TiniPropStorage

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
atroesch
Beiträge: 36
Registriert: Mo 7. Jul 2025, 10:05

TiniPropStorage

Beitrag von atroesch »

Hallo,
wie kann ich...
1. in der INI per code eine neue Section anlegen?
2. in der INI per code einen wert unter einer section schreiben / lesen?

und dann die frage ob bei speichern / lesen der Form session properities meine
geschriebenen werte auch bleiben...

Benutzeravatar
Ally
Beiträge: 286
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: TiniPropStorage

Beitrag von Ally »

Hallo atroesch,

im Anhang findest du zwei Beispiele dafür, wie du die Fensterwerte speichern kannst, damit sie beim Neustart erhalten bleiben.

Die Variante im Ordner XReg verwendet TRegistry.
TRegistry ist in Lazarus implementiert, sodass es plattformübergreifend ist. ( https://wiki.freepascal.org/fcl-registry )
Ich habe dafür eine kleine Unit erstellt, die Zeichenfolgen, Ganzzahlen, Boolesche Werte usw. in die Registrierung schreiben und aus dieser lesen kann.
Das Ganze funktioniert auch unter Linux, dort werden die Registrierungszugriffe automatisch im Ordner .config in einer entsprechenden XML-Datei gespeichert.

Vorteil: Die Programmeinstellungen sind BS-spezifisch am „richtigen” Ort gespeichert und jederzeit zugänglich.


Die Variante im Ordner XIni verwendet TIniFile.
Mit dieser Variante kann man eine Ini-Datei in einen beliebigen Ordner schreiben.

Vorteil: Man kann die Programmeinstellungen speichern, wo man möchte.
Dateianhänge
RegIni.zip
(12.18 KiB) 81-mal heruntergeladen

atroesch
Beiträge: 36
Registriert: Mo 7. Jul 2025, 10:05

Re: TiniPropStorage

Beitrag von atroesch »

Danke, habe ich mir angesehen.
Kann ich bestimmt irgendwann mal gebrauchen, ist aber im
moment nicht das was ich wollte.

Ich habe ja schon ein iniprop- also ini-file.
wollte halt gerne wissen ob ich da per code drauf zugreifen kann.
eben eine section anlegen und daten speichern / lesen.

Benutzeravatar
photor
Beiträge: 530
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: TiniPropStorage

Beitrag von photor »

Hallon atroesch,

ich weiß nicht, ob ich deine Frage richtig verstanden habe.

Ich nutze INI-Files oft, um Eingabe-Parameter zu Projekten zu speichern und wieder einzulesen. Das geht im Prinzip so (stark zusammengestrichen):

Code: Alles auswählen

uses
  INIFiles, StrUtils, SysUtils;

var
  INI: TMemINIFile;
begin
  INI := TMemINIFile.Create(Filename);
  
  try
    // aus INI lesen
    DataStr := INI.ReadString(section,'Date','NO_DATE_FOUND');
  
    // in INI schreiben
    Section := 'Header';

    INI.WriteString(Section,'INIVersion',INIVERSIONSTR);        // version string INI-File

    INI.WriteString(Section,'ProgVersion',ProgVersion);        // version of BMSC-Tool
  
  finally
    INI.UpdateFile;
    INI.Free;
  end;
  
end;
Falls eine 'Section* oder auch der 'Key' noch nicht existiert, wird er neu angelegt. Das birgt aber auch die Gefahr, dass man bei einem Schreibfehler neue Einträge erhält, anstatt den Wert eines bestehenden Eintrags zu ändern.

Vielleicht hilft dir das ja weiter.

Ciao,
Photor

wp_xyz
Beiträge: 5245
Registriert: Fr 8. Apr 2011, 09:01

Re: TiniPropStorage

Beitrag von wp_xyz »

Ich schreibe Ini-Dateien eigentlich auch lieber direkt, da weiß ich genau, was passiert. Wenn du trotzdem TIniPropStorage verwenden willst, dann hast du vollen Zugriff auf die Ini-Datei in den OnSaveProperties und OnRestoreProperties-Ereignissen, d.h. du kannst diese Ereignisse, die eigentlich dafür gedacht sind, public-Properties zu schreiben/lesen, dazu zweckentfremden, irgendwas in die Ini-Datei zu schreiben/aus ihr zu lesen. Dabei kannst du natürlich eigene Sections verwenden. Die Instanz der offenen Ini-Datei ist allerdings nur als protected Property zugänglich, man kann sie aber durch einen Type-Cast in eine von TIniPropStorage abgeleitete Klasse zugänglich machen:

Code: Alles auswählen

type
  TIniPropStorageOpener = class(TIniPropStorage)
  public
    property IniFile;
  end; 
  
procedure TForm1.IniPropStorage1RestoreProperties(Sender: TObject);
begin
  a := TIniPropStorageOpener(IniPropStorage1).IniFile.ReadInteger('Parameters', 'a', 1);
  b := TIniPropStorageOpener(IniPropStorage1).IniFile.ReadInteger('Parameters', 'b', 2);
end;

procedure TForm1.IniPropStorage1SaveProperties(Sender: TObject);
begin
  TIniPropStorageOpener(IniPropStorage1).IniFile.WriteInteger('Parameters', 'a', a);
  TIniPropStorageOpener(IniPropStorage1).IniFile.WriteInteger('Parameters', 'b', b);
end;
Wenn dir die Typ-Umwandlung etwas "hacky" vorkommt, kannst du aber auch durchaus in den Event-Handlern eine eigene Instanz der Ini-Datei erzeugen. Zumindest unter Windows kommt diese sich nicht mit der der PropStorage-Komponente in die Quere - andere Widgetsets habe ich nicht getestet:

Code: Alles auswählen

procedure TForm1.IniPropStorage1RestoreProperties(Sender: TObject);
var
  ini: TCustomIniFile;
begin
  ini := TIniFile.Create(IniPropStorage1.IniFileName);
  try
    a := ini.ReadInteger('Parameters', 'a', 1);
    b := ini.ReadInteger('Parameters', 'b', 2);
  finally
    ini.Free;
  end;
end;

procedure TForm1.IniPropStorage1SaveProperties(Sender: TObject);
var
  ini: TCustomIniFile;
begin
  ini := TIniFile.create(IniPropStorage1.IniFileName);
  try
    ini.WriteInteger('Parameters', 'a', a);
    ini.WriteInteger('Parameters', 'b', b);
  finally
    ini.Free;
  end;
end; 

atroesch
Beiträge: 36
Registriert: Mo 7. Jul 2025, 10:05

Re: TiniPropStorage

Beitrag von atroesch »

Danke für die super infos.
Hab es jetzt klasisch über TiniFile gemacht.
Läuft.

charlytango
Beiträge: 1145
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TiniPropStorage

Beitrag von charlytango »

atroesch hat geschrieben: Do 21. Aug 2025, 22:56 Hab es jetzt klasisch über TiniFile gemacht.
Vorsicht, bei TIniFile wird jede Änderung sofort in die Datei geschrieben, was oft Probleme bereiten könnte.

Bei TMemIniFile wird alles im Speicher gehalten und erst auf

Code: Alles auswählen

INI.UpdateFile;
alles auf einmal geschrieben, was letztlich ökonomischer ist

TSchnuckenbock
Beiträge: 123
Registriert: Do 20. Jul 2017, 23:47
OS, Lazarus, FPC: Win7 und Win10
CPU-Target: xxBit
Wohnort: Südheide (Schnuckenland)

Re: TiniPropStorage

Beitrag von TSchnuckenbock »

Wir machen's auch wie charlytango schreibt, also erst im Speicher mit

TMemIniFile

die Ini-Datei vom Inhalt her zusammenbauen und dann am Ende auf Festplatte schreiben mit ".UpdateFile".
Das hat sich Jahrzehnte bewährt.
Die TMemIniFile-Instanz wird dabei auch zwischen den Klassen hin- und hergereicht und jede Klasse schreibt ihren Kram in ihre Section rein, wenn ich mich recht erinnere.
Beim Einlesen dann genau umgekehrt.

Die Methoden in den einzelnen Klassen heißen dann möglichst immer gleich, also z.B. ReadIni und WriteIni und kriegen die Instanz des TMemIniFile-Instanz als Parameter übergeben.

Antworten