Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Rekursiver Methodenaufruf mit TTimer (https://www.delphipraxis.net/182868-rekursiver-methodenaufruf-mit-ttimer.html)

TForm1 22. Nov 2014 19:06

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:
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;
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?
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?

Sir Rufo 22. Nov 2014 19:11

AW: Rekursiver Methodenaufruf mit TTimer
 
Du kannst kein Objekt prüfen, was noch nicht da ist. Und auch mit
Delphi-Quellcode:
Assigned
geht das nicht.

Delphi-Quellcode:
Assigned
prüft lediglich, ob die Referenz-Variable <>
Delphi-Quellcode:
nil
ist. Punkt.

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.

Sir Rufo 22. Nov 2014 19:15

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:

TForm1 22. Nov 2014 19:49

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.

Sir Rufo 22. Nov 2014 19:50

AW: Rekursiver Methodenaufruf mit TTimer
 
Zitat:

Zitat von TForm1 (Beitrag 1280787)
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.

Was machst du mit dem Timer? Mach das auch für den Wert ;)

TForm1 22. Nov 2014 19:58

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 16:07 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