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.