Sådan placeres et afkrydsningsfelt i en DBGrid

click fraud protection

Der er adskillige måder og grunde til at tilpasse output fra en DBGrid i Delphi. En måde er at tilføje afkrydsningsfelter, så resultatet bliver mere visuelt attraktivt.

Hvis du har et boolsk felt i dit datasæt, er DBGrid som standard viser dem som "Sandt" eller "Falskt" afhængigt af værdien af ​​datafeltet. Det ser dog meget bedre ud, hvis du vælger at bruge en "sand" afkrydsningsfeltskontrol til at aktivere redigering af felterne.

Opret en prøveapplikation

Start en ny form i Delphi, og anbring en TDBGrid, TADOTable og TADOConnection, TDataSource.

Efterlad alle komponentnavne, som de er, da de først blev droppet i formen (DBGrid1, ADOQuery1, AdoTable1 osv.). Brug objektinspektøren til at indstille en ConnectionString-egenskab for ADOConnection1-komponenten (TADOConnection) til at pege på prøven QuickiesContest.mdb MS Access-database.

Tilslut DBGrid1 til DataSource1, DataSource1 til ADOTable1 og til sidst ADOTable1 til ADOConnection1. Egenskaben ADOTable1 TableName skal pege på Artikeltabellen (for at få DBGrid til at vise posterne i artikeltabellen).

instagram viewer

Hvis du har indstillet alle egenskaber korrekt, når du kører applikationen (i betragtning af at den aktive egenskab for ADOTable1-komponenten er Sandt) skal du som standard se DBGrid vise det boolske felt's værdi som "Sandt" eller "Falskt" afhængigt af værdien på dataene Mark.

CheckBox i en DBGrid

For at få vist et afkrydsningsfelt inde i en celle i en DBGrid, skal vi gøre en tilgængelig for os på kørselstidspunktet.

Vælg siden "Datakontroller" på Komponentpalet og vælg en TDBCheckbox. Slip en hvor som helst på formularen - det betyder ikke noget hvor, da det meste af tiden vil være usynlig eller flyde over gitteret.

Tip: TDBCheckBox er en databevidst kontrol, der giver brugeren mulighed for at vælge eller fravælge en enkelt værdi, som er passende til boolske felter.

Sæt derefter den synlige egenskab til False. Skift farveegenskab for DBCheckBox1 til den samme farve som DBGrid (så den smelter sammen med DBGrid) og fjern billedtekst.

Det vigtigste er, at DBCheckBox1 er tilsluttet DataSource1 og til det rigtige felt.

Bemærk, at alle ovennævnte DBCheckBox1s egenskabsværdier kan indstilles i formens OnCreate-begivenhed som denne:

procedure TForm1.FormCreate (Afsender: TObject);
begynde
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Vinder';
DBCheckBox1.Visible: = Falsk;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// forklaret senere i artiklen
DBCheckBox1.ValueChecked: = 'Ja en vinder!';
DBCheckBox1.ValueUnChecked: = 'Ikke denne gang.';
ende;

Det, der kommer næste, er den mest interessante del. Mens vi redigerer det boolske felt i DBGrid, er vi nødt til at sikre, at DBCheckBox1 er placeret over ("flydende") cellen i DBGrid, der viser det boolske felt.

For resten af ​​de (ikke-fokuserede) celler, der bærer de boolske felter (i kolonnen "Vinder"), er vi nødt til at tilvejebringe en vis grafisk repræsentation af den boolske værdi (sand / falsk). Dette betyder, at du har brug for mindst to billeder til tegning: et for den markerede tilstand (sand værdi) og et for den ikke-markerede tilstand (falsk værdi).

Den nemmeste måde at opnå dette på er at bruge Windows API DrawFrameControl-funktionen til at tegne direkte på DBGrids lærred.

Her er koden i DBGrid's OnDrawColumnCell begivenhedshåndterer, der opstår, når gitteret skal male en celle.

procedure TForm1.DBGrid1DrawColumnCell (
Afsender: TObject; const Rect: TRect; DataCol:
Heltal; Kolonne: TColumn; Stat: TGridDrawState);
const IsChecked: matrix[Boolesk] af Heltal =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK eller DFCS_CHECKED);
Var
DrawState: Heltal;
DrawRect: TRect;
beginif (gdFocused i Stat) thenbeginif (Kolonne. Mark. Feltnavn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.Left: = Rect. Venstre + DBGrid1.Læfte + 2;
DBCheckBox1.Top: = Rect. Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Højre - ret. Venstre;
DBCheckBox1.Hight: = Rect. Bund - Rekt. Top;
DBCheckBox1.Visible: = Sandt;
endendelsebeginif (Kolonne. Mark. Feltnavn = DBCheckBox1.DataField) thenbegin
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Kolonne. Mark. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Håndtag, DrawRect,
DFC_BUTTON, DrawState);
ende;
ende;
ende;

For at afslutte dette trin, skal vi sørge for, at DBCheckBox1 er usynlig, når vi forlader cellen:

procedure TForm1.DBGrid1ColExit (Afsender: TObject);
beginif DBGrid1.SelectedField. Feltnavn = DBCheckBox1.DataField derefter
DBCheckBox1.Visible: = Falsk
ende;

Vi har brug for kun to flere begivenheder til at håndtere.

Bemærk, at når du er i redigeringstilstand, går alle tastetryk til DBGrid's celle, vi er nødt til at sikre, at de sendes til CheckBox. I tilfælde af en CheckBox er vi primært interesseret i [Tab] og [Space] -tasten. [Tab] skal flytte inputfokus til den næste celle, og [Mellemrum] skal skifte status for CheckBox.

procedure TForm1.DBGrid1KeyPress (Afsender: TObject; var nøgle: Char);
beginif (nøgle = Chr (9)) derefter Afslut;
hvis (DBGrid1.SelectedField. Feltnavn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
ende;
ende;

Det kan være passende, at billedtekst af afkrydsningsfeltet ændres, når brugeren markerer eller fjerner markeringen af ​​afkrydsningsfeltet. Bemærk, at DBCheckBox har to egenskaber (ValueChecked og ValueUnChecked), der bruges til at specificere feltværdien repræsenteret af afkrydsningsfeltet, når det er markeret eller ikke markeret.

Denne ValueChecked-ejendom har "Ja, en vinder!", Og ValueUnChecked er lig med "Ikke denne gang."

procedure TForm1.DBCheckBox1Click (Afsender: TObject);
beginif DBCheckBox1.Checked derefter
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
andet
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
ende;

Kør projektet, og du vil se afkrydsningsfelterne over hele vinderen-feltets kolonne.

instagram story viewer