Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Welcher Timer (https://www.delphipraxis.net/19589-welcher-timer.html)

ThunderX86 5. Apr 2004 20:37


Welcher Timer
 
Hi, n00b Nummer X Meldet sich das 2. mal zu Wort und hat eine Frage.

Ich habe mehrere Timer die das gleiche Event bei OnTimer aufrufen, wie kann ich dabei herausfinden welcher Timer aber gerade das Event aufgerufen hat?

Ich hätte zu Testen nämlich dann gerne etwas wie ShowMessage('Ich bin Timer: '+timernummer);

Kann mir jemand helfen? Das ist das letzte das ich für mein erstes Programm benötige damit es fertig ist. :)

Pseudemys Nelsoni 5. Apr 2004 20:39

Re: Welcher Timer
 
pack es doch einfach mit in das OnTime event

Nikolas 5. Apr 2004 20:52

Re: Welcher Timer
 
Und wenn du dieses Event nicht x-mal in jedes OnTImer-Event pasten willst, kannst du dir auch einfach eine Globale Variable nehmen und dann schreibt jeder Timer im ontimer-event seine Nummer da rein.

himitsu 5. Apr 2004 20:55

Re: Welcher Timer
 
Jedes Objekt übergibt sich ja selber beim Aufrufen einer Ereignisprozedur im Parameter Sender an die Ereignisprozedur. Und diesen Parameter kann man ja vergleichen (siehe 1), oder seine Parameter abfragen (siehe 2).

1: Sender mit den Namen der verschiedenen Timer vergleichen:
Delphi-Quellcode:
Procedure TForm1.TimerXTimer(Sender: TObject);
  Begin
    If Sender = Timer1 Then ShowMessage('Ich bin Timer: 1');
    If Sender = Timer2 Then ShowMessage('Ich bin Timer: 2');
    ...
  End;
2: oder in jedem Parameter Tag (siehe OI) eine andere Zahl eintragen und siese auswerten:
Delphi-Quellcode:
{Timer1.Tag = 1}
{Timer1.Tag = 2}
{...}

Procedure TForm1.TimerXTimer(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

alcaeus 5. Apr 2004 20:56

Re: Welcher Timer
 
Wie wärs, das ganze mit Hilfe des Sender-Parameters zu lösen? Über diesen Parameter kannst du überprüfen, welche Komponente das Ereignis ausgelöst hat. Diesen Parameter kannst du dann auch an andere Funktionen weitergeben.

tommie-lie 5. Apr 2004 20:57

Re: Welcher Timer
 
Wenn die Timer alle das gleiche Event haben, bringt es recht wenig, daß irgendwie fest in das Timer-Event einzutragen.
Stattdessen kriegt jedes VCL-Event glücklicherweise das Objekt "Sender".
Wenn du also nur die Nummer haben willst, kannst du das Tag-Property der Timer missbrauchen und in jedes der Reihe nach Zahlen eintragen und dann mit
Delphi-Quellcode:
'Ich bin Timer: '+ IntToStr(Sender.Tag)
an die Zahl rankommen, oder, wenn dir auch der Name des Timers (Bsp: Timer1) genehm ist, mit
Delphi-Quellcode:
 'Ich bin Timer: '+ IntToStr(Sender.Name)
.

P.S.: Ich bin mir nicht sicher, ab welcher Klasse es den Namen und den Tag gibt, aber in TObject dürften sie beide eigentlich schon drin sein. Wenn nicht, hilft ein cast nach TTimer (sofern das Event immer von einem Timer aufgerufen wird und nicht von was anderem oder du nur den Namen oder nur den Tag brauchst. Wenn nicht, müsstest du einen entsprechenden gemeinsamen Klassenvorfahren finden...).

alcaeus 5. Apr 2004 20:59

Re: Welcher Timer
 
Zitat:

Zitat von tommie-lie
Delphi-Quellcode:
'Ich bin Timer: '+ IntToStr(Sender.Name)

So geht das leider nicht...:warn: so
Delphi-Quellcode:
'Ich bin Timer: '+Sender.Name
geht das schon eher...

himitsu 5. Apr 2004 21:01

Re: Welcher Timer
 
Zitat:

Zitat von tommie-lie
P.S.: Ich bin mir nicht sicher, ab welcher Klasse es den Namen und den Tag gibt...

Name gibt es überall.

Aber wenn ich das richtig im Köpfchen hab, hat TObject Tag nicht drin.

tommie-lie 5. Apr 2004 21:08

Re: Welcher Timer
 
Zitat:

Zitat von alcaeus
So geht das leider nicht...:warn: so
Delphi-Quellcode:
'Ich bin Timer: '+Sender.Name
geht das schon eher...

Hmpf...

@himitsu: In letzter Zeit mache ich so wenig mit Delphi, ich hab' die Objekthierarchie der VCL schon lange nicht mehr im Kopf. Ich weiß noch, daß der Button was ist, wo man draufklicken kann :mrgreen:

himitsu 5. Apr 2004 21:23

Re: Welcher Timer
 
[OT]Na dann schämm dich :warn: :P [/OT]

ThunderX86 5. Apr 2004 21:29

Re: Welcher Timer
 
Danke für die zahlreichen Antworten. :)
Ich werds gleich mal ausprobieren.

