AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Globale Vriablen, Record´s oder Objecte Konfigurationsdaten
Thema durchsuchen
Ansicht
Themen-Optionen

Globale Vriablen, Record´s oder Objecte Konfigurationsdaten

Ein Thema von Jens Hartmann · begonnen am 11. Apr 2009 · letzter Beitrag vom 12. Apr 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

Globale Vriablen, Record´s oder Objecte Konfigurationsdaten

  Alt 11. Apr 2009, 10:17
Hallo zusammen,

ich habe mal wieder eine Frage, aber ein die für mich keine Lösungsproblem darstellt, sondern vielmehr stelle ich mir die Frage welcher Lösungsweg wohl der richtige wäre.

Ich habe mein Programm eigendlich fertig,(was man so fertig nennen kann).
Jetzt sitze ich zur Zeit davor, den Code anzupassen und gewisse Sachen eventuell einfacher und Übersichtlicher zu lösen.

Mein Problem ergibt sich jetzt dabei, das ich in meiner Datenbank eine Tabelle habe, in der einige (ca. 25) Einstellungsparameter gespeichert sind. Diese nutze ich für z.B. USER Rechte, Systemkoniguration etc.

Beim Start von meinem Programm, und in verschiedenen Funktionen, benötige ich jetzt diese Werte
(String´s, Integer und Boolean(als Integer 0/1).

Daher meine Frage: 1. Lese ich alle Parameter direkt beim Programmstart ein oder immer dann wenn ich Sie benötige.
2. Wenn ich die Parameter einlese, trage ich diese direkt in Ihrer Komponenten ein, die allerding auf verschieden Formen positioniert sind, oder lese ich die Parameter z.B. in Globale Variablen, Record´s oder Objecte.
3. ....?

Naja so könnte man jetzt fortfahren, Also meine gezielte Frage: Wie geht man sowas mit solchen Parametern(Einstellungen) an.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 10:23
Also ich würde die Einstellungen zum Programmstart laden, dann hast du später keine Ladezeiten. Kommt aber immer drauf an, wie oft du mit den Einstellungsparametern arbeiten musst, damit es sich lohnt das beim Programmstart zu tun.

Was das Speichern betrifft, kommts halt auch wieder drauf an was du damit machen willst, verrat doch einfach mal mehr!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 10:25
Benutzt du ein Datenmodul?
Markus Kinzler
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 10:35
3. Du hälst an allen stellen eine Referenz auf deinen ConfigManager oder wie er bei dir auch heißt.

Den könntest du bereits in der DPR erzeugen und an das erste Form und andere Objekte, die dort erzeugt werden übergeben.
Wenn du Code nur in Forms liegen hast und/oder dein Hauptform in seinem ctor oder FormCreate deinen Initialisierungs-Code hat, dann könntest du es auch dort erzeugen.
Wichtig ist halt, dass du die Referenz an alle Objekte weitergibst, die du anlegst.
Globale Funktionen wären hier natürlich Shy-C, aber das sind sie sowieso.
Wenn du deine Logik, die mit den Config-Daten arbeiten musst schön in Instanzmethoden von Klassen stehen hast, kannst du diesen Klassen einfach eine Referenz mitgeben.
Globale Referenzen sind ziemlich beschissen, was Skalierung oder spätere Änderungen angeht.
Es kann ja gut sein, dass du einen 2. Satz von Configs haben willst, der während des Editierens "lebt" und wenn der User diesen 2. Satz testen will, will er ja nicht den richtigen Satz Configs zerlegen. Für alle Fenster/Worklflows, die nix mit dem Testen der neuen Config zu tun hätten, sollte ja weiterhin der richtige satz von Werten gelten können.
Oder wenn du einen Thread startest, willst du dem vllt eine kopie der aktuellen Settings mitgeben. So kann der seine Aufgabe erledigen ohne a) ständig alle Zugriffe auf die Config mit Criticalsections zu sperren (und gesperrt zu werden) und b) würde er konsistent mit dem gleichen Satz von Anfang bis Ende arbeiten.

