Guten Morgen,
ich habe seit gestern Abend das seltsame Problem, dass der Destructor Destroy() einer Klasse ausgeführt wird, ohne ihn aber gerufen zu haben, auch nicht mit FreeAndNil() oder dergleichen. Anschließend landet meine Anwendung in einer Endlosschleife und meldet eine
Exception "Stack-Überlauf".
Ich habe das folgende Konstrukt: ich lade aus der Datenbank Datensätze und erzeuge daraus ein paar Daten-Objekte, welche ich in einer TList "speichere". Ich kann dann jeweils eine Form zu einer dieser Objekte erzeugen, über welche ich dann die Werte bearbeiten kann. Der Form übergebe ich eben eine Referenz.
Nun habe ich parallel dazu einen Timer-Manager geschrieben, welcher in regelmäßigen Abständen Werte in der Datenbank ändert. Wird nun eine Form zu einem Datensatz geöffnet registriere ich das Daten-Objekt beim Timer-Manager, was ich so realisiert habe, dass ein passendes Objekt erzeugt wird, welches als Referenz das Daten-Objekt erhält, um das neu erzeugte Objekt später wieder passend auffindbar zu machen. Dieses neue Objekt schiebe ich dann in eine TList vom Timer-Manager.
Jetzt kommt das Problem und die Situation die ich nicht verstehe: wenn ich nun die Form schließe, dann teile ich dem Timer-Manager in der OnClose()-Methode mit, dass er doch bitte das Objekt in seiner TList, passend zum Daten-Objekt, freigeben soll. Ich suche mir das passende Objekt heraus, dann folgt ein TList.Delete() und anschließend ein FreeAndNil() auf dieses Objekt. Davon dürfte ja das Daten-Objekt nicht betroffen sein, allerdings wird genau da danach dann die Destroy()-Methode des Daten-Objekts aufgerufen und ich habe keine Ahnung wieso
es kann ja wohl nicht an der Referenz liegen, da sonst sämtliche Datenstrukturen in meiner Anwendung Schrott wären und bisher hat es ja auch so funktioniert.
Vielleicht hilft es noch, wenn ich euch mitteile, dass die Klasse zum Datenobjekt und die Objekte im Timer-Manager vom selben Interface abgeleitet sind, was aber nicht das Problem sein darf, da dies ja nur eine Vorschrift für die Klasse ist, oder!? Ich weiß grad selbst nicht mehr recht ein und aus... das kann es echt nicht sein.
PS: ich würde ja gerne einen Quelltext exportieren, allerdings ist das Projekt sehr umfangreich und es würde zu lange dauern. Außer ich komme eben nie auf eine Lösung, dann muss ich das wohl tun.
Mit freundlichen Grüßen
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)