Det finns många sätt och skäl att anpassa utgången från en DBGrid i Delphi. Ett sätt är att lägga till kryssrutor så att resultatet blir mer visuellt attraktivt.
Som standard, om du har ett booleskt fält i ditt dataset, DBGrid visar dem som "True" eller "False" beroende på datafältets värde. Men det ser mycket bättre ut om du väljer att använda en "sann" kryssruta för att aktivera redigering av fälten.
Skapa en provapplikation
Starta en ny form i Delphi och placera en TDBGrid, TADOTable och TADOConnection, TDataSource.
Lämna alla komponentnamn som de var när de först släpptes i formen (DBGrid1, ADOQuery1, AdoTable1, etc.). Använd Objektinspektören för att ställa in en ConnectionString-egenskap för ADOConnection1-komponenten (TADOConnection) för att peka på exemplet QuickiesContest.mdb MS Access-databas.
Anslut DBGrid1 till DataSource1, DataSource1 till ADOTable1 och slutligen ADOTable1 till ADOConnection1. Egenskapen ADOTable1 TableName bör peka på Artikeltabellen (för att DBGrid ska visa posterna i artikeltabellen).
Om du har ställt in alla egenskaper på rätt sätt när du kör applikationen (med tanke på att den aktiva egenskapen för ADOTable1-komponenten är Sann) du bör som standard se DBGrid visa det booleska fältets värde som "Sant" eller "Falskt" beroende på datavärdet fält.
CheckBox i en DBGrid
För att visa en kryssruta i en cell i en DBGrid måste vi göra en tillgänglig för oss vid körning.
Välj sidan "Datakontroller" på Komponentpalett och välj en TDBCheckbox. Släpp en var som helst på formuläret - det spelar ingen roll var, eftersom det för det mesta kommer att vara osynligt eller flyta över nätet.
Dricks: TDBCheckBox är en datainveten kontroll som gör att användaren kan välja eller avmarkera ett enda värde, vilket är lämpligt för booleska fält.
Ställ därefter den synliga egenskapen till False. Ändra färgegenskapen för DBCheckBox1 till samma färg som DBGrid (så att den smälter in i DBGrid) och ta bort bildtexten.
Det viktigaste av allt är att DBCheckBox1 är ansluten till DataSource1 och till rätt fält.
Observera att alla ovannämnda DBCheckBox1s egendomsvärden kan ställas in i formulärets OnCreate-händelse så här:
procedur TForm1.FormCreate (avsändare: TObject);
Börja
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Vinnare';
DBCheckBox1.Visible: = Falsk;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// förklaras senare i artikeln
DBCheckBox1.ValueChecked: = 'Ja en vinnare!';
DBCheckBox1.ValueUnChecked: = 'Inte den här gången.';
slutet;
Det som kommer nästa är den mest intressanta delen. När vi redigerar det booleska fältet i DBGrid måste vi se till att DBCheckBox1 är placerad ovanför ("flytande") cellen i DBGrid som visar det booleska fältet.
För resten av de (icke-fokuserade) cellerna som bär de booleska fälten (i kolumnen "Vinnare") måste vi tillhandahålla en viss grafisk representation av det booleska värdet (sant / falskt). Det betyder att du behöver minst två bilder för ritning: en för det kontrollerade tillståndet (sant värde) och en för det okontrollerade tillståndet (falskt värde).
Det enklaste sättet att uppnå detta är att använda funktionen Windows API DrawFrameControl för att rita direkt på DBGrids duk.
Här är koden i DBGrids OnDrawColumnCell-händelseshanterare som uppstår när rutnätet måste måla en cell.
procedur TForm1.DBGrid1DrawColumnCell (
Avsändare: TObject; const Rect: TRect; DataCol:
Heltal; Kolumn: TColumn; Tillstånd: TGridDrawState);
const IsChecked: array[Boolesk] av Heltal =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK eller DFCS_CHECKED);
var
DrawState: Heltal;
DrawRect: TRect;
beginif (gdFocused i Stat) thenbeginif (Kolumn. Fält. Fältnamn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.Left: = Rekt. Vänster + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rect. Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Rätt - Rekt. Vänster;
DBCheckBox1.Höjd: = Rect. Nedre - Rekt. Topp;
DBCheckBox1.Visible: = True;
endendelsebeginif (Kolumn. Fält. Fältnamn = DBCheckBox1.DataField) thenbegin
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Column. Fält. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Handtag, DrawRect,
DFC_BUTTON, DrawState);
slutet;
slutet;
slutet;
För att avsluta detta steg måste vi se till att DBCheckBox1 är osynlig när vi lämnar cellen:
procedur TForm1.DBGrid1ColExit (avsändare: TObject);
beginif DBGrid1.SelectedField. Fältnamn = DBCheckBox1.DataField sedan
DBCheckBox1.Visible: = Falskt
slutet;
Vi behöver bara ytterligare två evenemang för att hantera.
Observera att när alla tangenttryckningar går i redigeringsläge till DBGrids cell måste vi se till att de skickas till CheckBox. När det gäller en CheckBox är vi främst intresserade av [Tab] och [Space] -tangenten. [Tab] ska flytta inmatningsfokus till nästa cell och [Mellanslag] ska växla till CheckBox-tillståndet.
procedur TForm1.DBGrid1KeyPress (avsändare: TObject; var Key: Char);
beginif (nyckel = Chr (9)) sedan Avsluta;
om (DBGrid1.SelectedField. Fältnamn = DBCheckBox1.DataField) thenbegin
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
slutet;
slutet;
Det kan vara lämpligt att bildtexten för kryssrutan ändras när användaren markerar eller avmarkerar rutan. Observera att DBCheckBox har två egenskaper (ValueChecked och ValueUnChecked) som används för att ange fältvärdet som representeras av kryssrutan när den är markerad eller avmarkerad.
Den här ValueChecked-egenskapen innehåller "Ja, en vinnare!" Och ValueUnChecked är lika med "Inte den här gången."
procedur TForm1.DBCheckBox1Click (avsändare: TObject);
beginif DBCheckBox1.Checked sedan
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
annan
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
slutet;
Kör projektet så ser du kryssrutorna över hela Vinnarfältets kolumn.