AGB  ·  Datenschutz  ·  Impressum  







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

[XE5]: Nutzung des Datenmoduls

Ein Thema von Kralle · begonnen am 27. Jan 2014 · letzter Beitrag vom 31. Jan 2014
Antwort Antwort
Kralle

Registriert seit: 31. Okt 2004
Ort: Bremerhaven
355 Beiträge
 
Delphi XE7 Professional
 
#1

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 06:03
Moin,

Als globalen Speicher immer ein Singleton (Klasse oder Interface) benutzen.

Warum:
  • Zugriff kann threadsicher gemacht werden
  • Auf Änderungen kann reagiert werden (im Setter)
  • Abhängigkeiten zwischen den Variablen können automatisiert werden
  • Speichern und Laden kann direkt in die Klasse integriert werden
  • ...

Hört sich kompliziert an, ist es aber nicht.
Zu mindest die "class"-Lösung kann ich was das Erstellen betrifft nachvollziehen.
Und packst Du das in eine "normale" Unit oder in ein Datenmodul?
Und wie greifst Du aus einer anderen Unit darauf zu?


Gruß HEiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)

Geändert von Kralle (28. Jan 2014 um 06:04 Uhr) Grund: Erweitert
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 06:39
Bei der class Variante heißt die Klasse Global = class und bei der interface Variante gibt es eine function Global : IGlobal; .

Beide Varianten sind in der Benutzung identisch
Delphi-Quellcode:
unit Somewhere;

interface

procedure foo;

implementation

uses
  GlobalStore;

procedure foo;
begin
  if Global.UserID = 10 then
    ...
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Jan 2014 um 06:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#3

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 07:35
Auch zu einem Datenmodul gehört eine Unit, das hat mit globalen Variablen nur sehr wenig zu tun. http://docwiki.embarcadero.com/Libra...es.TDataModule:
Zitat:
TDataModule zentralisiert die Behandlung von nicht-visuellen Komponenten in einer Anwendung.

Mit einem TDataModule-Objekt können Sie in einer Anwendung einen Ort für die zentralisierte Behandlung von nicht-visuellen Komponenten bereitstellen. In der Regel handelt es sich dabei um Datenzugriffskomponenten, wie TSQLDataSet und TSQLConnection. Datenmodule sind nicht auf Datenzugriffskomponenten beschränkt, sie können auch andere nicht-visuelle Komponenten, wie TTimer, TOpenDialog oder TImageList, enthalten.
Man nimmt also ein Datenmodul, klatscht da seine nicht-visuellen Komponenten drauf, stellt sie zur Designtime ein und kann zentral darauf zugreifen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 08:33
Sir Rufo hat dir schon eine vollständige Lösung für dein Problem gezeigt.

Um sein letztes Beispiel nochmal zu verdeutlichen:
Delphi-Quellcode:
unit SomeOtherUnitFromYourProject;

interface

procedure BlaBla;

implementation

uses
  GlobalStore; //ja, das ist die gleiche Unit

procedure BlaBla;
begin
  GlobalStore.Global.UserID := 10;

  if GlobalStore.Global.UserName = 'Krallethen
  begin
    Writeln('Brauche eigentlich für mein Problem kein Datenmodul!');
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 09:29
Und wenn man den GlobalStore mit ein wenig Logik versieht, dann wird beim Setzen von Global.UserId auch schon passend dazu Global.UserRoleID und Global.Username gesetzt.

Oder das passiert auch beim Setzen des Usernamen (UserID, UserRoleID).

UserRoleID könnte zudem auch ReadOnly sein

Oder alle Felder sind ReadOnly und es gibt noch eine Login-Methode die dann diese Felder setzt.
Oder ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 12:52
Folgende zwei Codefragmente sind äquivalent:
Delphi-Quellcode:
type
  Global = class
  private
    class var FUserID : Integer;
    class var FUserRoleID : Integer;
    class var FUsername : string;
    class procedure SetUserID( const Value : Integer );
    class procedure SetUsername( const Value : string ); static;
    class procedure SetUserRoleID( const Value : Integer ); static;
  public
    class property UserID : Integer read FUserID write SetUserID;
    class property UserRoleID : Integer read FUserRoleID write SetUserRoleID;
    class property Username : string read FUsername write SetUsername;
  end;
Das ist im Prinzip nix anderes wie 3 globale Variablen
Delphi-Quellcode:
var
  UserID : Integer;
  UserRoleID : Integer;
  Username : string;
Ob man jetzt noch ein Interface darüberlegt oder den Username automatisch mit der UserID setzt ändert nichts daran dass hier ein "Sack voller globaler Variablen" vorliegt.
Ich habe dazu ein Tutorial geschrieben das für den Einen oder Anderen interessant sein könnte.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#7

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 13:09
Der Vorteil es nicht nur als viele globale Variablen zu machen, ist der, daß man sich später problemlos da überall reinhängen kann, ohne daß am Aufrufenden Code etwas geändert werden muß.

Das reicht schon vollkommen.
Delphi-Quellcode:
type
  Global = class abstract
  private class var
    FUserID : Integer;
    FUserRoleID : Integer;
    FUsername : string;
  public
    class property UserID : Integer read FUserID write FUserID;
    class property UserRoleID : Integer read FUserRoleID write FUserRoleID;
    class property Username : string read FUsername write FUsername;
  end;
Getter und Setter läßt sich nachträglich einfügen und schon kann man Code für eine Werte-Kontrolle der Felder integrieren, oder ein Logging oder oder oder...

Und viel mehr Aufwand ist es auch nicht.
Delphi-Quellcode:
type
  Global = class abstract
    class property UserID : Integer;
    class property UserRoleID : Integer;
    class property Username : string;
  end;
Nun nur noch Strg+Alt+C (Klassenvervollständigung) und fertig isses.


OK, abgesehn von dem BUG, welcher hier grade auftritt.
Denn so sollte das Ergebnis der Klassenvervollständigung wirklich nicht aussehn.
Delphi-Quellcode:
  Global = class abstract
    class property UserID : Integer read FUserID write SetUserID;
    class property UserRoleID : Integer read FUserRoleID write SetUserRoleID;
    class property Username : string read FUsername write SetUsername;
  private
    FUserID: Integer;
  private
    class var FUserRoleID: Integer;
  private
    class var FUsername: string;
  private
  private
  private
    procedure SetUserID(const Value: Integer);
    class procedure SetUsername(const Value: string); static;
    class procedure SetUserRoleID(const Value: Integer); static;
  end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 16:28
Folgende zwei Codefragmente sind äquivalent:
...
Das ist im Prinzip nix anderes wie 3 globale Variablen
...
Ob man jetzt noch ein Interface darüberlegt oder den Username automatisch mit der UserID setzt ändert nichts daran dass hier ein "Sack voller globaler Variablen" vorliegt.
Ja richtig, nur mit dem kleinen aber feinen Unterschied, dass globale Variablen unkontrollierbar und damit/darum böse sind.
In einer Klasse/Interface werden die aber kontrollierbar.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 19:03 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