BKnet
Messages postés4Date d'inscriptiondimanche 30 octobre 2005StatutMembreDernière intervention14 février 2006
-
13 févr. 2006 à 14:47
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
19 juin 2006 à 11:35
Bonjour tout le monde,
Jessai de faire une grille de loto avec une StringGrid, je
voudrai que la case ou on a cliqué dessus change de couleur, mais hélas cette
opération fonctionne très aléatoirement (parfaois la case cliquée change de
couleur et par fois non). Cela fait quelques heures que je me casse la tete ,
mais en vin .
Voila le code qui me pose problème :
procedure TForm1.FormCreate(Sender: TObject);
var
x, y, i: integer;
begin
i := 1;
Nb := 1;
GCol := 0;
GRow := 0;
clik := false;
for y:=0 to 6 do begin
for x:=0 to 6 do begin
StringGrid2.Cells[x, y] := inttostr(i);
inc(i);
end;
end;
end;
procedure TForm1.StringGrid2Click(Sender: TObject);
begin
clik := true;
end;
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
text: string;
cliked: boolean;
t: integer;
begin
if (clik = true) then begin
clik := false;
cliked := false;
text := StringGrid2.Cells[ACol, ARow]; //for t :1 to 9 do if NbJouer[t] strtoint(text) then cliked:=true;
if cliked = true then begin
NbJouer[1] := 0;
StringGrid2.Canvas.Brush.Color := clwhite;
StringGrid2.Canvas.FillRect(Rect);
StringGrid2.Canvas.TextOut(Rect.Left, Rect.Top, text);
end else begin
StringGrid2.Canvas.Brush.Color := clYellow;
StringGrid2.Canvas.FillRect(Rect);
StringGrid2.Canvas.TextOut(Rect.Left, Rect.Top, text);
NbJouer[1] := strtoint(text);
end;
memo1.Text := 'x='+inttostr(Acol)+'y='+inttostr(Arow)+' '+inttostr(NbJouer[1]);
end;
end;
Si quelqu'un a un débu de solution ou une autre idée, je le remercie d'avance
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20082 13 févr. 2006 à 17:08
Je pense que tu dois raisoner ainsi :
Tu crée un tableau de Boolean de la taille de ton StringGrid lors de la création de la fiche (qu'il ne faudra pas oublier de détruire à la fin ^^).
Ensuite, à chaque clique sur une cellule (capturé avec l'évenement OnSelectCell, c'est plus comode), tu mets la valeur correspondante à la cellule selectionnée à True pour signaler que cette cellule à été cliquée.
Enfin, lors de l'évenement OnDrawCell, tu testes si la cellule a dessiner est à True dans le tableau. Si oui, tu la colore, si non, tu la laisse tranquile.
Un détail: l'appel à Refresh dans l'évenement OnSelectCell permet d'actualise l'effichage tout de suite. En effet, sans lui, il faudrait attendre le prochain dessin du StringGrid pour voir les changements.
++
Si tu ne te plantes pas ......
tu ne pousseras jamais
type TFrmDemo = class(TForm)
StringGrid: TStringGrid;
procedure StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private { Déclarations privées }
public { Déclarations publiques }
FTableau: array of array of Boolean; // Déclaration du tableau ici
end;
var FrmDemo: TFrmDemo;
implementation
{$R *.dfm}
procedure TFrmDemo.StringGridSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin { Mise à True de l'élément du tableau correspondant. }
FTableau[ACol, ARow] := True;
{ Réaffichage du StringGrid pour colorier. }
StringGrid.Refresh;
end ;
procedure TFrmDemo.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin { Si la cellule a été cliquée, la colorier. }
if FTableau[ACol, ARow] then
begin
StringGrid.Canvas.Brush.Color : = clRed;
StringGrid.Canvas.Rectangle(Rect);
end;
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 13 févr. 2006 à 18:24
Salut,
Florenth moi j'aurai fait plutôt comme ça :
procedure TfrmDemo.StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin { Mise à True de l'élément du tableau correspondant. }
FTableau[ACol, ARow] := Not FTableau[ACol, ARow]; // ce qui permet de changer d'avis si l'une où l'autre cellule ne convient plus si non on ne peut plus modifier
{ Réaffichage du StringGrid pour colorier. }
StringGrid.Refresh;
end;
cs_amina27
Messages postés5Date d'inscriptionjeudi 4 mai 2006StatutMembreDernière intervention28 mars 2007 19 juin 2006 à 09:50
bonjour a tous
je voudrais pouvoir meliorer un logiciel qui a été programmer sous delphi afin de pouvoir ecrire en arabe
ce logiciel nous permet d'editer des informations dans une zone de saisi , cette dernière fait un affichage en point , "comme une matrice 8X8"
j'aimerais programmer un composant qui nous permet de le faire , mais je ne sais pas trop ??
toutes aide serait la bienvenue!!
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 19 juin 2006 à 11:35
Salut,
Amina tu t'es trompé d'endroit pour ta question.
En effet le fait de la poser ici te donnera pas de réponses, ici tu es dans un thread qui concerne les stringgrid et en plus si tu as pas de chance seulement trois personnes verront ta questions dans ce thread.
La solution pour toi est de poser une nouvelle question dans un nouveau thread afin que toute la communauté puisse la voir et que tes chances d'obtenir une réponse soient plus grande.