![]() |
Rekursiver Methodenaufruf mit TTimer
Hallo zusammen,
ich habe mehrere Fragen zur Lösung folgenden Problems: Ich habe eine Methode mit Parametern, welche einmal aufgerufen wird und dann diverse Prüfungen vornimmt. Falls diese Prüfungen negativ ausfallen, soll nach 5 Sekunden dieselbe Methode noch mal mit denselben Werten als Parameter aufgerufen werden.
Delphi-Quellcode:
1. Frage: Wie kann ich ein Objekt prüfen, wenn es noch gar nicht existiert und vorher auch nicht existierte? Kann man auch in so einem Fall assigned() verwenden?
procedure TFoo.macheIrgendEtwas(aValue: integer, Sender: TObject);
var aTimer: TTimer; ergebnis: boolean; begin if assigned(aTimer) then //Assigned nur nach FreeAndNil? begin if aTimer.Enabled then aTimer.Enabled:= false; end else aTimer:= TTimer.Create(nil); ergebnis:=pruefe(aValue); if ergebnis = false then begin aTimer.Interval:= 5000; aTimer.OnTimer:= macheIrgendetwas; //wie kann man hier aValue übergeben? aTimer.Enabled:= true; exit; end else aTimer.FreeAndNil; //Hier entsprechend weitere Behandlungen end; 2. Frage: Wie kann ich das OnTimer event so aufrufen, dass er immer den Parameter vom vorherigen Aufruf benutzt? 3. Frage: So, wie ich oben das OnTimer- Event festlege, sagt der Compiler mir immer: Got TFoo.TFoo.macheIrgendEtwas(LongInt, TObject), expected <procedure variable type of procedure(TObject) of object;Register>, was mache ich falsch? |
AW: Rekursiver Methodenaufruf mit TTimer
Du kannst kein Objekt prüfen, was noch nicht da ist. Und auch mit
Delphi-Quellcode:
geht das nicht.
Assigned
Delphi-Quellcode:
prüft lediglich, ob die Referenz-Variable <>
Assigned
Delphi-Quellcode:
ist. Punkt.
nil
Eine Referenz ist dabei nur ein Zeiger auf einen Speicherbereich an dem eine gültige Struktur für eine Instanz liegen kann, mal dort gewesen ist oder zukünftig dort liegen könnte oder auch niemals dort sein wird. |
AW: Rekursiver Methodenaufruf mit TTimer
Gerade gesehen:
Eine lokale Variable ist immer (immer? ja immer, wirklich immer) als nicht initialisiert zu betrachten (bis diese initialisiert wurde). Und bei jedem Aufruf der Methode ist diese Variable nicht initialisiert und wird auch nie niemals nicht gespeichert! Das was du da so vor hast geht gar nicht. Somit als Antwort auf deine letzte Frage: Alles :mrgreen: |
AW: Rekursiver Methodenaufruf mit TTimer
also muss ich wohl oder übel meine Timerdeklaration in die Klasse verschieben. Dann fällt auch die ganze Assign- Abfragerei weg. Damit wäre dieses Problem schon einmal gelöst.
Nächste Frage wäre jetzt, wie ich die Aufrufe entsprechend Rekursiv gestalten kann, d.h. wie ich den/die Parameter übernehmen kann. |
AW: Rekursiver Methodenaufruf mit TTimer
Zitat:
|
AW: Rekursiver Methodenaufruf mit TTimer
Gut, so gehts natürlich auch. Ich hatte irgendwie gehofft, dass ich meine Klasse nicht mit derartigen Variablen zumüllen muss, da diese ja eigentlich gar nicht in der gesamten Klasse verfügbar sein müssen :roll:. Naja, geht wohl nicht anders, wenigstens funktionierts jetzt.
PS: Theoretisch könnte ich mir für diese eine Methode und deren Variablen eine eigene Klasse schreiben, aber besonders praktisch wäre das wahrscheinlich auch nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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 by Thomas Breitkreuz