Wenn du globale Variablen benutzt, kannst du sowas schlicht und ergreifend vergessen.

@Datamodule: Die Viecher sind doch auch nur globale Variablen.
Rein vom Code design her, wären Datamodules höchsten zu gebrauchen um von der Configklasse instanziert zu werden damit dort einige Logik visuell zusammengeklickt werden kann. (Also 2-10 Minuten Code eingespart, dafür X Abhängigkeiten und Points of Failure gewonnen)
Aber unterm Strich bringen DMs fast gar nix.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 10:40
Zitat von SimStar001:
Was das Speichern betrifft, kommts halt auch wieder drauf an was du damit machen willst, verrat doch einfach mal mehr!
Also, das sind alles Variablen, die ich in verschiednen Formen einstellen kann. Mein Programm kann z.B. automatisch E-Mail´s über SMTP Server versenden. In einer Form siehe Anhang, kann man das halt konfigurieren. Momentan, habe ich einfach die Werte fest als EDIT.Text in der Entwurfszeit eingetragen, um die Funktionen Funktionen zu testen. Mittlerweile, habe ich allerdings diese ganzen Daten in einer Datenbank, und diese Wert auch schon über Speicherfunktonen dort hinterlegt.

Alle anderen Einstellungen, habe eigendlich den selben Sinn. Parameter der COM-Schnittstelle, Berechtigungsklassen(welche Button, Menü´s etc,) welcher angemeldete USER nutzen will, oder überhaupt erst darf.

Also im Grundegenommen, die üblichen Einstellungen in einen Programm OPTIK und FUNKTION.

Zitat von mkinzler:
Benutzt du ein Datenmodul?
Zur Zeit noch nicht. Momentan, befinden sich meine Connection und Query Komponenten auf den jeweiligen Formen, ich will das aber eigendlich irgendwann mal umstellen. Nur am Anfang, wusste ich noch nicht genau wie das geht, und daher momentan ohne Datenmodul.

Gruß Jens

[EDIT]
Zitat von Elvis:
@Datamodule: Die Viecher sind doch auch nur globale Variablen.
Rein vom Code design her, wären Datamodules höchsten zu gebrauchen um von der Configklasse instanziert zu werden damit dort einige Logik visuell zusammengeklickt werden kann. (Also 2-10 Minuten Code eingespart, dafür X Abhängigkeiten und Points of Failure gewonnen)
Aber unterm Strich bringen DMs fast gar nix.
Das z.B. ist für mich schon wieder eine ganz neue Ansicht. Allerdings, gebe ich zu, das ich von dem Rest was du geschrieben hast, nicht alzu viel verstanden habe. Das muss ich mir erst nochmal in Ruhe durchgehen.

Gruß Jens
Miniaturansicht angehängter Grafiken
beispiel_930.jpg  
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 14:34
Hallo Jens,

die Daten für die COM-Schnittstelle und der Datenbank lege ich als INI-Datei ab. Beim Start des Programms wird danach gesucht und entweder sie sind vorhanden, oder sie werden neu angelegt.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 14:38
Wenn man einen Wert aus einer anderen Form braucht, dann übergibt man den Wert an die Form beim Erzeugen als Property:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FMeinText: String;
  public
    { Public-Deklarationen }
    property MeinText: String read FMeinText write FMeinText;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  ShowMessage(FMeinText);
end;

end.
Delphi-Quellcode:
uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
var
  ZweiteForm: TForm2;
begin
  ZweiteForm := TForm2.Create(nil);
  try
    ZweiteForm.MeinText := 'Dieser Text kommt aus Form1';
    ZweiteForm.ShowModal;
  finally
    ZweiteForm.Free;
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 15:19
Hallo Jens,

eine mögliche Art, das mit einer Klasse anzugehen (die wird für jedes Programm benötigt und beruht auf einer Klassenhierarchie, die allen gemeinsam ist):

