Couleur cellule stringgrid

PhilLu - 20 nov. 2013 à 08:20
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 22 nov. 2013 à 14:53
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

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 nov. 2013 à 10:56
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..
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 nov. 2013 à 11:03
A étudier néanmoins une solution sans faire les boucles
ce qui serait plus rapide..
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 nov. 2013 à 12:00
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;
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 nov. 2013 à 15:10
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 nov. 2013 à 15:40
... 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!!!
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 nov. 2013 à 16:00
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 :-(
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 nov. 2013 à 14:41
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) ?
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
22 nov. 2013 à 14:53
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 ;-)
0
Rejoignez-nous