Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TObjectList: AV wenn OwnsObject := True (https://www.delphipraxis.net/84818-tobjectlist-av-wenn-ownsobject-%3D-true.html)

Die Muhkuh 22. Jan 2007 14:58

Re: TObjectList: AV wenn OwnsObject := True
 
Du musst das schon mit diesem TImageEnVect versuchen, alles andere hat keinen Sinn :roll:

Der_Unwissende 22. Jan 2007 15:13

Re: TObjectList: AV wenn OwnsObject := True
 
Zitat:

Zitat von Luckie
Auch damit bekomme ich eine AV, auch wenn ich im Destruktor den parent auf nil setze:
Delphi-Quellcode:
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.

Angel4585 22. Jan 2007 15:17

Re: TObjectList: AV wenn OwnsObject := True
 
Zitat:

Zitat von Die Muhkuh
Du musst das schon mit diesem TImageEnVect versuchen, alles andere hat keinen Sinn :roll:

Hab ich jetz au gemacht, hab alles gemacht was Luckie da oben auch zugewiesen hat, kommt immernoch kein Fehler... :gruebel:

Edit: jetzt wo ich die Kompos schon hab kannst des ding au ma schicken oder?

Hawkeye219 22. Jan 2007 15:44

Re: TObjectList: AV wenn OwnsObject := True
 
Hallo Leute,

ich habe jetzt noch einmal mit TComponentList und Delphi 6 getestet. Beliebig viele TImage-Komponenten (Owner=nil) werden dynamisch erzeugt und auf einem Panel abgelegt, zusätzlich werden Referenzen auf die TImages in einer TComponentList (OwnsObjects=True) gespeichert. Nach dem Zerstören des Panels und der damit verbundenen automatischen Freigabe der TImages enthält die TObjectList keine Elemente mehr. Beim Freigeben der Form kann somit in deren OnDestroy-Handler die Liste ohne Probleme freigegeben werden. Auch das Freigeben der Liste zur Laufzeit funktioniert, die TImages werden dann automatisch vom Panel entfernt. Das alles funktioniert ohne Änderung an der TComponentList.

Der Fehler muß meiner Meinung nach im restlichen Code zu suchen sein - vielleicht in der Komponente TImageEnVect, wie Die Muhkuh ja in Beitrag #14 schon angedeutet hat.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz