AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Delphiprozedur auf das deaktivieren eines Timers warten lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Delphiprozedur auf das deaktivieren eines Timers warten lassen

Ein Thema von Cookiesucht · begonnen am 25. Feb 2013 · letzter Beitrag vom 21. Mär 2013
Antwort Antwort
Cookiesucht

Registriert seit: 25. Feb 2013
2 Beiträge
 
#1

Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 25. Feb 2013, 20:56
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 25. Feb 2013, 21:35
Delphi-Quellcode:
while timer1.enabled do
  Application.ProcessMessages;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.034 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 25. Feb 2013, 23:09
Er hat Jehova gesagt!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 26. Feb 2013, 12:31
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 26. Feb 2013, 13:56
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.
  Mit Zitat antworten Zitat
Cookiesucht

Registriert seit: 25. Feb 2013
2 Beiträge
 
#6

AW: Delphiprozedur auf das deaktivieren eines Timers warten lassen

  Alt 21. Mär 2013, 18:44
Vielen Dank für eure Antworten. Ihr habt mir echt geholfen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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