Delphi-Quellcode:
{ Deklaration }
  type

  TBPMLogSettings = class (TRKIniSettingTable)
    public
    Station_Node : TRKiniSettingValue; { group }
    Station_Description : TRKiniSettingValue; { group }
    Station_CommPort : TRKiniSettingValue; { group }
    Station_USBSerial : TRKiniSettingValue; { group }
    QSDoc_Path : TRKiniSettingValue;

.....

{ Create }
constructor TBPMLogSettings.CreateTable (IC : TRKIniClass);
var CSection : ShortString;

begin
inherited Create (IC);

with BLMainForm do
  begin
  CSection := 'Station';
  Station_Node := TRKiniSettingValue.Create_Integer (-maxStationNo,CSection,
        'Node',0, [] ,self);
  Station_Description := TRKiniSettingValue.Create_String (-maxStationNo,CSection,
        'Description','', [] ,self);
  Station_CommPort := TRKiniSettingValue.Create_Integer (-maxStationNo,CSection,
        'CommPortNumber',0, [] ,self);
  Station_USBSerial := TRKiniSettingValue.Create_String (-maxStationNo,CSection,
        'USBSerial','', [] ,self);
  QSDoc_Path := TRKiniSettingValue.Create_String (1,'QS-Doc',
        'Path','', [] ,self);

....

{ Wert holen }
fTimeBase := BPMLogSettings.Station_TimeBase.GetInteger (1);
Erklärung:

Es gibt für jedes Programm eine Klasse XYZLogSettings, in der ein Parameter als TRKiniSettingValue deklariert wird. Im Konstruktor dieser Klasse wird durch einen Create-Aufruf für jeden Parameter festgelegt, um was für einen Type es sich handelt (Bool,Integer,Real,String,Binary,Windowposition,Fo nt,Color...), welcher Default und wenn möglich auch (vorletzter Parameter) Controls zum Lesen und Schreiben, für die meisten Typen ein array of TEdit.

Im Regelfall ist das meiste damit erledigt: Alles was in XYZLogSettings deklariert ist, kann am Programmbeginn mit ReadAllValues gelesen werden, und geänderte Werte werden am Programmende mit SaveAllValues in die Ini-Datei oder Registry zurückgespeichert.

Das mit den Gruppen ist noch eine weitere Arbeitserleichterung: mit dem Wert 10 werden 10 Werte definiert nach dem Muster Section - Key1 - Key2 ... Key10, mit dem Wert -10 nach dem Muster Section1 - Key, Section2 - Key usw. einfache Werte haben eben eine 1.

Es gibt natürlich noch viel mehr Möglichkeiten, aber das gehört nicht hierher.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 15:21
Hallo,

wenn man ein Datenmodul benutzt kann man zum Beispiel das Speichern und Laden der INI-Datei im Datenmodul unterbringen.

Delphi-Quellcode:
procedure TDM.DataModuleCreate(Sender: TObject);
var
  Test: Boolean;
  DBVerbindungsDaten: TDBVerbindungDaten;
  aInitDateiName: TFileName;
begin
  IniPathName(aInitDateiName);
  if not FileExists(aInitDateiName) then
  begin
    // Es besteht keine Verbindung zur Datenbank
    TfrmDatenBankVerbinden.GetData1 (Test, DM.SPSDAPDataBase,
                                 DM.SPSDAPDataSet, DM.SPSDAPTransactionPruefen);
  end else
  begin
    DBVerbindungsDaten:= TDBVerbindungDaten.Create;
    try
      DBVerbindungsDaten.DBDatenIniLesen(aInitDateiName);
      DM.SPSDAPDataBase.DBName:= DBVerbindungsDaten.DBPathName;
      DM.SPSDAPDataBase.LibraryName:= DBVerbindungsDaten.FBLibaray;
      DM.SPSDAPDataBase.ConnectParams.UserName:= DBVerbindungsDaten.DBNutzer;
      DM.SPSDAPDataBase.ConnectParams.Password:= DBVerbindungsDaten.DBPasswort;
    finally
      DBVerbindungsDaten.Free;
    end;
  end;
