Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Delphiprozedur auf das deaktivieren eines Timers warten lassen (https://www.delphipraxis.net/173453-delphiprozedur-auf-das-deaktivieren-eines-timers-warten-lassen.html)

Cookiesucht 25. Feb 2013 20:56

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

Bummi 25. Feb 2013 21:35

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
 
Delphi-Quellcode:
while timer1.enabled do
  Application.ProcessMessages;

Uwe Raabe 25. Feb 2013 23:09

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
 
Er hat Jehova gesagt!

SirThornberry 26. Feb 2013 12:31

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.

sx2008 26. Feb 2013 13:56

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen
 
In der Informatik gibt es sogenannte Zustandsautomaten.
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:
TForm1 = class(TForm)
private
  zustand : Integer;
...
end;
Du startest den Zustandsautomaten mit einem Button:
Delphi-Quellcode:
procedure TForm1.StartButtonClick(Sender:TObject);
  zustand := 0; // Anfangszustand
  Timer1.Interval := 800; // alle 0,8s ein Zustandwechsel
  Timer1.Enabled := True;
end;
Im Timer Event liegt die Hauptarbeit:
Delphi-Quellcode:
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;
In dem Beispiel läuft "zustand" von 0 bis 6 durch und dann endet das Ganze.
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:
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;
Denk auch daran, dass du je nach Zustand den Timer schneller oder langsamer machen kannst.

Viel Spass beim Ausdenken deiner Animation!
Man kann die Zustandvariable auch mit einem Aufzählungstyp abbilden.
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.

Cookiesucht 21. Mär 2013 18:44

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 02:58 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