Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Statische Objekte (https://www.delphipraxis.net/33338-statische-objekte.html)

hpf 5. Nov 2004 09:24


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

alcaeus 5. Nov 2004 09:31

Re: Statische Objekte
 
Hi hpf,

ich hoffe dich jetzt richtig verstanden zu haben. Meinst du so etwas:

Delphi-Quellcode:
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;
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.

Greetz
alcaeus

hpf 5. Nov 2004 09:37

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

Touchdown 5. Nov 2004 09:43

Re: Statische Objekte
 
Dann musst du alle Formulare von einer UrFormklasse ableiten und dort einen solchen Pointer public deklarieren.

Muetze1 5. Nov 2004 09:49

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

alcaeus 5. Nov 2004 09:51

Re: Statische Objekte
 
Zitat:

Zitat von Touchdown
Dann musst du alle Formulare von einer UrFormklasse ableiten und dort einen solchen Pointer public deklarieren.

Man kanns auch übertreiben. Eine Unit "Defines", in welcher die eigene Klasse sowie die Objektvariable deklariert sind, reicht vollkommen aus. Dann machst du es so wie Muetze gesagt hast, und du bist alle Sorgen los. Die Unit musst du nur noch in allen anderen Units einbinden, in welchen du auf das Objekt zugreifen willst.

Greetz
alcaeus

Sanchez 5. Nov 2004 09:53

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:
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;
grüße, daniel

hpf 5. Nov 2004 10:03

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

Sanchez 5. Nov 2004 10:08

Re: Statische Objekte
 
Du greifst auf die Instanz über
Delphi-Quellcode:
TTestClass.Instance
zu. Beim ersten Zugriff wird das Objekt erzeugt. Bei den nachfolgenden bekommst du sie selbe Instanz.

sakura 5. Nov 2004 10:09

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:
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;
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz