AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TYIniFile: Ein ini-Parser
Thema durchsuchen
Ansicht
Themen-Optionen

TYIniFile: Ein ini-Parser

Ein Thema von yankee · begonnen am 24. Mär 2007 · letzter Beitrag vom 25. Mär 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von yankee
yankee
Registriert seit: 10. Mär 2004
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.
Angehängte Dateien
Dateityp: pas uyinifile_158.pas (18,4 KB, 56x aufgerufen)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
 
Benutzerbild von yankee
yankee

 
Lazarus
 
#11
  Alt 25. Mär 2007, 16:42
Zitat von cruiser:
Dann ist es aber keine INI-Datei im eigentlichen Sinne mehr, sondern ein INI-ähnliches Format
Sagen wir "erweitertes Format"...
Zitat von cruiser:
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.
Solange du keine mehrzeiligen Strings verwendest (und wenn du auf Kompatibilität zu dem Windows mehr-oder-weniger-Standard wert legst, heisst dass, dass du eh keine mehrzeiligen Strings verwendest) sind die Parser sogar kompatibel..
Zumindest wenn ich mich recht erinnere kommt auch der Winparser beim lesen von Dateien mit Kommentaren zurecht und auch mit Strings in ". Nur dass beim schreiben in der Datei Windows die ini dann gerne kaputt macht.

Aber gut... Die Kompatibilität in diese Richtung ist eingeschränkt. Aber in die andere Richtung ist der Parser in jedem Fall zur WinAPI kompatibel. Eine per WinAPI generierte Datei ist in jedem Fall mit meinem Parser wieder lesbar.
Und da es genügend Unklarheit über die genaue Defintion einer ini-Datei gibt würde ich sagen, dass ich in jedem Fall nah genug dran bin um meinen Parser ini-Parser zu nennen.

Alles andere würde auch das Ziel verfehlen. ini-Datei sind eben Konfigdateien eines Programmes und damit müssen sie per Definition nicht kompatibel zu anderen Programmen sein. Sie sollten nur so aufgebaut sein, dass ein Computer sie schnell parsen können, und gleichzeitig von Menschen noch gut lesbar/editierbar sind.
  Mit Zitat antworten Zitat
Der_Unwissende
 
#12
  Alt 25. Mär 2007, 16:52
Zitat von cruiser:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:16 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