Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Component einer ObjectList zuweisen (https://www.delphipraxis.net/110084-component-einer-objectlist-zuweisen.html)

Andreas L. 12. Mär 2008 18:23


Component einer ObjectList zuweisen
 
Abend,

ich habe eine von TComponent abgeleitete Klasse (TBookmark) mit einer Eigenschaft Folder (TFolder = ObjectList). Wenn ich jetzt im der Eigenschaft Folder einen anderen TFolder zuweise, kann ich ja im Setter der Eigenschaft das TBookmark dem TFolder zuweisen.

Delphi-Quellcode:
Folder.Items.Add(Self);
Wird dabei die Instanz von TBookmark automatisch aus der vorherigen ObjectList (TFolder) entfernt? Muss dazu evtl. die Eigenschaft OwnObjects auf True sein?

Muetze1 12. Mär 2008 22:00

Re: Component einer ObjectList zuweisen
 
Zitat:

Zitat von Andreas L.
ich habe eine von TComponent abgeleitete Klasse (TBookmark) mit einer Eigenschaft Folder (TFolder = ObjectList). Wenn ich jetzt im der Eigenschaft Folder einen anderen TFolder zuweise, kann ich ja im Setter der Eigenschaft das TBookmark dem TFolder zuweisen.

Wozu nur einen? Wenn du im Setter von der Folder Eigenschaft bist, dann wird die eine andere TFooter zugewiesen - wie du ja am Setter Argument siehst - und somit nicht ein Bookmark sondern eine Liste (genauer: eine TObjectList). Somit musst du hier aufpassen und dir deine eigene Instanz von TFolder nicht überschreiben sondern statt dessen deine Folderliste leer machen und die Elemente der übergebenen TFolder Instanz übernehmen. Nun hast du aber das Problem, das du zwei Listen hast mit Elementen die in beiden Listen jeweils vorhanden ist. Wenn nun beide Listen OwnsObject auf true haben, dann kümmern sich beide Liste um die Freigabe einer Instanz beim Clear/Delete/Remove, etc. Dadurch hat die andere TFolder Liste aber immernoch diese Instanz und der nächste der diese (ehemalige) Instanz aus der anderen Liste holt, holt sich (unter den besten Umständen) eine blutige Nase mit EInvalidPointer, EAccessViolation, ERangeCheckError Exception, etc. Oder halt er greift damit ins Klo und es passiert nichts (GAU) und der zerschiesst Daten.

Von daher: OwnsObject auf true empfiehlt sich, da nur die Komponente weiss, wann sie die Objekte in der TFolder freigeben kann und wann nicht, da sie der Hauptabnehmer bzw. Verwender der Listenelemente ist. Dadurch hast du aber auch den Zwang, dass du im Setter von TFolder die Elemente kopierst der anderen Liste. Also jeden Eintrag als neue Klasse anlegen und die Werte der Originalen Instanz übernehmen. Die Daten sind dann kopiert und beide Listen haben die gleichen Daten, aber unterschiedliche Instanzen. Im Normalfall regelt man dies im Setter mit einem Aufruf einer Assign() Methode der TFolder, welche natürlich zuvor, wie oben beschrieben, implementiert werden muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

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