Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Kommentare In Ini Ignorieren? (https://www.delphipraxis.net/142776-kommentare-ini-ignorieren.html)

dust258 3. Nov 2009 15:49


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:
[Terminal3]
ID=3
Description=Terminal
DataSource=Importdaten
MaxAttempts=3
DatabaseID=1


//[Terminal4]
//ID=4
//Description=Mobile
//DataSource=UDP
//MaxAttempts=3
//DatabaseID=1
Im 1. Schritt lösche ich die alten Werte. Dabei Ignoriere ich Sektionen die mit "//" anfangen. Danach also:
Delphi-Quellcode:
[Terminal3]

//[Terminal4]
//ID=4
//Description=Mobile
//DataSource=UDP
//MaxAttempts=3
//DatabaseID=1
Damit die Kommentare nicht in Terminal3 geschrieben werden habe ich mir folgende Funktion überlegt:
Delphi-Quellcode:
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;
Leider werden hier keine Sektionen ohne Wert gefiltert... Das "//[Terminal4]" erscheint also immer unter Terminal 3:
Delphi-Quellcode:
[Terminal3]

//[Terminal4]

ID=3
Description=Terminal
DataSource=Importdaten
MaxAttempts=3
DatabaseID=1



//ID=4
//Description=Mobile
//DataSource=UDP
//MaxAttempts=3
//DatabaseID=1
Gibt es eine Möglichkeit Sektionen denen kein Wert zugewiesen ist zu bearbeiten? Oder muss ich hier selber Parsen?

himitsu 3. Nov 2009 16:00

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 -
1 //
2 //
3 -
0 - nicht löschen
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:
0 0 -
1 [s]2[/s] //
2 [s]3[/s] -
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

Progman 3. Nov 2009 17:45

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.

dust258 4. Nov 2009 07:05

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...

Lannes 4. Nov 2009 07:25

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.

ele 4. Nov 2009 09:44

Re: Kommentare In Ini Ignorieren?
 
Zitat:

Zitat von Progman
Kleiner Hinweis:
In Ini-Dateien kann man mit ; eine Kommentarzeile einleiten. Diese wird dann nicht beachtet.
Also statt // eben ein ; aber nur am Zeilenanfang.

Ja, das kann man. Allerdings werden die Kommentare beim speichern nicht zurück in die Datei geschrieben... Das kann schon recht ärgerlich sein, wenn plötzlich die auskommentierten Zeilen nicht mehr vorhanden sind.
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.

dust258 4. Nov 2009 11:02

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 21:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz