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/)
-   -   Freigeben von Komponenten (https://www.delphipraxis.net/193020-freigeben-von-komponenten.html)

idefix2 10. Jun 2017 20:14

Freigeben von Komponenten
 
In einer von TEdit abgeleiteten Komponente erzeuge ich ein TPanel und in dem TPanel eine TListbox. Es sollte daraus eine etwas flexiblere Kombobox werden.

TPanel und Tlistbox haben als Owner mein abgeleitetes TEdit.

Mir ist schon klar, dass ich untergeordnete Komponenten am Ende nicht freigeben MUSS. Ich habe es im Destroy des TEdits unnötigerweise trotzdem gemacht und da knallt es beim Freigeben der Listbox.
Ich habe im Debugger überprüft, dass die Listbox zu dem Zeitpunkt noch existiert, warum gibt es da bei der manuellen Freigabe eine Exception? Selbst wenn die Listbox zu dem Zeitpunkt schon freigegeben wäre, was nicht der Fall ist, dürfte doch Free keine Exception auslösen.

Es ist natürlich kein Problem, das Free aus dem Programmcode zu entfernen, aber ich würde trotzdem gerne wissen, warum das nicht geht.

himitsu 10. Jun 2017 21:50

AW: Freigeben von Komponenten
 
Zitat:

Zitat von idefix2 (Beitrag 1374215)
Selbst wenn die Listbox zu dem Zeitpunkt schon freigegeben wäre, was nicht der Fall ist, dürfte doch Free keine Exception auslösen.

Doch, wenn DU oder jemand Anderes die Variable nicht auf nil setzt, dann steht danach Schrott in dem Zeiger und Schrott knallt schön, wenn man damit was machen will.

Achtung, die VCL und TControl ist extrem blöd, denn nicht nur der Owner gibt etwas frei, sondern leider auch der Parent.
Da war jemand einfach nur saudoof, als er das vor vielen Jahren verbockt hat, aber leider ist das immernoch so und leider übersieht jeder die Anmerkung
http://docwiki.embarcadero.com/Libra...Control.Parent
Wobei das für mich immernoch ein total falsche Verhalten ist, was man entdlich "reparieren" sollte.

idefix2 11. Jun 2017 00:05

AW: Freigeben von Komponenten
 
Zitat:

Zitat von himitsu (Beitrag 1374225)
Zitat:

Zitat von idefix2 (Beitrag 1374215)
Selbst wenn die Listbox zu dem Zeitpunkt schon freigegeben wäre, was nicht der Fall ist, dürfte doch Free keine Exception auslösen.

Doch, wenn DU oder jemand Anderes die Variable nicht auf nil setzt, dann steht danach Schrott in dem Zeiger und Schrott knallt schön, wenn man damit was machen will.

Ok, mir fällt jetzt auf, dass ein Owner oder Parent, wer auch immer, der seine Komponenten freigibt, das natürlich über seine Komponentenliste (Components bzw. Controls) erledigen wird und er von der privaten Variable der Tedit, die auf die Komponente zeigt, gar nichts weiß und auch nichts wissen will. Die Variable kann also wohl beim Freigeben gar nicht nil gesetzt werden, und das zu erwarten war wohl ein Fehlschluss.

Bedeutet das aber nicht, dass man Komponenten prinzipiell gar nicht selbst freigeben darf? Denn von einem x.free bekommt ja vermutlich weder die Components-Liste noch die Controls-Liste etwas mit? Was ist da die korrekte Vorgangsweise, wenn ich eine Komponente vorzeitig entsorgen will? Muss ich die vorher explizit aus der Controls Liste des Parent und aus der Components Liste des owners entfernen?

himitsu 11. Jun 2017 00:36

AW: Freigeben von Komponenten
 
Dafür gibt es in der VCL eine FreeNotification, wo sich die Kmponenten gegenseitig registieren und bei Freigabe den jeweils Anderen informieren.
Der setzt dann bei sich die Variable auf nil und gut ist.

idefix2 11. Jun 2017 10:38

AW: Freigeben von Komponenten
 
ok, danke, das beruhigt mich. Weil Komponenten gebe ich in meinen Programmen öfters frei, und darum habe ich mich nie gekümmert.


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