Einzelnen Beitrag anzeigen

Fingolfin

Registriert seit: 7. Okt 2003
62 Beiträge
 
#1

Interfaces: Ich werd' irre!

  Alt 8. Jun 2004, 20:28
Hallöle, ich möchte per Interfaces ermöglichen, daß verschiedene Units an ein Objekt rankommen ohne es instantiieren zu müssen (quasi ein Singleton, der von überall nur duch Einbindung der Unit zugreifbar sein soll).

Ich habe es folgendermaßen versucht:

Code:
interface

type

  ITest = interface
  ['{74B2F6FC-1464-43E2-A5FB-74A889F723F2}']
    procedure Show;
  end;

  function Test: ITest;

implementation

uses
  Dialogs, SysUtils;

type

  TTest = class(TInterfacedObject, ITest)
  private
  public
    procedure Show;
  end;

var
  FTest: TTest;

function Test: ITest;
begin
  if not Assigned(FTest) then
    FTest := TTest.Create;
    Result := FTest as ITest;
end;

{TTest}

destructor TTest.Destroy;
begin
  inherited;
end;

procedure TTest.Show;
begin
  ShowMessage('');
end;

initialization
  FTest := nil;
finalization
  if Assigned(FTest) then
    FTest.Free;
Das Aufrufen von Test.Show im Hauptprogramm funktioniert auch erstmal gut. Wenn ich die Prozedur allerdings ein zweites Mal ausführe, crasht er mir weg, da vorher anscheinend schon alle Referenzen auf das Interface verschwinden (direkt nach dem ersten Aufruf von Test.Show). Anscheinend besteht das Objekt FTest aber trotzdem noch, da ich per Debugger den RefCount sehen kann.



Also wird anscheinend nach jedem Zugriff eine Funktion das Objekt FTest freigegeben, was ich eigentlich auch nicht möchte, da die Daten ja eine ganze Weile bereitstehen sollen.

Für Anmerkungen und Hilfe wäre ich sehr dankbar. Bitte bringt ein wenig Licht in mein Dunkel.

Bitte Bitte.

Fingolfin
  Mit Zitat antworten Zitat