AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [TSettings] Einstellungen speichern - der einfache Weg
Thema durchsuchen
Ansicht
Themen-Optionen

[TSettings] Einstellungen speichern - der einfache Weg

Ein Thema von chaosben · begonnen am 12. Aug 2008 · letzter Beitrag vom 13. Aug 2008
Antwort Antwort
Benutzerbild von chaosben
chaosben
Registriert seit: 27. Apr 2005
Hi!

Hier wollen wir euch eine neue Entwicklung vorstellen: die Settings-Komponenten.

Für die, die es ganz eilig haben: Den Download-Link gibts unter "Wie installiert man das?".

Warum könnte mich das interessieren?
Die Settings-Komponenten bieten folgende Vorteile/Features:
  • speichern von Einstellungen in einer Baumstruktur
  • nachträgliches Ändern der/des Zielstruktur/-ortes (Datei, XMl, Stream, ...) möglich
  • automatisches Speichern der Einstellungen aller verlinkten Komponenten
  • Unterstützung von regulären Ausdrücken bei der Selektierung

Wie funktionierts?
Als Grundlage braucht meine eine TSettingsXXX - Komponente. Am besten, wir gehen das an einem Beispiel durch.

Nehmen wir mal an, ich will meine Settings in einer XML-Datei speichern. Also droppe ich eine TSettingsXMLFile irgendwo (bei mehreren Formularen idealerweise auf einem Datenmodul).

Als nächstes setzt man die Filename-Property. Das kann im Objektinspektor oder per Code erfolgen. Hier mein Vorschlag:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  SettingsXMLFile1.FileName := IncludeTrailingPathDelimiter(GetShellFolder(CSIDL_APPDATA)) + 'settings.xml';

  if FileExists(SettingsXMLFile1.FileName) then
    SettingsXMLFile1.Load;
end;
Für den obigen Code (das bestimmen des APPData-Verzeichnisses) muss man noch die Units ShlObj und uSysTools einbinden.

Am Ende, also beim schliessen des Programms, sollte man natürlich die Einstellungen auch wieder wegschreiben.
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SettingsXMLFile1.Save;
end;
Ok, jetzt sollte man natürlich auch etwas in die Settings reinschreiben:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
const
  LastRunPath = '/Application/LastRun';
begin
  if SettingsXMLFile1.Exists(LastRunPath) then
    Caption := 'Last run: ' + DateTimeToStr(SettingsXMLFile1.GetValue(LastRunPath, null));

  SettingsXMLFile1.SetValue(LastRunPath, Now);
end;
Wie man sieht, werden alle Settings per Pfad referenziert. So ein Pfad beginnt immer mit einem Slash.

Ok, ich seh ein, das das ein wenig trivial ist. Viel wichtiger sind für den Endbenutzer ja z.B. die Postion des Formulars, dessen Größe und dergleichen.
Aber anstatt dies per Hand/Code in die Settings zu schreiben, machen wir uns das Leben ein wenig leichter und droppen eine TSettingsLinkForm auf das zu speichernde Formular.

TSettingsLinks dienen dazu, Komponenten mit einem TSettingsXXX-Object zu verbinden, um Eigenschaften der Komponenten zu speichern bzw. zu laden.

Jetzt müssen wir noch den Link mit den Settings verknüpfen (Eigenschaft "Settings") und dem SettingsLink sagen, für welche Eigenschaften des Formulars er verantwortlich ist (Eigenschaft "SaveProperties"). In diesem Fall würde ich "Top, Left, Width und Height" vorschlagen.
Fertig. Das wars schon. Einfach das Testprogramm starten und wenn ihr alles so gemacht habt wie ich, sollte das Fenster immer wieder an der gleichen Stelle erscheinen.

Für andere Komponenten gibt es dann entweder spezielle Links (z.B. TSettingsLinkVST, TSettingsLinklistView) bzw. einen Standard-Link TSettingsLinkComponent für alles, was von TComponent abegleitet ist.

Wie installiert man das?
Als erstes musst du dir die Sourcen besorgen. Das geht per SVN von http://svn.theunknownones.net/tuo/Components/Settings/ oder als ZIP von hier.

Je nachdem, ob man den VirtualTree nutzt installiert man alle 4 Packages aus dem Projects-Verzeichnis oder nur die 2 Basisprojekte.

