Guten Tag,
Ich verwende das erste mal eine TObjectList. Leider bekomme ich nun beim close; des Forms eine
exception:
EInvalidPointer 'Ungültige zeigeroperation'.
Programmbeschreibung:
Anhand einer Mitarbeiter Tabelle erstelle ich Frames. Für jeden Mitarbeiter erzeuge ich ein Frame, dies füge ich einer TObjectList(PersonList) hinzu. Der Owner bei der TObjectList ist auf true.
Wenn man TComponent-Abkömmlinge in einer TObjectlist mit OwnsObjects = true ablegt muss man sich sehr genau überlegen, wie denn nun die Verwaltung der Lebensdauer sein soll. TComponents haben normalerweise einen Owner, der automatisch alle Komponenten zerstört, wenn er selbst zerstört wird. Bei TControls ist das noch verschärft, da die auch noch einen Parent haben müssen, damit sie angezeigt werden. Der Parent ist ein Psychopath per excellance: er ermordet alle seine Kinder bevor er selbst ins Jenseits entschwindet
. Es gibt da also reichlich Potential für Konflikte, zumal die Objectlist ja nicht mitbekommt, wenn ein in ihr enthaltenes Objekt anderswo zerstört wird. Sie enthält dann ungültige Objektreferenzen, die solche pointer-Fehler erzeugen, wenn die TObjectlist versucht, ihren Inhalt zu free-en.
In deinem Fall mußt Du also
unbedingt die TObjectlist löschen und darfst dann auch keinen Fall mehr versuchen, eines der Frames "anzufassen", die existieren dann nämlich nicht mehr. Kode in TComponent sorgt dafür, dass der Owner benachrichtigt wird, wenn sein Eigentum externem Vandalismus anheim fällt, da gibt es also keine Probleme, und auch die Parent <-> Child Beziehung wird ordentlich beendet. Deine TObjectlist ist aber außerhalb der automatischen Verwaltung der Lebensdauer, da bist Du also selbst dafür verantwortlich, eine enthaltene Objektreferenz zu entfernen, wenn Du das Objekt anderswo zerstörst. TObjectlist hat eine Extract-Methode dafür, die entfernt eine Referenz aus der Liste ohne zu versuchen, die freizugeben.