Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Nochmal aufgegriffen: Objekte freigeben notwendig? (https://www.delphipraxis.net/157642-nochmal-aufgegriffen-objekte-freigeben-notwendig.html)

Rob09 19. Jan 2011 14:02

Delphi-Version: 5

Nochmal aufgegriffen: Objekte freigeben notwendig?
 
Hi!

Ich würde gerne mal einige Fragezeichen in meinem Kopf endlich ausräumen. Und zwar möchte ich mich insbesondere auf Beitrag #4 in http://www.delphipraxis.net/71919-ob...notwendig.html und #10 in http://www.delphipraxis.net/57807-ob...zerstoert.html beziehen. Konkret lauten meine Fragen:

Man stelle sich folgende Situation vor:

Code:
type

  TLeerKlasse = class(TObject)
  private
    FObjektInObjekt: TObject;
  end;

implementation

constructor TLeerKlasse.Create;
begin
  inherited Create;

  FObjektInObjekt := TObject.Create;
end;
Nun schrieb Sir Thornberry (#10):
Zitat:

Wenn du Komponenten frei gibst wo andere Komponenten drauf liegen so werden auch die Childs freigegeben
1. FRAGE:
Verstehe ich es richtig, dass FObjektInObjekt bei mir auf meinem Objekt der Klasse TLeerKlasse liegt und ich deshalb im destructor von TLeerKlasse meine Instanz von FObjektInObjekt nicht freigeben muss, weil dies automatisch geschieht?

2. FRAGE:
Wenn ich nun irgendwo beispielsweise ein Objekt BeispielObjekt vom Typ TComponent erzeuge mit einer Instanz von TLeerKlasse als Owner, dann müsste ja (vgl. selber Beitrag) dieses BeispielObjekt automatisch zerstört werden, wenn ich die Instanz von TLeerKlasse (die ja nur von TObject erbt) zerstöre - richtig? Ich frage mich nur, an welcher Stelle "weiß" denn meine Instanz von TLeerKlasse, dass sie auch BeispielObjekt zerstören soll?

Soweit, so gut. Wäre nett, wenn mich jemand freundlicherweise aufklären könnte...

Viele Grüße!
Robert

guinnes 19. Jan 2011 14:07

AW: Nochmal aufgegriffen: Objekte freigeben notwendig?
 
Zitat:

Zitat von Rob09 (Beitrag 1075808)
Verstehe ich es richtig, dass FObjektInObjekt bei mir auf meinem Objekt der Klasse TLeerKlasse liegt und ich deshalb im destructor von TLeerKlasse meine Instanz von FObjektInObjekt nicht freigeben muss, weil dies automatisch geschieht?

Du mußt in dem Fall dein FObjektInObjekt selber im Destruktor freigeben, da TObject keinen Owner hat

Zitat:

Wenn ich nun irgendwo beispielsweise ein Objekt BeispielObjekt vom Typ TComponent erzeuge mit einer Instanz von TLeerKlasse als Owner, dann müsste ja (vgl. selber Beitrag) dieses BeispielObjekt automatisch zerstört werden, wenn ich die Instanz von TLeerKlasse (die ja nur von TObject erbt) zerstöre - richtig? Ich frage mich nur, an welcher Stelle "weiß" denn meine Instanz von TLeerKlasse, dass sie auch BeispielObjekt zerstören soll?
Geht sowieso nicht, TLeerklasse kannst du nicht als Owner eines TComponent zuweisen ( Der Owner muß mindestsns TComponent sein )

Rob09 19. Jan 2011 14:16

AW: Nochmal aufgegriffen: Objekte freigeben notwendig?
 
Vielen Dank, jetzt wird mir einiges klar :thumb:

stahli 19. Jan 2011 15:34

AW: Nochmal aufgegriffen: Objekte freigeben notwendig?
 
kleiner Nachsatz:

Eine Komponente (X) sammelt alle Subkomponenten in einer Liste.
Delphi-Quellcode:
A := TA.Create(X);
B := TB.Create(X);
C := TC.Create(X);
X verwaltet dann eine Liste von 3 Subkomponenten, die Du über diese Liste auch ansprechen kannst.

Mit X.DestroyComponents kannst Du alle 3 Subkomponenten freigeben, was bei X.Free automatisch erfolgt.

Aphton 19. Jan 2011 16:48

AW: Nochmal aufgegriffen: Objekte freigeben notwendig?
 
Owner - Child Beziehung bei TComponent sieht ca so aus:

Create: Der Owner fügt die gerade erstellte Klasse in seine "Child-Liste"
Destroy: Die Instanz ruft Free bei allen "Child-Listen" Elementen auf, die wiederum dasselbe machen (usw, usf - rekursives Löschen einer Hirarchie) und löscht letzendlich seine eigene Instanz.

MfG

Rob09 19. Jan 2011 19:21

AW: Nochmal aufgegriffen: Objekte freigeben notwendig?
 
Vielen Dank euch beiden für die weiteren Infos! :thumb:


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