Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   XML IniFiles (https://www.delphipraxis.net/140730-xml-inifiles.html)

TheReaper 24. Sep 2009 20:19


XML IniFiles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

im Zuge eines größeren Programmes, war ich "gezwungen" meine ini-Datei als XML zu speichern. Deshalb hab ich mir eine Klasse dazu geschrieben. Da ich hier schon oft gelesen habe, das man doch ini-Files als XML speichern soll, dachte ich mir, dass ich die Klasse auch gleich mal veröffentlich kann.

Die Klasse heißt TXMLIniFile aus der Unit XMLIniFiles. Sie ist von der TCusotmIniFile abgeleitet und benötigt die MSXML2_TLB. Sie ist "Copy and Paste" fähig. Das heißt man kann sie genauso handhaben wie die normale TIniFile, sie reagiert gauso wie in der Dokumentation der TIniFile beschrieben und es sind keine Änderungen (außer natürlich die Klassen austauschen :wink: ) im bestehenden Code nötig. Deshalb verzichte ich auch auf ein Tutorial oder Demo.

Vielleicht kann sie der ein oder andere gebrauchen.



Über Fragen, Anregungen und Kritik freue ich mich natürlich. :-D

[edit]Neue Version[/edit]

himitsu 24. Sep 2009 20:46

Re: XML IniFiles
 
Ein großes Problem gib es:
Nimm mal Namen für "Section" oder "Ident", welche nicht den Namenskonventionen für einen XML-Node entsprechen ....... dann knallt's und MSXML haut dir Exceptions um die Ohren!

z.B. ein Leerzeichen im Namen oder ein Name, welcher mit einer Zahl beginnt

aber sonst sieht es anscheinend OK aus :thumb:



darum hier mal der Aufbau meiner XML als Vorschlag
XML-Code:
<?xml ... ?>
<ini>
  <section name="{sectionName}">
    <ident name="{identName}">{value}</ident>
    ...
  </section>
  ...
</ini>
(hab in meinem himXML auch soeine Klasse, nur daß ich da halt eine andere XML-Klasse verwende und einige der Typen/Strings selber umgewandele, damit sie mehr mit dem allgemeinen Aufbau/Verständnis von vielen XML-Parsern übereinstimmen, wie z.B. das Format der Datums-Strings)

[edit]
da jemand der Meinung war ich solle doch ...
Matze: An deiner Stelle hätte ich "himXML" verlinkt. Dann ist es gleichzeitig bessere Werbung ;)
himitsu: ich wollt ihm nur den Namen nennen, falls er selber nachsehn will und als Quellenangabe für die gepostete XML
Matze: vllt denkt er, das sei was internes von dir, das nicht Open-Source ist. Daher die verlinkung.
Aber is au net tragisch. War nur son Geheimtip ^^

Hier im Forum suchenhimXML siehe Unit himXML_Tools (oder ausgekoppelt in himXML_Ini, in der Beta)

aber bezüglich der Werbung:
vor Delphi 2006 und für alle, die nur eine Kleine Ini-Unit einbinden wollen, würde ich deines empfehlen
(also wenn du dann das Problemchen mit dem Leerzeichen beseitigt hast, da dieses doch schon öfter mal in solchen Namen vorkommen)

TheReaper 24. Sep 2009 22:10

Re: XML IniFiles
 
:wall:
Da hast du natürlich recht. Daran hab ich gar nicht gedacht. :oops: Naja, neue Version ist hochgeladen und das Problem sollte jetzt weg sein. Dein Beispiel ist am besten und hab das auch gleich als Vorlage genommen. Ich hätts auch nich anders gemacht. :-D

Dein himXML ist ja hier in der DP nicht zu übersehen und ich weiß, dass da so eine Klasse dabei ist. Aber ich muss zugeben, ich habs mir trotzdem noch nie angeguckt. :duck: Aber ich schreib XML zeugs lieber selber. Da weiß ich was ich hab und kann das perfekt für mein Programm optimieren.

Wer noch Fehler findet, kann sie natürlich posten.

taaktaak 25. Sep 2009 07:45

Re: XML IniFiles
 
Moin, Moin.

Habe das mal an meinem "rzDelphiGuide" ausprobiert - es funktioniert ohne Probleme. Ich stelle mir allerdings die Frage, was ist besser an XmlIniFile als an dem uralten IniFile? Kann eigentlich nur feststellen: Die INI-Datei wird in meinem Fall etwa 25% größer und unleserlich?
  • Worin liegt der Vorteil gegenüber dem IniFile?
  • Mit welchem Programm kann man die Datei mit leserlicher Struktur anzeigen?

himitsu 25. Sep 2009 09:39

Re: XML IniFiles
 
