Comment forcer une image à se redessiner ?

Résolu
racimo1985 Messages postés 13 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 10 octobre 2008 - 28 sept. 2008 à 11:20
racimo1985 Messages postés 13 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 10 octobre 2008 - 30 sept. 2008 à 23:06
Bonjour tt le monde, j besoin d'un algorithme qui force une image ( deux rectangles en formant un L) à se redessiner lorsqu'on répète l'exécution de l'application , voici un petit programme qui dessine une image en utilisant l'objet " timer"   :
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    i:integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if i>97 then begin timer2.Enabled:=true; i:=0; timer1.Enabled:=false; end
else
begin
image1.Visible:=true;
image1.Canvas.Pen.Color:=clblue;
image1.Canvas.Pen.Width:=25 ;
image1.Canvas.Rectangle(0,0,20,i);
 image1.Refresh;
i:=i+1;
end;
 end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if i>50 then begin timer3.Enabled:=true; i:=0; timer2.Enabled:=false; end
else
begin
 image2.Visible:=true;
image2.Canvas.Pen.Color:=clblue;
image2.Canvas.Pen.Width:=100;
image2.Canvas.Rectangle(0,0,i,20);
 image2.Refresh;
i:=i+1; 
end;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
if i>500 then begin  i:=0; timer3.Enabled:=false; end
else
begin
image1.Visible:=false;
image2.Visible:=false;
i:=i+1;
end;
 end;
end.

losrqu'on clic une 2eme fois sur le button1 "L "se montre entiérement dessiné ! (pas comme on a voulu par notre programme!) .
cordialemment
Racimo1985.

5 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
30 sept. 2008 à 19:55
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture := nil;
  Image2.Picture := nil;
  timer1.Enabled := false;
  timer1.Enabled := true;
end;

cantador
3
racimo1985 Messages postés 13 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 10 octobre 2008
28 sept. 2008 à 19:04
Bonsoir[../auteur/CANTADOR/705439.aspx cantador]

Le but d' utiliser le timer c de permettre l'affichage séquentiel de deux segments     (" I " (image1) suivi  par" _  " (image2)), c que je veux c une solution du problm proposé :)
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 sept. 2008 à 22:27
Déjà une petite erreur de principe, on ferme un timer avant de l'ouvrir
et ta variable i n'était pas remise à zéro puisque le timer était déclenché.
Je n'ai pas vraiment compris ce que tu veux faire exactement mais regarde si
cela te convient.

Le programme est très lent..et n'est pas très convaincant...

unit Unit1;


interface


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


type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;
  i: integer;
implementation


{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  timer1.Enabled := false;
  timer1.Enabled := true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if i > 97 then
  begin
    i := 0;
    timer2.Enabled := false;
    timer2.Enabled := true;
    timer1.Enabled := false;
  end
  else
  begin
    image1.Visible := true;
    image1.Canvas.Pen.Color := clblue;
    image1.Canvas.Pen.Width := 25;
    image1.Canvas.Rectangle(0, 0, 20, i);
    image1.Refresh;
    i := i + 1;
  end;
end;


procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if i > 50 then
  begin
    i := 0;
    timer3.Enabled := false;
    timer3.Enabled := true;
    timer2.Enabled := false;
  end
  else
  begin
    image2.Visible := true;
    image2.Canvas.Pen.Color := clblue;
    image2.Canvas.Pen.Width := 100;
    image2.Canvas.Rectangle(0, 0, i, 20);
    image2.Refresh;
    i := i + 1;
  end;
end;


procedure TForm1.Timer3Timer(Sender: TObject);
begin
  if i > 500 then
  begin
    i := 0;
    timer3.Enabled := false;
  end
  else
  begin
    image1.Visible := false;
    image2.Visible := false;
    i := i + 1;
  end;
end;


end.

cantador
0
racimo1985 Messages postés 13 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 10 octobre 2008
30 sept. 2008 à 11:23
Bonjour, merci de m'avoir accordé ton temps pour essayer de trouver une solution pour ce problème .
Au début je devais t'informer que la propriété "enable" des timer est mise à "false" , et aussi que la valeur i est initialisée dans "procedure TForm1.FormCreate(Sender: TObject)" comme suivant :
procedure TForm1.FormCreate(Sender: TObject);
begin
  i:=0;
end; 
Ton programme est lent , donc tu dois modifier la propriété "interval" des timer comme suivant :
 Timer1.interval:=10;
 Timer2.interval:=10;
 Timer3.interval:=2000;
En cliquant sur button1 tu aperçois que l'image 'L' se dessine en un mode de défilement (de haut vers le bas (image1 puis image2)), mais en cliquant une 2eme fois "L" s'affiche complètement dessinée (pas comme à la 1ere fois), c'est ça le problème à résoudre!

Racimo1985.
0

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

Posez votre question
racimo1985 Messages postés 13 Date d'inscription dimanche 10 février 2008 Statut Membre Dernière intervention 10 octobre 2008
30 sept. 2008 à 23:06
Merci infiniment !! ça marche très bien  10/10
0
Rejoignez-nous