Come utilizzare le caselle di controllo in un controllo DBGrid

Esistono numerosi modi e motivi per personalizzare l’output di un controllo DBGrid in Delphi. Un modo è aggiungere caselle di controllo in modo che il risultato sia visivamente più attraente.

Per impostazione predefinita, se si dispone di un campo booleano nel set di dati, DBGrid li visualizza come “True” o “False” a seconda del valore del campo di dati. Tuttavia, sembra molto meglio se scegli di utilizzare una casella di controllo “true” per abilitare la modifica dei campi.

Crea un’applicazione di esempio

Avvia un nuovo modulo in Delphi e inserisci TDBGrid, TADOTable e TADOConnection, TDataSource.

Lascia tutti i nomi dei componenti come sono quando sono stati rilasciati per la prima volta nel modulo (DBGrid1, ADOQuery1, AdoTable1 e così via). Utilizzare Object Inspector per impostare una proprietà ConnectionString del componente ADOConnection1 (TADOConnection) in modo che punti al database MS Access QuickiesContest.mdb di esempio.

Connettere DBGrid1 a DataSource1, DataSource1 a ADOTable1 e infine ADOTable1 a ADOConnection1. La proprietà TableName ADOTable1 dovrebbe puntare alla tabella Articoli (per fare in modo che il controllo DBGrid visualizzi i record della tabella Articoli).

Se hai impostato correttamente tutte le proprietà, quando esegui l’applicazione (dato che la proprietà Active del componente ADOTable1 è True) dovresti vedere, per impostazione predefinita, DBGrid visualizzare il valore del campo booleano come “True” o “False” a seconda sul valore del campo dati.

CheckBox in un controllo DBGrid

Per mostrare una casella di controllo all’interno di una cella di un DBGrid, dovremo renderne uno disponibile in fase di esecuzione.

Selezionare la pagina “Controlli dati” nella tavolozza dei componenti e selezionare una casella di controllo TDBC. Rilascia uno in qualsiasi punto del modulo: non importa dove, poiché la maggior parte delle volte sarà invisibile o fluttuante sulla griglia.

Mancia: TDBCheckBox è un controllo sensibile ai dati che consente all’utente di selezionare o deselezionare un singolo valore, appropriato per i campi booleani.

Quindi, impostare la sua proprietà Visible su False. Modificare la proprietà Color di DBCheckBox1 allo stesso colore come il controllo DBGrid (così esso si fonde con il controllo DBGrid) e rimuovere la didascalia.

Soprattutto, assicurati che DBCheckBox1 sia connesso a DataSource1 e al campo corretto.

Si noti che tutti i valori di proprietà di DBCheckBox1 sopra possono essere impostati nell’evento OnCreate del modulo in questo modo:

procedura TForm1.FormCreate (Sender: TObject);
iniziare
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Winner';
DBCheckBox1.Visible: = False;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';

// spiegato più avanti nell'articolo
DBCheckBox1.ValueChecked: = 'Sì, un vincitore!';
DBCheckBox1.ValueUnChecked: = 'Non questa volta.';
fine;

Quello che viene dopo è la parte più interessante. Durante la modifica del campo booleano nel DBGrid, dobbiamo assicurarci che il DBCheckBox1 sia posizionato sopra (“mobile”) la cella nel DBGrid che visualizza il campo booleano.

Per il resto delle celle (non focalizzate) che contengono i campi booleani (nella colonna “Vincitore”), dobbiamo fornire una rappresentazione grafica del valore booleano (Vero / Falso). Ciò significa che sono necessarie almeno due immagini per disegnare: una per lo stato selezionato (valore True) e una per lo stato non selezionato (valore False).

Il modo più semplice per eseguire ciò è utilizzare la funzione DrawFrameControl API di Windows per disegnare direttamente nell’area di disegno del DBGrid.

Ecco il codice nel gestore di eventi OnDrawColumnCell del DBGrid che si verifica quando la griglia deve disegnare una cella.

procedura TForm1.DBGrid1DrawColumnCell (
Mittente: TObject; const Rect: TRect; DataCol:
Numero intero; Colonna: TColumn; Stato: TGridDrawState);

const IsChecked: schieramento[Booleano] of Intero =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK o DFCS_CHECKED);
var
DrawState: Integer;
DrawRect: TRect;
beginif (gdFocused in Stato) thenbeginif (Column.Field.FieldName = DBCheckBox1.DataField) quindi iniziare
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;
endendelseginif (Column.Field.FieldName = DBCheckBox1.DataField) quindi iniziare
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Column.Field.AsBoolean];
DBGrid1.Canvas.FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas.Handle, DrawRect,
DFC_BUTTON, DrawState);
fine;
fine;
fine;

Per completare questo passaggio, dobbiamo assicurarci che DBCheckBox1 sia invisibile quando usciamo dalla cella:

procedura TForm1.DBGrid1ColExit (mittente: TObject);
beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField poi
DBCheckBox1.Visible: = False
fine;

Abbiamo solo bisogno di altri due eventi da gestire.

Nota che in modalità di modifica, tutte le sequenze di tasti vanno alla cella di DBGrid, dobbiamo assicurarci che vengano inviate al CheckBox. Nel caso di un CheckBox siamo principalmente interessati al tasto [Tab] e [Spazio]. [Tab] dovrebbe spostare il focus di input alla cella successiva e [Space] dovrebbe cambiare lo stato del CheckBox.

procedura TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (chiave = Chr (9)) quindi esci;
if (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) quindi iniziare
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
fine;
fine;

Potrebbe essere opportuno che la didascalia della casella di controllo cambi quando l’utente seleziona o deseleziona la casella. Si noti che DBCheckBox ha due proprietà (ValueChecked e ValueUnChecked) utilizzate per specificare il valore del campo rappresentato dalla casella di controllo quando è selezionata o deselezionata.

Questa proprietà ValueChecked contiene “Sì, un vincitore!” E ValueUnChecked è uguale a “Non questa volta”.

procedura TForm1.DBCheckBox1Click (Sender: TObject);
beginif DBCheckBox1.Checked poi
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
altro
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
fine;

Esegui il progetto e vedrai le caselle di controllo in tutta la colonna del campo Vincitore.