![]() |
Kommentare In Ini Ignorieren?
Hi Leute,
ich hab mal wieder ein Problem: Ich möchte Werte in einer vorhandenen Ini-Datei verändern. Nun habe ich das Problem das der Autor "//" nutzt um Bestimmte Werte zu ignorieren... Das Ganze sieht in der Ini so aus:
Delphi-Quellcode:
Im 1. Schritt lösche ich die alten Werte. Dabei Ignoriere ich Sektionen die mit "//" anfangen. Danach also:
[Terminal3]
ID=3 Description=Terminal DataSource=Importdaten MaxAttempts=3 DatabaseID=1 //[Terminal4] //ID=4 //Description=Mobile //DataSource=UDP //MaxAttempts=3 //DatabaseID=1
Delphi-Quellcode:
Damit die Kommentare nicht in Terminal3 geschrieben werden habe ich mir folgende Funktion überlegt:
[Terminal3]
//[Terminal4] //ID=4 //Description=Mobile //DataSource=UDP //MaxAttempts=3 //DatabaseID=1
Delphi-Quellcode:
Leider werden hier keine Sektionen ohne Wert gefiltert... Das "//[Terminal4]" erscheint also immer unter Terminal 3:
function TIniAccess.writeDataToIni (inSSCategory, inSDescription, inSValue : String) : Boolean;
var lInifile:TIniFile; lStringsDiscription, lStringsValue : TStringList; i:integer; begin if fSPath = '' then setAppDir; Result:=False; if inSValue <> '' then begin lStringsDiscription := TStringList.Create; lStringsValue := TStringList.Create; try ForceDirectories(Copy(fSPath, 0, LastDelimiter('\', fSPath))); lInifile := TIniFile.Create(fSPath); lInifile.ReadSection(inSSCategory, lStringsDiscription); for i := 0 to lStringsDiscription.Count - 1 do begin lStringsValue.Add(lInifile.ReadString(inSSCategory, lStringsDiscription[i],'')) end; if lStringsDiscription.Count = lStringsValue.Count then begin for I := 0 to lStringsDiscription.Count - 1 do begin lInifile.DeleteKey(inSSCategory, lStringsDiscription[i] ); end; end; lInifile.writestring(inSSCategory, inSDescription, inSValue); for i := 0 to lStringsDiscription.Count - 1 do lInifile.writestring(inSSCategory, lStringsDiscription[i], lStringsValue[i]); Result:=true; finally lInifile.Free; lStringsDiscription.free; lStringsValue.free; end; end; end;
Delphi-Quellcode:
Gibt es eine Möglichkeit Sektionen denen kein Wert zugewiesen ist zu bearbeiten? Oder muss ich hier selber Parsen?
[Terminal3]
//[Terminal4] ID=3 Description=Terminal DataSource=Importdaten MaxAttempts=3 DatabaseID=1 //ID=4 //Description=Mobile //DataSource=UDP //MaxAttempts=3 //DatabaseID=1 |
Re: Kommentare In Ini Ignorieren?
löschen IMMER rückwärts, wenn man eine For-Schleife nutzt.
Delphi-Quellcode:
for I := lStringsDiscription.Count - 1 downto do
begin lInifile.DeleteKey(inSSCategory, lStringsDiscription[i] ); end;
Delphi-Quellcode:
0 - nicht löschen
0 -
1 // 2 // 3 - 1 - löschen 2 - nicht löschen (ja, du siehst richtig) 3 - Fehler, weil gibt es nicht denn wenn du etwas löschst, dann rückt alles Nachfolgende nach vorne
Code:
außerdem Merkt sich Delphi das schleifen Ende am Anfang, so daß es von der nun körzeren Liste nix weiß und auch den "letzten" nun nicht mehr existierenden Index verarbeiten will
0 0 -
1 [s]2[/s] // 2 [s]3[/s] - |
Re: Kommentare In Ini Ignorieren?
Kleiner Hinweis:
In Ini-Dateien kann man mit ; eine Kommentarzeile einleiten. Diese wird dann nicht beachtet. Also statt // eben ein ; aber nur am Zeilenanfang. |
Re: Kommentare In Ini Ignorieren?
@himitsu:
Stimmt, aber in diesem Fall egal. @Progman Das Programm soll bestehende Inis bearbeiten. Ich habe also leider keinen Einfluss auf die Form der Kommentare. Naja, dann muss ich mir wohl was manuelles einfallen lassen. Ich poste meine Lösung später... |
Re: Kommentare In Ini Ignorieren?
Hallo,
bei den Bedingungen würde ich vermutlich auf TIniFile verzichten und nur mit TStringList arbeiten. Die TStringList bietet ja auch Wertepaare in der Form Name=Wert über .Names und .Values an. |
Re: Kommentare In Ini Ignorieren?
Zitat:
Eine mögliche Lösung wäre es eine Ableitung von TCustomIniFile zu schreiben, die mit Kommentaren umgehen kann. Allerdings fehlt mir im Moment etwas die Zeit dafür. |
Re: Kommentare In Ini Ignorieren?
So, habs jetzt über die Stringlist gelöst:
Delphi-Quellcode:
function TIniAccess.writeDataToIni (inSSCategory, inSDescription, inSValue : String) : Boolean;
var lInifile : TStringList; begin if fSPath = '' then setAppDir; Result:=False; if inSValue <> '' then begin try ForceDirectories(Copy(fSPath, 0, LastDelimiter('\', fSPath))); lInifile := TStringlist.Create; if FileExists(fSPath) then lInifile.LoadFromFile(fSPath); if lInifile.IndexOf('['+inSSCategory+']') < 0 then begin lInifile.Add(''); lInifile.Add('['+inSSCategory+']'); end; lInifile.Insert(lInifile.IndexOf('['+inSSCategory+']')+1,inSDescription+'='+inSValue); lInifile.SaveToFile(fSPath); Result:=true; finally lInifile.Free; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz