TiniPropStorage
TiniPropStorage
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...
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...
- Ally
- Beiträge: 286
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
Re: TiniPropStorage
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.
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
Re: TiniPropStorage
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.
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.
- 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
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):
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
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;
Vielleicht hilft dir das ja weiter.
Ciao,
Photor
Re: TiniPropStorage
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:
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
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;
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;
Re: TiniPropStorage
Danke für die super infos.
Hab es jetzt klasisch über TiniFile gemacht.
Läuft.
Hab es jetzt klasisch über TiniFile gemacht.
Läuft.
-
- 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
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;
-
- 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
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.
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.