Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekte die ein Interface impl in einer Liste speichern??? (https://www.delphipraxis.net/115323-objekte-die-ein-interface-impl-einer-liste-speichern.html)

winx 10. Jun 2008 12:34


Objekte die ein Interface impl in einer Liste speichern???
 
Hallo,

ich habe mehrere Klassen, die alle das IAction Interface implementieren. Nun erzeugt mir eine Factory immer
die richtige Klasse und gibt mir das IAction Objekt zurück

function build(...): IAction;

Nun möchte ich diese in einer Liste abspreichern, bekomme aber immer den Fehler:

[DCC Error] Actiongroup.pas(54): E2010 Incompatible types: 'TObject' and 'IAction' :wall:

wie kann ich in Delphi in einer Liste beliebige, IAction implementierente Objekte speichern?

Danke,
winx

mkinzler 10. Jun 2008 12:36

Re: Objekte die ein Interface impl in einer Liste speichern?
 
Funktioniert ein Cast?

winx 10. Jun 2008 13:03

Re: Objekte die ein Interface impl in einer Liste speichern?
 
fActions.Add(TObject(action));

Es funzt :dp:

Mann bin ich bescheuert, ans naheliegenste nicht gedacht :duck:

Danke!!!

uligerhardt 10. Jun 2008 13:03

Re: Objekte die ein Interface impl in einer Liste speichern?
 
Zitat:

Zitat von winx
wie kann ich in Delphi in einer Liste beliebige, IAction implementierente Objekte speichern?

Mit TInterfaceList?

HTH,
Uli.

Bernhard Geyer 10. Jun 2008 13:23

Re: Objekte die ein Interface impl in einer Liste speichern?
 
Zitat:

Zitat von winx
fActions.Add(TObject(action));

Bitte keine harten Casts! Du kommst über früher oder später in teufels Küchen (unerwartete Speicherfreigaben oder keine)

winx 10. Jun 2008 15:29

Re: Objekte die ein Interface impl in einer Liste speichern?
 
habs mit der Interfaced List gemacht.

Aber wie kann ich nun diese IAction Objekte in eine Listbox einfügen (das klappt schon) und wieder rausbekommen???

Einfügen funktioniert:

lbActions.Items.AddObject(action.ToString(),TObjec t(action));

Aber wenn ich Sie wieder rausholen möchte, gehts nicht:

action := IAction(lbActions.Items[i].LinkedObject); //[DCC Error] ActionCreationForm.pas(128): E2010 Incompatible types: 'IAction' and 'TObject'

wie läuft denn das mit Klassen, die ein Interface implementieren... ???

danke

xaromz 10. Jun 2008 15:41

Re: Objekte die ein Interface impl in einer Liste speichern?
 
Hallo,

wenn Du wirklich ein Interface an einen Eintrag hängen willst, bekommst Du den nur über einen weiteren Cast wieder zurück:
Delphi-Quellcode:
action := IAction(Pointer(lbActions.Items[i].LinkedObject));
Du solltest bei solchen Schweinereien aber beachten, dass Du damit die Referenzzählung aushebelst (bzw. eine Weak-Referenz verwendest). Das heist also, dass Du das Interface mit einer solchen Speicherung nicht vor dem Zerstören retten kannst.

Gruß
xaromz

Bernhard Geyer 10. Jun 2008 20:49

Re: Objekte die ein Interface impl in einer Liste speichern?
 
nimm eine Helperobjekt welche das Interface speichert

Delphi-Quellcode:
type
  TInterfaceHolder = class(TObject)
    FInterface: IAction;
  end;


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