Coloration decalee avec TDrawGrid

lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013 - 9 juin 2011 à 15:02
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 9 juin 2011 à 18:08
Bonjour, je dois faire un morpion sous Delphi. Pour les cases du jeu j'utilise un DrawGrid de 3x3. A l'appel de la procedure DrawGridSelectCell c-a-d a la selection d'une case avec la souris, je souhaite la colorier en fonction du joueur. Cela marche mais mon probleme c'est que c'est decale. En effet, je click sur une case et c'est au bout de 1 ou 2 clicks suplementaie que la case du debut se colorie enfin et ansi de suite..

procedure TFormetableau.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var rect: TRect;
begin
lignecliquee := Arow; //récupère la ligne cliquée
colonnecliquee := ACol; //récupère la colonne cliquée
if Monjeu [colonnecliquee,lignecliquee] <> 0 then
        showmessage('Case deja jouée')
else
begin
        if (joueur=1) then
        begin
                Monjeu [colonnecliquee,lignecliquee]:=1;
                drawgrid1.canvas.brush.color := clred;
                rect := drawgrid1.CellRect(colonnecliquee,lignecliquee);
                joueur:=2;
                nbcoups := nbcoups -1;
        end
        else if (joueur=2) then
        begin
                Monjeu [colonnecliquee,lignecliquee]:=2;
                drawgrid1.canvas.brush.color := clgreen;
                rect := drawgrid1.CellRect(colonnecliquee,lignecliquee);
                joueur:=1;
                nbcoups := nbcoups -1;
        end;
        peindre;
end;
if nbcoups = 0 then  showmessage('Partie finie') ;
end;


procedure  TFormetableau.peindre;
var     i,j : integer;
rect : Trect;
begin
      for i:=0 to 2 do
        begin
           for j:=0 to  2 do
           begin
               if (Monjeu[i,j]= 0) then
               begin
                        drawgrid1.canvas.brush.color := clwhite;
                        rect := drawgrid1.CellRect(i,j);
                        drawgrid1.Canvas.FillRect(rect);
               end
               else if (Monjeu[i,j]= 1) then
               begin
                        drawgrid1.canvas.brush.color := clred;
                        rect := drawgrid1.CellRect(i,j);
                        drawgrid1.Canvas.FillRect(rect);
               end
               else if (Monjeu[i,j]= 2) then
               begin
                        drawgrid1.canvas.brush.color := clgreen;
                        rect := drawgrid1.CellRect(i,j);
                        drawgrid1.Canvas.FillRect(rect);
               end;
           end;
      end;
end;


Monjeu est un tableau d'entier de 3x3 qui stock les coup: 1 pour le joueur 1, 2 pour le joueur 2 et 0 pour vide.

Avez vous une idee svp ? Je suis bloque depuis plusieurs heures.


l3KTr0 Was HeRe

2 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
9 juin 2011 à 16:34
Bonsoir,

juste un truc :
// lignecliquee := Arow; //récupère la ligne cliquée
 //colonnecliquee := ACol; //récupère la colonne cliquée


ne sert à rien, écrire directement
if Monjeu [ACol,Arow] <> 0 then...


ce qui en réglera pas ton souci mais ça fait du bien..
pour la coloration, je la ferai directement dans la procédure de sélection.

cantador
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 juin 2011 à 18:08
Salut,

ton évènement "Peindre" tu peux le virer, il faut implémenter le "OnDrawCell" de ton DrawGrid et dans le "OnSelectCell" tu remplaces l'appel à "Peindre" par "DrawGrid1.Invalidate;" et ça devrait fonctionner


[hr]@+Cirec
[hr]
0
Rejoignez-nous