Delphi は、データベース アプリケーションの設計を容易にする強力な DBGrid コンポーネントを提供します。しかし、DBGrid コンポーネントのみを使用する場合、各フォーカス (グリッド) は単なるテキスト編集ボックスにすぎず、ユーザーがデータを入力するのは不便です。 Delphi は、ユーザー入力を容易にする他のデータ コンポーネント (DBComboBox、DBCheckBox、その他のコンポーネントなど) も提供しますが、これらのコンポーネントは DBGrid ほど強力ではありません。 Visual FoxPRo と同様に、Delphi では、ユーザーの便宜のために、DBGrid のフォーカス グリッドを他のビジュアル データ コンポーネントにすることができますか?実際、他のビジュアルコンポーネントを DBGrid に挿入することでこれを実現できます。
DBGrid を処理するための Delphi の内部メカニズムは、コンポーネント (DBEdit コンポーネント) をグリッド上にフローティングすることです。データを入力するグリッドは実際にはフローティング DBEdit コンポーネントであり、フォーカスされない他の領域は単なる画像です。したがって、他のビジュアル コンポーネントを DBGrid に挿入すると、ビジュアル コンポーネントがグリッド上にフローティングされます。したがって、単純な DbCheckBox から複雑なダイアログ ボックスに至るまで、あらゆるコンポーネントを DBGrid に挿入できます。以下は、DBComboBox コンポーネントを DBGrid に挿入する手順です。同じ方法を使用して他のコンポーネントを挿入できます。
1. Delphi 4.0 で新しいプロジェクトを作成します。
2. データ アクセス コンポーネント ボードの DataSource と Table、データ コントロール コンポーネント ボードの DBGrid と DBComboBox の 4 つのコンポーネントをそれぞれ Form1 にドラッグします。
3. 各コンポーネントのプロパティを次のように設定します。
rcf1 オブジェクト属性設定プラント
Form1 キャプション「SpinEdit コンポーネントを DBGrid に挿入する例」
データソース 1 データセット テーブル 1
表1 データベース名 DBDEMOS
テーブル名 '教師.DBF'
アクティブな真
DBGrid1 データソース データソース 1
DBComboBox1 データフィールド SEX
データソース データソース1
目に見える偽
文字列アイテム「男性」 | 「女性」
注: ここでは Teacher.dbf を使用しました。これは教職員の性別を反映しており、「男性」または「女性」のみを指定できます。
4. DrawDataCell イベントは、フォーカスされたグリッドに対応するフィールドがコンボ ボックスに対応するフィールドと一致する場合、コンボ ボックスをフォーカスされたグリッドに移動します。
DBGrid の指定された列に DBComboBox を表示する機能を実現するには、コンボ ボックスを表示します。 DBGrid1 の OnDrawDataCell イベントを次のように設定します。
プロシージャ TForm1.DBGrid1DrawDataCell(送信者: TObject; const Rect: TRect; フィールド: TField; 状態: TGridDrawState);
始める
if (gdFocused in State) then
始める
if (Field.FieldName = DBComboBox1.DataField ) then
始める
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := True;
終わり;
終わり;
終わり;
5. DBGrid 内の指定されたセルがフォーカスを受け取っていない場合、DBComboBox は表示されません。 DBGrid1 の OnColExit イベントを次のように設定します。
プロシージャ TForm1.DBGrid1ColExit(送信者: TObject);
始める
DBGrid1.SelectedField.FieldName = DBComboBox1.DataField の場合、
始める
DBComboBox1.Visible := false;
終わり;
終わり;
6. DBGrid の指定された列がフォーカスを取得すると、DrawDataCell イベントはセルを描画して DBComboBox を表示するだけですが、DBComboBox はフォーカスを取得せず、データ入力は引き続きセルに対して実行されます。 DBGrid1 の KeyPress イベントで SendMessage Windows API 関数を呼び出して、データ入力を DBComboBox に転送し、DBComboBox でのデータ入力を実現します。したがって、次のように KeyPress イベントも設定します。
プロシージャ TForm1.DBGrid1KeyPress(送信者: TObject; var Key: Char);
始める
if (key < > chr(9)) then
始める
if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) then
始める
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, Word(Key), 0);
終わり;
終わり;
終わり;
このプログラムは、中国版 Windows 98 および Delphi 4.015 でのデバッグに合格しました。この記事により、データベース アプリケーションをより便利かつ迅速に開発できるようになることを願っています。