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
Seite 1 von 4  1 23     Letzte »    
Kralle

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

[XE5]: Nutzung des Datenmoduls

  Alt 27. Jan 2014, 22:48
Hallo,

ich habe das Problem, das ich den Inhalt einer Variablen in mehreren Units nutzen will und diese Units nicht gegenseitig in die uses eintragen wiil.
Also, dachte ich mir:"Nimm doch ein Datenmodul."
Also, ein Datenmodul erstellt und die eine Variable vom Typ integer darin definiert.
Wenn ich jetzt in Unit 1 der Variablen einen Wert zuweise, kann ich ihn auch in Unit 1 wieder auslesen.
Aber, in keinen anderen Unit.
Das Datenmodul ist in den uses der units eingetragen.

Habe ich einen Denkfehler? Kann man ein Datenmodul so nicht nutzen?

Ich habe das Problem auch schon in d.c.l.d.m.
https://groups.google.com/d/msg/de.c...M/O5lJiV8DjAcJ angesprochen, aber die Lösungsvorschläge (außer neues Projekt erstellen - habe ich noch nicht gemacht) brachten nicht.

Vieleicht habe ich ja ein grundsätzlichen Gedankenfehler (in Bezug auf die Datenmodule )den wir bisher übersehen haben.

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: [XE5]: Nutzung des Datenmoduls

  Alt 27. Jan 2014, 23:08
Wozu soll das Datenmodul gut sein, wenn es garnicht benutzt und nichtmal irgendwo instanziiert wird?
Eine globale Variable kann man auch so deklarieren.

Im Endeffekt läuft dein gezeigter Code darauf hinaus
und dieser ist eigentlich korrekt, auch wenn nicht unbedingt schön.
Delphi-Quellcode:
unit meineschrottigenglobalenvariablen;

interface

var
  MaxLine: integer;
  Symboltyp: Integer;

implementation

end.


Wie und wo verwendest du diese Variablen?

Antwort: Mit deinem Datenmodul ist alles in Ordnung, da es nichts macht.
Aber da du sonst alles Wichtige über die Variablen verschweigst, kann dir Keiner helfen.
$2B or not $2B

Geändert von himitsu (27. Jan 2014 um 23:17 Uhr)
  Mit Zitat antworten Zitat
fillibuster

Registriert seit: 3. Nov 2010
Ort: Coesfeld
245 Beiträge
 
Delphi 2010 Professional
 
#3

AW: [XE5]: Nutzung des Datenmoduls

  Alt 27. Jan 2014, 23:09
Hallo,

für solche Zwecke reicht eine Unit völlig aus. Du möchtest programmweit erreichbare (also globale) Variablen:
Delphi-Quellcode:
unit globalsUnit;

interface

var
  UserId : integer;
  UserRoleId : integer;
  UserName : string;


implementation

end.
Ein Datenmodul ist ja eher ein nonvisuelles Form - ich pack da immer alle meine Datenbankobjekte rein.

Viele Grüße ….
  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
 
#4

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 00:32
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.
Delphi-Quellcode:
unit GlobalStore;

interface

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;

implementation

{ Global }

procedure Global.SetUserID( const Value : Integer );
begin
  FUserID := Value;
end;

class procedure Global.SetUsername( const Value : string );
begin
  FUsername := Value;
end;

class procedure Global.SetUserRoleID( const Value : Integer );
begin
  FUserRoleID := Value;
end;

end.
über ein Interface
Delphi-Quellcode:
unit GlobalStore;

interface

type
  IGlobal = interface
    ['{F0A0B4C5-44CF-401A-983E-B68CF010A0AD}']
    function GetUserID : Integer;
    procedure SetUserID( const Value : Integer );
    property UserID : Integer read GetUserID write SetUserID;
    function GetUserRoleID : Integer;
    procedure SetUserRoleID( const Value : Integer );
    property UserRoleID : Integer read GetUserRoleID write SetUserRoleID;
    function GetUsername : string;
    procedure SetUsername( const Value : string );
    property Username : string read GetUsername write SetUsername;
  end;

function Global : IGlobal;

implementation

type
  TGlobal = class( TInterfacedObject, IGlobal )
  private
    class var _Default : IGlobal;
  private
    FUserID : Integer;
    FUserRoleID : Integer;
    FUsername : string;
  public
    class function Default : IGlobal;
    function GetUserID : Integer;
    function GetUserRoleID : Integer;
    function GetUsername : string;
    procedure SetUserID( const Value : Integer );
    procedure SetUserRoleID( const Value : Integer );
    procedure SetUsername( const Value : string );
  end;

function Global : IGlobal;
begin
  Result := TGlobal.Default;
end;

{ TGlobal }

class function TGlobal.Default : IGlobal;
begin
  if not Assigned( _Default ) then
    _Default := TGlobal.Create;
  Result := _Default;
