Er zijn verschillende manieren en redenen om de uitvoer van een DBGrid in Delphi. Een manier is om selectievakjes toe te voegen, zodat het resultaat visueel aantrekkelijker wordt.
Standaard, als u een booleaans veld in uw dataset heeft, de DBGrid geeft ze 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 de velden te kunnen bewerken.
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, enz.). Gebruik de Object Inspector om een ConnectionString-eigenschap van de ADOConnection1-component (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 naar de tabel Artikelen verwijzen (om DBGrid de records van de tabel Artikelen te laten weergeven).
Als u alle eigenschappen correct hebt ingesteld, wanneer u de toepassing uitvoert (aangezien de eigenschap Active van de ADOTable1-component dat is Waar) je zou standaard moeten zien dat de DBGrid de waarde van het booleaanse veld weergeeft als "Waar" of "Onwaar", afhankelijk van de waarde van de gegevens veld.
CheckBox in een DBGrid
Om een selectievakje in een cel van een DBGrid weer te geven, moeten we er tijdens de uitvoering een beschikbaar maken.
Selecteer de pagina "Gegevensbeheer" op de Componentpalet en kies een TDBCheckbox. Zet er een neer op het formulier - 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, wat geschikt is voor booleaanse velden.
Stel vervolgens de eigenschap Zichtbaar in op False. Wijzig de eigenschap Color van DBCheckBox1 in dezelfde kleur als DBGrid (zodat het opgaat in DBGrid) en verwijder het bijschrift.
Het belangrijkste is dat de DBCheckBox1 is verbonden met de DataSource1 en met het juiste veld.
Merk op dat alle bovenstaande DBCheckBox1-eigenschapswaarden als volgt kunnen worden ingesteld in de OnCreate-gebeurtenis van het formulier:
procedure TForm1.FormCreate (Afzender: 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: = 'Dit keer niet.';
einde;
Wat daarna komt, is het meest interessante. Bij het bewerken van het booleaanse veld in de DBGrid, moeten we ervoor zorgen dat de DBCheckBox1 boven de cel in de DBGrid wordt geplaatst ("zwevend") met het booleaanse veld.
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 / Onwaar) geven. Dit betekent dat u ten minste twee afbeeldingen nodig heeft om te tekenen: één voor de aangevinkte staat (Ware waarde) en één voor de niet-aangevinkte staat (Valse waarde).
De eenvoudigste manier om dit te bereiken is door de Windows API DrawFrameControl-functie te gebruiken om rechtstreeks op het canvas van 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: matrix[Boolean] van Geheel getal =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK of DFCS_CHECKED);
var
DrawState: geheel getal;
DrawRect: TRect;
beginif (gdFocused in Staat) thenbeginif (Kolom. Veld. FieldName = DBCheckBox1.DataField) dan beginnen
DBCheckBox1.Left: = Rect. Links + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rect. Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Rechts - Rect. Links;
DBCheckBox1.Height: = Rect. Bodem - Recht. Top;
DBCheckBox1.Visible: = True;
endendelsebeginif (Kolom. Veld. FieldName = DBCheckBox1.DataField) dan beginnen
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Kolom. Veld. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Greep, 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 (Afzender: TObject);
beginif DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField vervolgens
DBCheckBox1.Visible: = False
einde;
We hebben nog maar twee gebeurtenissen nodig.
Merk op dat in de bewerkingsmodus alle toetsaanslagen naar de cel van DBGrid gaan, we ervoor moeten zorgen dat ze naar de CheckBox worden gestuurd. In het geval van een CheckBox zijn we vooral geïnteresseerd in de [Tab] en de [Space] -toets. [Tab] moet de invoerfocus verplaatsen naar de volgende cel en [Spatie] moet de status van de CheckBox omschakelen.
procedure TForm1.DBGrid1KeyPress (Afzender: TObject; var Sleutel: Char);
beginif (key = Chr (9)) sluit vervolgens af;
als (DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField) dan beginnen
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
einde;
einde;
Het kan passend zijn dat het bijschrift van het selectievakje verandert 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 vertegenwoordigd door het selectievakje wanneer deze is aangevinkt of niet is aangevinkt.
Deze ValueChecked-eigenschap bevat "Yes, a Winner!" En ValueUnChecked is gelijk aan "Not this time."
procedure TForm1.DBCheckBox1Click (Afzender: TObject);
beginif DBCheckBox 1. gecontroleerd vervolgens
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
anders
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
einde;
Voer het project uit en je ziet de selectievakjes in de kolom van het Winnaarveld.