Entwickler-Ecke

Multimedia / Grafik - Aktualisiern von TImage während des Prozedurablaufes


wafrie - Do 09.11.06 19:53
Titel: Aktualisiern von TImage während des Prozedurablaufes
Hallo zusammen,

ich habe folgendes Problem:

Ich möchte in einer Prozedur (zum Beispiel Button1Click) über Canvas in TImage eine Ellipse zeichnen und diese blinken lassen. Ursprünglich wollte ich diese Funktion so realisieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.image1.canvas.brush.color:=clblue;
  form1.image1.canvas.ellipse(X1,Y1,X2,Y2);
  sleep(1000);
  form1.image1.canvas.brush.color:=clwhite; //Löschen der Ellipse auf weißem Hintergrund
  form1.image1.canvas.ellipse(X1,Y1,X2,Y2);
  sleep(1000);
  form1.image1.canvas.brush.color:=clblue;
  form1.image1.canvas.ellipse(X1,Y1,X2,Y2);
  sleep(1000);
end;


Leider blinkt die Ellipse bei dieser Lösung nicht, sondern wird nach den 3 Sekunden Wartezeit einfach gezeichnet. Wie kann ich den Bildinhalt bereits während des Prozedurablaufes aktualisieren?


DaKirsche - Do 09.11.06 20:07

Setze jedesmal statt deines sleep(1000); folgendes:

Delphi-Quelltext
1:
2:
sleep(1000);
application.processmessages;


statt eines sleeps von 1000 würde ich eher eine Schleife von sleep(10) 100mal durchlaufen lassen....aber das ist nur ein Tipp nebenbei...


wafrie - Do 09.11.06 20:37

Nun funktioniert es, danke! Aber warum würdest du statt sleep(1000) hundertmal sleep(10) durchlaufen lassen?


Coder - Do 09.11.06 22:17

Image1.Repaint; tut es auch, da es nur das Image neuzeichnet.

application.processmessages; zeichnet die komplette Form neu.
Wenn du, wärend eine Prozedure arbeitet, auf einen Button klickst wird dieser erst ausgelöst wenn die Procedure zu ende ist.
Wenn du processmessages aufrufst wird er schon dann ausgelöst.
Das ist eigentlich die Hauptfunktion von processmessages.

MfG


DaKirsche - Do 09.11.06 22:29

Application.Processmessages; ruft die Eingaben ab und führt diese ggf. aus.
Image.refresh sorgt dafür, dass sich das imgage refreshed...aber man kann keine eingaben machen, wie z.B. "Form1.close" halt Button1click(Sender:TObject); oder so...korrekt.

eine Schleife deshalb, weil sleep(xxxx); für die Zeit xxxx das komplette Programm in den "Schlaf versetzt" und dann keine Eingaben annimmt. Das wird bei längeren sleep-aufrufen nervig!

lieber:

Delphi-Quelltext
1:
2:
3:
4:
for (i:= 0 to 100do begin
sleep(10);
Application.Processmessages;
end;


Dann sind zumindest noch andere Einagben wirksam...