Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TIniFile und Kommentare (https://www.delphipraxis.net/90439-tinifile-und-kommentare.html)

Bernd Nowak 17. Apr 2007 15:17


TIniFile und Kommentare
 
Heute scheint mein Frage Tag zu sein.

Habe folgendene INI Zeile:

Delphi-Quellcode:
[ Communications ]
alternate_ip_addr_lookup = 1                  ; Find IP addresses another way 0 = No alternate lookup *  1 = Use alternate way
Nun wollte ich den Wert mit ReadBool('Communications','alternate_ip_addr_looku p',false) auslesen. Klappt nicht wegen dem doofen Kommentar. Gleiche wenn ich es als ReadInteger. Alles unter Vista. Ich habe es auch mal als ReadString getestet und siehe da er liest mir den Kommentar mit ein :wall:

Da ich die Kommentare nicht beeinflussen kann (also keine Diskussion ob das die richtige ini interne Syntax ist) meine Frage ob es eine einfach Möglichkeit gibt an die Werte zu kommen (ohne den String auseinander zu nehmen) ?

SirThornberry 17. Apr 2007 15:24

Re: TIniFile und Kommentare
 
momentan scheinst du TIniFile zu verwenden das unterstützt es von haus aus nicht.
Und eine einfache Variante ohne den String auseinander zu nehmen? Ich dachte dein Ziel ist es den String auseinander zu nehmen?! (wenn du den String nicht ändern willst kannst du logicher Weise nix abschneiden).

Apollonius 17. Apr 2007 15:27

Re: TIniFile und Kommentare
 
Nun, wäre das schlimm, wenn du den String auseinandernehmen musst?
Im Prinzip musst du doch nur mit pos() die Position des ersten Leerzeichens im String finden und dann den Rest mit delete() löschen (oder mit copy() alles davor rauskopieren). Die Funktionen sind in StrUtils.

Ohne Auseinandernehmen fällt mir nichts ein.

messie 17. Apr 2007 15:28

Re: TIniFile und Kommentare
 
Das Auseinandernehmen des Strings kannst Du abtippen aus der Unit Inifiles. ReadBool benutzt ReadInteger:
Delphi-Quellcode:
IntStr := ReadString(Section, Ident, '');
  if (Length(IntStr) > 2) and (IntStr[1] = '0') and
    ((IntStr[2] = 'X') or (IntStr[2] = 'x')) then
    IntStr := '$' + Copy(IntStr, 3, Maxint);
  Result := StrToIntDef(IntStr, Default);
Grüße, Messie

Bernd Nowak 17. Apr 2007 15:33

Re: TIniFile und Kommentare
 
Danke schonmal. Es kann sein das ich das sogar so auf meinem anderem PC gemacht habe ("m Prinzip musst du doch nur mit pos() die Position des ersten Leerzeichens im String finden und dann den Rest mit delete() löschen (oder mit copy() alles davor rauskopieren). Die Funktionen sind in StrUtils.").

Klar ich habe jetzt die Unit inifile benutzt und bin gerade darüber gestolpert :-D Geht es mit einer anderen Unit ? Ich habe mal ein bisschen gegoogelt und es scheint an der Art und Weise zu liegen wie Winodws ( GetPrivateString ) eine Ini Datei ausliest. Das Programm (nicht von mir) scheint aber die Daten anders auszulesen, da die Kommentare so nicht stören. Und ist das Verhalten von GetPrivateString in allen Windows Versionen von WIN95-Vista gleich ?

Bernd Nowak 17. Apr 2007 19:05

Re: TIniFile und Kommentare
 
Habe es gefunden :)
Ich habe es so gemacht:

Delphi-Quellcode:
        j := ini.ReadString('Communications','alternate_ip_addr_lookup','-5');
        // We look for ; and use this position to strip off the rest comment
        posfound := AnsiPos(';', j);
        if posfound > 0 then SetLength(j, posfound-1);
        // We use trim to cut off blanks
        trimmed := Trim(j);
        // We use StrToIntDef to have the Integer regardless if the string is
        // a number or something else
        i := StrToIntDef(trimmed, -1);
Kann man das besser machen (Habe englische Kommentare falls ich die Quellen des Programmes veröffentliche) ?

Muetze1 19. Apr 2007 15:26

Re: TIniFile und Kommentare
 
Schreib den Kommentar einfach vor die Zeile in die INI Datei. Die TIniFile kennt Kommentare ( ; als Kennung als erstes Zeichen) und ignoriert sie ordentlich. Auch beim Schreiben lässt er sie drinne. Also einfach die Einträge vor dem Eintrag an sich kommentieren und du hast keinen Aufwand und keine Probleme...

Und grundsätzlich: INI sind alle Strings. ReadInteger liest den String und versucht ihn in einen Integer umzuwandeln. Beim Lesen kenn er keinen Typ und liest immer String. Von daher fängt INIfile niemals an irgendwas auf Gültigkeit zu prüfen oder nur passende Dinge auszulesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 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