Hoe selectievakjes in een DBGrid te gebruiken

Er zijn talloze manieren en redenen om de uitvoer van een DBGrid in Delphi aan te passen. Een manier is om selectievakjes toe te voegen zodat het resultaat visueel aantrekkelijker wordt.

Als u een boolean-veld in uw gegevensset hebt, geeft DBGrid deze standaard weer als "Waar" of "Onwaar", afhankelijk van de waarde van het gegevensveld. Het ziet er echter veel beter uit als u ervoor kiest om een ​​"echt" selectievakje te gebruiken om het bewerken van de velden mogelijk te maken.

Maak een voorbeeldtoepassing

Start een nieuw formulier in Delphi en plaats een TDBGrid, TADOTable en TADOConnection, TDataSource.

Laat alle componentnamen zoals ze waren toen ze voor het eerst in het formulier werden neergezet (DBGrid1, ADOQuery1, AdoTable1, etc.). Gebruik de Object Inspector om een ​​eigenschap ConnectionString van de component ADOConnection1 (TADOConnection) in te stellen om naar de voorbeeld-QuickiesContest.mdb MS Access-database te verwijzen.

Verbind DBGrid1 met DataSource1, DataSource1 met ADOTable1 en ten slotte ADOTable1 met ADOConnection1. De eigenschap ADOTable1 TableName moet verwijzen naar de tabel Artikelen (zodat de DBGrid de records van de tabel Artikelen kan weergeven).

Als u alle eigenschappen correct hebt ingesteld, moet u bij het uitvoeren van de toepassing (gezien het feit dat de eigenschap Active van de component ADOTable1 True is) de DBGrid standaard de waarde van het Booleaanse veld weergeven als "True" of "False", afhankelijk van op de waarde van het gegevensveld.

CheckBox in een DBGrid

Om een ​​selectievakje in een cel van een DBGrid weer te geven, moeten we er tijdens runtime een beschikbaar voor ons maken.

Selecteer de pagina "Gegevensbesturing" in het componentenpalet en kies een TDBCheckbox. Zet er een ergens op het formulier neer - het maakt niet uit waar, omdat het meestal onzichtbaar is of over het raster zweeft.

Tip: TDBCheckBox is een gegevensbewust besturingselement waarmee de gebruiker een enkele waarde kan selecteren of deselecteren, die geschikt is voor Booleaanse velden.

Stel vervolgens de eigenschap Visible in op False. Wijzig de eigenschap Color van DBCheckBox1 in dezelfde kleur als de DBGrid (dus het past in de DBGrid) en verwijder het bijschrift.

Zorg er vooral voor dat de DBCheckBox1 is verbonden met de DataSource1 en met het juiste veld.

Merk op dat alle bovenstaande eigenschapswaarden van DBCheckBox1 kunnen worden ingesteld in de OnCreate-gebeurtenis van het formulier als volgt:

procedure TForm1.FormCreate (Sender: TObject);
beginnen
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Winnaar';
DBCheckBox1.Visible: = False;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = ";
// wordt later in het artikel uitgelegd
DBCheckBox1.ValueChecked: = 'Ja een winnaar!';
DBCheckBox1.ValueUnChecked: = 'Niet deze keer.';
einde;

Wat hierna komt, is het meest interessante deel. Tijdens het bewerken van het booleaanse veld in de DBGrid, moeten we ervoor zorgen dat de DBCheckBox1 boven ("zwevend") de cel in de DBGrid wordt geplaatst die het booleaanse veld weergeeft.

Voor de rest van de (niet-gefocuste) cellen die de Booleaanse velden dragen (in de kolom "Winnaar"), moeten we een grafische weergave van de Booleaanse waarde (waar / niet waar) geven. Dit betekent dat u ten minste twee afbeeldingen nodig hebt om te tekenen: een voor de aangevinkte status (ware waarde) en een voor de niet-aangevinkte status (valse waarde).

De eenvoudigste manier om dit te bereiken is om de Windows API DrawFrameControl-functie te gebruiken om rechtstreeks op het canvas van de DBGrid te tekenen.

Hier is de code in de OnDrawColumnCell-gebeurtenishandler van DBGrid die optreedt wanneer het raster een cel moet schilderen.

procedure TForm1.DBGrid1DrawColumnCell (
Afzender: TObject; const Rect: TRect; DATACOL:
Geheel getal; Kolom: TColumn; Staat: TGridDrawState);
const Is nagekeken : rangschikking[Boolean] van Geheel getal =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK of DFCS_CHECKED);
var
DrawState: geheel getal;
DrawRect: TRect;
beginif (gdFocused in Staat) 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);
einde;
einde;
einde;

Om deze stap te voltooien, moeten we ervoor zorgen dat DBCheckBox1 onzichtbaar is wanneer we de cel verlaten:

procedure TForm1.DBGrid1ColExit (Sender: TObject);
beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField vervolgens
DBCheckBox1.Visible: = False
einde;

We hebben nog twee evenementen nodig om af te handelen.

Merk op dat in de bewerkingsmodus alle toetsaanslagen naar de cel van DBGrid gaan, we moeten ervoor zorgen dat ze naar de CheckBox worden verzonden. In het geval van een CheckBox zijn we vooral geïnteresseerd in de [Tab] en de [Spatie] -toets. [Tab] moet de invoerfocus naar de volgende cel verplaatsen en [Spatie] moet de status van de CheckBox schakelen.

procedure TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (sleutel = Chr (9)) en vervolgens afsluiten;
als (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) thenbegin
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
einde;
einde;

Het is mogelijk dat het bijschrift van het selectievakje wordt gewijzigd wanneer de gebruiker het selectievakje in- of uitschakelt. Merk op dat de DBCheckBox twee eigenschappen heeft (ValueChecked en ValueUnChecked) die worden gebruikt om de veldwaarde op te geven die wordt weergegeven door het selectievakje wanneer deze is ingeschakeld of uitgeschakeld.

Deze eigenschap ValueChecked bevat "Ja, een winnaar!" En ValueUnChecked is gelijk aan "Niet deze keer."

procedure TForm1.DBCheckBox1Click (Sender: TObject);
beginif DBCheckBox1.Checked vervolgens
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
anders
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
einde;

Voer het project uit en u ziet de selectievakjes in de kolom van het Winnaar-veld.