Admin Fondateur
Nombre de messages : 197 Age : 40 Localisation : Tlemcen ( Algérie ) Date d'inscription : 04/12/2006
| Sujet: mettre une case à cocher dans une DBGrid Mer 14 Fév - 2:50 | |
| a case à cocher n'est pas prévue en standard dans la BDGrid, il faut donc la dessiner 'à la main'. Le moyen le plus simple est d'utiliser 2 images, une pour l'état 'coché' et une pour l'état 'décoché'.
Les images sont stockées dans une liste d'images 'imgCheck' se trouvant dans un DataModule (DmImages). Dans cette liste d'images, on fixe arbitrairement l'image 0 comme étant l'image 'décoché' et 1 comme étant l'image 'coché'.L'événement à intercepter pour dessiner la case à cocher est DrawColumnCell. - Code:
-
procedure TForm1.dbGrid1DrawColumnCell( Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (column est une colonne 'case à cocher') then begin { on efface la cellule } dbGrid1.Canvas.FillRect(Rect); { si coché } if (column.Field a la valeur coché) then begin DmImages.imgCheck.draw(dbGrid1.Canvas, rect.Left + ((rect.Right - rect.Left - DmImages.imgCheck.Width) div 2), rect.Top, 1); end { sinon, pas coché } else begin DmImages.imgCheck.draw(dbGrid1.Canvas, rect.Left + ((rect.Right - rect.Left - DmImages.imgCheck.Width) div 2), rect.Top, 0); end end { si column ne correspond pas à une case à cocher, } { on ne s'occupe pas du dessin de la cellule, on } { transmet donc à DefaultDrawColumnCell } else begin dbGrid1.DefaultDrawColumnCell(rect,datacol,column,state); end; end; Remarques :- le test if (column est une colonne 'case à cocher') est très variable : pour déterminer si la zone est une case à cocher, on peut se baser sur le type de la zone (if (Column.Field.DataType = ftBoolean) then...) ou bien sur son nom (if sameText(Column.FieldName,'nomZone') then...) - Le code ci-dessus peut servir à afficher autre chose qu'une case à cocher. Par exemple si une zone peut prendre 4 valeurs entières de 0 à 3, on peut avoir les 4 images équivalentes dans une liste d'images et l'utiliser ainsi : - Code:
-
dbGrid1.Canvas.FillRect(Rect); listeImages.draw(dbGrid1.Canvas, rect.Left + ((rect.Right - rect.Left - listeImages.Width) div 2), rect.Top, column.Field.AsInteger); Le code donné ci-dessus permet d'afficher la case à cocher, mais ne gère pas le cochage/décochage. Pour cocher ou décocher (i.e. pour changer l'image), il suffit de changer la valeur du champ. L'affichage sera mis à jour automatiquement. Par exemple, comment cocher ou décocher sur un double-click dans la grille : - Code:
-
procedure TForm1.dbGrid1DblClick(Sender: TObject); begin with dbGrid1 do begin { La grille doit être modifiable... } if (not ReadOnly) { ainsi que le dataset } and DataSource.DataSet.CanModify { Et la zone sur laquelle on a cliqué doit } { être une case à cocher } and ((SelectedField.FieldName = 'UNE ZONE A COCHER') or (test sur un autre nom de zone) or ...) then begin DataSource.DataSet.Edit; SelectedField.AsBoolean := not SelectedField.AsBoolean; DataSource.DataSet.Post; end; end; end; . | |
|