![]() |
Statische Objekte
Hallo erstmal,
also ich möchte ein Statisches Object einer selbstgeschreibenen klasse erzeugen, welches nur einmal im speicher instanziert wird, aber alle komponenten meiner Software sollen darauf zugreifen können (Singleton Pattern). ist sowas in delphi möglich, wenn ja wie ?? mfg hpf |
Re: Statische Objekte
Hi hpf,
ich hoffe dich jetzt richtig verstanden zu haben. Meinst du so etwas:
Delphi-Quellcode:
Alle Komponenten können dann auf DeinObjekt zugreifen, und es wird nur einmal im Speicher instanziert. Falls es nicht das Richtige ist, solltest du vielleicht genauer erklären, was du machen willst.
type
TDeineKlasse = class(TObject) private //... public //... end; TForm1 = class(TForm) private //... public DeinObjekt: TDeineKlasse; end; //... procedure TForm1.FormCreate(Sender: TObject); begin DeinObjekt := TDeineKlasse.Create; end; Greetz alcaeus |
Re: Statische Objekte
Erst einmal danke für die schnelle antwort,
aber das ist nur halb das was ich machen möchte, für ne form ist das ja schon super, aber ich hätte das objekt gerne applikations weit verfügbar, also für alle forms der app. es geht nämlich um eine internationalisierung, die ihre werte aus einer excel tabelle in eine hashmap schaufelt, nun möchte ich halt nur eine instanz der hashmap haben, die beim applikations start erstellt wird, danach können alle komponenten ihre caption über ein synonym in der entsprechenden sprache aus der hashmap bekommen. mfg hpf |
Re: Statische Objekte
Dann musst du alle Formulare von einer UrFormklasse ableiten und dort einen solchen Pointer public deklarieren.
|
Re: Statische Objekte
Moin!
Oder eine Unit die die Klasse enthält und eine Public Instanzenvariable. Diese kannst du im Initialisation Teil der Unit instanziieren und im Finalisation Teil wieder freigeben... MfG Muetze1 |
Re: Statische Objekte
Zitat:
Greetz alcaeus |
Re: Statische Objekte
Hallo,
Ein Singleton-Pattern lässt sich in Delphi durchaus mit hilfe von statischen Methoden und typisierten Konstanten realisieren. Und so sieht ein Singleton aus, wenn ich ihn mir vom Modelmaker generieren lasse:
Delphi-Quellcode:
grüße, daniel
type
TTest = class(TObject) protected constructor CreateInstance; class function AccessInstance(Request: Integer): TTest; public constructor Create; destructor Destroy; override; class function Instance: TTest; class procedure ReleaseInstance; end; constructor TTest.Create; begin inherited Create; raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]); end; constructor TTest.CreateInstance; begin inherited Create; end; destructor TTest.Destroy; begin if AccessInstance(0) = Self then AccessInstance(2); inherited Destroy; end; class function TTest.AccessInstance(Request: Integer): TTest; {$J+} const FInstance: TTest = nil; {$J-} begin case Request of 0 : ; 1 : if not Assigned(FInstance) then FInstance := CreateInstance; 2 : FInstance := nil; else raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]); end; Result := FInstance; end; class function TTest.Instance: TTest; begin Result := AccessInstance(1); end; class procedure TTest.ReleaseInstance; begin AccessInstance(0).Free; end; |
Re: Statische Objekte
noch einmal danke für die schnellen antworten,
@sanchez wenn ich das richtig verstanden habe, kann ich dieses Singelton irgendwo(beim app start) initialisieren, und mir egal wo in meiner app auf die instanz zugreifen, über statische methoden ?? mfg hpf |
Re: Statische Objekte
Du greifst auf die Instanz über
Delphi-Quellcode:
zu. Beim ersten Zugriff wird das Objekt erzeugt. Bei den nachfolgenden bekommst du sie selbe Instanz.
TTestClass.Instance
|
Re: Statische Objekte
Hi Sanchez,
folgendes würde ich ändern, da es einerseits sauberer ist und andererseits sich nicht darauf verlässt, dass die class-method Variable FInstance eines Tages durch Compileränderungen doch zerstört wird.
Delphi-Quellcode:
...:cat:...
var
FInstance: TTest = nil; class function TTest.AccessInstance(Request: Integer): TTest; begin case Request of 0 : ; 1 : if not Assigned(FInstance) then FInstance := CreateInstance; 2 : FInstance := nil; else raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]); end; Result := FInstance; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz