Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface in eine TObjectList einerben (https://www.delphipraxis.net/81300-interface-eine-tobjectlist-einerben.html)

Master_BB 24. Nov 2006 11:53


Interface in eine TObjectList einerben
 
Hallo,
ich hab das Problem das ich ein Interface habe das bei TObjectList Objeten
mit rein soll. Ergo sieht das so aus:
Delphi-Quellcode:
TAListEx = class(TAList, IFormularTypList)

So nun hat man das Problem man kann nur Interfaces mit reinholen
wenn man als Basis InterfacedObject hat.
TObjectList hat als BasisKlasse jedoch TObject.

Jetzt hab ich mir meine eigene TInterfacedObjectList geschrieben damit das klappt.

Problem hierbei ist nun nur das das Freigeben einer Instanz zum fehler führt.
Das sieht so aus

Delphi-Quellcode:
var
  AList : IFormularTypList;
begin
  AList := TAListEx.Create;
  AList.Free; //CRASH
end;
so nun ist die Frage woran liegt jetzt der Fehler an meiner InterfacedObjList?

Kennt jemand eine ObjectList die von hauseaus schon Interfaces unterstützt?

Gruß

Khabarakh 24. Nov 2006 12:11

Re: Interface in eine TObjectList einerben
 
Zitat:

Zitat von Master_BB
So nun hat man das Problem man kann nur Interfaces mit reinholen
wenn man als Basis InterfacedObject hat.

Nö. TInterfacedObject ist nur eine Standardimplementierung von IInterface.

Master_BB 24. Nov 2006 12:14

Re: Interface in eine TObjectList einerben
 
hm das heißt also,
es muß an meiner implementierung der InterfacedObjList liegen, sprich an einer der routinen
die IInterface mitbringt.

function QueryInterface(const IID: TGUID; out Obj) : HResult; stdcall;
function _AddRef : Integer; stdcall;
function _Release : Integer; stdcall;
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
class function NewInstance : TObject; override;

hab diese bisher nur von TInterfacedObj kopiert.
nochmal rüberschaun.
müßte ja bestimmt bei Destruction oder Release der Fehler sein.

hm hat jemand mal ein beispiel für eine ObjectList wo ein Interface mit eingeerbt ist?

Jens Schumann 24. Nov 2006 12:19

Re: Interface in eine TObjectList einerben
 
Zitat:

Zitat von Master_BB
Delphi-Quellcode:
var
  AList : IFormularTypList;
begin
  AList := TAListEx.Create;
  AList.Free; //CRASH <- Free ist hier nicht nötig
end;

Da Du AList als Interface deklariert hast brauchst Du AList nicht freizugeben. Bei einem Interface erkennt
Delphi automatisch wenn der Gültigkeitsbereich verlassen wird und gibt AList dann frei


Im Zweifelsfall kannst Su den Nachfahren auch von TInterfaceList ableiten.

bhenker 24. Nov 2006 12:58

Re: Interface in eine TObjectList einerben
 
Die Unit Classes enthält eine Klasse TInterfaceList, mit der sich Listen von Interfaces verwalten lassen. Wenn deine Objekte alle ein Interface implementieren, sollte diese alles haben was Du brauchst.

Delphi-Quellcode:
var
  IList: TInterfaceList;
begin
  IList := TInterfaceList.Create;
  try
   IList.Add(<InterfaceRef>:IInterface)
   ...
  finally
    IList.Free;
end;
Man sollte aber immer darauf achten Interfaces und Objekte nicht zu mischen, (meistens)früher oder später kracht´s. Dem Referzzähler geht dann die Puste aus. Ich habe mir angewöhnt, Bei Objekten mit Interfaces diese nur über entsprechende Interface-Variablen zu verwenden.

Gruß


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