Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Fehler beim Programm beenden

  Alt 20. Okt 2015, 06:21
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.
  Mit Zitat antworten Zitat