Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TYIniFile: Ein ini-Parser (https://www.delphipraxis.net/88993-tyinifile-ein-ini-parser.html)

yankee 24. Mär 2007 10:01


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:
; 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.

Alexander Roth 24. Mär 2007 11:21

Re: TYIniFile: Ein ini-Parser
 
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.

yankee 24. Mär 2007 11:31

Re: TYIniFile: Ein ini-Parser
 
Zitat:

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?

Alexander Roth 24. Mär 2007 11:40

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.

DGL-luke 24. Mär 2007 12:58

Re: TYIniFile: Ein ini-Parser
 
wie wärs mit MPL?

Reinhard Kern 25. Mär 2007 03:01

Re: TYIniFile: Ein ini-Parser
 
Zitat:

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

SirThornberry 25. Mär 2007 08:25

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.

SirThornberry 25. Mär 2007 09:19

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.

glkgereon 25. Mär 2007 11:00

Re: TYIniFile: Ein ini-Parser
 
Zitat:

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.

cruiser 25. Mär 2007 16:07

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 12:17 Uhr.
Seite 1 von 2  1 2      

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