tommie-lie 5. Apr 2004 21:31

Re: Welcher Timer
 
Zitat:

Zitat von himitsu
[OT]Na dann schämm dich :warn: :P [/OT]

Ja, reit' nur auf mir rum.
Nicht genug daß ich wegen diverser Ablenkungen zwei Minuten zu spät gepostet habe und nicht alle paarhundert Klassen auswendig kann, jetzt stellt sich auch noch die ganze DP-Gemeinde gegen mich. Toll, mein Ego ist am Boden zerstöert.

ThunderX86 5. Apr 2004 21:48

Re: Welcher Timer
 
Bisher funktionieren leider alle Lösungen nicht. :(

Liegt aber sicher an der Art wie ich die Timer erstelle... ich muss sie nämlich erstellen wärend das Programm läuft, und das mache ich so:

Delphi-Quellcode:
procedure TForm1.CreateTimers(Sender: TObject);

var
  TimerArray: ARRAY OF TTimer;
  i, j:         Integer;
 
begin

  SetLength(Timerarray, 0);

  frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0))+'frconfig.ini');
  i       := frconfig.ReadInteger('Counter', 'Foren', 0);

  j := i-1;
  SetLength(TimerArray, i);
  for i := i downto 1 do
    begin
      TimerArray[j] := TTimer.Create(nil);
      TimerArray[j].Interval := frconfig.ReadInteger('Foren', 'Timer'+IntToStr(i), 0);
      TimerArray[j].Enabled := true;
      TimerArray[j].OnTimer := TimerEvent;
      j := j-1;
    end;


end;
Ich Lese also die Dauer bis zum nächsten Aufruf aus einer Ini und Setze das Event so...

Wenn ich das jetzt mache wie oben beschrieben:

Delphi-Quellcode:
procedure TForm1.TimerEvent(Sender: TObject);
begin
  ShowMessage('Ich bin Timer: '+IntToStr(TTimer(Sender).Tag)); // Oder Sender.Tag oder auch If Sender = Timer1 ...
end;
Dann bekomme ich nur Fehler... entweder kennt der das "Tag" nicht oder es kommen andere Fehlermeldungen (Wenn ich das so aufbaue dass variable j geschickt wird).

/edit: Ich bin natürlich für allgemeine Tips zu Delphi oder Hinweise auf Schönheitsfehler dankbar!

himitsu 5. Apr 2004 23:27

Re: Welcher Timer
 
1. Zähler-Variable im Zähler verwendet :warn:
Code:
for i := [color=red]i[/color] downto 1 do
2. wozu das Array - das ist doch total sinnlos

3. bei mir geht's - bei dir sollte es aber zumindestens "0" anzeigen - da du's ja nicht zugewiesen hast ;)
PS: du solltest Tag natürlich auch festlegen

Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var Timer: TTimer;
    frconfig: TIniFile; // sowas sollte man doch eher lokal definieren
    i, j: Integer;
 
  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      For j := 1 to i do Begin
        Timer := TTimer.Create(Form1); // wegen der Freigabe macht es sich besser, das Objekt irgendwo zuzuordnen (am einfachsten dem Formular)
        Timer.Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer.Tag := j; // einen Wert für Tag festlegen
        Timer.Enabled := true;
        Timer.OnTimer := TimerEvent;
      End;
    frconfig.Free; // Freigeben sollte man die Datei natürlich auch
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

ThunderX86 6. Apr 2004 00:11

Re: Welcher Timer
 
Zitat:

Zitat von himitsu
1. Zähler-Variable im Zähler verwendet :warn:
Code:
for i := [color=red]i[/color] downto 1 do
2. wozu das Array - das ist doch total sinnlos

