![]() |
Globale Variable - Definition
Hallo alle...
ich bin verwirrt... Entweder zu spät oder überarbeitet. :oops: Ich habe eine Klasse welche über den gesamten Lebenszyklus der Anwendung existiert (Properties). Die einzige Instanz der Klasse soll von allen Formularen "erreichbar" sein. Da sowieso ein DataModule existiert dachte ich rein damit nach folgendem Muster.
Delphi-Quellcode:
die Frage: Zählt rein Definitionstechnisch die Instanz von dBK als globale Variable ?
.
. type TDataModuleCommon = class(TDataModule) . . procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var DataModuleCommon: TDataModuleCommon; dBK: TdBK; implementation {$R *.dfm} procedure TDataModuleCommon.DataModuleCreate(Sender: TObject); begin dBK:= TdBK.Create; end; procedure TDataModuleCommon.DataModuleDestroy(Sender: TObject); begin dBK.Free; end; Für Anregungen dankbar... :hi: |
AW: Globale Variable - Definition
Ja, das sollte so funktionieren. Alternativ würde ich aber die Instanz von dBK im initialization / finalization Part der Unit verarbeiten.
|
AW: Globale Variable - Definition
Warum wirfst du die Variable dBK nicht in die Klasse TDataModuleCommon rein?
|
AW: Globale Variable - Definition
Hatte ich zuerst. Da mußte aber noch jedesmal beim Aufruf DataModuleCommon davor.
Beispiel: DataModuleCommon.dBK.Properties.Database.Host war mir irgendwie zu lang jedesmal. Mit obigem Muster fällt dann im Aufruf DataModuleCommon weg. Nur ist das dann mit einer globalen Variable vergleichbar ? Danke... |
AW: Globale Variable - Definition
Ich mache es bisher immer so, dass ich Variablen in entsprechende Objekte kapsle. Bin ich dann mal zu faul es immer auszuschreiben baue ich mir eine "Shortcut"-Funktion, die mir eben das Objekt liefert :stupid: Ist vor allem dann hilfreich wenn ich Singleton-Pattern einsetze.
|
AW: Globale Variable - Definition
Delphi-Quellcode:
Wenn die DB auch schon existieren soll, dann müßte/könnte man dieses als class var und class property deklarieren und in initialzation der Unit erstellen.
type
TDataModuleCommon = class(TDataModule) . . procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); private { Private-Deklarationen } FdBK: TdBK; public { Public-Deklarationen } property dBK: TdBK; end; var DataModuleCommon: TDataModuleCommon; // DataModuleCommon.dBK |
AW: Globale Variable - Definition
Danke an alle...
@himi: das ist der normale Weg. Da hab ich immer noch DataModuleCommon davor. Ich bin halt schreibfaul und die Kettenaufrufe mag ich nicht. Mit Generics läßt sich das doch etwas verbessern... muß ich mal lesen. |
AW: Globale Variable - Definition
Ich wüßte jetzt nicht was hier jetzt die Generics helfen sollen,
aber die Generics funktionieren auch nur in Klassen. |
AW: Globale Variable - Definition
Wie wäre es mit einer eigenen Unit?
Delphi-Quellcode:
So ist keine projekt-globale-Variable vorhanden.
unit dBKU;
interface type TdBK = class : : end; function dBK: TdBK; implementation var gdBK: TdBK; function dBK: TdBK; begin Result:=gdBK; end; initialization gdBK:= TdBK.Create; finalization gdBK.Free; end. |
AW: Globale Variable - Definition
Delphi-Quellcode:
So sieht es doch auch nett aus.
function dBK: TdBK;
begin if not Assigned(gdBK) then gdBK := TdBK.Create; Result := gdBK; end; initialization finalization gdBK.Free; end. |
AW: Globale Variable - Definition
Ich hab das immer so :stupid:
Delphi-Quellcode:
Bitte aber die ShortcutName()-Methode umbenennen ;)
TSingletonClass = class(TObject)
private class var FInstance; class procedure Init(); class procedure Finalize(); constructor Create(); reintroduce; public class function GetInstance(): TSingletonClass; destructor Destroy(); end; function ShortcutName(): TSingletonClass; implementation class procedure TSingletonClass.Init(); begin { ... } end; class procedure TSingletonClass.Finalize(); begin { ... } end; class function TSingletonClass.GetInstance(): TSingletonClass; begin if (not Assigned(TSingletonClass.FInstance)) then TSingletonClass.FInstance := TSingletonClass.Create(); Resul := TSingletonClass.FInstance; end; function ShortcutName(): TSingletonClass; begin Result := TSingletonClass.GetInstance(); end; initialization TSingletonClass.Init(); finalization TSingletonClass.Finalize(); |
AW: Globale Variable - Definition
gdBK sollte aber initialisiert werden!
Zitat:
|
AW: Globale Variable - Definition
Es ist zwar schon spät, aber fehlt da nicht ein ELSE-Teil?
|
AW: Globale Variable - Definition
Wo genau? Ich glaube aber nein. Das Objekt muss ja immer zurückgegeben werden. Wenn es bisher nur noch nicht existiert, dann muss es vorher noch erzeugt werden.
|
AW: Globale Variable - Definition
@s.h.a.r.k: So ähnlich mach ich es auch. Aber sollte nicht der Destruktor auch privat sein?
|
AW: Globale Variable - Definition
Zitat:
Nur bei den lokalen Variablen sieht das anders aus, denn dort wird es aus Performancegründen oftmals nicht gemacht (außer bei String dyn. Array und Interface) und bei vielem Anderem, was sonst noch von irgendwo anders herkommt (z.B. GetMem und Co.). |
AW: Globale Variable - Definition
Zitat:
|
AW: Globale Variable - Definition
Private kann der Destructer überhaupt nicht sein.
Denn wir überschreiben ja diesen und ein Nachfahre möchte dieses auch gerne tun können, was mit Private nicht möglich wäre :zwinker: Aber Protected wäre ein gutes Fleckchen dafür. |
AW: Globale Variable - Definition
Zitat:
|
AW: Globale Variable - Definition
Zitat:
Die Lösung der Probleme mit den globalen Variablen und Singleton bietet die Dependency Injection. Es braucht aber einige Wochen oder Monate bis man es begriffen und akzeptiert hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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-2025 by Thomas Breitkreuz