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