Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectlist - Container fuer? (https://www.delphipraxis.net/80880-tobjectlist-container-fuer.html)

rowkajjh 16. Nov 2006 20:07


TObjectlist - Container fuer?
 
Hallo,

ich habe eine Klasse, die von TObject abgelitten ist:

type
TMyClass = class ( TObject )
private
...



Instanzen von dieser Klasse würde ich gerne in eine TObjectList verwalten. Leider erhalte ich aber:

[Pascal Fehler] cMsgCtrl.pas(138): E2010 Inkompatible Typen: 'TMyClass' und 'TObject'

wenn ich z.B. sowas machen will:

Result := fObjList[Index];

Was kann ich machen?

Elvis 16. Nov 2006 20:16

Re: TObjectlist - Container fuer?
 
Hi :hi:
Schaue dir mal diesen Thread an: ständiges Typecasting bei Parametern
Dort findest du die Lösung, und nebenbei wird erklärt was Type casting ist. :zwinker:

Hador 16. Nov 2006 20:35

Re: TObjectlist - Container fuer?
 
Oder kurz gesagt:
Du musst dem Compiler sagen, dass er annehmen soll, dass es sich um ein Objekt der von dir erstellten Klasse handelt (Typecasting).
Dies kannst du auf 2 Wegen erreichen.
1.
Delphi-Quellcode:
TMyClass(fObjList[Index])
2.
Delphi-Quellcode:
(fObjList[Index] as TMyClass)

bernau 17. Nov 2006 09:07

Re: TObjectlist - Container fuer?
 
Die TObjectlist kann alle Objekte Speichern, die von TObject abgeleitet sind. Eingefügt werden diese einfach mit "Add"

Delphi-Quellcode:
myObjectlist.add(TBananenObject.create);
Dabei kannst du in eine Liste auch unterschiedliche objekte speichern.

Delphi-Quellcode:
myObjectlist.add(TBananenObject.create);
myObjectlist.add(TApfelObject.create);
myObjectlist.add(TBirnenObject.create);
Wenn du darauf zugreifen willst, musst du ein Typecast durchführen

Delphi-Quellcode:
myboolean:=TBananenObject(myObjectlist[a]).hatKerne;
Aber vorsichtig! So kannst du es nur machen, wenn du dir sicher bist, daß nur Bananenobjekte in der Liste sind. Ansonsten solltest du vorher püfen, was für ein objekt es ist.

Delphi-Quellcode:
if myObjectlist[a] is TBanabenObject then
  myboolean:=TBanabenObject(myObjectlist[a]).hatKerne;

Übrigens: Der Vorteil von TObjectList ist, daß es sich um die Freigabe der enthaltenen objekte kümmert, wenn du OwnsObjects auf true setzt. (Kann aber auch Nachteile haben)

Gruss Gerd

Hador 17. Nov 2006 11:36

Re: TObjectlist - Container fuer?
 
Zitat:

Zitat von bernau
Übrigens: Der Vorteil von TObjectList ist, daß es sich um die Freigabe der enthaltenen objekte kümmert, wenn du OwnsObjects auf true setzt. (Kann aber auch Nachteile haben)

Wenn du schon das anführst, solltest du gleich dabei Sagen, das die Eigenschaft OwnsObject standardmäßig aus True steht.
Wenn das nicht gewünscht ist einfach
Delphi-Quellcode:
MyObjectList := TObjectList.Create(False);
aufrufen

Muetze1 17. Nov 2006 12:57

Re: TObjectlist - Container fuer?
 
Wenn ihr das schon erklärt, dann weist doch bitte auch darauf hin, dass die Methode Extract() ein Objekt aus der Liste entfernt ohne das Objekt freizugeben - auch wenn OwnsObject auf true steht.

bernau 17. Nov 2006 13:14

Re: TObjectlist - Container fuer?
 
Zitat:

Zitat von Muetze1
Wenn ihr das schon erklärt, dann weist doch bitte auch darauf hin, dass die Methode Extract() ein Objekt aus der Liste entfernt ohne das Objekt freizugeben - auch wenn OwnsObject auf true steht.

Damit hast du es ja grade erklärt. Dann brauche ich es nicht mehr. :lol:

Aber davon abgesehen, kannte ich diese Funktion bisher nicht. Oder habe sie wieder vergessen.


GErd


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