Nja, ich seh einfach den Vorteil darin, daß man leicht älte Projekte, welche noch als INI speichern auf XML umstellen kann, um dann in neueren Projekten dann richtig mit XML weiterzuarbeiten.

Im grunde umgeht man damit einige Probleme der INI
- Größenbeschränkung (OK, dafür gibt es andere Klassen)
- und du kannst in der XML auch Daten speichern, welche in die INI garnicht reinpassen

Hier mal ein einfaches Beispiel für mehrzeiligen Text:
uses IniFiles;

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var ini: TIniFile;
begin
  ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  ini.WriteString('section', 'ident', 'mehrzeiliger'#13#10'Text');
  Memo1.Text := ini.ReadString('section', 'ident', '');
  ini.Free;
end;
Dieser steht dann zwar in der INI drin, aber läßt sich nicht mehr auslesen,
da Value nur bis Zeilenende ausgelesen wird.
Code:
[section]
ident=mehrzeiliger
Text
Es ist also gut um ein altes Projekt "aufzurüsten", ohne viel ändern zu müssen,
oder für Leute, die zwar "aufrüsten" und mit XML arbeiten wollen, aber sich einfach nicht trauen (angst haben, daß sie es nicht schaffen) und dann praktisch die XML genauso handhaben, als wäre sie eine bekannte INI.

taaktaak 25. Sep 2009 10:12

Re: XML IniFiles
 
Zitat:

und du kannst in der XML auch Daten speichern, welche in die INI gar nicht reinpassen
Ahh, ja, das ist allerdings ein sehr gutes Argument. Und das funktioniert dann alles mit der himXML?! Muss ich mir mal anschauen...

Offen ist noch meine Frage: Mit welchem Programm man sich so eine XML-Datei vernünftig anzeigen lassen? Mit Notpad & Co. ist das nicht so prickelnd was man zu sehen bekommt.

himitsu 25. Sep 2009 10:25

Re: XML IniFiles
 
himXML selber ist eine eigenständige XML-Implementation ... ähnlich wie das MSXML-DOM, welches hier verwendet wurde.
(bin allerdings noch in der Aufbau.Phasen dieser Klassen)

Die TXMLIniFile (hey, unsere Klassen heißen sogar gleich :mrgreen: ) macht im Grunde auch das,
welches hier gemacht wurde, nur das es eine andere XML-Implementation im Hintergrund verwendet.

taaktaak 25. Sep 2009 10:28

Re: XML IniFiles
 
... dann gibt es in himXML (TXMLIniFile) noch keine fertigen Methoden um z.B. ein Integer-Array zu speichern bzw. zu lesen? Wenn nicht, ist das geplant?

himitsu 25. Sep 2009 10:57

Re: XML IniFiles
 
Zitat:

Zitat von taaktaak
... dann gibt es in himXML (TXMLIniFile) noch keine fertigen Methoden um z.B. ein Integer-Array zu speichern bzw. zu lesen? Wenn nicht, ist das geplant?

Gute frage, da mußte ich selber nochmal nachschauen :oops:

Es ist auch dort nur das umgesetzt, welches in der original TIniFile drin steckt

Also du kannst einen Stream speichern.


Ansonsten müßte ich eigentlich nur meine Serialisierung durchschleifen.
in himXML selber gibt es ja eine Serialisierung für Records (welche Arrays enthalten können) und Variants (die für Objekte kann immernoch nicht das einmal Gespeicherte auslesen, bzw. der Code dafür ist noch nicht freigegeben)


Also was die Funktionen der originalen TIniFile angeht, ist der Code von hier natürlisch schön klein und übersichtlich und bietet das Selbe wie meine Klassen :-D

TheReaper 25. Sep 2009 11:37

Re: XML IniFiles
 
Meine TXMLIniFile ist wirklich nur für den Umstieg auf XML geeignet. Für ein neues Projekt würde ich es auch "richtig" machen. Erst recht wenn man sowieso himXML verwenden will. Obwohl, wenn man nichts großartiges Initialisieren will, geht das schon.


Zitat:

Zitat von taaktaak
  • Worin liegt der Vorteil gegenüber dem IniFile?

Die Vorteile kann ich die von himitsu genannten nur bestätigen. Dazu kommt noch, dass Delphi MSDN-Library durchsuchenWritePrivateProfileString verwendet. Die MSDN Doku sagt dazu:
Zitat:

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.
Es ist also nur eine Frage der Zeit bis, IniFiles von Windows deprecated sind.


Zitat:

Zitat von taaktaak
  • Mit welchem Programm kann man die Datei mit leserlicher Struktur anzeigen?

Mit so ziemlichen jedem Bei Google suchenXML-Viewerkann man XML-Dateien Ansehen :wink: IE, VisualStudio... Notepad ist eher weniger geeignet, weil keine Whitespaces gespeichert werden. deshalb auch die etwas komische Form.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 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