Verwendung von Kontrollkästchen in einem DBGrid

Es gibt zahlreiche Möglichkeiten und Gründe, die Ausgabe eines DBGrid in Delphi anzupassen. Eine Möglichkeit besteht darin, Kontrollkästchen hinzuzufügen, damit das Ergebnis optisch attraktiver wird.

Wenn Sie in Ihrem Dataset ein boolesches Feld haben, zeigt das DBGrid diese standardmäßig als "Wahr" oder "Falsch" an, abhängig vom Wert des Datenfelds. Es sieht jedoch viel besser aus, wenn Sie ein "echtes" Kontrollkästchen verwenden, um das Bearbeiten der Felder zu ermöglichen.

Erstellen Sie eine Beispielanwendung

Starten Sie ein neues Formular in Delphi und platzieren Sie ein TDBGrid, TADOTable, und TADOConnection, TDataSource.

Lassen Sie alle Komponentennamen unverändert, als sie zum ersten Mal im Formular abgelegt wurden (DBGrid1, ADOQuery1, AdoTable1 usw.). Verwenden Sie den Objektinspektor, um eine ConnectionString-Eigenschaft der ADOConnection1-Komponente (TADOConnection) so festzulegen, dass sie auf die Beispieldatenbank QuickiesContest.mdb MS Access verweist.

Verbinden Sie DBGrid1 mit DataSource1, DataSource1 mit ADOTable1 und schließlich ADOTable1 mit ADOConnection1. Die Eigenschaft ADOTable1 TableName sollte auf die Tabelle Articles verweisen (damit das DBGrid die Datensätze der Tabelle Articles anzeigt)..

Wenn Sie alle Eigenschaften korrekt festgelegt haben, sollte beim Ausführen der Anwendung (vorausgesetzt, die Active-Eigenschaft der ADOTable1-Komponente lautet True) im DBGrid standardmäßig der Wert des booleschen Felds als "True" oder "False" angezeigt werden auf den Wert des Datenfeldes.

CheckBox in einem DBGrid

Um ein Kontrollkästchen in einer Zelle eines DBGrid anzuzeigen, müssen Sie uns zur Laufzeit ein Kontrollkästchen zur Verfügung stellen.

Wählen Sie die Seite "Datensteuerelemente" in der Komponentenpalette aus und wählen Sie eine TDBCheckbox aus. Legen Sie eines an einer beliebigen Stelle im Formular ab - es spielt keine Rolle, wo es sich befindet, da es die meiste Zeit unsichtbar ist oder über dem Raster schwebt.

Trinkgeld: TDBCheckBox ist ein datensensitives Steuerelement, mit dem der Benutzer einen einzelnen Wert auswählen oder die Auswahl aufheben kann, der für boolesche Felder geeignet ist.

Setzen Sie anschließend die Eigenschaft Visible auf False. Ändern Sie die Color-Eigenschaft von DBCheckBox1 in dieselbe Farbe wie das DBGrid (damit es mit dem DBGrid verschmilzt) und entfernen Sie die Beschriftung.

Stellen Sie vor allem sicher, dass die DBCheckBox1 mit der DataSource1 und dem richtigen Feld verbunden ist.

Beachten Sie, dass alle oben genannten Eigenschaftswerte von DBCheckBox1 im OnCreate-Ereignis des Formulars wie folgt festgelegt werden können:

Verfahren TForm1.FormCreate (Absender: TObject);
Start
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Winner';
DBCheckBox1.Visible: = False;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = ";
// später im Artikel erklärt
DBCheckBox1.ValueChecked: = 'Ja, ein Gewinner!';
DBCheckBox1.ValueUnChecked: = 'Diesmal nicht.';
Ende;

Was als nächstes kommt, ist der interessanteste Teil. Beim Bearbeiten des Booleschen Felds im DBGrid müssen wir sicherstellen, dass die DBCheckBox1 über der Zelle im DBGrid platziert ist, in der das Boolesche Feld angezeigt wird ("Floating").

Für die restlichen (nicht fokussierten) Zellen, die die Booleschen Felder enthalten (in der Spalte "Gewinner"), müssen Sie eine grafische Darstellung des Booleschen Werts (Wahr / Falsch) bereitstellen. Dies bedeutet, dass Sie mindestens zwei Bilder zum Zeichnen benötigen: eines für den aktivierten Status (True-Wert) und eines für den nicht aktivierten Status (False-Wert)..

Der einfachste Weg, dies zu erreichen, besteht darin, die Windows-API-Funktion DrawFrameControl zu verwenden, um direkt auf der Zeichenfläche des DBGrid zu zeichnen.

Hier ist der Code im OnDrawColumnCell-Ereignishandler des DBGrid, der auftritt, wenn das Raster eine Zelle zeichnen muss.

Verfahren TForm1.DBGrid1DrawColumnCell (
Absender: TObject; const Rect: TRect; DataCol:
Ganze Zahl; Spalte: TColumn; Zustand: TGridDrawState);
const Wird geprüft : Array[Boolean] von Ganzzahl =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK oder DFCS_CHECKED);
var
DrawState: Integer;
DrawRect: TRect;
beginif (gdFocused im Zustand) thenbeginif (Column.Field.FieldName = DBCheckBox1.DataField) dann fange an
DBCheckBox1.Left: = Rect.Left + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rect.Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect.Right - Rect.Left;
DBCheckBox1.Height: = Rect.Bottom - Rect.Top;
DBCheckBox1.Visible: = True;
endendelsebeginif (Column.Field.FieldName = DBCheckBox1.DataField) dann fange an
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Column.Field.AsBoolean];
DBGrid1.Canvas.FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas.Handle, DrawRect,
DFC_BUTTON, DrawState);
Ende;
Ende;
Ende;

Um diesen Schritt abzuschließen, müssen wir sicherstellen, dass DBCheckBox1 unsichtbar ist, wenn wir die Zelle verlassen:

Verfahren TForm1.DBGrid1ColExit (Absender: TObject);
beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField dann
DBCheckBox1.Visible: = False
Ende;

Wir brauchen nur noch zwei Ereignisse zu bewältigen.

Beachten Sie, dass im Bearbeitungsmodus alle Tastenanschläge in die Zelle des DBGrid übertragen werden. Wir müssen sicherstellen, dass sie an die CheckBox gesendet werden. Bei einer CheckBox interessieren uns in erster Linie die Tasten [Tab] und [Leertaste]. [Tab] sollte den Eingabefokus auf die nächste Zelle verschieben, und [Leertaste] sollte den Status des Kontrollkästchens umschalten.

Verfahren TForm1.DBGrid1KeyPress (Absender: TObject; var Key: Char);
beginif (Schlüssel = Chr (9)) dann Exit;
wenn (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) dann fange an
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, Wort (Schlüssel), 0);
Ende;
Ende;

Es kann angebracht sein, die Beschriftung des Kontrollkästchens zu ändern, wenn der Benutzer das Kontrollkästchen aktiviert oder deaktiviert. Beachten Sie, dass die DBCheckBox über zwei Eigenschaften verfügt (ValueChecked und ValueUnChecked), mit denen der Feldwert angegeben wird, der durch das Kontrollkästchen dargestellt wird, wenn es aktiviert oder deaktiviert ist.

Diese ValueChecked-Eigenschaft enthält "Yes, a Winner!" Und ValueUnChecked entspricht "Not this time".

Verfahren TForm1.DBCheckBox1Click (Absender: TObject);
beginif DBCheckBox1.Checked dann
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
sonst
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
Ende;

Führen Sie das Projekt aus, und in der Spalte "Gewinner" werden die Kontrollkästchen angezeigt.