AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kommentare In Ini Ignorieren?

Ein Thema von dust258 · begonnen am 3. Nov 2009 · letzter Beitrag vom 4. Nov 2009
Antwort Antwort
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#1

Kommentare In Ini Ignorieren?

  Alt 3. Nov 2009, 16:49
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.067 Beiträge
 
Delphi 12 Athens
 
#2

Re: Kommentare In Ini Ignorieren?

  Alt 3. Nov 2009, 17:00
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

Re: Kommentare In Ini Ignorieren?

  Alt 3. Nov 2009, 18:45
Kleiner Hinweis:
In Ini-Dateien kann man mit ; eine Kommentarzeile einleiten. Diese wird dann nicht beachtet.
Also statt // eben ein ; aber nur am Zeilenanfang.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#4

Re: Kommentare In Ini Ignorieren?

  Alt 4. Nov 2009, 08:05
@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...
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#5

Re: Kommentare In Ini Ignorieren?

  Alt 4. Nov 2009, 08:25
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.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Kommentare In Ini Ignorieren?

  Alt 4. Nov 2009, 10:44
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.
  Mit Zitat antworten Zitat
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#7

Re: Kommentare In Ini Ignorieren?

  Alt 4. Nov 2009, 12:02
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 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