![]() |
TYIniFile: Ein ini-Parser
Liste der Anhänge anzeigen (Anzahl: 1)
Hi @ll,
ich habe einen kleinen ini-Parser geschrieben... Das erste was euch dazu einfällt ist wahrscheinlich "was will mman damit, in Zeiten von xml und json?". Es gibt noch nichtmal einen Standard, wie genau eine ini-Datei auszusehen hat! Die Antwort ist für mich die Möglichkeit der verwendung von Kommentaren:
Code:
In der Linuxwelt ist diese grundsätzliche Art der Programmkonfiguration Standard, aber in der Windowswelt quasi nicht vorhanden. Dabei kann es manchmal sehr praktisch sein eine kommentierte Konfigdatei zu haben.
; Diese Section regelt blablabla...
[aSec] ; aName (integer) legt den Wert, der in seiner Niedrigkeit maximal ist fest. aName=123 ; aString (string) Beschreibt die Anzahl Erdbeben in Australien in etwas, was niemand lesen kann aString="abc" Delphis mitgelieferter ini-Parser kann damit leider nicht umgehen... Eigentlich kann Delphis mitgelieferter ini-Pasrer grundsätzlich nicht viel: Er kann ja noch nichtmla mit mehrzeiligen Strings umgehen. Daher habe ich meinen eigenen Parser, der beim schreiben in einer ini-Datei die Kommentare beibehält und der auch mehrzeilige Stings kann gebaut. Mein Aufbau der ini-Datei sieht so aus:
Code:
Der Parser selbst besteht aus 3 Klassen:
[aSection] <-- Leited eine Section ein. Die Section endet, wenn die Datei endet, oder eine andere Section anfängvt
; <-- Zeilen, die mit einem Semikolon beginnen sind Kommentarzeilen aName=123 <-- weisst der Eigenschaft "aName" der Section "aSection" den Wert "123" zu. Dabei verwende ich 'ne ganze Menge trim() aName = 123 <-- dies ist das gleiche wie in der Zeile drüber. Die Leerzeichen werden beim updaten der Datei jedoch entfernt aString="abc" <-- Strings werden in doppelte Hochkommas eingefasst anotherString="abc\"bl\\a" <-- Hochkommas in Strings können escaped werden um solche zu erlauben. Zwei backslashes führen zu einem normalen Backslash im String StringAgain=blablubb <-- Einzeilige Strings können auch ohne " geschrieben werden. Diese werden zum Zeilenende terminiert. Beim sopeichern das Wertes werden die " jedoch wieder ergänzt. mehrzeilig="Eine Zeile Noch eine Zeile" <-- So sehen mehrzeilige Strings aus aFloat=123,456 <-- Für Floats verwende ich immer Kommas. 1. TYIniFile 2. TYiniFileSection 3. TYIniFileItem TYIniFile enthält eine Liste mit allen TYIniFileSections und TYIniFileSection enthält wieder eine Liste mit den Items. So lässt sich eine Datei parsen:
Delphi-Quellcode:
Lizenz:
procedure Beispiel;
var ini: TYIniFile; cursec: TYIniFileSection; curitem: TYIniFileItem; begin ini :=TYIniFile.Create; ini.LoadFromFile('bla.ini'); //findSection sucht eine Section mit einem bestimmten Name raus. Wenn die Section nicht existiert und: // - der zweite Parameter true ist, wird die Section erstellt. // - der zweite Paramater false ist, wird nil zurückgegeben // Der zweite Paramater kann weggelassen werden. Er ist dann false. cursec :=ini.findSection('aSec',true); //findItem sucht das Item mit dem Name im ersten Paramater raus. Wenn das Item nicht existiertn und: // - der zweite Parameter true ist, wird das Item mit dem defaultwert im 3. Parameter erstellt // - der zweite Parameter fals ist, wird nil zurückgegeben //Der zweite und dritte Paramter können weggelassen werden. Sie sind dann false und ein leerer String. curitem :=cursec.findItem('aName',true,'aValue'); //curitem.value enthält den Wert als String. Alternativ gibt es auch noch curitem. Alternativ gibt es auch noch //curitem.AsBool (gibt false zurück, wenn value='' oder value='0' oder value='false', sonst wird true zurückgegeben) //curitem.AsFloat / curitem.AsInteger. Konvertiert nach php-Vorbild. Gibt 0 zurück, wenn value keine Zahl ist. Wenn value mit einer Zahl anfängt und später ein String folgt, wird der durchgängig numerische Teil zurückgegeben ShowMessage(curitem.value); curitem.value :='Was neues'; //UpdateFile updated die Werte in der angegebenen Datei. Kommentare bleiben erhalten ini.UpdateFile('bla.ini'); ini.Free; ![]() Ich würde mich über ein paar Rückmeldungen freuen :-). EDIT: Version 1.0.2: Zur Kompatibilität und zur Vereinfachung der Bedienung habe ich noch ein paar der Write/Read-Funktionen der TIniFile-Klasse eingebaut. Beachted jedoch, dass dies ggf. ein Performancenachteil ist diese zu verwenden! Version 1.0.1: 2 Bugs behoben, die beim Speichern unter gewissen Umständen zu einer syntaktisch inkorrekten ini-Datei führen konnten. |
Re: TYIniFile: Ein ini-Parser
|
Re: TYIniFile: Ein ini-Parser
Zitat:
Die GPL ist mir für solche mini-Projekte viel zu restrektiv lang und kompliziert. Gibt es was möglichst ähnliches für Software? |
Re: TYIniFile: Ein ini-Parser
fand ich auch schade.
Gruß Alexander Tut, mir Leid dass ich mir den Parser zurzeit noch nicht anschauen kann (Chemie Arbeit wartet nicht), doch die Idee finde ich prima. |
Re: TYIniFile: Ein ini-Parser
wie wärs mit MPL?
|
Re: TYIniFile: Ein ini-Parser
Zitat:
Gruss Reinhard |
Re: TYIniFile: Ein ini-Parser
im übrigen ist die Delpi-Klasse TIniFile kein Ini-Parser von Delphi sondern eine Kapselung der Windowsmethoden um auf eine-File zu zugreifen. Das heißt das TIniFile von Delphi immer genau so viel kann wie Windows mit Ini-Files auch kann.
|
Re: TYIniFile: Ein ini-Parser
weil delphi, wie bereits von mir erwähnt, nur die Windowsfunktionen für den Zugriff auf Ini-Files kapselt. Und da braucht nix formatiert werden weil der Standard von Ini-Files das Format vorgibt.
|
Re: TYIniFile: Ein ini-Parser
Zitat:
Sinn dieses Parsers war es (wenn ich mich recht erinnere, yankee, korriegier mich wenn ich blödsinn rede) einen IniParser zu schreiben, welcher ein Format ´benutzt welches dem eine IniDatei entspricht, Kommentare unterstützt und mir mehrzeiligen Strings umgehen kann. |
Re: TYIniFile: Ein ini-Parser
Dann ist es aber keine INI-Datei im eigentlichen Sinne mehr, sondern ein INI-ähnliches Format
kommentierbare Einträge, da würd ich aber noch mitgehn... allerdings würd ich dann nur einen Ini-Writer basteln, denn solang es zum Standard kompatibel bleibt kann man es auch mit T(Mem)IniFile auslesen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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