AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rekursiver Methodenaufruf mit TTimer

Ein Thema von TForm1 · begonnen am 22. Nov 2014 · letzter Beitrag vom 22. Nov 2014
Antwort Antwort
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#1

Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:06
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?
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:11
Du kannst kein Objekt prüfen, was noch nicht da ist. Und auch mit Assigned geht das nicht.

Assigned prüft lediglich, ob die Referenz-Variable <> 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:15
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:49
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.
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:50
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Rekursiver Methodenaufruf mit TTimer

  Alt 22. Nov 2014, 19:58
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 . 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.
Der Fehler sitzt immer vor dem Computer...

Geändert von TForm1 (22. Nov 2014 um 20:01 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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