AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Statische Objekte

Ein Thema von hpf · begonnen am 5. Nov 2004 · letzter Beitrag vom 5. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
hpf

Registriert seit: 1. Nov 2004
5 Beiträge
 
#1

Statische Objekte

  Alt 5. Nov 2004, 09:24
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Statische Objekte

  Alt 5. Nov 2004, 09:31
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
hpf

Registriert seit: 1. Nov 2004
5 Beiträge
 
#3

Re: Statische Objekte

  Alt 5. Nov 2004, 09:37
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
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#4

Re: Statische Objekte

  Alt 5. Nov 2004, 09:43
Dann musst du alle Formulare von einer UrFormklasse ableiten und dort einen solchen Pointer public deklarieren.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Statische Objekte

  Alt 5. Nov 2004, 09:49
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#6

Re: Statische Objekte

  Alt 5. Nov 2004, 09:51
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#7

Re: Statische Objekte

  Alt 5. Nov 2004, 09:53
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
hpf

Registriert seit: 1. Nov 2004
5 Beiträge
 
#8

Re: Statische Objekte

  Alt 5. Nov 2004, 10:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#9

Re: Statische Objekte

  Alt 5. Nov 2004, 10:08
Du greifst auf die Instanz über
TTestClass.Instance zu. Beim ersten Zugriff wird das Objekt erzeugt. Bei den nachfolgenden bekommst du sie selbe Instanz.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Statische Objekte

  Alt 5. Nov 2004, 10:09
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;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.
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