Faire une pause pendant un dessin avec Canvas

Résolu
dbzpunkrocker Messages postés 6 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 26 février 2009 - 26 févr. 2009 à 10:57
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 27 févr. 2009 à 13:39
Bonjour,

J'ai un petit problème pour un programme : je dois dessiner avec la propriété Canvas des rectangles imbriqués les uns dans les autres. Pour cela, pas de problème. Mais lorsque je clique sur le bouton Départ, tout les rectangles sont dessinés instantanément alors que je voudrais qu'ils se dessinent les uns après les autres pour pouvoir faire une pause si je le souhaite...J'utilise alors la fonction SLEEP, mais il ne fait pas de pause entre les dessins, il fait une pause quand je clique sur le bouton Départ et il m'affiche tout les rectangles...
Pouvez-vous m'aider svp voici le code :

unit F_ex12;


interface


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


type
  Tdessin = class(TForm)
    Image1: TImage;
    depart: TButton;
    stop: TButton;
    fin: TButton;
    procedure finClick(Sender: TObject);
    procedure departClick(Sender: TObject);
    procedure stopClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  dessin: Tdessin;
  st: boolean;


implementation


{$R *.dfm}


 


procedure Tdessin.finClick(Sender: TObject);
begin
close;
end;


procedure Tdessin.departClick(Sender: TObject);
var
  x,y,i,p: integer;
begin
  p:=0;
  x:=Image1.Width;
  y:=Image1.Height;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.Pen.Width:=2;
  st:=false;
    for i:=1 to 8 do
      begin
       if st=false then
        begin
          Image1.Canvas.LineTo(p,y);
          Image1.Canvas.LineTo(x,y);
          Image1.Canvas.LineTo(x,p);
          Image1.Canvas.LineTo(p,p);
          p:=p+(x div 35);
          Image1.Canvas.MoveTo(p,p);
          x:=x-(x div 35);
          y:=y-(x div 35);
        end;


     end;
end;


procedure Tdessin.stopClick(Sender: TObject);
begin
if st=true then
  st:=false
else
  st:=true;
end;


procedure Tdessin.FormActivate(Sender: TObject);
begin
 image1.Canvas.MoveTo(0,0);
 image1.Center:=true;
end;


end.

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 févr. 2009 à 03:19
tu mets un timer sur ta fiche puis tu le regle entre 45 et 500 ms, puis :

procedure Tdessin.finClick(Sender: TObject);
begin
  close;
end;

procedure Tdessin.stopClick(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
end;

procedure Tdessin.FormActivate(Sender: TObject);
begin
   image1.Canvas.MoveTo(0,0);
   image1.Center := true;
end;

var
  Step : integer = 0;

procedure TDessin.Timer1Timer(Sender: TObject);
var X,Y,I,P : integer;
begin
  if Step = 0 then
  begin
    P := 0;
    X := Image1.Width;
    Y := Image1.Height;
    Image1.Canvas.Pen.Color := clBlack;
    Image1.Canvas.Pen.Width := 2;

  end;
 
  if (Step > 0) and (Step <= 8) then
  begin
    Image1.Canvas.LineTo(P, Y);

    Image1.Canvas.LineTo(X, Y);

    Image1.Canvas.LineTo(X, P);

    Image1.Canvas.LineTo(P, P);

    P := P + (X div 35);

    Image1.Canvas.MoveTo(P, P);

    X := X-(X div 35);

    Y := Y-(Y div 35);

  end;
 
  inc(Step);

  if Step = 9 then
  begin
    Step := 0;
    // Efface l'affichage pour refaire l'animation
    // Image1.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height));
    // Stop automatiquement l'animation a la fin
    // Timer1.Enabled := False;
  end;
end;

<hr size="2" width="100%" />
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 févr. 2009 à 13:39
petit bug a corriger :

var
  Step : integer = 0;
  X, Y, P : integer;

procedure TDessin.Timer1Timer(Sender: TObject);

<hr width="100%" size="2" />
0
Rejoignez-nous