![]() |
Timer in einer Unit
Ich brauche einen Timer in einer Unit oder Klasse (ist noch nicht klar). Bei einem Formular packe ich einfach die Timer Komponente drauf und gut ist es. Nur wie mache ich das wenn ich kein Formular habe?
Ich hab mir die Timer Komponente angeguckt, auf das nötigste, zumindest was ich für nötig halte, gestaucht, und den Code erstellt. Funktionieren tut es, gleich beim ersten Mal. Nur bei mir hat noch nie etwas beim ersten Mal funktioniert, was mich skeptisch macht. Ich brauch es nicht kompliziert, nur eben, dass etwas im Takt ausgeführt wird. In dem Code der TTimer Komponente wird noch auf WM_TIMER geprüft. Ist das nötig? Was mich wundert ist auch IDEvent. In der Api-Hilfe steht, dass der Wert nur von Null verschieden sein soll. Bei der Timer-Komponente steht da einfach ein 1. Aber so wie ich es verstanden haben wird der Wert bei KillTimer benötigt um das Ganze zu stoppen. Wie wird hier also zwischen den einzelnen Timern unterschieden?
Delphi-Quellcode:
const
IDEvent: Integer = 1; //Von Null verschieden var a: Integer = 0; procedure OnTimer; begin Inc(a) end; procedure TimerStop; begin KillTimer(Application.Handle, IDEvent); end; procedure TimerStart; var Interval: Cardinal; begin TimerStop; Interval := 1000; SetTimer(Application.Handle, IDEvent, Interval, @OnTimer); end; |
AW: Timer in einer Unit
Zitat:
Delphi-Quellcode:
MyTimer := TTimer.Create(Self);
|
AW: Timer in einer Unit
Jeder TTimer erstellt sich intern sowieso sein eigenes Form, da es unmöglich ist, abzufragen, ob auf einer Form schon Timer sind und welche IDs Diese belegen, also Nicht-TTimer, so wie Deiner, direkt über die WinAPI.
|
AW: Timer in einer Unit
Ja die WM_TIMER ist wichtig. Damit deine TTimer Komponente auch funktioniert, benötigst du im selben Thread eine Message Queue (
![]() ![]() ![]() Da ich die Window Messages nicht sonderlich mag, implementiere ich mir Timer in Units ohne Formular meistens als Thread, der X Sekunden einfach Sleept. |
AW: Timer in einer Unit
Zitat:
![]() Da er den Timer mit SetTimer(Application.Handle, IDEvent, Interval, @OnTimer); erstellt und somit eine Funktion (@OnTimer) zum Aufrufen mit übergibt, bekommt er gar kein WM_TIMER. Das WM_TIMER-Event wird nur an das Windows-Handle (hier Application.Handle) geschickt, wenn KEINE Funktion angegeben wird, sondern NULL/NIL. Die Implementation von WM_TIMER im TTimer kommt daher, das hier wahrscheinlich ein NIL als Funktion angegeben wird und somit an das TTimer ein WM_TIMER geschickt wird. Die TTimer Komponente erzeugt ein eigenes Windows-Handle und somit ist IDEvent egal, da jeder TTimer eh sein eigenes Handle hat und IDEvent dann im Kontext des Handle nur eindeutig sein muss. Wird hingegen kein Handle übergeben, so muß IDEvent eindeutig sein, um eine Trennung zwischen den verschiedenen Timer zu erreichen. Wenn Du wie hier mit Application.Handle arbeitest, brauchst Du für jeden weiteren Timer eine neue IDEvent um einen weiteren Timer mit dem selben Application.Handle zu erstellen. |
AW: Timer in einer Unit
Ich bezog mich aber doch ausdrücklich auf die TTimer Komponente, welche wohl die Windows Messages verwendet. Die
![]() |
AW: Timer in einer Unit
Sorry, dachte du meintest mit ' deine TTimer' den im ersten Posting gezeigten Quellcode.. :(
|
AW: Timer in einer Unit
Zitat:
|
AW: Timer in einer Unit
Zitat:
|
AW: Timer in einer Unit
Zitat:
Kein hWnd und nIDEvent passt zu keinem existierenden Timer, dann gibt es eine neue Timer ID. Also wird nicht generell ignoriert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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