Entwickler-Ecke

Sonstiges (Delphi) - schrittbasierter timer


dude - Sa 22.02.03 07:54
Titel: schrittbasierter timer
hi,

wie kann ich in einem Timer Quelltext den TExxt so schreiben, dass er in einem Timer-Code zuererst die erste aktion ausführt, und dann nach einer sekunde die zweite aktion. also:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Timer1.OnTimer (...)
var
 a : TTime
 b : TTime
 c : TTime
begin
a := Time;
//nach einer Sekunde dann
b := Time;
c :=  b-a;
Label1.caption := TimeToStr(c);
end;


Anonymous - Sa 22.02.03 09:34

Versuch mal mit Sleep(Millisekunden);


Delete - Sa 22.02.03 09:49

Hat der Timer ein 1sec-Intervall? Dann hätte ich eine globale Variable genommen, diese anfangs auf Null gesetzt und bei jedem "OnTimer" um Eins erhöht und dann den passenden Code ausgeführt (case).

sleep blockiert das Programm nur unnötigerweise.


dude - Sa 22.02.03 10:44

also das mit sleep(1000) funktioniert super. Bloss ist sleep ja eher ein befehl der das system auf sleep stellt. d.h. man kann dann die form nicht verschieben oder benutzen.

und das mit der globalen variable...kannst du mir da mal ein beispiel geben anhand meines beispieles oben ?Der Timer hat ein 1000 Interval (1grobe Sekunde)

Ich hatte das so mla ausprobiert. Funktionieren tut das aber nicht!

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i : Integer;
  a : TTIme;
  b : TTIme;
  c : TTIme;
begin
if i = 1 then
  begin
    b := Time;
    c := b - a;
    label1.Caption := TimeToStr(c);
    i := 0;
  end;
if i = 0 then
  begin;
    a := time;
    i := 1;
  end;
end;


Fred Ferkel - Sa 22.02.03 11:34


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:
var
  form1:Tform1;
  warteauftimer:integer=1;

implementation

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
  a : TTIme; 
  b : TTIme; 
  c : TTIme; 
begin 
if WarteAufTimer = 1 then 
  begin 
    b := Time; 
    c := b - a; 
    label1.Caption := TimeToStr(c); 
    WarteAufTimer := 0; 
  end; 
if WarteAufTimer = 0 then 
  begin; 
    a := time; 
    i := 1; 
  end;


cya


Delete - Sa 22.02.03 12:25

dude hat folgendes geschrieben:
Ich hatte das so mla ausprobiert. Funktionieren tut das aber nicht!

Eine globale Variable wird außerhalb der Prozedur deklariert und kann mit einem bestimmten Wert initialisiert werden (wie auch Fred zeigte). Eine lokale Variable, wie in deinem Codebeispiel, wird bei jedem Aufruf der Funktion/Prozedur neu erstellt. - Ich dachte an so was:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  curAction : integer = 0;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(curAction);

  case curAction of
    1: MachDies;
    2: MachDas;
    3: MachWasGanzAnderes;
    { ... }
  end;
end;

Du müsstest nur dafür sorgen, dass irgendwann der Timer gestoppt bzw. die Variable wieder auf Null zurückgesetzt wird. Sonst wird sie endlos hochgezählt, führt aber irgendwann keine passenden Aktionen mehr aus.