Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - "langsame" Schleife


Assbuild - So 04.06.06 01:25
Titel: "langsame" Schleife
Guten Abend,
ich habe folgendes Problem:
In einer Whileschleife ist eine Rechnung enthalten die x/y Koordinaten ausrechnet und sie dann einzeichnet.Diese Schleife wiederholt sich bis der Graf komplett ist. Das klappt soweit alles nur möchte ich gerne, dass nach jedem eingezeichneten Punkt etwas gewartet wird, bis der nächste Punkt eingezeichnet bzw die die Schleife wiederholt wird, damit der graf langsam,fliessend entsteht.
Ich wüsste jetzt nicht wie ich ín die Schleife ne Timerprocedur hineinsetze. Gibt es da einfache befehele die sagen "warte(x)ms" oder sowas ähnliches?
Danke schonmal im Voraus, Ole


Ironwulf - So 04.06.06 02:18

öhm sleep(), müsste dir da weiter helfen

und wennd so wie ich delphi 3 hast oder eine andere version die noch kein sleep kennt dann einfach mit nem timer

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
...   //befehle die in der schleife ausgeführt werden sollen, ohne das while am anfang
If (bedingung zum beenden der schleife) Then timer.Enabled:= False;

end;


Hack Gott - So 04.06.06 10:38

Ich würde dir aber sehr von der sleep() Funktion abraten, weil dadurch das ganze Programm "angehalten" wird, für den normalen Windows Bentuzer dürfte das dann so aussehen als ob sich deine Anwendung aufgehängt hätte.

//EDIT: Achja, beim TImer müsst du den Interval ändern um zu bestimmen, wann es immer ausgeführt werden soll.


Assbuild - So 04.06.06 13:00

Hmm, mit Sleep geht´s schonmal nicht wirklich. Da wartet das Prog nur die Zeit ab und zeichnet danach den entstatus der Schleife (also wieder alles auf einmal. Und wie ich den Timer da genau einbau kapier ich irgendwie nicht :(
Ich Poste hier mal die Procedure in der das passieren soll:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TSchusssimulation.AbschiessenClick(Sender: TObject);

begin

 y:=1;
 x:=5;
while y>0 do
begin

    {Rechnungen und Zeichnungen:}
 y:=((Sin(wink)/Cos(wink))*x)-((9.81*x*x)/(2*(geschw*geschw)*(cos(wink)*cos(wink))));
 yz:=round(y);


   with Image1.Canvas do
  begin
  pen.Width:=1;
  pen.Color:=clred;
  brush.Color:=clred;
  Ellipse(x-1,249-yz-1,x+1,249-yz+1);
  end;
x:=x+1;
{hier soll jetzt kurz gewartet werden bevor es weiter geht}
end;


 end;


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


JayEff - So 04.06.06 13:10

Bitte benutze <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG2c5a3a8b10e855a6935e51a326c108a8}</span></span> tags um deinen Code zu umschließen ... ^^
Zu deinem Problem: Application.ProcessMessages; dürfte helfen. Einfach ans ende der Schleife setzen und das sleep danach (oder davor.. oder sonst wo .. ^^ is im prinzip egal)
Also:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
with Image1.Canvas do 
begin 
   pen.Width:=1
   pen.Color:=clred; 
   brush.Color:=clred; 
   Ellipse(x-1,249-yz-1,x+1,249-yz+1); 
end
x:=x+1
Application.ProcessMessages;
Sleep(100); //100 milisekunden
end;

//edit wtf ..... ah .. geht doch .. oO


Balmung der blaue Gott - So 04.06.06 13:18

Hi,

Also so müsste es zumindest mit sleep erstmal hinhauen.
Aber ein Timer wär besser..


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TSchusssimulation.AbschiessenClick(Sender: TObject);
  begin
  y:=1;
  x:=5;
  while y>0 do
    begin

    {Rechnungen und Zeichnungen:}
    y:=((Sin(wink)/Cos(wink))*x)-((9.81*x*x)/(2*(geschw*geschw)*(cos(wink)*cos(wink))));
    yz:=round(y);


    with Image1.Canvas do
      begin
      pen.Width:=1;
      pen.Color:=clred;
      brush.Color:=clred;
      Ellipse(x-1,249-yz-1,x+1,249-yz+1);
      end;
      x:=x+1;
      end;

    sleep(100); // sollte eigentlich gehen

  end;

end.


Assbuild - So 04.06.06 13:20

Habs dochnoch selbst rausbekommen mit dem Timer...danke für die Tipps


JayEff - So 04.06.06 13:20

Nope so gehts nicht, sonder so, wie ichs bereits vor 5 minuten geschrieben hatte... :/ Bei deiner version wird er immernoch die komplette Schleife abarbeiten bevor er Zeichnet.


Balmung der blaue Gott - So 04.06.06 13:22

user profile iconJayEff hat folgendes geschrieben:
Nope so gehts nicht, sonder so, wie ichs bereits vor 5 minuten geschrieben hatte... :/ Bei deiner version wird er immernoch die komplette Schleife abarbeiten bevor er Zeichnet.


Ja, stimmt, hab ich ganz vergessen.