Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Echter Objektcontainer? (https://www.delphipraxis.net/51214-echter-objektcontainer.html)

DGL-luke 8. Aug 2005 14:20


Echter Objektcontainer?
 
Ich habe mich gerade ein wenig mit listen bechäftigt, und festgestellt, dass TObjectList gar keine Objekte selbst hält, sondern nur die referenzen darauf und man damit z.B. die Objekte selbst in einem array noch halten muss.

Stimmt das so? Oder wie bringe ich "TDingsda" so in eine TObjectlist rein, dass ich es nicht selber halten muss, sondern die Objectlist das createn übernimmt? ich will mir eben so etwas ermöglichen:

Delphi-Quellcode:
with DingsList.add do //Dingslist.add liefert eine referenz auf ein TDings-Objekt, das die Liste selbst erstellt hat
 begin
  property1:='1';
  property2:='2';
 end;
Dass ich also nicht mehr selbst z.B. einen array mit meinen Objekten verwalten muss.

Geht das?

Tyrael Y. 8. Aug 2005 14:33

Re: Echter Objektcontainer?
 
Ich versteh dein Problem mit den Objectlisten nicht...


- du erzeugst irgendwo ein Objekt
- die Referenz zum Objekt speicherst du in einer Objektliste
- machst irgendwas mit den Objekten
- wenn du das Objekt nicht mehr brauchst gibst du es frei

oder

- du hast die Objektliste mit dem Parameter True erzeugt, dann gibst
du die Objektliste frei und alle Objekte werden auch freigegeben


Gruß


Edit: Wofür willst du die Objekte in einem Array speichern?
Versteh ich nicht. Solang du das Objekt nicht freigibst,
ist es da und bleibt auch da (bzw. Owner freigibst)...und zum freigeben
holst du die entsprechende Referenz aus der Objektliste, castest es zu deinem
Objekttypen und gibst es frei...

VORSICHT !!! Wie bei StringListen auch achte genau darauf welches Listenelement du
zuerst freigibst, da an freie Stellen nachgerückt wird

DGL-luke 8. Aug 2005 14:42

Re: Echter Objektcontainer?
 
heisst das, dass so etwas zulässig ist? EDIT: und das objekt in der liste bleibt, bis ich es freigeben lasse?

Delphi-Quellcode:
MyObjectlist.add(TMyObject.create);
Wenn ja, unter welchen Umständen?

Robert_G 8. Aug 2005 14:52

Re: Echter Objektcontainer?
 
Delphi-Quellcode:
Miep := TMiep.Create();
Die Instanz von TMiep liegt jetzt irgendwo im Heap rum, Miep ist nur ein Zeiger darauf.
TObjectList hat TList als Vorfahren, das heißt es wird das reingeworfene Objekt als einen untypisierten Pointer in die PointerList von TList werfen.
Das ändert aber nix daran, dass es weiterhin ein Pointer auf die Instanz ist. ;)
Ob du nun 5.000 neue Pointer darauf irgendwo anlegst interessiert das Objekt selbst herzlich wenig. :mrgreen:

Tyrael hat zwar schon was dazu geschrieben, aber nunja... :duck:


Nachtrag: Wir sind hier immer noch in Delphi32, nicht in .Net.
Also wird hier kein unbenutztes Objekt per GC zerstört. ;)
An Adresse 0815 (wobei Miep eigentlich nur die 0815 enthält, und dadurch auf die Instanz zeigt...) steht die TMiep Instanz, was immer du auch machst, solange du es nicht freigibst bleibt sie dort stehen.

Tyrael Y. 8. Aug 2005 16:18

Re: Echter Objektcontainer?
 
Delphi-Quellcode:
  myObjectList := TObjectList.Create(False);
  ..
  .
  .
  AObject := TMyObject.Create();
  .
  .
  myObjectList.Add(AObject);




..
...
...
  TMyObject(myObjectList.Items(Index)).MachWas;
  TMyObject(myObjectList.Items(Index)).NeProperty := 45678;
  TMyObject(myObjectList.Items(Index)).NeAndereProperty := 'Hallo Welt';
....
...
....
...

 for i := myObjectList.Count - 1 DownTo 0 do
 begin
   TMyObject(myObjectList.Items[i]).Free;
   myObjectList.Items[i].Delete;
 end;
...
...
..
..

  myObjectList.Free;

alles Wichtige steht im oberen Beispielcode...weitere Infos in der Hilfe unter
TObjectList


Gruß

Tyrael


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