StringGrid trop aléatoirement

BKnet Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 14 février 2006 - 13 févr. 2006 à 14:47
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 19 juin 2006 à 11:35
Bonjour tout le monde,





J’essai 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

Bonne journée !!!

9 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
13 févr. 2006 à 17:12
Voila le code d'une fiche (nommée FrmDemo) qui fait ce que je t'ai dit plus tot :
<hr size= "2" width="100%"> unit Unit1;

interface

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

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;

{ Ecriture du texte. }
StringGrid.Canvas.TextRect(Rect, Rect.Left, Rect.Top, StringGrid.Cells[ACol, ARow]);
end;

procedure TFrmDemo.FormCreate(Sender: TObject);
begin
{ Création du tableau. }
SetLength(FTableau, StringGrid.ColCount, StringGrid.RowCount);
end;

procedure TFrmDemo.FormDestroy(Sender: TObject);
begin
{ Libération de mémoire. }
Finalize(FTableau);
end;

end.
<hr size="2" width="100%">
Bonne prog'
Florent

Si tu ne te plantes pas ......
tu ne pousseras jamais
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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;

@+
Cirec
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
13 févr. 2006 à 18:51
Alors, là, c'est tout une question de choix.
C'est vrai que la question de l'intéréssé se prète aux deux réponses.

Tu lui as indiqué la deuxième, tant mieux, il n'aura pas à chercher trop loin.
Après, c'est à BKnet de choisir ...

++ Flo

Si tu ne te plantes pas ......
tu ne pousseras jamais

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

Posez votre question
BKnet Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 14 février 2006
14 févr. 2006 à 12:01
Hello,













J’ai testé et sa fonctionne super bien !!!
L’idée est très intéressante.

Un grand merci pour ton aide Florent et a toi Cirec pour ton
astuce !



Je vs souhaite une bonne journée !

Bruno
BKnet Messages postés 4 Date d'inscription dimanche 30 octobre 2005 Statut Membre Dernière intervention 14 février 2006
14 févr. 2006 à 12:04
Heu... c'est juste pour valider les réponses...

A bientôt
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 févr. 2006 à 12:38
Salut,
si c'est pour valider les réponses il faut cliquer sur le bouton Réponse Acceptée des réponses qui te conviennent

@+
Cirec
cs_amina27 Messages postés 5 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 28 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és 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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.

Bonne chance et

@+
Cirec
Rejoignez-nous