Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [XE5]: Nutzung des Datenmoduls (https://www.delphipraxis.net/178788-%5Bxe5%5D-nutzung-des-datenmoduls.html)

Sir Rufo 28. Jan 2014 09:29

AW: [XE5]: Nutzung des Datenmoduls
 
Und wenn man den GlobalStore mit ein wenig Logik versieht, dann wird beim Setzen von
Delphi-Quellcode:
Global.UserId
auch schon passend dazu
Delphi-Quellcode:
Global.UserRoleID
und
Delphi-Quellcode:
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 ...

sx2008 28. Jan 2014 12:52

AW: [XE5]: Nutzung des Datenmoduls
 
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.

himitsu 28. Jan 2014 13:09

AW: [XE5]: Nutzung des Datenmoduls
 
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;

Sir Rufo 28. Jan 2014 16:28

AW: [XE5]: Nutzung des Datenmoduls
 
Zitat:

Zitat von sx2008 (Beitrag 1245658)
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.

Perlsau 28. Jan 2014 16:28

AW: [XE5]: Nutzung des Datenmoduls
 
Wieso kann man eigentlich keine Class Const deklarieren, und auch kein Class Type? Ich hab diese geniale Idee mit den Klassenvariablen nämlich gleich mal ausprobiert, um nicht immer alles im Datenmodul deklarieren zu müssen.

Sir Rufo 28. Jan 2014 16:29

AW: [XE5]: Nutzung des Datenmoduls
 
Zitat:

Zitat von Perlsau (Beitrag 1245704)
Wieso kann man eigentlich keine Class Const deklarieren, und auch kein Class Type? Ich hab diese geniale Idee mit den Klassenvariablen nämlich gleich mal ausprobiert, um nicht immer alles im Datenmodul deklarieren zu müssen.

Weil es unnötig ist ;)

Die Konstanten sind immer da und erreichbar und die Types auch

Perlsau 28. Jan 2014 16:31

AW: [XE5]: Nutzung des Datenmoduls
 
Hab Dank, Sir Rufo, genau das hatte ich vermutet, denn es hat bei Const und Type auch ohne vorangestelltes Class funktioniert :thumb:

himitsu 28. Jan 2014 16:33

AW: [XE5]: Nutzung des Datenmoduls
 
Es gibt
Delphi-Quellcode:
class abstract
, wo der Compiler und auch zur Laufzeit eine Exception werfen sollte, wenn man versucht davon eine Instanz zu createn. (die weitere Vererbung könnte man auch noch abschalten)
Und du kannst es auch gerne als Record deklarieren.

In die Klasse rein, kann man auch noch abhängige/private Typen und Konstanten aufnehmen, welche dann nicht im Kontext der Unit "öffentlich" rumschwirren.

Kralle 31. Jan 2014 06:58

AW: [XE5]: Nutzung des Datenmoduls
 
Hallo,

erstmal Entschuldigung das ich erst jetzt antworte.

Ich habe gerade versucht das jetzt umzusetzen - leider ohne Erfolg.
Ich habe eine neue Unit angelegt und so gefüllt:

Delphi-Quellcode:
unit datenmodul;

interface
 type
   Global = class
     private
       class var FSymboltyp : Integer;
       class procedure SetSymboltyp (const Value : Integer);
     public
       class property Symboltyp : Integer read FSymboltyp write SetSymboltyp;
   end;

implementation

procedure Global.SetSymboltyp(const Value : Integer);
 begin
   FSymboltyp:=Value;
 end;

end.
Wenn das Projekt erstellen will bekomme ich diese Fehlermeldungen:

Zitat:

[dcc32 Fehler] datenmodul.pas(10): E2355 Für den Zugriff auf Klasseneigenschaften muss ein Klassenfeld oder eine statische Klassenmethode verwendet werden
[dcc32 Fehler] datenmodul.pas(15): E2037 Deklaration von 'SetSymboltyp' unterscheidet sich von vorheriger Deklaration
[dcc32 Fehler] datenmodul.pas(17): E2003 Undeklarierter Bezeichner: 'FSymboltyp'
[dcc32 Fehler] datenmodul.pas(8): E2065 Ungenügende Forward- oder External-Deklaration: 'Global.SetSymboltyp'
[dcc32 Fataler Fehler] main.pas(8): F2063 Verwendete Unit 'datenmodul.pas' kann nicht compiliert werden
Und die Eingabemarke steht auf dem "SetSymboltyp" nach dem "write".
Wenn es sich um eine Tippfehler handelt, finde ich ihn nicht.

Könnt Ihr noch mal schauen?

Gruß Heiko

DeddyH 31. Jan 2014 07:12

AW: [XE5]: Nutzung des Datenmoduls
 
Delphi-Quellcode:
class procedure Global.SetSymboltyp(const Value : Integer);
 begin
   FSymboltyp:=Value;
 end;
Es ist ja als Klassenmethode deklariert, deshalb muss es auch so implementiert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.
Seite 2 von 4     12 34      

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