[gelöst] ObjectList und Interfaces

Rund um die LCL und andere Komponenten
Antworten
Danccce
Beiträge: 16
Registriert: Do 17. Feb 2011, 11:48

[gelöst] ObjectList und Interfaces

Beitrag von Danccce »

Hallo zusammen,

ich habe ein Interface und zwei (mehrere) abgeleitet Klassen geschrieben:

Code: Alles auswählen

  IMyInterface = interface(IUnknown)
    ['{CC79C31B-E310-4D22-BCE9-0A8E88DA917E}']
    procedure doSomething;
  end;
 
  TTestClass1 = Class(TInterfacedObject, IMyInterface)
  public
    procedure doSomething;
  end;
 
  TTestClass2= Class(TInterfacedObject, IMyInterface)
  public
    procedure doSomething;
  end;        
Objekte der Klassen möchte ich in eine ObjectList packen, abarbeiten und danach löschen. Vereinfacht so:

Code: Alles auswählen

procedure mainLoop;
var
  objList : TObjectList;
  obj1    : TTestClass1;
  obj2    : TTestClass2;
begin
  // ObjectListe und Objekte instanziieren
  objList := TObjectList.create(false);
  obj1    := TTestClass1.Create;
  obj2    := TTestClass2.Create;
 
  // Objekte der Liste hinzufügen
  objList.Add(obj1);
  objList.Add(obj2);
 
  // ObjectListe abarbeiten und verkleinern
  while objList.First<> nil do begin
    (objList.First as IMyInterface).doSomething;
    objList.Remove(objList.First);
  end;
end;
Jedoch denke ich, das dies zu einem Speicher-Leck führt, da die Objecte wegen objList := TObjectList.create(false); nicht gelöscht werden.
Ändere ich jedoch

Code: Alles auswählen

objList := TObjectList.create(true);
erhalte ich einen RunError 204.

Was mache ich falsch?

Vielen Dank und besten Gruß
Marc
Zuletzt geändert von Danccce am Mi 3. Sep 2014, 19:12, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: ObjectList und Interfaces

Beitrag von m.fuchs »

Benutzt du COM oder möchtest du die Interfaces im klassischen Sinne nutzen?

Im zweiten Fall fügst du in den Compilerdirektiven einfach folgendes hinzu:

Code: Alles auswählen

{$Interfaces Corba}
Dann änderst du deine Interface-Deklaration ab:

Code: Alles auswählen

IMyInterface = interface
    procedure doSomething;
  end;
Und dann verfluchst du die Verantwortlichen von Borland, die damals der Meinung waren COM und Interfaces einfach so zusammenzumixen.

Im ersten Fall: keine Ahnung.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: ObjectList und Interfaces

Beitrag von Socke »

Falls du COM-Interfaces verwendest, könntest du auch TInterfaceList verwenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Danccce
Beiträge: 16
Registriert: Do 17. Feb 2011, 11:48

Re: ObjectList und Interfaces

Beitrag von Danccce »

Danke, ich werd die Corba-Version verwenden...

Besten Gruß
Marc

Antworten