Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Component einer ObjectList zuweisen

  Alt 12. Mär 2008, 22:00
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.
  Mit Zitat antworten Zitat