Erstmal grundsätzlich: Speicher sollte dort freigegeben werden wo man diesen auch initialisiert hat
Delphi-Quellcode:
var
obj: TObjectList;
begin
obj := TObjectList.Create;
try
GetAllAccounts( obj );
...
finally
obj.Free;
end;
end;
Dann zu deinem Problem:
1) warum verwendest du eine Objektlist wenn du mit Interfaces arbeitest? Gibt auch eine TInterfaceList
2) wenn du eine ObjectList verwendest, ist auch OwnsObjects auf false, sonst sind die Objekte beim Free alle wieder weg (auch deine TInterfaceObjects)
Bei Item.Data solltest du dann auch das Interface angeben und den Referenzcounter erhöhen. Hier mal ein Beispiel hoffe das ist jetzt so korrekt und du kannst was damit anfangen
Delphi-Quellcode:
type
IIrgendwas = interface ['{0EF386E9-7F06-4D9A-A261-37D61BE3F8BE}']
procedure MessageBox;
end;
TMyObject = class(TInterfacedObject, IIrgendwas)
procedure MessageBox;
end;
procedure TForm6.FormCreate(Sender: TObject);
var
x: TInterfaceList;
obj, obj2: IInterface;
obj3: IIrgendwas;
sl: TStringList;
i: integer;
begin
obj := TMyObject.Create;
sl := TStringList.Create;
try
x := TInterfaceList.Create; // statt der ObjectList
try
x.Add(obj);
for i := 0 to x.Count - 1 do begin
sl.Add('test');
obj._AddRef; // ein cast als Pointer bekommt Delphi nicht mit (dein data)
sl.Objects[i] := Pointer(obj);
end;
finally
FreeAndNil(x);
end;
obj := nil;
// verwenden und freigeben
obj2 := IInterface(Pointer(sl.Objects[0]));
if Succeeded(obj2.QueryInterface(IIrgendwas, obj3)) then
obj3.MessageBox;
obj2._Release;
finally
FreeAndNil(sL);
end;
end;
{ TMyObject }
procedure TMyObject.MessageBox;
begin
MessageBoxA(0, 'test', nil, 0)
end;