Colorier différemment les cellules d'une colonne sur un dbgrid

cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 9 avril 2004 à 09:33
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 12 avril 2004 à 18:42
Bonjour,

J'aimerais colorier chacune des cellules de la première colonne uniquement d'un dbgrid en fonction de son contenu.

Les cellules pourront avoir une couleur différente les unes des autres.

Si quelqu'un a une solution.
Merci

Orélien.

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
10 avril 2004 à 07:30
Bonjour Orelien.
Voici un exemple basé sur l'utilisation de la table Biolife (alias DbDemos) :
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
//ne colorie pas la cellule détenant la focalisation
if not (gdFocused in State) then
begin
//colorie ce qui correspond à la première 
//colonne 
if Column.Index = 0 then
//couleur selon une valeur déterminée par le contenu
//du champ SpeciesNo
      if Table1SpeciesNo.AsInteger < 90100 then
      begin
        Column.Color := clGreen;
        Column.Font.Color := clYellow;
      end
      else
      begin
        Column.Color := clYellow;
        Column.Font.Color := clGreen;
      end;
end;

Le problème, c'est que le code tel qu'il est écrit dessus génère un scintillement de la grille de données. Pour remédier à ce problème, je te conseille de mettre dans l'évènement OnCreate de la fiche propriétaire du TDbGrid :
procedure TForm1.FormCreate(Sender: TObject);
begin
//Elimine le scintillement de DbGrid1
DbGrid1.DoubleBuffered := True;
end;

Et tout est nickel !
Tu dois maintenant pouvoir adapter ce code à tes besoins sans difficultés.
0
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009
12 avril 2004 à 12:12
Bonjour,

Merci, ton code fonctionne bien.
Il y a juste un petit problème c'est que dans le code on demande à la dbgrid de colorier la première colonne en vert si le champs 'species no' est inférieur à 90100. Or chez moi la première colonne rencontrée est égale à 90020 et se trouve coloriée en jaune !
De plus losque je clique sur la ligne à 90100 celle qui la suit (à 90110) se colorie automatiquement en vert alors qu'elle était en jaune au départ... Si tu as une idée sur la question...

Merci
Orélien.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 avril 2004 à 18:42
Autant pour moi !
Il faut utiliser la propriété Canvas et non l'argument Column. De plus, un appel à DefaultDrawColumnCell est nécessaire pour forcer les cellules à se repeindre.
Voici donc le bon code :
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if not (gdFocused in State) then
  begin
    if Column.Index = 0 then
    with DbGrid1 do
    begin
      if TField(Column.Field).AsInteger <= 90100 then
      begin
        Canvas.Brush.Color := clGreen;
        Canvas.Font.Color := clYellow;
      end
      else
      begin
        Canvas.Brush.Color := clYellow;
        Canvas.Font.Color := clGreen;
      end;
      DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
  end;
end;
0
Rejoignez-nous