| Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Mi 16.04.08 13:17
Hallo mal wieder,
ich habe eine Frage bezüglich der INI Dateien. Ich lese aus einer solchen Datei einen String aus und der hat nach der Abspeicherung ein führendes Leerzeichen, sodass die INI dann so aussieht:
| Zitat: |
[TestSec]
TestId= Test
|
Wenn ich dann allerdings diese Datei einlese, schneidet er mir das führende Zeichen ab. Wie kann ich das umgehen ?
Ich habe es schon so versucht (über den Index eines STrings):
Delphi-Quelltext 1:
| ... := Ini.ReadString('TestSec','TestId','')[0]; |
Da sagt der Compiler mir, dass das 0te Element nicht abgefragt werden könne. Und das erste Element ist leider nur das 'T'.
Habt ihr einen Tipp ?
Ciao LHUser
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 13:49
hab mir mal gerade die inifiles.pas angesehen und folgendes gefunden:
dort wird irgendwann
LoadValues aufgerufen, in der Methode wird die (Ini)-Datei eingelesen und mit
SetStrings(List);
werden dann die einzelnen Zeilen verarbeitet.
in der SetStrings-routine hab ich dann das gefunden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| ... schnipp ... if Strings <> nil then begin J := Pos('=', S); if J > 0 then Strings.Add(Trim(Copy(S, 1, J-1)) + '=' + Trim(Copy(S, J+1, MaxInt)) ) else Strings.Add(S); end; |
und genau daher kommt dein Problem.
Da kannst du nun entweder die inifiles.pas umschreiben (aua)
oder die Datei selber (d.h. ohne TInifile) einlesen/auswerten (eklig, aber machbar)
oder versuchen, den 'Leerwert' durch ein anderes Zeichen zu ersetzen (evtl. auch eklig oder gar nicht machbar)
Moderiert von matze: Code- durch Delphi-Tags ersetzt
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 16.04.08 13:50
Titel: Re: Führendes Leerzeichen in Eintrag einer INI NICHT ignorie
LonghornUser hat folgendes geschrieben: |
Delphi-Quelltext 1:
| ... := Ini.ReadString('TestSec','TestId','')[0]; |
Da sagt der Compiler mir, dass das 0te Element nicht abgefragt werden könne. Und das erste Element ist leider nur das 'T'. |
Es gibt beim String kein 0tes Element  Wenn es wirklich wichtig ist, dann gäbs da 2 Möglichkeiten (die mir gerade einfallen)
1. Du speicherst eine Zahl mit, welche die führenden Leerzeichen speichert oder
2. Du machst ein Sonderzeichen davor.
Delphi-Quelltext 1: 2: 3:
| Sonderzeichen='Blub#'; S:=Ini.ReadString('a','b',''); S:=Copy(S,Length(Sonderzeichen)+1,Length(S)); |
//Edit: Der Vorteil an Nummer 2 ist sogar, dass es egal ist, ob im Text dann nochmal das Sonderzeichen auftaucht.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 13:55
machbar, aber das Problem tritt wohl nur bei Leerzeichen auf und
scheinbar ist das Leerzeichen zwar speicherbar,
aber nicht mehr einlesbar (siehe mein Post oben).
Netter 'Bug' in der IniFiles-Logik .. 
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 16.04.08 14:00
zuma hat folgendes geschrieben: | machbar, aber das Problem tritt wohl nur bei Leerzeichen auf und
scheinbar ist das Leerzeichen zwar speicherbar,
aber nicht mehr einlesbar (siehe mein Post oben). |
doch, es werden ja nicht alle Leerzeichen entfernt, sondern nur die beim =
zuma hat folgendes geschrieben: |
// remove spaces before and after '='
|
also, wenn ich nach dem = einfach hinschreibe, wird das vordere nichtmehr gelöscht (es gibt ja keins, mein Sonderzeichen ist ja das vorderste) Beim Auslesen schneid ich das einfach wieder ab
//Edit: berichtigung, die Leerzeichen werden nach jedem = abgeschnitten *sich wundert* darf man denn kein = in einer ini speichern?
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 14:31
Xion hat folgendes geschrieben: |
//Edit: berichtigung, die Leerzeichen werden nach jedem = abgeschnitten *sich wundert* darf man denn kein = in einer ini speichern? |
also, ich hab das so verstanden:
es wird das ERSTE = in einer Zeile gesucht und sich dessen pos gemerkt, dann wird alles davor rausgeschnitten (und getrimmt!) und alles danach rausgeschnitten (und ebenfalls getrimmt). Beim Speichern scheint aber der String 1:1 geschrieben zu werden (also auch mit führendem Leerzeichen). Dadurch hat man den Effekt, das man führende Leerzeichen nach dem = nicht mehr einlesen kann. Da bleibt dann nur noch die von dir beschriebene Methode, sich mit der 'Krücke' eines Sonderzeichens zu helfen oder eben den source der inifiles.pas anzupassen
(stelle mir da einen vorbelegten boolean vor, der dann vom create bis zu der Methode durchgereciht werden müsste).
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 16.04.08 14:44
Aja, ich dachte es mir schon. Die Geschichte mit dem Ersatzzeichen für gewisse andere Zeichen hatte ich schonmal bei Zeilenumbrüchen (#10+#13 war das glaube ich). Da habe ich das genauso gemacht. Aber ich dachte, es gäbe vielleicht ein Flag, das man umstellen könnte. Naja, was solls.
Aber wie ist denn das "Zeichen" für Leer, was ich aus dem Text rausfiltern muss ?
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 14:56
LonghornUser hat folgendes geschrieben: |
Aber wie ist denn das "Zeichen" für Leer, was ich aus dem Text rausfiltern muss ? |
Meinst du beim schreiben der Inidatei ?
Dort sollte ein Trim(DeinStringValue) reichen, um das führende Leerzeichen verschwinden zu lassen.
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Nico72
      
Beiträge: 50
Win XP, Vista
Delphi 7, Delphi 2006
|
Verfasst: Mi 16.04.08 16:09
Hallo,
wenn du die Leerzeichen am Anfang deines Wertes brauchst, dann setze doch einfach den Wert in Anführungszeichen (AnsiQuotedStr) und entferne sie beim Einlesen wieder (AnsiExtractQoutedStr).
Das erscheint mir am einfachsten..
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 17.04.08 10:50
Nico72 hat folgendes geschrieben: | Hallo,
wenn du die Leerzeichen am Anfang deines Wertes brauchst, dann setze doch einfach den Wert in Anführungszeichen (AnsiQuotedStr) und entferne sie beim Einlesen wieder (AnsiExtractQoutedStr).
|
das ist so in etwa das, was ich schon meinte.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|