Computerwissenschaften

So platzieren Sie ein 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 ist.

Wenn Sie ein boolesches Feld in Ihrem Dataset haben, zeigt das DBGrid diese standardmäßig je nach Wert des Datenfelds als „True“ oder „False“ an. Es sieht jedoch viel besser aus, wenn Sie ein Kontrollkästchen „true“ verwenden, um die Bearbeitung der Felder zu ermöglichen.

 

Erstellen Sie eine Beispielanwendung

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

Lassen Sie alle Komponentennamen so, wie sie waren, als sie zum ersten Mal in das Formular eingefügt wurden (DBGrid1, ADOQuery1, AdoTable1 usw.). Verwenden Sie den Objektinspektor, um eine ConnectionString-Eigenschaft der ADOConnection1-Komponente (TADOConnection) festzulegen, die auf die MS Access-Beispieldatenbank QuickiesContest.mdb verweist.

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

Wenn Sie alle Eigenschaften korrekt festgelegt haben, sollten Sie beim Ausführen der Anwendung (vorausgesetzt, die Active-Eigenschaft der ADOTable1-Komponente ist True) standardmäßig sehen, dass DBGrid den Wert des booleschen Felds je nach „True“ oder „False“ anzeigt auf den Wert des Datenfeldes.

 

CheckBox in einem DBGrid

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

Wählen Sie die Seite “ Datensteuerelemente. in der Komponentenpalette aus und wählen Sie eine TDBCheckbox aus. Legen Sie eine an einer beliebigen Stelle im Formular ab – egal wo, da sie die meiste Zeit unsichtbar ist oder über dem Raster schwebt.

Tipp: 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 als Nächstes die Visible-Eigenschaft auf False. Ändern Sie die Color-Eigenschaft von DBCheckBox1 in dieselbe Farbe wie das DBGrid (damit es sich in das DBGrid einfügt) 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:

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

Was als nächstes kommt, ist der interessanteste Teil. Während Sie das boolesche Feld im DBGrid bearbeiten, müssen Sie sicherstellen, dass die DBCheckBox1 über („schwebend“) der Zelle im DBGrid platziert ist, in der das boolesche Feld angezeigt wird.

Für den Rest der (nicht fokussierten) Zellen, die die Booleschen Felder tragen (in der Spalte „Gewinner“), müssen wir eine grafische Darstellung des Booleschen Werts (Wahr / Falsch) bereitstellen. Dies bedeutet, dass Sie zum Zeichnen mindestens zwei Bilder 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 Leinwand des DBGrid zu zeichnen.

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

Prozedur TForm1.DBGrid1DrawColumnCell ( 
Absender: TObject; const Rect: TRect; DataCol: 
Integer; Column: TColumn; State: TGridDrawState); 
 
const IsChecked: Array [Boolean] von Integer=
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK oder DFCS_CHECKED); 
var
 DrawState: Integer; 
DrawRect: TRect; 
beginif (gdFocused in State) thenbeginif (Column.Field.FieldName=DBCheckBox1.DataField) thenbegin
 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) thenbegin
 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:

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

Wir brauchen nur noch zwei Ereignisse.

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

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

Es kann angebracht sein, dass sich die Beschriftung des Kontrollkästchens ändert, 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 „Ja, ein Gewinner!“, Und ValueUnChecked entspricht „Diesmal nicht“.

Prozedur TForm1.DBCheckBox1Click (Absender: TObject); 
beginif DBCheckBox1.Checked then
 DBCheckBox1.Caption:=DBCheckBox1.ValueChecked 
 else
 DBCheckBox1.Caption:=DBCheckBox1.ValueUnChecked; 
Ende;

Wenn Sie das Projekt ausführen, werden die Kontrollkästchen in der gesamten Spalte des Gewinnerfelds angezeigt.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.