Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Timer zur Laufzeit erzeugen


grisu81 - Mi 23.07.03 19:17
Titel: Timer zur Laufzeit erzeugen
Hallo zusammen.

Ich bin ncoh ein ziemlicher Delphi-Anfänger und habe folgende Frage: Ich möchte in meinem Programm Timer zur Laufzeit erschaffen. Die Anzahl ist jeweils von den Benutzeraktionen abhängig.

Wie erzeuge ich die Timer mit von mir vorgegebenen Namen am besten und wo "speichere" ich sie? In einer Liste etc.?

Und wie weise ich diesen Timer zu, was sie ausführen sollen, wenn das OnTimer-Ereignsi eintritt?

Danke für Eure Hilfe!
Gruss
grisu81


Tino - Do 24.07.03 09:46

Hallo!

eine Komponente kannst du wie folgt dynamisch zur Laufzeit erstellen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Var
  NewTimer: TTimer;
Begin
  NewTimer := TTimer.Create (Nil);  // Nil oder z. b. Form1 oder self
  NewTimer.Interval := 1000;
  NewTimer.Enabled := True;
  NewTimer.OnTimer := DoTimer;
End;

DoTimer ist eine Procedure die aufgerufen wird wenn der festgelegte Zeitabschnitt verstrichen ist.

Da du ja mehrere Timer hast könntest du diese in ein TList-Objekt verwalten. Dazu erstellst du ganz am Anfang (z. b. im OnCreate Event der Form) die TList:

Delphi-Quelltext
1:
fList: TList.Create;                    

Wenn du dann einen neuen Timer erstellst dann fügst du den Pointer auf die Instance in die Liste hinzu:

Delphi-Quelltext
1:
fList.Add (NewTimer);                    

Beim Beenden der Anwendung musst du aber die Timer wieder freigeben (z. B. im OnDestroy Event);

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Var
  Idx: Integer;
Begin
  For Idx := fList.Count -1 DownTo 0 Do
    TTimer (fList [Idx]).Free;
End;


Gruß
Tino


grisu81 - Do 24.07.03 10:22

Herzlichen Dank!


Tino - Do 24.07.03 11:21

grisu81 hat folgendes geschrieben:
Herzlichen Dank!

Gerne :-D


grisu81 - Do 24.07.03 12:48

Für mich tut sich da gerade ein Problem auf:

Ich erstelle die Prozedur DoTimer;

Delphi-Quelltext
1:
2:
3:
4:
procedure DoTimer(Sender: TObject);
begin
{ mach irgendwas }
end;

Bei dieser Zuweisung

Delphi-Quelltext
1:
 NewTimer.OnTimer := DoTimer;                    

erhalte ich dann aber beim Compilieren die Meldung
Delphi hat folgendes geschrieben:
Inkompatible Typen: Methodenzeiger und reguläre Prozedur

Woran kann das liegen?

Gruss
grisu81

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Tino - Do 24.07.03 13:03

Hallo!

Das liegt daran das das Ereignis OnTimer eine Methode erwartet und keine normale Procedure.

Der Unterschied ist der das eine Methode in einer Klasse definiert ist. Also zum Beispiel Bestandteil der Form Klasse:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TForm1 = Class (TForm);
    {...}
    private
      Procedure DoTimer (aSender: TObject);
    {...}
    End;

{...}

procedure Form1.DoTimer(Sender: TObject); 
begin 
  { mach irgendwas } 
end;

Dann sollte es funktionieren.

Gruß
Tino