![]() |
Das "Vorausdenken" in einer Procedure verhindern
Hi,
ich möchte ein Programm programmieren, in dem nach einer bestimmten Zeit ein neues Bild geladen wird. Mein Problem ist, dass in einer Prozedur Delphi "vorauszudenken" scheint. Wie verhindere ich das? Beispiel: TCanvas Ich möchte meine Fläche pixelweise fülle, aber sehen wie jeder Pixel erscheint: Bis jetzt: (Kurze Wartezeit und dann eine volle Fläche :cry: )
Delphi-Quellcode:
:wiejetzt:
procedure Button1Click(Sender: TObject);
var x, y: Integer; begin for y := 0 to Image1.Height do for x := 0 to Image1.Width do Image1.Canvas.Pixels[x, y]; end; |
Re: Das "Vorausdenken" in einer Procedure verhinde
Er denkt nicht voraus, er ist zu schnell ;)
Abhilfe wäre bspw.:
Delphi-Quellcode:
procedure Button1Click(Sender: TObject);
var x, y: Integer; begin for y := 0 to Image1.Height do for x := 0 to Image1.Width do begin Image1.Canvas.Pixels[x, y]; Image1.Repaint; // oder so // vll. noch Application.ProcessMessages Sleep(20); // dann isser nicht ganz so schnell end; end; |
Re: Das "Vorausdenken" in einer Procedure verhinde
Da arbeitet Dein Rechner schneller als Du schauen kannst.
Delphi-Quellcode:
delay findest Du hier ->
procedure Button1Click(Sender: TObject);
var x, y: Integer; begin for y := 0 to Image1.Height do for x := 0 to Image1.Width do begin Image1.Canvas.Pixels[x, y]; delay(5); end; end; ![]() Grüße Klaus |
Re: Das "Vorausdenken" in einer Procedure verhinde
Na ja... Das Beispiel war schlecht... 'Tschuldigung...
Nahmen wir das hier:
Delphi-Quellcode:
Lässt ihr nun dieses Laufen passiert Folgendes:
procedure TForm1.Button1Click(Sender: TObject);
var x, y: Integer; begin Label1.Caption := 'Eins'; sleep(750); Label2.Caption := 'Zwei'; sleep(750); Label3.Caption := 'Drei'; sleep(750); Label4.Caption := 'Vier'; end; 1. Du drückst auf den Knopf... 2. Das Programm wartet für 3 * 750 Millisekunden... 3. Erst danach werden die Labels geändert... Eine Pause zwischen den Änderungen ist nicht Vorhanden... Auch nicht bei "Sleep(10000)"... :gruebel: |
Re: Das "Vorausdenken" in einer Procedure verhinde
passiert das auch wenn Du anstelle sleep delay nimmst?
Weil wenn sleep aktiv ist werden keine Systemmessages abgearbeitet. Grüße Klaus |
Re: Das "Vorausdenken" in einer Procedure verhinde
So müsste es gehen. Sichwort: Update;
Da das Label erst am Ende der Prozedur gezeichnet wird.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x, y: Integer; begin Label1.Caption := 'Eins'; Label1.Update; sleep(750); Label2.Caption := 'Zwei'; Label2.Update; sleep(750); Label3.Caption := 'Drei'; Label3.Update; sleep(750); Label4.Caption := 'Vier'; end; |
Re: Das "Vorausdenken" in einer Procedure verhinde
Danke!
"Update" funktioniert und "delay" auch! Für mich ist "delay" besser, weil ich dann nicht vor jedem Sleep eine extra Zeile Quellentext schreiben muss. (Bei langen Programmen insbesondere!) :dp: |
Re: Das "Vorausdenken" in einer Procedure verhinde
Die IMHO beste Lösung ist ein Application.ProcessMessages Aufruf nach jedem Hinzufügen eines neuen Pixels. Beim Label Beispiel ist delay schon in Ordnung. Dieses würde aber den Aufbau eines Bildes zusehr abbremsen.
Florian |
Re: Das "Vorausdenken" in einer Procedure verhinde
Wie schon gesagt:
Zitat:
Lösungen: Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz