AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte SJ Config Utils 1.0 RC 3
Thema durchsuchen
Ansicht
Themen-Optionen

SJ Config Utils 1.0 RC 3

Ein Thema von jaenicke · begonnen am 29. Mai 2009 · letzter Beitrag vom 21. Jun 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von jaenicke
jaenicke
Registriert seit: 10. Jun 2003
Hallo!

Diese Unit stellt eine Klasse zur automatischen Verwaltung der Einstellungen zur Verfügung. Um diese in einem eigenen Programm zu verwenden, bindet man die Unit ein und leitet eine eigene Einstellungsklasse von TAppConfigManager ab. Diese Klasse muss dann bestimmte Methoden implementieren und bekommt die notwendigen Objekte zum Auslesen der Einstellungen geliefert.
Mehr dazu im zweiten Teil unter Implementierung im eigenen Programm.

Eine Demo ist mit im Download enthalten. Der Wizard davon sieht so aus:
http://www.sj-berlin.de/service/df/s...zard_thumb.png

Ein Forum zum Support und mit weiteren Informationen entsteht hier:
http://sjberlin.de/forum/viewforum.php?f=24

Features:
  • Automatische Verwaltung der Einstellungen
  • Bereitstellung der Objekte zum Auslesen
  • Unterstützung verschiedener Orte für die Einstellungen
    • Arbeitsspeicher - nur für die Session
    • Portabel - Verzeichnis der Anwendung
    • Neu! Portabel angehängt an die Exe
    • Anwendungsdatenverzeichnisse
    • Registry
  • Unterstützung mehrerer Dateitypen
    • XML-Dateien
    • INI-Dateien
    • Eigenes Format (Stream)
  • Vereinfachter identischer Zugriff auf XML-Dateien, INIs und die Registry
  • Aufforderung zum Aufruf des Einstellungswizards
  • Angabe eigener Fehlermeldungen
  • Fenster zur detaillierten Fehleranzeige
  • Integrierte Stringbehandlung für Streams inkl. UTF-8 Encoding für volle Delphi 2009 Interoperabilität
Lizenz:
MPL 1.1 oder GPL 2.0 oder LGPL 2.1

Installation:
Die Unit muss entweder in den Bibliothekspfad aufgenommen oder dem Projekt hinzugefügt werden, damit die Unit über die uses-Klausel eingebunden werden kann.
Zur Verwendung siehe die Details im zweiten Teil:
http://www.delphipraxis.net/internal...042718#1042718

Unterstützte Delphiversionen:
Delphi 6, 7, 2006, 2007 und 2009
(in Delphi 7 und früher fehlt die XML-Unterstützung, daher muss in Source\SJConfigUtils.inc der Schalter für XML-Unterstütuzung deaktiviert werden)

Unterstützte Windowsversionen:
Windows 2000, XP, Vista und 7

Weitere Planung:
  • Assistent für Integration in Software - Fertig, integriert
Bekannte Probleme:
  • keine
Einen FAQ Eintrag mit weiteren Informationen zu den Hintergründen findet ihr hier:
http://www.delphi-library.de/viewtopic.php?p=541637

Ich habe die Unit auch hier vorgestellt:
http://forum.delphi-treff.de/showthread.php?t=26681
http://www.delphi-forum.de/viewtopic.php?p=562996

Ich habe mal ein kleines Demovideo gemacht zur besseren Illustration des Integrationstools:
http://www.sjberlin.de/service/video...utils_demo.wmv (ggf. vorher speichern)
Und für den IE als Webseite: http://www.sjberlin.de/service/video...tils_demo.html

Schönen Gruß,
Sebastian
Miniaturansicht angehängter Grafiken
sjconfigutils_wizard_213.png  
Angehängte Dateien
Dateityp: zip sjconfigutils1.0rc3_src_214.zip (128,1 KB, 137x aufgerufen)
Dateityp: zip sjconfigutils1.0rc3_941.zip (782,9 KB, 165x aufgerufen)
 
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#2
  Alt 29. Mai 2009, 05:45
Teil 2: Implementierung im eigenen Programm

Wie ich bereits gesagt habe muss die eigene Einstellungsklasse von TAppConfigManager abgeleitet werden. Wenn bereits eine solche Klasse existiert, kann diese einfach entsprechend ergänzt werden. So habe ich es bei meinen Projekten auch gemacht.
Dann müssen ein paar Methoden überschrieben bzw. implementiert werden. Insgesamt sieht das dann so aus:
Delphi-Quellcode:
uses
  XMLIntf, IniFiles, Registry, SJConfigUtils, ...;

type
type
  TAppConfig = class(TAppConfigManager)
  protected
    procedure LoadFromStream(Data: TStream); override;
    procedure SaveToXml(Ini: IXMLDocument); override;
    procedure LoadFromINI(Ini: TCustomIniFile); override;
    procedure LoadFromRegistry(Reg: TRegistry; ParentPath: String); override;

    procedure SaveToStream(Data: TStream); override;
    procedure LoadFromXml(Ini: IXMLDocument); override;
    procedure SaveToINI(Ini: TCustomIniFile); override;
    procedure SaveToRegistry(Reg: TRegistry; ParentPath: String); override;

    procedure RunConfigWizard; override;
    procedure ApplyStandardSettings; override;
    procedure GetProgramInfo(var Author, ProductName, ProductVersion: string); override;
  end;

implementation

uses
  ConfigWizard;

{ TAppConfig }

// Allgemeine Aufgaben

procedure TAppConfig.RunConfigWizard;
begin
  frmConfigWizard := TfrmConfigWizard.Create(nil);
  frmConfigWizard.ShowModal(Self);
end;

procedure TAppConfig.ApplyStandardSettings;
begin
  fUserName := 'Standardname';
end;

procedure TAppConfig.GetProgramInfo(var Author, ProductName,
  ProductVersion: string);
begin
  Author := 'Sebastian Jänicke';
  ProductName := 'SJ Config Utils Demo';
  ProductVersion := '1.0';
end;

...
Bei RunConfigWizard muss ein eigener Einstellungswizard angezeigt werden, der den Benutzer auch nach dem Ort für die Einstellungen fragen sollte. Ihr könnt natürlich den der Demo übernehmen und anpassen.

Für das Auslesen und Speichern der Einstellungen gibt es ReadString, WriteString, und so weiter. Das sieht dann so aus:
Delphi-Quellcode:
procedure TAppConfig.LoadFromXml(Ini: IXMLDocument);
begin
  if AccessManager.InitReadLocation('Userinfo', sIniSectionOpenError) then
  begin
    fUserName := AccessManager.ReadString('Username', sIniValueNotFound);
  end;
end;

...
Dabei wird mit InitReadLocation ein Knoten einer XML-Datei, ein Schlüssel in der Registry oder eine Sektion einer INI geöffnet und dann darin die Werte gelesen.

Eine andere Möglichkeit ist, die übergebenen Objekte direkt zu verwenden um die XML-Datei usw. direkt auszulesen oder zu schreiben.

Welche Speicherarten verfügbar sind und welche Methoden dementsprechend implementiert werden müssen, wird in der Unit SJConfigUtils ganz oben per Compilerdirektive festgelegt.

Eine komplette Implementierung findet ihr in der mitgelieferten Demo.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

 
Delphi 2007 Professional
 
#3
  Alt 29. Mai 2009, 06:46
Ich habe mal einen Blick auf den Sourcecode geworfen...
Relativ häufig ist Folgendes zu sehen:
Delphi-Quellcode:
  case FLocationType of
    icltINI:
...
    icltXml:
...
    icltRegistry:
...
  else
...
  end;
Diese Case-Anweisungen könnten durch das Strategie Designpattern ersetzt werden.

Man benötigt dazu eine Basisklasse mit virtuellen Methoden und davon abgeleitet jeweils eine Klasse für die Ini-Datei, XML, Registry.
Man bildet so eine Art Treibersystem, in dem man den physikalischen Zugriff auf die Daten (Inifile, XML,...)
einfach austauschen kann.
Man könnte das später leicht erweitern und z.B. einen Treiber für verschlüsselte Inifiles schreiben.
Oder man speichert die Daten im Active Directory oder auf einem Webserver über HTTP.

Die Klasse TAccessManager erzeugt intern also ein Objekt der jeweiligen "Treiberklasse" und deligiert das Lesen und Schreiben von Daten an dieses Objekt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#4
  Alt 29. Mai 2009, 06:58
Ja, das wäre eine gute Idee, ich habe da auch Überlegungen angestellt, es dann aber doch erst einmal so gelassen. Damit das klappt, müsste ich den ganzen AccessManager dafür hernehmen, da der die für das konkrete Auslesen nötigen Daten beinhaltet.

Eine Struktur ähnlich diesem Pattern benutze ich in einem Projekt, in dem ich diese Unit selbst benutze auch schon (meinem Periodensystem, da für die verschiedenen Darstellungsmodelle).

Ich muss die gesamte Struktur noch einmal ein wenig überdenken.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

 
Delphi 2007 Professional
 
#5
  Alt 29. Mai 2009, 07:51
Zitat von jaenicke:
... Damit das klappt, müsste ich den ganzen AccessManager dafür hernehmen, da der die für das konkrete Auslesen nötigen Daten beinhaltet.
Man müsste im Konstruktor der Strategieklasse den Kontext (also den AcessManager) mitgeben:
Delphi-Quellcode:
procedure TAccessManager.CreateStrategieObj;
begin
  case FLocationType of
    icltINI:
    FStrategieObj := TIniStratege.Create(self);
    // ^^^^
    // damit kennt das Strategieobjekt den AccessManager und kann bei Bedarf
    // bestimmte Informationen abgreifen
    ...
end;
Zitat von jaenicke:
Ich muss die gesamte Struktur noch einmal ein wenig überdenken.
Ja, solche Dinge muss man erst etwas absacken lassen, bevor man es umsetzen kann.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#6
  Alt 29. Mai 2009, 07:55
Sebastian hat den Beitrag im Bereich Open Source gepostet. Er hat sicherlich nichts dagegen, wenn man seinen Coder verbessert/erweitert
Markus Kinzler
  Mit Zitat antworten Zitat
Satty67

 
Delphi 2007 Professional
 
#7
  Alt 29. Mai 2009, 08:57
Klingt für mich sehr nützlich. Bei meinen (wenigen) größeren Projekten war die Speicherung der Konfiguration jedesmal von einer neuen Strategie geprägt. Etwas Einheitliches, Wiederverwendbares wollte mir da nie einfallen.

Werde SJ Config bei der nächsten größeren Aufgabe sicher mal Testen!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#8
  Alt 29. Mai 2009, 16:13
Ich werde heute auch noch eine neue Version meines Periodensystems veröffentlichen, da hat der Einbau in die bereits bestehenden Einstellungen auch problemlos geklappt.

Ich habe jetzt eine aktualisierte Version hochgeladen, die ich mit Delphi 6, 7, 2006, 2007 und 2009 erfolgreich getestet habe. Zudem habe ich einen Flüchtigkeitsfehler beim Streamformat behoben, der dazu geführt hatte, dass es gar nicht funktionierte.

Unter Delphi 6 und 7 muss einfach der Schalter für die XML-Unterstützung deaktiviert werden, die Formulare der Demo einmal alle geöffnet und die Fehlermeldungen ignoriert werden. Dann sollte es laufen.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#9
  Alt 3. Jun 2009, 14:44
So, ich habe einmal eine neue Betaversion hochgeladen.
Neuerungen:
  • Trennung in einzelne Klassen für die Formate umgesetzt
  • Unterscheidung der Formate beim Speichern und Laden mehr von der Logik abgekoppelt
  • die Demo ist jetzt voll funktionsfähig und unterstützt alle Speicherorte und Formate in der erweiterten Einrichtung
Sebastian Jänicke
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

 
Delphi 11 Alexandria
 
#10
  Alt 23. Jun 2009, 08:51
Es gibt eine neue Version. Jetzt kann man die Einstellungen auch an die Exe anhängen. Dafür habe ich (auf einen Vorschlag hin) mein Projekt ExeDataStream in dieses hier integriert.

Diese Möglichkeit könnte insbesondere für die schnelle portable Weitergabe von Tools sehr nützlich sein.

Die neue Version habe ich eingehender getestet. Da mir keine Fehler aufgefallen sind und es auch keine Meldungen mehr zu Fehlern gab, gebe ich die Version als Release Candidate heraus.
Sebastian Jänicke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:55 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