Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi freigeben? (https://www.delphipraxis.net/32049-freigeben.html)

Pseudemys Nelsoni 18. Okt 2004 04:47


freigeben?
 
hi,

wenn ich eine komponente im create zur laufzeit erstelle und als owner Form1 übergebe, muss ich sie dann am ende OnClose auch wieder freigeben? soweit ich weiss müsste form1 das als owner selbst tun oder?

teebee 18. Okt 2004 07:07

Re: freigeben?
 
Ja, die Freigabe übernimmt der Owner selbst.

Gruß, teebee

Pseudemys Nelsoni 18. Okt 2004 07:21

Re: freigeben?
 
gut, danke.

wäre es auch so wenn es der Parent wäre? das gleiche wie Owner?

teebee 18. Okt 2004 07:43

Re: freigeben?
 
Wenn ein WinControl zersört wird, gibt es alle Child-Controls vorher frei, d.h. alle Komponenten, die als Parent dieses WinControl haben. Im Prinzip brauchst Du also entweder einen Owner oder ein Parent. (Auch wenn die OH hier etwas anderes sagt... siehe: TWinControl.Destroy).
Aber alle Objekte _ohne_ Owner oder Parent müssen von Dir selber freigegeben werden.

Gruß, teebee

dizzy 18. Okt 2004 08:40

Re: freigeben?
 
In meinem Kopf schwirrt etwas rum von wegen, dass nur "Owner" für die Freigabe verantwortlich ist. Parent hingegen hat damit nichts zu tun, sondern gibt nur an, wo sich visuelle Kompos hinzeichnen sollen. Es kann aber auch sein, dass ich das genau vertausche...
Auf jeden Fall sind nicht beide für die Freigabe von Bedeutung.

Sanchez 18. Okt 2004 08:48

Re: freigeben?
 
@dizzy
Was bei dir im Kopf rumschwirrt ist richtig.
Der Owner kümmert sich um den Speicher bzw die Freigabe und der Parent sagt, wohins gemalt werden soll.

teebee 18. Okt 2004 08:59

Re: freigeben?
 
Zitat:

Zitat von Sanchez
Der Owner kümmert sich um den Speicher bzw die Freigabe und der Parent sagt, wohins gemalt werden soll.

Das ist zwar prinzipiell richtig so und wird auch so in der OH beschrieben, aber ein Blick in die VCL-Quellen zeigt, dass TWinControl in Destroy seine untergeordneten Controls freigibt. Komponenten, die kein Control sind fallen da natürlich nicht drunter, die haben ja aber auch gar kein Parent.

Gruß, teebee

dizzy 18. Okt 2004 09:16

Re: freigeben?
 
Zitat:

Zitat von teebee
Komponenten, die kein Control sind fallen da natürlich nicht drunter, die haben ja aber auch gar kein Parent.

Aber sie haben einen Owner (alle ab TComponent). Und der ist für die Freigaben zuständig - nicht der Parent! (Oder hab ich's verpeilt was du sagen wolltest? :gruebel: )

teebee 18. Okt 2004 09:24

Re: freigeben?
 
Zitat:

Zitat von dizzy
(Oder hab ich's verpeilt was du sagen wolltest? :gruebel: )

Ich glaube ja...
Natürlich sind wir uns einig, dass prinzipiell der Owner für die Freigabe einer Komponente zuständig ist. Wenn die Komponente allerdings ein Control ist und ein Parent hat, gibt der Parent in seinem Destroy diese Komponente frei: Siehe TWinControl.Destroy in den VCL-Quellen. Das steht leider nicht so in der OH, ist aber trotzdem so...

Gruß, teebee

dizzy 18. Okt 2004 10:18

Re: freigeben?
 
:shock: Datt isn Ding! Eigentlich eine Fehlerquelle par excellance, wenn man dann versucht da noch selber freizugeben...

teebee 18. Okt 2004 11:59

Re: freigeben?
 
Stimmt, kann man aber vermeiden indem man als Owner den Parent nimmt. Dann kommt man eigentlich gar nicht auf die Idee nochmal explizit freizugeben. (Wobei das mit den Ideen beim Programmieren so eine Sache ist :wink: )

Gruß, teebee

Pseudemys Nelsoni 18. Okt 2004 12:55

Re: freigeben?
 
Moin,

danke für die antworten jungs.

@dizzy

Zitat:

Datt isn Ding! Eigentlich eine Fehlerquelle par excellance, wenn man dann versucht da noch selber freizugeben...
wenn man .Free benutzt passiert nie etwas, da die methode erst prüft ob das object tatsächlich existiert, wenn dem so ist wird Destroy aufgerufen :)

teebee 18. Okt 2004 19:09

Re: freigeben?
 
Zitat:

Zitat von Pseudemys Nelsoni
wenn man .Free benutzt passiert nie etwas, da die methode erst prüft ob das object tatsächlich existiert, wenn dem so ist wird Destroy aufgerufen :)

Leider nicht ganz...
Free prüft nicht, ob ein Objekt existiert, sondern ob die Objektreferenz ungleich Nil ist. Wenn Du ein Objekt mit Free freigibst und die Objektreferenz nicht von Hand auf Nil setzst, geht der zweite Versuch, das Objekt freizugeben ins Nirwana, weil Free eine Referenz ugleich Nil sieht und das Destroy einer nicht mehr existenten Instanz aufruft.
Deshalb am besten immer mit FreeAndNil arbeiten, wo man selbst die Kontrolle darüber hat.

Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.

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