![]() |
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. :) |
Re: Welcher Timer
pack es doch einfach mit in das OnTime event
|
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.
|
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:
2: oder in jedem Parameter Tag (siehe OI) eine andere Zahl eintragen und siese auswerten:
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;
Delphi-Quellcode:
{Timer1.Tag = 1}
{Timer1.Tag = 2} {...} Procedure TForm1.TimerXTimer(Sender: TObject); Begin ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag)); End; |
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.
|
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:
an die Zahl rankommen, oder, wenn dir auch der Name des Timers (Bsp: Timer1) genehm ist, mit
'Ich bin Timer: '+ IntToStr(Sender.Tag)
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...). |
Re: Welcher Timer
Zitat:
Delphi-Quellcode:
geht das schon eher...
'Ich bin Timer: '+Sender.Name
|
Re: Welcher Timer
Zitat:
Aber wenn ich das richtig im Köpfchen hab, hat TObject Tag nicht drin. |
Re: Welcher Timer
Zitat:
@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: |
Re: Welcher Timer
[OT]Na dann schämm dich :warn: :P [/OT]
|
Re: Welcher Timer
Danke für die zahlreichen Antworten. :)
Ich werds gleich mal ausprobieren. |
Re: Welcher Timer
Zitat:
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. |
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:
Ich Lese also die Dauer bis zum nächsten Aufruf aus einer Ini und Setze das Event so...
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; Wenn ich das jetzt mache wie oben beschrieben:
Delphi-Quellcode:
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).
procedure TForm1.TimerEvent(Sender: TObject);
begin ShowMessage('Ich bin Timer: '+IntToStr(TTimer(Sender).Tag)); // Oder Sender.Tag oder auch If Sender = Timer1 ... end; /edit: Ich bin natürlich für allgemeine Tips zu Delphi oder Hinweise auf Schönheitsfehler dankbar! |
Re: Welcher Timer
1. Zähler-Variable im Zähler verwendet :warn:
Code:
2. wozu das Array - das ist doch total sinnlos
for i := [color=red]i[/color] downto 1 do
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; |
Re: Welcher Timer
Zitat:
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:
Ja, Null stand da. Zitat:
Aber danke, ich denk so wirds gehen. :) Echt nett hier das Forum! :D |
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:
Ohne Timer-Array:
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;
Delphi-Quellcode:
Ohne Timer-Variable:
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;
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; |
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 08:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz