Entwickler-Ecke

Sonstiges (Delphi) - Verzögerung mit Timer?


GR-Thunderstorm - Di 09.05.06 20:02
Titel: Verzögerung mit Timer?
Ich will in eine Schleife eine Verzögerung einbauen. Die Schleife dient dem Zweck, ein Bild zu bewegen.

Der Teil mit der Schleife zur Bewegung sieht soweit so aus:

for i:= 1 to 10 do
begin
image1.left:=image1.left+1;
end;


Wie bekomm ich es hin, dass Delphi eine kurze Zeit wartet, bevor es i weiter erhöht und das Bild somit weiterbewegt?

Wieso funktioniert der aus Pascal bekannte befehl delay(100); nicht in Delphi?


Narses - Di 09.05.06 20:09

Moin und :welcome: im Forum!

Du kannst vermutlich besser mit GetTickCount arbeiten, einfach das Wort eingeben und F1 drücken. ;)

Ansonsten: die Suchfunktion Suche in: Delphi-Forum, Delphi-Library DELAY SLEEP

cu
Narses


fidionael - Di 09.05.06 20:09

Delay gibt es nicht mehr auf Grund des nun etablierten Multi-Tasking :-)

Das Äquivalent ist

Delphi-Quelltext
1:
sleep(Zeit_in_ms);                    


starsurfer - Di 09.05.06 20:10

dafür gibt es jetzt sleep(100).
Davon ist aber abzuraten weil das Programm dann einfriert, nehm lieber:


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.left+1
end;


Gausi - Di 09.05.06 20:47

Um auf den Titel des Threads zurückzukommen: Es geht auch mit nem Timer. Ins OnTimer.Event kommt dann:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// Damits irgendwann stoppt
if Timer1.Tag = 10 then Timer1.enabled := false;
// Bild verschieben
image1.left:=image1.left+1;
// tag erhöhen
Timer1.Tag := Timer1.Tag + 1;


Gestartet wird das dann z.B. mit

Delphi-Quelltext
1:
2:
3:
4:
// Tag zurücksetzen
timer1. Tag := 0;
// timer starten
timer1.enabled := True;


GR-Thunderstorm - Di 09.05.06 21:59

Das sieht ziemlich kompliziert aus... :?!?:

Das Problem ist, ich habe 4 verschiedene Schleifen. Ums auch für euch übersichtlich zu halten schreib ich die wichtigsten Punkte mal auf:


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:
28:
29:
30:
31:
32:
33:
34:
35:
begin

 if key = 'd' then
 begin
   for i:=1 to 10 do
     begin
     image1.left:=image1.left+1;
     end;
 end;

 if key = 'a' then
 begin
   for i:=1 to 10 do
     begin
     image1.left:=image1.left-1;
     end;
 end;

 if key = 'w' then
 begin
   for i:=1 to 10 do
     begin
     image1.top:=image1.top-1;
     end;
 end;

 if key = 's' then
 begin
   for i:=1 to 10 do
     begin
     image1.top:=image1.top+1;
     end;
 end;

end;


Ich möchte nicht, dass sich mein Bild so ruckhaft immer gleich um 10 Pixel verschiebt, es soll ganz geschmeidig in 10-Pixel-Abständen über den Bildschirm gleiten...

Moderiert von user profile iconGausi: I- durch Delphi-Tags ersetzt. Um es noch ein bißchen übersichtlicher zu machen ;-)


fidionael - Di 09.05.06 22:32

Ich sehe jetzt allerdings nicht so richtig dein Problem dabei - du kannst es doch immer noch alles in eine Timer-Prozedur stecken und wenn du je Timer-Aufruf um 1px verschiebst, bei einem Interval von ca 20-30ms sollte eine flüssige Animation entstehen.

Mfg


GR-Thunderstorm - Mi 10.05.06 11:51

Ich hab das ganze jetzt ohne Timer hinbekommen.
Trotzdem danke an euch! :)


DaKirsche - Mi 10.05.06 12:35

Mit Timer :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Tag := Timer1.Tag +1;
  if (Timer1.Tag = 10then
    begin
      Image1.Left := Image1.Left -1;
      Timer1.Tag := 0;
    end;
end;


Ohne Timer :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var Ticker : integer;
begin
Form1.DoubleBuffered := True;
 repeat
    Ticker := 0;
    Image1.Left := Image1.Left -1;
   repeat
      Ticker := Ticker + 1;
      sleep(10);
      Application.Processmessages;
   until (Ticker > 2);
    Application.Processmessages;
  until (Image1.Left <= 5);
end;


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