Hm... jo da war ich zu dumm, hab ned gewusst wie ich das am besten mach und da ich ja einen wert zuweisen muss...
Array hab ich aus dem Grund verwendet weil ich ja später von über all drauf zugreifen will, woher weiß ich jetzt in welcher Variable der Timer ist? Ich brauch ja nicht nur einen sondern mehrere... wenn ich da nur hab Timer als eine Variable, wie soll ich der mehrere Timer geben? Das is doch irgendwie unlogisch oder?

/edit: Ich hab ja auch eine Bearbeitungsfunktion, und wenn ich da in der Ini den Zeitwert ändere, muss ich ihn gleich danach wärend das Programm läuft noch beim Timer direkt ändern... wie sollte ich den betroffenen Timer sonst ansprechen?

Zitat:

Zitat von himitsu
3. bei mir geht's - bei dir sollte es aber zumindestens "0" anzeigen - da du's ja nicht zugewiesen hast ;)
PS: du solltest Tag natürlich auch festlegen

:| Jetzt weiß ich wieso das nicht ging, wenn ich den Tag nicht definier kann da ja nix sein... :|
Ja, Null stand da.

Zitat:

Zitat von himitsu
Delphi-Quellcode:
Procedure TForm1.CreateTimers(Sender: TObject);
  Var Timer: TTimer;
    frconfig: TIniFile; // sowas sollte man doch eher lokal definieren
    i, j: Integer;

Hab gelernt dass man die Ini Global machen sollte wenn man sie öfter braucht.

Aber danke, ich denk so wirds gehen. :)
Echt nett hier das Forum! :D

himitsu 6. Apr 2004 14:35

Re: Welcher Timer
 
Es geht in diesem Fall auch mit nur einer Variable, da es sich hier nur um einen Zeiger auf den mit TTimer.Create(Form1) erstellten Timer.

OK, wenn du später drauf zugreifen willst, dann sollte natürlich das Array für die Timer Global definiert sein, oder du greifst nicht über die Zeiger in einem Timer-Array zu, sondern läßt dir den entsprechenden Timer suchen.

Das mit der INI: Wenn du es so gelernt hast, dann mach es halt so - Delphi ist ja flexiebel und es gibt ja mehrere Möglichkeiten, die nicht unbedingt Falsch sind ^^


Über ein Timer-Array:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;

Var Timer: Array of TTimer;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do Begin
        Timer[i - 1] := TTimer.Create(Form1);
        Timer[i - 1].Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer[i - 1].Tag := j;
        Timer[i - 1].Enabled := True;
        Timer[i - 1].OnTimer := TimerEvent;
      End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Begin
    Timer[0].Enabled := False; // Timer1
    Timer[1].Enabled := False; // Timer2
  End;
Ohne Timer-Array:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    Timer: TTimer;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do Begin
        Timer := TTimer.Create(Form1);
        Timer.Name := 'Timer' + IntToStr(j);
        Timer.Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer.Tag := j;
        Timer.Enabled := True;
        Timer.OnTimer := TimerEvent;
      End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Var Timer: TTimer;

  Begin
    Timer := TTimer(Form1.FindComponent('Timer' + IntToStr(1)));
    Timer.Enabled := False; // Timer1
    {oder}
    TTimer(Form1.FindComponent('Timer' + IntToStr(2))).Enabled := False; // Timer2
  End;
Ohne Timer-Variable:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do
        With TTimer.Create(Form1) do Begin
          Name := 'Timer' + IntToStr(j);
          Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
          Tag := j;
          Enabled := True;
          OnTimer := TimerEvent;
        End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Var Timer: TTimer;

  Begin
    Timer := TTimer(Form1.FindComponent('Timer' + IntToStr(1)));
    Timer.Enabled := False; // Timer1
    {oder}
    TTimer(Form1.FindComponent('Timer' + IntToStr(2))).Enabled := False; // Timer2
  End;

ThunderX86 6. Apr 2004 16:10

Re: Welcher Timer
 
Danke für die Hilfe, klingt alles einleuchtend. :)
Nur muss ich mein Prog nochmal neu Anfangen (saß jetzt 3 Tage dran, aber da ich mich jetzt "auskenne" sollte ich das in ein paar Stunden schaffen) weil ich zu viele Fehler durch ausprobieren eingebaut habe.

Ich hoffe dass ich das jetzt schaffe, THX!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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