![]() |
Delphiprozedur auf das deaktivieren eines Timers warten lassen
Jo hi!
Ich mache eine Animation mit nem Timer in Delphi. In meiner "Hauptprozedur" wird den Timer sozusagen Aktiviert (Timer1.Enable=true; ), beim event OnTimer ein Bild um jeweils ein paar Pixel verschoben und wenn das bild irgendwann an seinem ziel angekommen ist, wird der Timer wider deaktiviert. Das Problem ist, dass die "Hauptprozedur" sozusagen weiterläuft. Wisst ihr vielleicht Was man machen muss damit die Hauptprozedur darauf wartet, dass der timer beendet worden ist und dann erst fortfährt. "Sleep()"geht nicht weil dann gleich ales eingefrohren ist und wenn ich ne while-schleife widerholen lasse bis der timer beendet wurde(while timer1.enabled=true do begin end; ) weil es sich dann total aufhängt. Vielleicht würde es auch gehen wenn man die variablen aus der "hauptprozedur" als Parameter an die onTimer prozedur weitergibt und der dann ne neue prozedur mit den variablen ausfüht, aber ist auch wider schwierig die Patameter an die OnTimer prozedur weiterzugeben. Naja vielleicht findet sich ja einer der ne Lösung parat hat :-D |
AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
Delphi-Quellcode:
while timer1.enabled do
Application.ProcessMessages; |
AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
Er hat Jehova gesagt!
|
AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
Du könntest deine Hauptprocedure auch in zwei Proceduren aufteilen. Der erste Teil wird vor aktivieren des Timers ausgeführt, und den zweiten Teil führst du nach aktivieren des Timers aus. Die Parameter könntest du dann (sofern möglich) im Private/Protected Teil deiner Klasse ablegen.
|
AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
In der Informatik gibt es sogenannte
![]() Wenn du eine bestimmte Abfolge von Aktionen haben möchtest, dann wäre das ein heiser Kandidat. Im Formular benötigst du eine Variable für den aktuellen Zustand:
Delphi-Quellcode:
Du startest den Zustandsautomaten mit einem Button:
TForm1 = class(TForm)
private zustand : Integer; ... end;
Delphi-Quellcode:
Im Timer Event liegt die Hauptarbeit:
procedure TForm1.StartButtonClick(Sender:TObject);
zustand := 0; // Anfangszustand Timer1.Interval := 800; // alle 0,8s ein Zustandwechsel Timer1.Enabled := True; end;
Delphi-Quellcode:
In dem Beispiel läuft "zustand" von 0 bis 6 durch und dann endet das Ganze.
procedure TForm1.Timer1Timer(Sender:TObject);
var neu_zustand : integer; begin neu_zustand := zustand + 1; case zustand of 0: self.Color := clGreen; // Hintergrund grün 1: MovePlayerLeft; // Spielfigur bewegen 2: MovePlayerLeft; // Spielfigur bewegen 3: MovePlayerUp; 4: MovePlayerUp; 5: self.Color := clWindow; 6: Timer1.Enabled := False; // Animation beendet, Timer abstellen end; zustand := neu_zustand; end; Es ist aber durchaus möglich, von dem normalen Ablauf abzuweichen und abhängig von einer Bedingung zu jedem anderen Zustand zu springen:
Delphi-Quellcode:
Denk auch daran, dass du je nach Zustand den Timer schneller oder langsamer machen kannst.
procedure TForm1.Timer1Timer(Sender:TObject);
var neu_zustand : integer; begin neu_zustand := zustand + 1; case zustand of 0: self.Color := clGreen; // Hintergrund grün 1: MovePlayerLeft; // Spielfigur bewegen 2: MovePlayerLeft; // Spielfigur bewegen 3: begin MovePlayerUp; // nach oben if ShapePlayer.Top > 20 then neu_zustand := 2; 5: self.Color := clWindow; 6: Timer1.Enabled := False; // Animation beendet, Timer abstellen end; zustand := neu_zustand; end; Viel Spass beim Ausdenken deiner Animation! Man kann die Zustandvariable auch mit einem ![]() Für den Anfang würde ich aber bei einem Integer bleiben, weil das weniger Schreibarbeit ist und mehr Raum für spontane Änderungen lässt. |
AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
Vielen Dank für eure Antworten. Ihr habt mir echt geholfen
:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 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