Delphi bietet die leistungsstarke DBGrid-Komponente, um das Design von Datenbankanwendungen zu erleichtern. Wenn wir jedoch nur die DBGrid-Komponente verwenden, ist jeder Fokus (Grid) nur ein einfaches Textbearbeitungsfeld, was für Benutzer bei der Dateneingabe unpraktisch ist. Delphi bietet auch einige andere Datenkomponenten zur Erleichterung der Benutzereingabe, wie DBComboBox, DBCheckBox und andere Komponenten, aber diese Komponenten sind nicht so leistungsstark wie DBGrid. Kann Delphi, wie Visual FoxPRo, zulassen, dass das Fokusraster in DBGrid zur Vereinfachung für Benutzer andere visuelle Datenkomponenten umfasst? Tatsächlich können wir dies erreichen, indem wir andere visuelle Komponenten in das DBGrid einfügen.
Der interne Mechanismus von Delphi zur Verarbeitung von DBGrid besteht darin, eine Komponente im Raster schweben zu lassen – die DBEdit-Komponente. Das Raster, in dem Sie Daten eingeben, ist eigentlich eine schwebende DBEdit-Komponente, und die anderen Bereiche, die nicht den Fokus erhalten, sind nur Bilder. Das Einfügen anderer visueller Komponenten in das DBGrid ist also so, als würde man eine visuelle Komponente im Raster schweben lassen. Daher kann jede Komponente, von einer einfachen DbCheckBox bis hin zu einem komplexen Dialogfeld, in DBGrid eingefügt werden. Im Folgenden finden Sie einen Schritt zum Einfügen der DBComboBox-Komponente in DBGrid. Sie können andere Komponenten auf die gleiche Weise einfügen.
1. Erstellen Sie ein neues Projekt in Delphi 4.0.
2. Ziehen Sie die vier Komponenten DataSource und Table auf der Datenzugriffskomponentenplatine und DBGrid und DBComboBox auf der Data Controls-Komponentenplatine jeweils auf Form1.
3. Legen Sie die Eigenschaften jeder Komponente wie folgt fest:
rcf1-Objektattribut-Einstellungsanlage
Form1-Beschriftung „Beispiel für das Einfügen einer SpinEdit-Komponente in DBGrid“
DataSource1 DataSet Table1
Tabelle1 Datenbankname DBDEMOS
Tabellenname 'teacher.DBF'
Aktiv Wahr
DBGrid1 DataSource DataSource1
DBComboBox1 DataField SEX
DataSource DataSource1
Sichtbar falsch
Saitenelemente. 'Männlich' |.
Hinweis: Ich habe hier Teacher.dbf verwendet, das das Geschlecht der Fakultät und des Personals widerspiegelt, das nur „männlich“ oder „weiblich“ sein kann.
4. Das DrawDataCell-Ereignis dient zum Zeichnen von Zellen. Wenn das Feld, das dem fokussierten Raster entspricht, mit dem Feld übereinstimmt, das dem Kombinationsfeld entspricht, verschieben Sie das Kombinationsfeld in das fokussierte Raster und
Machen Sie das Kombinationsfeld sichtbar, um die Funktion der Anzeige der DBComboBox in der angegebenen Spalte des DBGrid zu erreichen. Legen Sie das OnDrawDataCell-Ereignis von DBGrid1 wie folgt fest:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
beginnen
if (gdFocused in State) then
beginnen
if (Field.FieldName = DBComboBox1.DataField ) dann
beginnen
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;
Ende;
Ende;
Ende;
5. Die DBComboBox wird nicht angezeigt, wenn die angegebene Zelle in DBGrid keinen Fokus erhält. Legen Sie das OnColExit-Ereignis von DBGrid1 wie folgt fest:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
beginnen
Wenn DBGrid1.SelectedField.FieldName = DBComboBox1.DataField, dann
beginnen
DBComboBox1.Visible := false;
Ende;
Ende;
6. Wenn die angegebene Spalte von DBGrid den Fokus erhält, zeichnet das DrawDataCell-Ereignis nur die Zelle und zeigt die DBComboBox an, aber die DBComboBox erhält nicht den Fokus und die Dateneingabe wird weiterhin für die Zelle durchgeführt. Rufen Sie die SendMessage-Windows-API-Funktion im KeyPress-Ereignis von DBGrid1 auf, um die Dateneingabe an die DBComboBox zu übertragen und so eine Dateneingabe in die DBComboBox zu erreichen. Legen Sie also auch das KeyPress-Ereignis wie folgt fest:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
beginnen
if (key < > chr(9)) then
beginnen
if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) dann
beginnen
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, Word(Key), 0);
Ende;
Ende;
Ende;
Das Programm hat das Debuggen unter chinesischem Windows 98 und Delphi 4.015 bestanden. Ich hoffe, dass dieser Artikel Ihnen dabei hilft, Datenbankanwendungen bequemer und schneller zu entwickeln.