AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TComponentList: Komponenten sauber freigeben

Ein Thema von geesmith · begonnen am 6. Jun 2019 · letzter Beitrag vom 7. Jun 2019
Antwort Antwort
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#1

TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 10:43
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!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#2

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 10:46
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).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#3

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 11:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#4

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 11:12
Moin...
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.

Zitat:
...folglich sollten alle erstellten Komponenten wieder freigegeben werden.
...genau so ist es.
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#5

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 13:21
Klar haentschman, da hast du natürlich Recht. Falls OwnedObjects = True erübrigt sich der Freigabe-Befehl. So hatte ich das auch gemeint.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 13:52
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.
Thomas Mueller
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#7

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 14:44
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?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#8

AW: TComponentList: Komponenten sauber freigeben

  Alt 6. Jun 2019, 14:53
Zitat:
diese kaskadierte Komponenten automatisch freigegeben werden sobald der Top-Owner freigegeben wird
...ja. Wenn du den Top Owner richtig zugeordnet hast? Die "Kaskade" sagt ja nur etwas über den Parent aus.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TComponentList: Komponenten sauber freigeben

  Alt 7. Jun 2019, 14:57
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.
Peter Below
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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