Alle Abhängigkeiten sollten sich innerhalb des Repositories lösen lassen (siehe http://svn.theunknownones.net/tuo/Libraries/). (Außer dem GDIPlus-Support ... den gibts wie immer von http://www.progdigy.com)

Offiziell wird zu Zeit Delphi 2006 & 2007 unterstützt. Aber mit eine wenig Einsatz, sollte es in den meisten anderen Versionen auch laufen.

Was gibts noch?
  • Jedes TSettingsXXXX hat eine Eigenschaft "ParentSettings". Hier kann wiederum ein anderes SettingsObjekt angegeben werden. Die Eigenschaft "ParentMode" regelt, wie sich die ParentSettings verhalten (nicht nutzen, fehlendes ergänzen oder alles ersetzen). Damit könnte man z.B. Administrative Einstellungen als ParentSettings über die User-Einstellungen setzen und bräuchte nur das User-Settings-Objekt abfragen.
  • Die SettingsLinks haben eine Eigenschaft "DefaultSettingsRoot". Sie regelt, wo die Einstellungen der verlinkten Komponente im Settings-Baum abgelegt und gesucht werden (z.B. '/Form_Main/Panel1'). Ihr übergeordnet ist das Ereigniss "OnNeedRootSetting".
  • Falls dir plötzlich einfällt, das du z.B. nicht mehr in eine XML-Datei speichern willst, brauchst du nur die TSettingsXMLFile-Komponente gegen eine andere tauschen. Fertig.
  • Sobald die Einstellungen geladen wurden, liegen sie in der TSettingsXXXx Komponente vor. Lädt man danach ein Formular muss man den Settings-Links noch sagen, das sie ihre Einstellungen auf die Komponenten anwenden sollen (Link.ApplySettings)
  • Ansonsten gilt: Spielen bildet!

Wie gehts weiter?
Das ganze Projekt befindet sich noch in Entwicklung. Wer Vorschläge hat, kann sie gern hier oder als SVN-Patch (mit Kommentar bitte ) unterbreiten.

Viel Spass.
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
 
Micha88
 
#2
  Alt 12. Aug 2008, 21:59
Naja,

ich finde es sehr umständlich wenn man mal überlegt wie einfach es doch mit INI-Files geht
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#3
  Alt 13. Aug 2008, 05:49
Zitat von MichaelLinden:
ich finde es sehr umständlich wenn man mal überlegt wie einfach es doch mit INI-Files geht
Dann unterstell ich dir, das du es nicht ausprobiert hast.

Wie lange brauchst du, um den Code zu schreiben, der die Formularposition in eine Ini schreibt und wieder aus ihr lädt? 2 Minuten?
Mit den Settings-Komponenten brauchst du nur 10-20 Sekunden. Ich glaube das ist weniger umständlich.

Und außerdem: Unterstützen Ini-Files reguläre Ausdrücke? Nein.
Kann ich ohne den Code zu verändern anstatt in eine Ini in einen Stream speichern, den ich dann in die Datenbank schiebe? Nein.
Erlauben Ini-Files die Kaskadierung von Einstellungen? Nein.
Benjamin Schwarze
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#4
  Alt 13. Aug 2008, 11:42
Was beinhaltet GDIPlusSupport? Nur der GDIPlus-Wrapper?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#5
  Alt 13. Aug 2008, 12:52
Eigentlich ja.
Wo brauchst du das denn? Bei mir heißen das GDI-Package "GDIPlus100". *wunder*

//Fehler gefunden. Ja, das ist das offizielle GDI-Package von http://www.progdigy.com
Benjamin Schwarze
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#6
  Alt 13. Aug 2008, 12:59
Habe mir mal die Libraries gezogen. Beim Testen wurde dann von PNGSupport das fehlende Package angemahnt
[Edit: Das liegt mir vor ]
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#7
  Alt 13. Aug 2008, 13:02
Dann ist es wohl wieder mal eine Disharmonie der Package-Namen.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Alter Mann

 
Delphi 10.2 Tokyo Professional
 
#8
  Alt 13. Aug 2008, 17:25
Hi,

würde mir ja gern die Sachen mit SVN ziehen, jedoch wie sind die Zugangsdaten für TortoiseSVN?
Die 'Settings.zip' ist ja leider leer und alle Dateien einzeln mit 'Ziel speichern unter' ziehen mach kein Spaß.

Gruß
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#9
  Alt 13. Aug 2008, 17:31
Zitat von Alter Mann:
Hi,

würde mir ja gern die Sachen mit SVN ziehen, jedoch wie sind die Zugangsdaten für TortoiseSVN?
Die 'Settings.zip' ist ja leider leer und alle Dateien einzeln mit 'Ziel speichern unter' ziehen mach kein Spaß.

Gruß
Keiner. Einfach CheckOut machen
Markus Kinzler
  Mit Zitat antworten Zitat
Alter Mann

 
Delphi 10.2 Tokyo Professional
 
#10
  Alt 13. Aug 2008, 17:38
Danke
  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 23:00 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