Einzelnen Beitrag anzeigen

brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#6

AW: Data-Pointer in Interfacevariable casten

  Alt 14. Jul 2010, 19:40
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;
  Mit Zitat antworten Zitat