Zitat von
Luckie:
Auch damit bekomme ich eine
AV, auch wenn ich im Destruktor den parent auf
nil setze:
self.Items[i].Parent := nil;
Das ist irgendwie alles nichts. Ich glaube, ich bleibe doch bei meiner TList.
Du solltest auch tunlichst dem Parent mitteilen, dass sein Child nicht mehr gültig ist, nicht umgekehrt. Wenn Du
control.Parent := Blubb verwendest, dann wird bei dieser Zuweisung
Blubb.insertControl(control) aufgerufen, ist Blubb hier nil, nun ja, dann wird das natürlich nicht aufgerufen, aber der alte Parent bekommt davon so nichts mit. Deswegen solltest du
removeControl (vom Parent aus) verwenden (denke die Methode heißt so, ist jetzt aber aus dem Kopf, lieber nochmal nachschauen!).
Am einfachsten ist es, wenn Du eine Liste von TComponentList ableitest, sagen wir mal TControlList. In dieser musst Du nur den Destruktor überschreiben und für alle Kinder vor dem Aufruf des geerbten Konstruktors dann etwas aufrufen wie:
Delphi-Quellcode:
var i: Integer;
begin
if self.OwnsObjects and (self.Count > 0) then
begin
for i := 0 to self.Count - 1 do
begin
self[i].Parent.RemoveControl(self[i]);
end;
end;
inherited destroy;
end;
Ach ja, natürlich darfst Du dann auch nur TControl-Instanzen einfügen.