Couleur cellule stringgrid

Signaler
-
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
2 mars 2020
-
Bonjour,
Je souhaite colorer certaines cellules d'un stringgrid selon certaines conditions.
J'utilise Canvas drawcell dans une boucle.
La cellule se colore correctement mais seulement une fraction de seconde!?!
Qui peut m'aider?
Merci!!!!
PhilLu

7 réponses

Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
bonjour,

un exemple avec un TjvStringGrid que j'aime bien car il possède la méthode clear :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, JvExGrids, JvStringGrid;

type
TForm1 = class(TForm)
JvSGFlux: TJvStringGrid;
procedure FormCreate(Sender: TObject);
procedure JvSGFluxDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
JvSGFlux.Cells[3, 3] := '1';
end;

procedure TForm1.JvSGFluxDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with TJvStringGrid(sender) do
begin
for ACol := 0 to Colcount - 1 do
for ARow := 0 to RowCount - 1 do

if Cells[ACol, ARow] = '1' then
begin
canvas.Brush.Color := ClRed;
canvas.FillRect(Rect);
end;

end;
end;

end.


me dire si ça te convient..
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
A étudier néanmoins une solution sans faire les boucles
ce qui serait plus rapide..
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
2 mars 2020

Merci Cantador!
J'ai trouvé ceci qui fonctionne très bien mais les cellules "clignotent" ce qui n'est pas très esthétique :-/
Si tu as une idée pourquoi???
Merci pour ton aide!!!
procedure TForm1.SGSampleDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin

for i := 1 to 100 do
With SGSample As TStringGrid Do
With Canvas Do

Begin

if ((Cells[4,i]='POS') AND (Cells[2,i]='NEG')) OR ((Cells[4,i]='NEG') AND (Cells[2,i]='POS')) then
begin
cells[5,i]:='1';
Rect := CellRect(4, i);
Brush.Color := clRed;
Font.Color := clBlack;
FillRect(Rect);
DrawText(Canvas.Handle, PChar(Cells[4,i]), -1, Rect ,
DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE );

Rect := CellRect(2, i);
Brush.Color := clRed;
Font.Color := clBlack;
FillRect(Rect);
DrawText(Canvas.Handle, PChar(Cells[2,i]), -1, Rect ,
DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE );
end;
end;

end;
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
chez moi, ça ne clignote pas..
mais ce programme est confus, incomplet et codé en dur..
bref, pas terrible..

le mieux serait d'indiquer ce que tu souhaites obtenir réellement.
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
2 mars 2020

... codé en dur?
Je souhaite colorer des cellules [2,i] et [4,i] si chacune d'elle est différente de l'autre à savoir si
([2,i]='POS' AND [4,i]='NEG') OR
([2,i]='NEG' AND [4,i]='POS')
Comme l'opération CanvasDrawtext pour changer la couleur de fond et de fonte bousille la position du texte, il faut le recentrer.
(d'où DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE)
Cette proc est appelée par l'évenement OnDrawCell de mon stringgrid.(peut-être pas le meilleure méthode?!?
Merci Canta!!!
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
2 mars 2020

accessoirement je souhaite trier ma table pour avoir ces discordances en tête de tableau. Ca marche mais alors ma table est bloquée en édition et mon appli ne répond plus :-(
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
codé en dur ?
oui
ex: for i := 1 to 100 do

il faut paramétrer..
c'est une habitude de travail.
cela permet d'éviter de retoucher le code ultérieurement.
tout dépend évidemment de l'activité que tu pratiques et du temps que tu disposes..

Je souhaite colorer des cellules [2,i] et [4,i] si chacune d'elle est différente de l'autre.

Inutile d'ajouter quelque chose ni de coller du texte dans l'une et dans l'autre :

mais la question qui se pose :

La coloration doit-elle se produire au moment de la saisie dans les cellules ou s'agit-il de textes stockés par programmation (dus à des évènements extérieurs par exemple) ?
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
2 mars 2020

Ah ok, oui, je sais ;-)

La coloration doit se faire à posteriori lors d'un clic sur un bouton qui lance d'autres traitement, donc pas à la saisie.
Donc OnDrawCell peut-être pas le mieux mais ayant testé d'autres voies pas efficaces, je suis resté sur celle-là; mais avec le problème des cellules qui "scintillent"!?! (j'utilise stringgrid classique)

Thanks!!!! et bon week-end ;-)