Autor Beitrag
wafrie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19


Delphi 2005 Personal
BeitragVerfasst: Do 09.11.06 19:53 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Do 09.11.06 20:07 
Setze jedesmal statt deines sleep(1000); folgendes:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19


Delphi 2005 Personal
BeitragVerfasst: Do 09.11.06 20:37 
Nun funktioniert es, danke! Aber warum würdest du statt sleep(1000) hundertmal sleep(10) durchlaufen lassen?
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for (i:= 0 to 100do begin
sleep(10);
Application.Processmessages;
end;


Dann sind zumindest noch andere Einagben wirksam...