Comment utiliser les cases à cocher dans un DBGrid

Il existe de nombreuses façons et raisons de personnaliser la sortie d'un DBGrid dans Delphi. Une façon consiste à ajouter des cases à cocher afin que le résultat soit plus attrayant visuellement.

Par défaut, si vous avez un champ booléen dans votre jeu de données, le DBGrid les affiche comme "True" ou "False" selon la valeur du champ de données. Cependant, il semble beaucoup mieux si vous choisissez d'utiliser un contrôle de case à cocher "true" pour activer la modification des champs.

Créer un exemple d'application

Démarrer un nouveau formulaire dans Delphi et placer un TDBGrid, TADOTable et TADOConnection, TDataSource.

Laissez tous les noms de composants tels qu'ils sont lorsqu'ils ont été déposés pour la première fois dans le formulaire (DBGrid1, ADOQuery1, AdoTable1, etc.). Utilisez l'inspecteur d'objets pour définir une propriété ConnectionString du composant ADOConnection1 (TADOConnection) pour pointer vers l'exemple de base de données MS Access QuickiesContest.mdb.

Connectez DBGrid1 à DataSource1, DataSource1 à ADOTable1 et enfin ADOTable1 à ADOConnection1. La propriété ADOTable1 TableName doit pointer vers la table Articles (pour que le DBGrid affiche les enregistrements de la table Articles).

Si vous avez correctement défini toutes les propriétés, lorsque vous exécutez l'application (étant donné que la propriété Active du composant ADOTable1 est True), vous devriez voir, par défaut, DBGrid afficher la valeur du champ booléen comme "True" ou "False" selon sur la valeur du champ de données.

CheckBox dans un DBGrid

Pour afficher une case à cocher à l'intérieur d'une cellule d'un DBGrid, nous devons en rendre une disponible au moment de l'exécution.

Sélectionnez la page "Contrôles de données" sur la palette de composants et choisissez une TDBCheckbox. Déposez-en un n'importe où sur le formulaire - peu importe où, car la plupart du temps il sera invisible ou flottant sur la grille.

Pointe: TDBCheckBox est un contrôle orienté données qui permet à l'utilisateur de sélectionner ou de désélectionner une valeur unique, qui convient aux champs booléens.

Ensuite, définissez sa propriété Visible sur False. Modifiez la propriété Color de DBCheckBox1 à la même couleur que le DBGrid (afin qu'il se confond avec le DBGrid) et supprimez la légende.

Plus important encore, assurez-vous que le DBCheckBox1 est connecté au DataSource1 et au champ correct.

Notez que toutes les valeurs de propriété de DBCheckBox1 ci-dessus peuvent être définies dans l'événement OnCreate du formulaire comme ceci:

procédure TForm1.FormCreate (expéditeur: TObject);
commencer
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Winner';
DBCheckBox1.Visible: = False;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = ";
// expliqué plus loin dans l'article
DBCheckBox1.ValueChecked: = 'Oui un gagnant!';
DBCheckBox1.ValueUnChecked: = 'Pas cette fois.';
fin;

Ce qui vient ensuite est la partie la plus intéressante. Lors de la modification du champ booléen dans le DBGrid, nous devons nous assurer que le DBCheckBox1 est placé au-dessus ("flottant") de la cellule du DBGrid affichant le champ booléen.

Pour le reste des cellules (non focalisées) portant les champs booléens (dans la colonne "Gagnant"), nous devons fournir une représentation graphique de la valeur booléenne (Vrai / Faux). Cela signifie que vous avez besoin d'au moins deux images pour le dessin: une pour l'état vérifié (valeur vraie) et une pour l'état non contrôlé (valeur fausse).

La manière la plus simple d'y parvenir est d'utiliser la fonction DrawFrameControl de l'API Windows pour dessiner directement sur le canevas de DBGrid.

Voici le code du gestionnaire d'événements OnDrawColumnCell de DBGrid qui se produit lorsque la grille doit peindre une cellule.

procédure TForm1.DBGrid1DrawColumnCell (
Expéditeur: TObject; const Rect: TRect; DataCol:
Entier; Colonne: TColonne; État: TGridDrawState);
const Est vérifié : tableau[Booléen] de Entier =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK ou DFCS_CHECKED);
var
DrawState: Entier;
DrawRect: TRect;
beginif (gdFocused dans Etat) thenbeginif (Column.Field.FieldName = DBCheckBox1.DataField) puis commencer
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;
endendelsebeginif (Column.Field.FieldName = DBCheckBox1.DataField) puis commencer
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Column.Field.AsBoolean];
DBGrid1.Canvas.FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas.Handle, DrawRect,
DFC_BUTTON, DrawState);
fin;
fin;
fin;

Pour terminer cette étape, nous devons nous assurer que DBCheckBox1 est invisible lorsque nous quittons la cellule:

procédure TForm1.DBGrid1ColExit (expéditeur: TObject);
beginif DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField ensuite
DBCheckBox1.Visible: = False
fin;

Nous avons besoin de seulement deux autres événements pour gérer.

Notez qu'en mode édition, toutes les frappes vont à la cellule de DBGrid, nous devons nous assurer qu'elles sont envoyées à la CheckBox. Dans le cas d'un CheckBox, nous nous intéressons principalement à la touche [Tab] et [Space]. [Tab] devrait déplacer le focus d'entrée vers la cellule suivante, et [Space] devrait basculer l'état de la CheckBox.

procédure TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (clé = Chr (9)) puis quitter;
si (DBGrid1.SelectedField.FieldName = DBCheckBox1.DataField) puis commencer
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
fin;
fin;

Il peut être approprié que la légende de la case à cocher change lorsque l'utilisateur coche ou décoche la case. Notez que le DBCheckBox a deux propriétés (ValueChecked et ValueUnChecked) utilisées pour spécifier la valeur de champ représentée par la case à cocher lorsqu'elle est cochée ou décochée.

Cette propriété ValueChecked contient "Oui, un gagnant!", Et ValueUnChecked est égal à "Pas cette fois".

procédure TForm1.DBCheckBox1Click (expéditeur: TObject);
beginif DBCheckBox1.Checked ensuite
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
autre
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
fin;

Exécutez le projet et vous verrez les cases à cocher partout dans la colonne du champ Gagnant.