Slik plasserer du en avkrysningsrute i en DBGrid

click fraud protection

Det er mange måter og grunner til å tilpasse utgangen til en DBGrid i Delphi. En måte er å legge til avmerkingsbokser slik at resultatet blir mer visuelt attraktivt.

Som standard, hvis du har et boolesk felt i datasettet ditt, DBGrid viser dem som "True" eller "False", avhengig av verdien av datafeltet. Imidlertid ser det mye bedre ut hvis du velger å bruke en "ekte" avkrysningsrute-kontroll for å aktivere redigering av feltene.

Opprett en prøveapplikasjon

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

La alle komponentnavnene være som de var da de først ble slettet i skjemaet (DBGrid1, ADOQuery1, AdoTable1, etc.). Bruk Objektinspektøren til å angi en ConnectionString-egenskap til ADOConnection1-komponenten (TADOConnection) for å peke på prøven QuickiesContest.mdb MS Access-database.

Koble DBGrid1 til DataSource1, DataSource1 til ADOTable1, og til slutt ADOTable1 til ADOConnection1. Egenskapen ADOTable1 TableName skal peke på Artikeltabellen (for å få DBGrid til å vise postene til Artikeltabellen).

instagram viewer

Hvis du har satt alle egenskapene riktig, når du kjører applikasjonen (gitt at Active-egenskapen til ADOTable1-komponenten er True) du skal som standard se DBGrid vise det boolske feltets verdi som "True" eller "False", avhengig av verdien av dataene felt.

CheckBox i en DBGrid

For å vise en avkrysningsrute i en celle i en DBGrid, må vi gjøre en tilgjengelig for oss på kjøretid.

Velg siden "Datakontroller" på Komponentpalett og velg en TDBCheckbox. Slipp en hvor som helst på skjemaet - det betyr ikke hvor, siden det meste av tiden vil være usynlig eller flyte over rutenettet.

Tips: TDBCheckBox er en datavisst kontroll som lar brukeren velge eller avvelge en enkelt verdi, som er passende for boolske felt.

Deretter setter du synlig eiendom til usann. Endre Color-egenskapen til DBCheckBox1 til samme farge som DBGrid (slik at den smelter sammen med DBGrid) og fjern bildeteksten.

Det viktigste er at du sørger for at DBCheckBox1 er koblet til DataSource1 og til riktig felt.

Legg merke til at alle ovennevnte DBCheckBox1s egenskapverdier kan settes i skjemaets OnCreate-hendelse som dette:

fremgangsmåte TForm1.FormCreate (avsender: TObject);
begynne
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Vinner';
DBCheckBox1.Visible: = Falsk;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// forklart senere i artikkelen
DBCheckBox1.ValueChecked: = 'Ja en vinner!';
DBCheckBox1.ValueUnChecked: = 'Ikke denne gangen.';
slutt;

Det som kommer videre er den mest interessante delen. Mens vi redigerer det boolske feltet i DBGrid, må vi sørge for at DBCheckBox1 er plassert over ("flytende") cellen i DBGrid som viser det boolske feltet.

For resten av (ikke-fokuserte) celler som bærer de boolske feltene (i "Vinneren" -kolonnen), må vi gi en grafisk fremstilling av den boolske verdien (Sann / usann). Dette betyr at du trenger minst to bilder for tegning: ett for den avkryssede tilstanden (sann verdi) og ett for den ukontrollerte tilstanden (falsk verdi).

Den enkleste måten å oppnå dette på er å bruke Windows API DrawFrameControl-funksjonen for å tegne direkte på DBGrids lerret.

Her er koden i DBGrids OnDrawColumnCell-hendelseshåndterer som oppstår når nettet må male en celle.

fremgangsmåte TForm1.DBGrid1DrawColumnCell (
Avsender: TObject; const Rect: TRect; DataCol:
Integer; Kolonne: TColumn; Oppgi: TGridDrawState);
konst IsChecked: matrise[Boolsk] av Heltall =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK eller DFCS_CHECKED);
Var
DrawState: Heltall;
DrawRect: TRect;
beginif (gdFocused i Stat) thenbeginif (Kolonne. Felt. Feltnavn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.Left: = Rekt. Venstre + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rekt. Topp + DBGrid1.top + 2;
DBCheckBox1.Bredde: = Rekt. Rett - Rekt. Venstre;
DBCheckBox1.Hight: = Rect. Bunn - Rekt. Topp;
DBCheckBox1.Visible: = True;
endendelsebeginif (Kolonne. Felt. Feltnavn = DBCheckBox1.DataField) thenbegin
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Column. Felt. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Håndtak, DrawRect,
DFC_BUTTON, DrawState);
slutt;
slutt;
slutt;

For å fullføre dette trinnet, må vi sørge for at DBCheckBox1 er usynlig når vi forlater cellen:

fremgangsmåte TForm1.DBGrid1ColExit (avsender: TObject);
beginif DBGrid1.SelectedField. Feltnavn = DBCheckBox1.DataField deretter
DBCheckBox1.Visible: = Falske
slutt;

Vi trenger bare to andre arrangementer for å håndtere.

Merk at når du er i redigeringsmodus, vil alle tastetrykk til DBGrid-cellen, vi må sørge for at de blir sendt til CheckBox. Når det gjelder en CheckBox er vi først og fremst interessert i [Tab] og [Space] -tasten. [Tab] skal flytte inngangsfokuset til neste celle, og [Mellomrom] skal veksle tilstanden til CheckBox.

fremgangsmåte TForm1.DBGrid1KeyPress (Avsender: TObject; var Key: Char);
beginif (tast = Chr (9)) deretter Avslutt;
hvis (DBGrid1.SelectedField. Feltnavn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
slutt;
slutt;

Det kan være aktuelt at bildetekst av avmerkingsboksen endres når brukeren sjekker eller fjerner merket for boksen. Legg merke til at DBCheckBox har to egenskaper (ValueChecked og ValueUnChecked) som brukes til å spesifisere feltverdien som er representert av avmerkingsboksen når den er avmerket eller ikke merket av.

Denne ValueChecked-eiendommen har "Ja, en vinner!", Og ValueUnChecked tilsvarer "Ikke denne gangen."

fremgangsmåte TForm1.DBCheckBox1Click (avsender: TObject);
beginif DBCheckBox1.Checked deretter
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
ellers
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
slutt;

Kjør prosjektet, så ser du avkrysningsrutene over kolonnen for Winner-feltet.

instagram story viewer