Couleur cellule stringgrid

- - Dernière réponse : PhilLu
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
- 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
Afficher la suite 

7 réponses

Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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..
Commenter la réponse de cs_cantador
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
A étudier néanmoins une solution sans faire les boucles
ce qui serait plus rapide..
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
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;
Commenter la réponse de PhilLu
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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.
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
... 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!!!
PhilLu
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
-
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 :-(
Commenter la réponse de PhilLu
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
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) ?
Commenter la réponse de cs_cantador
Messages postés
249
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
6 mai 2018
0
Merci
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 ;-)
Commenter la réponse de PhilLu