beim Verlassen des Programms werden die aktuellen Verbindungsdaten wieder in die INI-Datei geschrieben.

Delphi-Quellcode:
procedure TDM.DataModuleDestroy(Sender: TObject);
var
  DBVerbindungsDaten: TDBVerbindungDaten;

  aInitDateiName: TFileName;
begin
  IniPathName(aInitDateiName);
  DBVerbindungsDaten:= TDBVerbindungDaten.Create;
  try
    DBVerbindungsDaten.DBPathName:= DM.SPSDAPDataBase.DBName;
    DBVerbindungsDaten.FBLibaray:= DM.SPSDAPDataBase.LibraryName;
    DBVerbindungsDaten.DBNutzer:= DM.SPSDAPDataBase.ConnectParams.UserName;
    DBVerbindungsDaten.DBPasswort:= DM.SPSDAPDataBase.ConnectParams.Password;
    DBVerbindungsDaten.DBDatenIniSchreiben(aInitDateiName);
  finally
    DBVerbindungsDaten.Free;
  end;
Damit das ganze Funktioniert muss in der Project-Datei die Datei als erstes stehen:

Delphi-Quellcode:
program SPSDAP2009;

uses
  uDatenBankVerbindung in 'SPSDAP-Datenbank\uDatenBankVerbindung.pas{frmDatenBankVerbinden},
  uSPSDAPDM in 'SPSDAP-Datenbank\Datenmodul\uSPSDAPDM.pas{DM: TDataModule},

usw.
Außer für die Forms habe ich im gesamten Programm keine globale Variablen.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Globale Vriablen, Record´s oder Objecte Konfigurationsda

  Alt 11. Apr 2009, 17:07
Hhmm, ist jetzt doch echt komplizierter als ich dachte. Ich glaube ich versteh das noch nicht so ganz. Ich habe die Daten, die zur Nutzung des Programm´s notwendig sind, ja eigendlich vor in eine Datenbank zu implementiern, bzw ich habe das so schon gemacht. Jetzt wird hier schon wieder von INI-Dateien, Registry etc. geredet, so wie ich es ja zum Teil schon programmiert habe.

Meine Einstellungen für die COM-Schnittstelle liegen momentan in der Registry, meine Kundeninformationen in einer verschlüsslten Textdatei, die Einstellungen für E-Mail und Oberflächen Gestaltung mache ich momentan manuell über die Entwurfszeitkomponenten, wie TEdit.Text. Die restlichen Parameter wie Hardwareanpassung(Zentralenverwaltung etc.) liegen in einer INI-Datei gespeichert.

Wenn ich diese Informationen jetzt benötige, frage ich die wie folgt ab...

Delphi-Quellcode:
  Einstellungen := TIniFile.Create(C:\Programe\HU\Print&Save\Einstellungen.Ini');
with Einstellungen do begin
ConfigComForm.CBAutoAufzeich.Checked := ReadBool(
'Einstellung','Automatische Aufzeichnung', false);
ConfigComForm.CBSystemstart.Checked := ReadBool(
'Einstellung', 'Automatischer Programmstart', false);
ConfigComForm.RGZentralentyp.ItemIndex := ReadInteger(
'Einstellung', 'Zentralentyp', 0);
end;
Einstellungen.Free;}

ComPort1.LoadSettings(stRegistry,
'HKEY_LOCAL_MACHINE\Software\HU\PRINTSAVE');
Pfad:=ExtractFilePath(Application.EXEName);
Jetzt muss ich zugeben, das ich ein bißchen überfordert bin. Weil meine Gedanken, gingen eigendlich dahin, das ich alle Einstllungen und Parameter sowie Informationen, in meiner Datenbank integrieren wollte, und diese daraus Abfrage.

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:21 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