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; 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 100) do begin sleep(10); Application.Processmessages; end; |
Dann sind zumindest noch andere Einagben wirksam...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!