Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Verfügbarkeit von Objecten in unterschiedlichen Units

  Alt 25. Feb 2025, 00:30
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

Geändert von berens (25. Feb 2025 um 11:35 Uhr)
  Mit Zitat antworten Zitat