end;

function TGlobal.GetUserID : Integer;
begin
  Result := FUserID;
end;

function TGlobal.GetUsername : string;
begin
  Result := FUsername;
end;

function TGlobal.GetUserRoleID : Integer;
begin
  Result := FUserRoleID;
end;

procedure TGlobal.SetUserID( const Value : Integer );
begin
  FUserID := Value;
end;

procedure TGlobal.SetUsername( const Value : string );
begin
  FUsername := Value;
end;

procedure TGlobal.SetUserRoleID( const Value : Integer );
begin
  FUserRoleID := Value;
end;

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)
  Mit Zitat antworten Zitat
Kralle

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

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 06:53
Moin,

Wozu soll das Datenmodul gut sein, wenn es garnicht benutzt und nichtmal irgendwo instanziiert wird?
Deshalb, frage ich ja hier um zu erfahren ob ich alles richtig gemachtr habe bei der Nutzung.
Eine globale Variable kann man auch so deklarieren.
Ich will aber Werte die ich in einer Unit produziere in anderen Units nutzen und da sollte doch ein Datenmodul der schönere Weg sein - oder?
Wie und wo verwendest du diese Variablen?
Hier wird sie gesetzt:
Delphi-Quellcode:
unit allgemein;

interface

uses
.... datenmodul; // Einbinden um Felder deaktivieren zu können

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form_Allgemein: TForm_Allgemein;

implementation

{$R *.dfm}


procedure TForm_Allgemein.CoB_SymboltypChange(Sender: TObject);
begin
 datenmodul.MaxLine:= CoB_Symboltyp.ItemIndex;
 CB_Activate_Symbol.Caption:=IntToStr(CoB_Symboltyp.ItemIndex)+'##'+inttostr(datenmodul.MaxLine);
end;


end.
und hier zum Beispiel genutzt:
Delphi-Quellcode:
unit anschluesse;

interface

uses
...,
   datenmodul; // Einbinden um Felder deaktivieren zu können


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form_Anschluesse: TForm_Anschluesse;

implementation

{$R *.dfm}


procedure TForm_Anschluesse.FormShow(Sender: TObject);
begin
 lbledt_AnzAnschluesse.EditLabel.Caption:=IntToStr(datenmodul.MaxLine);
 if datenmodul.MaxLine in [7,8,9,10,11,12,13,14] then
   begin
     Form_Anschluesse.chklst_GAnschluesse.Enabled:=False;
     Form_Anschluesse.chklst_KAnschluesse.Enabled:= False;
     Form_Anschluesse.lbledt_AnzAnschluesse.Enabled:=False;
    end
 else

   if datenmodul.MaxLine = 6 then
     begin
       Form_Anschluesse.chklst_GAnschluesse.Enabled:=False;
       Form_Anschluesse.chklst_KAnschluesse.Enabled:= True;
       Form_Anschluesse.lbledt_AnzAnschluesse.Enabled:=True;
     end
   else
     begin
       Form_Anschluesse.chklst_GAnschluesse.Enabled:=True;
       Form_Anschluesse.chklst_KAnschluesse.Enabled:=false;
       Form_Anschluesse.lbledt_AnzAnschluesse.Enabled:=False;
     end;




end;
Antwort: Mit deinem Datenmodul ist alles in Ordnung, da es nichts macht.
Genau das ist das "Problem". Aber wenn es nichts macht, warum kann ich in der ersten Unit den Variableninhalt wieder auslesen und in der zweiten nicht?

Aber da du sonst alles Wichtige über die Variablen verschweigst, kann dir Keiner helfen.
Nicht mit Vorsatz. Ich dachte ich hätte das Problem deutlich genug beschrieben ohne Quellcode posten zu müssen.

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Kralle

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

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 06:57
Moin,

Hallo,

für solche Zwecke reicht eine Unit völlig aus. Du möchtest programmweit erreichbare (also globale) Variablen:
Ein Datenmodul ist ja eher ein nonvisuelles Form - ich pack da immer alle meine Datenbankobjekte rein.

Viele Grüße ….
Aber, meine Variablen sind doch auch Nonvisuell.
Und da ich noch nicht weiß, was in der nächsten Ausbaustufe alles kommt, wollte ich halt jetzt schon alle "globalen" Datenspeicher an einem Ort zusammenfassen.

Gruß Heiko
OS: Windows 10 Professional, Delphi XE7 Pro SP1 +(Mobilpack & FireDAC)
  Mit Zitat antworten Zitat
Kralle

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

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 07: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 07: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
 
#8

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 07: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 07:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 08: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.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: [XE5]: Nutzung des Datenmoduls

  Alt 28. Jan 2014, 09: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
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    

 

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 22:58 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