Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TComponentList: Komponenten sauber freigeben (https://www.delphipraxis.net/200910-tcomponentlist-komponenten-sauber-freigeben.html)

geesmith 6. Jun 2019 10:43

TComponentList: Komponenten sauber freigeben
 
Hallo zusammen

Leider finde ich im Netz nirgendwo eine Antwort auf meine Frage... daher wende ich mich an die Spezialisten.

- Ich erstelle eine TComponentList mit Create(True)
- Ich erstelle dynamisch irgendwelche Komponenten ...TPanel, TButton, ...
- Ich trage diese Komponenten in eine TComponentList ein (Add(...)).
- Ich gebe die TComponentList frei (free)

...folglich sollten alle erstellten Komponenten wieder freigegeben werden.

Meine Fragen:
- Wie sauber gibt TComponentList diese Komponenten wieder frei?
- Spielt es eine Rolle ob ich "TPanel(MyComponentList.Items[i]).Free" oder "MyComponentList.Items[i].Free" mache?

Meiner Meinung nach wäre die Variante "TPanel(MyComponentList.Items[i]).Free" richtig. Denn eine TPanel kann noch Objekte enthalten die in einer TComponent nicht enthalten sind.

Vielen Dank für eure Antworten!

Uwe Raabe 6. Jun 2019 10:46

AW: TComponentList: Komponenten sauber freigeben
 
Free ruft Destroy auf, Destroy ist virtual, somit wird immer das Destroy aller abgeleiteten Klassen aufgerufen (es sei denn, jemand hat vergessen das inherited aufzurufen).

geesmith 6. Jun 2019 11:00

AW: TComponentList: Komponenten sauber freigeben
 
Herzlichen Dank Uwe!

Stimmt, das macht natürlich Sinn. Somit kann man gut "MyComponentList.Items[i].Free" aufrufen und kann sicher sein, dass alle zusätzlichen Objekte von TPanel freigegeben werden.

haentschman 6. Jun 2019 11:12

AW: TComponentList: Komponenten sauber freigeben
 
Moin...8-)
Zitat:

das macht natürlich Sinn. Somit kann man gut "MyComponentList.Items[i].Free" aufrufen
...das macht überhaupt keinen Sinn. Wenn du die Componentlist.Create(True) erzeugst, dann kümmert sich die Liste um die Freigabe. "MyComponentList.Items[i].Free" ist somit sinnlos. :P

Zitat:

...folglich sollten alle erstellten Komponenten wieder freigegeben werden.
...genau so ist es. :thumb:

geesmith 6. Jun 2019 13:21

AW: TComponentList: Komponenten sauber freigeben
 
Klar haentschman, da hast du natürlich Recht. Falls OwnedObjects = True erübrigt sich der Freigabe-Befehl. So hatte ich das auch gemeint.

dummzeuch 6. Jun 2019 13:52

AW: TComponentList: Komponenten sauber freigeben
 
Wobei sich die Frage stellt, ob die ComponentList überhaupt notwendig ist. Ich habe noch nie eine gebraucht, weil ich Komponenten zwar zur Laufzeit erstelle, aber nicht mehr per Code freigebe. Das überlasse ich in der Regel dem Formular (oder dem Container), dem ich sie zugeordnet habe.

Nur so als Denkanstoß, vielleicht ist das in diesem Fall ja auch so.

geesmith 6. Jun 2019 14:44

AW: TComponentList: Komponenten sauber freigeben
 
Tatsächlich? Ist das so, dass wenn kaskadierte Komponenten in einem bestehenden TWinControl(TForm, TPanel, TabSheet, ...) platziert wurden, diese kaskadierte Komponenten automatisch freigegeben werden sobald der Top-Owner freigegeben wird?

haentschman 6. Jun 2019 14:53

AW: TComponentList: Komponenten sauber freigeben
 
Zitat:

diese kaskadierte Komponenten automatisch freigegeben werden sobald der Top-Owner freigegeben wird
...ja. Wenn du den Top Owner richtig zugeordnet hast? :wink: Die "Kaskade" sagt ja nur etwas über den Parent aus.

peterbelow 7. Jun 2019 14:57

AW: TComponentList: Komponenten sauber freigeben
 
Zitat:

Zitat von geesmith (Beitrag 1434063)
Tatsächlich? Ist das so, dass wenn kaskadierte Komponenten in einem bestehenden TWinControl(TForm, TPanel, TabSheet, ...) platziert wurden, diese kaskadierte Komponenten automatisch freigegeben werden sobald der Top-Owner freigegeben wird?

Für Controls gibt es zwei Mechanismen zur Lebensdauerverwaltung in der VCL. Das eine ist der Owner, das wird von TComponent geerbt. Wenn man eine Komponente über den Konstruktor mit einem Owner erzeugt wird die Komponente automatisch zerstört wenn der Owner zerstört wird.

Für Controls spielt aber auch der Parent eine Rolle; TWinControl zerstört automatisch alle Controls in seiner Controls-Liste (die also dieses TWinControl als Parent haben) wenn es selbst zerstört wird. Das kommt bei den meisten Anwendungen zum Tragen bevor die Ownership greift. Ist ein bißchen doppelt gemoppelt, ist aber notwendig, da TWinControls ja ein Window handle haben und Windows dieses Verhalten auch auf der "handle-Ebene" erzwingt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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