So habe ich das bei mir gelöst:
Delphi-Quellcode:
type
TMeinObjekt = class(TComponent)
...
function MeinObjekt: TMeinObjekt;
implementation
var
// Edit: Danke für den Hinweis!
FMeinObjekt: TMeinObjekt = NIL;
function MeinObjekt: TMeinObjekt;
begin
Result := NIL;
try
if not assigned(FMeinObjekt) then begin
FMeinObjekt := TMeinObjekt.Create(NIL);
end;
Result := FMeinObjekt;
except
on E: SysUtils.Exception do begin
...
end;
end;
end;
...
initialization
begin
// In der Tat unnötig
FMeinObjekt:= NIL;
end;
finalization
FreeAndNil(FMeinObjekt);
Keine Ahnung, ob das der beste Weg ist, aber beim Initialisieren der
Unit wird FMeinObjekt explizit ungültig gemacht (NIL), dass es nicht auf irgendeinen zufälligen Arbeitsspeicherbereich verweist, und dieser dann versehentlich als FMeinObjekt behandelt wird.
Die function MeinObjekt: TMeinObjekt; sorgt dafür, dass du immer ein gültiges Objekt erhältst, und dass es (über diesen Weg) auch immer nur eine Instanz gibt.
Wird das Programm beendet, wird das Objekt im Finalization-Abschnitt korrekt freigegeben.
Benötigt ein anderes Programm dieses Objekt nicht, wird es nicht erzeugt. Wird es benötigt, wird es automatisch erzeugt. Wird es erzeugt, wird es automatisch freigegeben.
Du darfst/solltest halt an keiner anderen Stelle im Quellcode weitere Instanzen davon erzeugen mit TMeinObjekt.Create, ansonsten sollte alles passen?
https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit