Comment placer une case à cocher dans un DBGrid

Il existe de nombreuses façons et raisons de personnaliser la sortie d'un DBGrid dans Delphes. 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, DBGrid les affiche comme "Vrai" ou "Faux" 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émarrez un nouveau formulaire dans Delphi et placez 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).

instagram viewer

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 Vrai) vous devriez voir, par défaut, le DBGrid afficher la valeur du champ booléen comme "Vrai" ou "Faux" selon la valeur des données champ.

CheckBox dans un DBGrid

Pour afficher une case à cocher dans une cellule d'un DBGrid, nous devons en mettre un à notre disposition au moment de l'exécution.

Sélectionnez la page "Contrôles de données" sur le Palette de composants et choisissez un 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 façon 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 (Colonne. Champ. FieldName = DBCheckBox1.DataField) puis commencer
DBCheckBox1.Left: = Rect. Gauche + DBGrid1.Left + 2;
DBCheckBox1.Top: = Rect. Haut + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Droite - Rect. La gauche;
DBCheckBox1.Height: = Rect. Bas - Rect. Haut;
DBCheckBox1.Visible: = True;
endendelsebeginif (Colonne. Champ. FieldName = DBCheckBox1.DataField) puis commencer
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Colonne. Champ. 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 à 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 (expéditeur: 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.

instagram story viewer