Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#32

Re: TObjectList: AV wenn OwnsObject := True

  Alt 22. Jan 2007, 15:13
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.
  Mit Zitat antworten Zitat