Ich glaube, dass das ganze mit der Komponente VirtualStringTree zu tun hat. In der OnCloseQuery gebe ich das VST frei und irgendwie habe ich die Vermutung, das der Fehler dabei auftreten tut. Nach der Fehlermeldung ist der VST nicht mehr sichtbar und die Anwendung ansonsten noch offen. Außerdem verwende ich in der VST Objekte.
Wenn du den VirtualStringTree (VST) nicht selbst erzeugst, darfst du ihn auch nicht selbst freigeben. Legst du einen
VST auf die Form, erhält dieser automatisch die Form als Eigentümer (
Owner) und wird somit automatisch freigegeben, wenn die Form freigegeben wird. Mit irgendwelchen Objekten, die du dem
VST zuweist, ist es ähnlich: Du mußt feststellen, ob diese Objekte beim Zerstören des
VST ebenfalls zerstört werden und wenn nicht, diese Objekte zuerst freigeben.
Im Übrigen sollte man Freigaben niemals im
OnCloseQuery machen, sondern immer im
OnDestroy, weil erst im
OnDestroy sichergestellt ist, daß die Zerstörung nun wirklich begonnen hat und auch durchgeführt wird. So könnte im
OnClose, das nach
OnCloseQuery aufgerufen wird (wenn
CanClose = True), auch etwas anderes als das
caFree vereinbart werden oder worden sein; der Standard-Wert ist nämlich
caHide. Nur wenn die zu schließende Form auch die Mainform ist, wird bei
OnClose automatisch
caFree aufgerufen.
Um genau herauszufinden, wo diese ominösen Memory-Leaks entstehen, wäre es zielführend, das Programm-Ende ein- oder mehrmals sorgfältig durchzusteppen. Beim letzten meiner Kunden, der dieses Problem hatte, wurde in seiner vollkommen undurchschaubaren Anwendung mehrfach
OnClose oder
OnDestroy aufgerufen, was sich natürlich fatal auf die saubere Beendigung des Programms auswirkt. Oft werden bei älteren Anwendungen auch massenweise Hinweise und Warnungen mitgeschleppt und ignoriert (besagter Kunde erzeugte bei jedem Kompilierungsvorgang mehrere Hundert!). Da muß man sich einfach die Zeit nehmen, das einmal in aller Ruhe zu bereinigen. Häufig erledigen sich dadurch bereits zahlreiche Fehlerquellen, vor allem beim Beheben von Warnungen über nicht initialisierte Variablen.