TcyDBAdvGrid et CheckBox [Résolu]

Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
- - Dernière réponse : cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 14 janv. 2013 à 10:21
Bonjour,

J'ai un champs 'Avec_PRG' de type smallint borné entre 0..1 (la base ne gére pas le type boolean)

Je veux afficher un checkbox dans un TcyDBAdvGrid (compo de Mauricio, pour ceux qui connaissent pas, c'est ICI)

La colonne n'est pas en Readonly (sinon je m'en sort avec un fkCalculated)
Ce code fonctionne, mais à coté du checkbox j'ai la valeur 0 ou 1. Comment faire pour que la valeur ne soit pas affichée, et l'edit n'apparaisse pas si on click hors de la checkbox ?

procedure TFrmTest.cyDBAdvGrid_HistoDrawCheckBox(Sender: TObject;
  const Rect: TRect; Checked: Boolean);
begin
  if ZROQuery_Histo.FieldByName('Avec_PRG').Value = 1 then
   cyDBAdvGrid_Histo.DefaultDrawCheckBox(Rect, true)
  else
   cyDBAdvGrid_Histo.DefaultDrawCheckBox(Rect, false);
end;


Reste la solution de centrer l'écriture dans la colonne de manière à ce qu'elle soit sous la checkbox, mais cela ne règle pas le problème de l'edit.

Merci
Jean
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
5
3
Merci
Salut,

tu utilises la sélection de lignes pour afficher ton champ.

pour ce qui est de l' affichage du champ:
BeforeDrawColumnCell(Sender: TObject; ACol, ARow: Integer; ARect: TRect; Column: TColumn; var AState: TGridDrawState;
Highlight: Boolean; var DrawBackground, DrawFieldValue: Boolean);
begin
if Column.FieldName = 'Avec_PRG' then
DrawFieldValue := false;
end;


Composants Cindy pour Delphi
Faites une donation.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 117 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MAURICIO
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
15
0
Merci
Salut,

Comment ça ?
Mauricio affiche des 0 et des 1 de manière intempestive ?

cantador
Commenter la réponse de cs_cantador
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
1
0
Merci
Bonjour Cantador,

Non, les compos de Mauricio fonctionnent à merveille.

Pour un TBooleanField, la checkbox s'affiche automatiquement (ContentFieldRender.BooleanField :bfCheckBox) et il suffit de définir la valeur DisplayValues ' ' dans le DataSet pour avoir uniquement la checkbox dans la Cellule.

Mais moi, je veux la même chose mais avec un TSmallIntField et la je coince pour ne pas faire apparaître la valeur et surtout désactiver le TEdit en edition.

A+
Jean
Commenter la réponse de jderf
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
1
0
Merci
Salut Mauricio,

Je suis pas certain d'avoir compris ce que tu veux dire par "tu utilises la sélection de lignes" maic voici ce que j'ai fait avec CellClick, DrawCheckBox et BeforeDrawColumnCell

procedure TFrmTest.cyDBAdvGrid_HistoCellClick(Column: TColumn);
begin
  if cyDBAdvGrid_Histo.SelectedField.FieldName = 'Avec_PRG' then
    begin
     cyDBAdvGrid_Histo.DataSource.DataSet.Edit;
     if cyDBAdvGrid_Histo.DataSource.DataSet.FieldByName('Avec_PRG').Value = 0 then
       cyDBAdvGrid_Histo.DataSource.DataSet.FieldByName('Avec_PRG').Value := 1
     else
       cyDBAdvGrid_Histo.DataSource.DataSet.FieldByName('Avec_PRG').Value := 0;
    end;
end;

procedure TFrmTest.cyDBAdvGrid_HistoDrawCheckBox(Sender: TObject;
  const Rect: TRect; Checked: Boolean);
begin
 if TcyDBAdvGrid(Sender).DataSource.DataSet.FieldByName('Avec_PRG').Value = 1 then
   TcyDBAdvGrid(Sender).DefaultDrawCheckBox(Rect, true)
 else
   TcyDBAdvGrid(Sender).DefaultDrawCheckBox(Rect, false);
end;

procedure TFrmTest.cyDBAdvGrid_HistoBeforeDrawColumnCell(Sender: TObject; ACol,
  ARow: Integer; ARect: TRect; Column: TColumn; var AState: TGridDrawState;
  Highlight: Boolean; var DrawBackground, DrawFieldValue: Boolean);
begin
  if Column.FieldName = 'Avec_PRG' then
    DrawFieldValue := false;
end;


J'ai mis aussi
cyDBAdvGrid_Histo.CheckBoxes.Visible := true;
cyDBAdvGrid_Histo.CheckBoxes.ColumnMode := cmByFieldName;

Cela semble fonctionner, mais je suis pas certain que ce soit bien "propre" ?!

Merci
Jean
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
5
0
Merci
Il y a 2 types de checkbox dans ma DBGrid:
- celui-ci permet la sélection de lignes et qui est paramétrable depuis la propriété "CheckBoxes"(celui que tu utilises afin de voir si le champ = 1 ou 0)
- celui utilisé pour voir les champs booleens, que tu ne peux pas voir puisque ton champ n' est pas de type bool.

Le fait d' utiliser le 1er (car ton champ n' est pas de type bool) ne pose pas de problèmes particuliers ...



Autre façon:
----------------------
J' ai essayé de forcer l' utiliation de checkbox comme ça:
procedure TForm3.cyDBAdvGrid1SetContentFieldRendering(Sender: TObject; ACol, ARow: Integer; ARect: TRect; Column: TColumn; AState: TGridDrawState;
Highlight: Boolean; var FieldContentRendering: TFieldContentRendering);
begin
if Column.FieldName = 'NUM' then
FieldContentRendering := fcCheckBox;
end;
mais malheureusement la DBGrid provoque une erreur car elle s' attends ensuite à un champ boolean.
Je vais voir si je peux corriger cela pour la prochaine sortie de mes compos ...

A+



Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
1
0
Merci
Merci beaucoup Mauricio, je vais donc faire comme ça.

Bonne journée.
Jean
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
5
0
Merci
Salut jderf,

tu peux télécharger la dernière version des compos Cindy (v5.13).
Tu pourras ensuite utiliser le code qui suit:

procedure TForm3.cyDBAdvGrid1SetContentFieldRendering(Sender: TObject; ACol, ARow: Integer; ARect: TRect; Column: TColumn; AState: TGridDrawState;
Highlight: Boolean; var FieldContentRendering: TFieldContentRendering);
begin
if Column.FieldName = 'NUM' then
FieldContentRendering := fcCheckBox;
end;

Si le champ contient 0 ou '0', le checkbox sera décoché.
Si le champ contient 1 ou '1', le checkbox sera coché.

A+



Composants Cindy pour Delphi
Faites une donation.
Commenter la réponse de cs_MAURICIO
Messages postés
192
Date d'inscription
mercredi 29 décembre 2004
Dernière intervention
2 octobre 2014
1
0
Merci
Bonjour Mauricio,

Merci pour cette mise à jour.

Juste une petite remarque, en utilisant ContentFieldRendering, la checkbox est bien affichée mais la valeur aussi.
L'astuce DrawFieldValue := false; ne fonctionne plus car dans ce cas pas de checkbox.

Lorsque que j'ai besoin d'une seul colonne avec des checkbox, je vais continuer d'utiliser le DrawCheckBox. Par contre effectivement si j'ai besoin de plusieurs colonnes, cela offrira une solution.
Y'a une solution pour center la checkbox dans ce cas là ?

A+
Jean
Commenter la réponse de jderf
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
5
Commenter la réponse de cs_MAURICIO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.