Entwickler-Ecke

Dateizugriff - INI-Wert mit mehreren Zeilen


UGrohne - So 16.02.03 23:51
Titel: INI-Wert mit mehreren Zeilen
Moin,
möchte in eine INI-Datei einen Wert speichern, der mehrere Zeilenumbrüche hat (z.B aus nem Memo). Geht das? Bisher speichert der das irgendwie blödsinnig, hat dann zwischen den Werten die einzelnen Zeilen *grml*

gruß


Alibi - Mo 17.02.03 00:10

Ich hab das bis jetzt so gemacht, dass ich für jede Zeile einen Inieintrag mache.
Line0=bla
Line1=blubb
Line2=blablubb
und dann so z.B. auslese:

Quelltext
1:
2:
3:
4:
5:
  i := 0;
    while Settings.ValueExists('PrintOptions','Top'+inttostr(i)) do begin
      MemoUpperText.Lines.Add(Settings.ReadString('PrintOptions','Top'+inttostr(i),''));
      inc(i);
    end;


So schreibe ich das ganze:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    i := 0;
    while  Settings.ValueExists('HTMLExport','HTMLText'+inttostr(i)) do begin
      Settings.DeleteKey('HTMLExport','HTMLText'+inttostr(i));
      inc (i);
    end;

    for i := 0 to MemoHTMLText.Lines.Count-1 do
      Settings.WriteString('HTMLExport','HTMLText'+inttostr(i),MemoHTMLText.Lines[i]);


Anonymous - Mo 17.02.03 00:21

Für die Lösung hab ich zwei Tage gebraucht und das soll ich so vertaten? Na gut ;)


Quelltext
1:
..., Memo1.Lines.CommaText, ...                    


Das einzige Problem ist, daß eine ganze Ini-Zeile ink. Schlüssel 1024 Zeichen fassen kann. Wenn das aber kein Problem ist, dann ist CommaText die Lösung.


UGrohne - Mo 17.02.03 00:22

Danke, funktioniert einwandfrei. Dachte eigentlich erst da gibts irgendne EInstellungsfunktion. Aber auf die Idee bin ich irgendwie net gekommen *g*

Gruß


Alibi - Mo 17.02.03 00:31

Gibt es bei Commatext nicht das Problem, dass das ganze durcheinandergerät, wenn man Kommas im Memo verwendet?


Anonymous - Mo 17.02.03 00:48

UGrohne hat folgendes geschrieben:
Danke, funktioniert einwandfrei. Dachte eigentlich erst da gibts irgendne EInstellungsfunktion. Aber auf die Idee bin ich irgendwie net gekommen *g*


Das ist ja auch das Problem wieso ich zwei Tage dafür gebraucht habe. Auf das einfachste kommt man garnicht.


Alibi hat folgendes geschrieben:
Gibt es bei Commatext nicht das Problem, dass das ganze durcheinandergerät, wenn man Kommas im Memo verwendet?


Nein. Wenn Kommas im Text vorkommen, dann wird die Zeile in "Anführungszeichen" gesetzt. Und wenn Anführungszeichen vorkommen, dann werden diese in drei """ Anführungszeichen gesetzt.


Alibi - Mo 17.02.03 01:12

Die Methode ist weitaus eleganter als meine momentane. Es gibt hier jedoch ein Problem.
Wenn hier als Defaultwert eine Zeile mit 2 Wörtern getrennt durch ein Leerzeichen ist:
LissaJous Simulation
Wird das in der Inidatei mit einem Komma dazwischen abgespeichert:
LissaJous,Simulation
!?


Anonymous - Mo 17.02.03 01:28

Der Defaultwert muß dann auch ein CommaText sein, z.B.


Quelltext
1:
Memo1.Lines.CommaText := ReadString('Section', 'Key', '"Gugalin, Popov"');                    


Wird in eine Zeile geschrieben.


Quelltext
1:
Memo1.Lines.CommaText := ReadString('Section', 'Key', 'Gugalin, Popov');                    


Wird in zwei Zielen geschrieben.


Alibi - Mo 17.02.03 01:34

Naja, das Einlesen ist ja nicht so das Problem, eher das Abspeichern. :)

Einlesen:

Quelltext
1:
    MemoUpperText.Lines.CommaText := Settings.ReadString('PrintOptions','UpperText',MemoUpperText.Lines.CommaText);                    


Abspeichern:

Quelltext
1:
Settings.WriteString('PrintOptions','UpperText',MemoUpperText.Lines.CommaText);                    

Das Abspeichern ergibt bei dem Memotext:
LissaJous Simulation
das hier:
LissaJous,Simulation

// Edit: Korrektur:
Das Speichern scheint einwandfrei zu funktionieren, nur das Laden nicht.
Beim Laden macht der aus dem Abgespeicherten "LissaJous Simulation" einen Zweizeiler...

// Edit: Lösung:
Wenn bei Inifiles ein String in Anführungszeichen steht werden die beim Auslesen nicht beachtet.
Also aus
Text="bla bla bla"
wird
bla bla bla
Eine kleine Korrektur beim Schreiben reicht:

Quelltext
1:
Settings.WriteString('PrintOptions','UpperText','"'+MemoUpperText.Lines.CommaText+'"');