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 1 von 2  1 2      
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 Alexander Roth
Alexander Roth

 
Turbo Delphi für Win32
 
#2
  Alt 24. Mär 2007, 11:21
Soweit ich weiß ist CC nur für Texte und Medien aller art, aber nicht für Computer Programme.
Das wollte ich nämlich auch mal ausprobieren siehe hier und hier.
Es ist jetzt die Frage, ob ein Parser ein Programm ist, oder als Medialer Inhalt angesehen werden kann.
Alexander Roth
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#3
  Alt 24. Mär 2007, 11:31
Zitat von Alexander Roth:
Soweit ich weiß ist CC nur für Texte und Medien aller art, aber nicht für Computer Programme.
Toll... Dabei gefällt mir die Lizenz so gut.. *brrrr*.
Die GPL ist mir für solche mini-Projekte viel zu restrektiv lang und kompliziert.

Gibt es was möglichst ähnliches für Software?
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

 
Turbo Delphi für Win32
 
#4
  Alt 24. Mär 2007, 11:40
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.
Alexander Roth
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

 
Delphi 2006 Professional
 
#5
  Alt 24. Mär 2007, 12:58
wie wärs mit MPL?
Lukas Erlacher
  Mit Zitat antworten Zitat
Reinhard Kern
 
#6
  Alt 25. Mär 2007, 03:01
Zitat von yankee:
Hi @ll,

ich habe einen kleinen ini-Parser geschrieben...
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.
In INI-Files gibt es keine mehrzeiligen Strings. Ausdenken kann man sich ja viel, aber es ist eben kein Standard, sondern proprietär - und das ist zu Recht ein Schimpfwort.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#7
  Alt 25. Mär 2007, 08:25
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.
Jens
  Mit Zitat antworten Zitat
Alt 25. Mär 2007, 09:08     Erstellt von EWeiss
Dieser Beitrag wurde von fkerber gelöscht. - Grund: Inhalt von Autor entfernt
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#8
  Alt 25. Mär 2007, 09:19
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.
Jens
  Mit Zitat antworten Zitat
Alt 25. Mär 2007, 09:31     Erstellt von EWeiss
Dieser Beitrag wurde von fkerber gelöscht. - Grund: Inhalt von Autor entfernt
Benutzerbild von glkgereon
glkgereon
 
#9
  Alt 25. Mär 2007, 11:00
Zitat von Reinhard Kern:
In INI-Files gibt es keine mehrzeiligen Strings. Ausdenken kann man sich ja viel, aber es ist eben kein Standard, sondern proprietär - und das ist zu Recht ein Schimpfwort.
Aber genau dadrum geht es ja hier.
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.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

 
Delphi 7 Enterprise
 
#10
  Alt 25. Mär 2007, 16:07
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.
Ronny Lüttke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:43 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