[gelöst] SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
Rüfa
Beiträge: 2
Registriert: Mi 1. Jun 2022, 10:41
OS, Lazarus, FPC: Win11 (Laz 2.2.0 | FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Umland von Magdeburg

[gelöst] SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Beitrag von Rüfa »

Hallo, Ihr lieben Lazarus-Profis!

Nachdem ich letztes Jahr nach fast 20-jähriger Pascal-Abstinenz den Wiedereinsteig in diese schöne Sprache mit Lazarus begonnen habe und dieses Forum mir den Wiedereinstieg als Leser schon sehr erleichtert hat, habe ich nun eine Frage, zu der ich noch keine Antwort gefunden habe:

Ich möchte SessionProperties abspeichern. Kein Problem, das klappt und bekomme ich mit TXMLPropStorage oder TINIPropStorage auch wunderbar geregelt.

Aber: die entsprechende XML (oder ini)-Datei wird standardmäßig im Programmpfad abgespeichert. Das ist nicht befriedigend (um nicht zu sagen: nicht sinnvoll denkt man z.B. an Windows und den Versuch eine Datei im Programmordner zu "manipulieren"!).

Wie kann ich die Komponenten TXMLPropStorage oder TINIPropStorage so einstellen, dass die automatisch erstellte XML/ini z.B. in

Code: Alles auswählen

GetAppConfigDir(false)+'Config.ini' 
abgelegt wird?

Vermutlich gibt es hierfür eine recht einfache Lösung, die ich nur noch nicht gefunden habe und bin dankbar für jeden Hinweis, der mich in die richtige Richtung stupst! :wink:
Zuletzt geändert von Rüfa am Do 2. Jun 2022, 13:22, insgesamt 1-mal geändert.

Benutzeravatar
h-elsner
Beiträge: 199
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 2.0.12, FPC3.2.0
CPU-Target: 64Bit
Wohnort: Illertissen
Kontaktdaten:

Re: SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Beitrag von h-elsner »

Du kannst doch einen Dateinamen mit Pfad einstellen mit der Property FileName.
Ich habe das zwar noch nicht ausprobiert, weil ich es sehr schön finde, die Config bei der Exe zu haben, da fast alle meine Programme portabel sind. So kannst du die Einstellungen mitnehmen. Ich wüsste nicht, warum ich die Konfiguration in den Tiefen des Betriebssystems "verstecken" sollte. Hübsch ist auch, dass ich mehrere Programminkarnationen mit unterschiedlichen Einstellungen in unterschiedlichen Verzeichnissen haben.

Gruß HE

charlytango
Beiträge: 504
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Beitrag von charlytango »

ich kann @h-elsner nur recht geben wenn er meint dass Programme weitgehend portabel sein sollten. Also keine Installationsorgien in die Untiefen von Windows (außer der Kunde braucht das wegen seiner Corporate Policy)

Aber das kann man auch so lösen dass es etwas aufgeräumter ist, wie @Rüfa das anscheinend mag.
Ein Unterverzeichnis in dem alle Config-Dateien liegen ist oft nützlich.

Bei Programmstart checkt eine Routine ob alle Voraussetzungen erfüllt sind und erzeugt sie ggfs auch. Dazu würden Config-Verzeichnisse und alle anderen nötigen Dateien gehören. Die Routine setzt dann auch gleich die richtigen Pfade.

Code: Alles auswählen

procedure TForm1.CheckEnvironment;
var
  sConfigDir:string;
  sConfigName:string;
begin
    sConfigDir:='config';
    sConfigName:='config';
    //vorher checken ob das Verzeichnis existiert ungefär nach dem Muster:
    {If Not DirectoryExists('NewDir') then
         If Not CreateDir ('NewDir') Then
            Writeln ('Failed to create directory !')
    }
    IniPropStorage1.IniFileName:= Application.Location + sConfigDir + DirectorySeparator + sConfigName + '.ini';
    XMLPropStorage1.FileName:=Application.Location + sConfigDir + DirectorySeparator + sConfigName + '.xml'; ;
end; 
Wobei ich keine Ahnung habe warum die Property des Dateinames in so ähnlichen Komponenten unterschiedlich heißt. Vermutlich irgendwie historisch bedingt.

TBug
Beiträge: 151
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.0 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Beitrag von TBug »

Hallo zusammen,
h-elsner hat geschrieben:
Mi 1. Jun 2022, 11:21
Ich wüsste nicht, warum ich die Konfiguration in den Tiefen des Betriebssystems "verstecken" sollte.
Es gibt gute Gründe dafür den Pfad nicht bei oder unterhalb der EXE-Datei zu haben, sondern GetAppConfigDir() zur Ermittlung des Speicherortes zu verwenden, ausser die Anwendung sei wirklich nur für ein und den selben Nutzer und dazu noch portabel.

Einige Gründe für GetAppConfigDir()

Der Installationsordner ist meist ein Unterordner von "Programme" oder "Program Files. Hier wird das Speichern der Konfiguationsdateien unter Windows zur Problemstellung.
Das

Code: Alles auswählen

XMLPropStorage1.FileName:=Application.Location + sConfigDir + DirectorySeparator + sConfigName + '.xml';
kann natürlich dazu führen, dass keine Einstellungen gepeichert werden, da kein Anlegen von Dateien oder Änderungen daran gestattet werden.

Ein weiterer Grund ist der, dass mehrere Nutzer eines Rechners ihre individuellen Einstellungen speichern können.

Benutzeravatar
Rüfa
Beiträge: 2
Registriert: Mi 1. Jun 2022, 10:41
OS, Lazarus, FPC: Win11 (Laz 2.2.0 | FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Umland von Magdeburg

Re: SessionProperties -> TXMLPropStorage -> Pfad einstellen?

Beitrag von Rüfa »

Zunächst einmal vielen lieben Dank für Eure Antworten! :D

Die Gründe, die @TBug aufführt, sind genau die Gründe, weshalb ich nach einer Lösung gesucht habe: eine ini/XML, die im Programmordner bei Windows liegt, kann nicht geändert werden - die SessionProperties können also nicht gespeichert werden, das verhindert Windows.
Weiterhin ist das einer der Gründe:
TBug hat geschrieben:
Mi 1. Jun 2022, 21:00
Ein weiterer Grund ist der, dass mehrere Nutzer eines Rechners ihre individuellen Einstellungen speichern können.
Manchmal ist man eben wie vernagelt... Und hier geht mein Dank an @h-elsner und @charlytango, Ihr beiden habt mich wieder in die richtige Spur gebracht! Natürlich, völlig klar: den FileName beim Programmstart entsprechend festnageln und schon läuft das alles!

Ich habe jetzt ein entsprechendes "onCreate"-Ereignis eingefügt und schon klappt alles, wie es soll...

Vielen Dank euch allen!

Antworten