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:
; 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"
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.
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:
[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.
Der Parser selbst besteht aus 3 Klassen:
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:
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;
Lizenz:
Creative Commons by-sa
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.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.
Have a lot of fun!