Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Das "Vorausdenken" in einer Procedure verhindern (https://www.delphipraxis.net/71540-das-vorausdenken-einer-procedure-verhindern.html)

qb-tim 16. Jun 2006 16:59


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:
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;
:wiejetzt:

jfheins 16. Jun 2006 17:01

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;

Klaus01 16. Jun 2006 17:03

Re: Das "Vorausdenken" in einer Procedure verhinde
 
Da arbeitet Dein Rechner schneller als Du schauen kannst.

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];
        delay(5);
      end;
end;
delay findest Du hier -> http://www.delphipraxis.net/internal...ighlight=delay

Grüße
Klaus

qb-tim 16. Jun 2006 17:43

Re: Das "Vorausdenken" in einer Procedure verhinde
 
Na ja... Das Beispiel war schlecht... 'Tschuldigung...

Nahmen wir das hier:

Delphi-Quellcode:
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;
Lässt ihr nun dieses Laufen passiert Folgendes:

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:

Klaus01 16. Jun 2006 17:45

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

Martin K 16. Jun 2006 17:50

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;

qb-tim 16. Jun 2006 17:52

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:

Zacherl 16. Jun 2006 17:55

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

qb-tim 16. Jun 2006 18:57

Re: Das "Vorausdenken" in einer Procedure verhinde
 
Wie schon gesagt:

Zitat:

Zitat von qb-tim
Na ja... Das Beispiel war schlecht... 'Tschuldigung...

Es geht für mich hier vielmehr darum einen visuell vollziehbaren Vorgang (z.Bsp: Änderung eines Label, Änderung des Bildes einer Image, etc...) vom anderen zu Trennen.

Lösungen:

Zitat:

Zitat von Klaus01
delay

oder

Zitat:

Zitat von Martin K
Update



Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz