Du hast nur ein Problem und darauf begründet sich das ganze Verhalten:
Zitat von
Bbommel:
..., überschreibe ich das Delete von TList und gebe dann dort das entsprechende Objekt frei
Du hast kein Delete() überschrieben sondern das Original versteckt. Da Delete() in TList nicht virtuell bzw. dynamisch ist, kannst du diese Methode gar nicht überschreiben. Du kannst nur ein neues Delete() einführen und somit das alte verdecken. In TList.Clear wird Delete() von TList aufgerufen und da es nicht virtuell ist, kannst/hast du es nicht überschrieben. Dein Delete() ist ein komplett neues Delete und TList weiss nichts von deiner abgeleiteten Klasse.
Mach es doch wie TObjectList: TList implementiert eine Notify() Methode (virtuell) und dort kommt er mit jedem Item durch, wenn es hinzugefügt, entfernt oder extrahiert wird. Genau dort setzt auch TObjectList an um die Einträge freizugeben.