Entwickler-Ecke
Dateizugriff - Ein Problem nach dem Anderen. Wie am Besten Daten speichern?
elcomportal - Fr 16.12.05 00:52
Titel: Ein Problem nach dem Anderen. Wie am Besten Daten speichern?
Ich schon wieder...
Mal ne Frage, ich mache ein Prog welches ca 200 Byte-Werte, davon einige in ein paar Arrays of byte, ca. 100 Integer, davon auch einige in Arrays und ca. 30 Strings, auch hier einige in arrays, braucht. Die ganzen Variablen muss ich speichern. :?: :oops: Jede Einstellung soll wenn sie fertig ist gespeichert werden können. Immer alle Variablen zusammen für eine Einstellung. Ich hatte schon dran gedacht, für jede Konfiguration eine Textdatei anzulegen, ich denke das ist bestimmt nicht sehr elegant. Wie würdet Ihr das machen? Möglichst einfach, bin nicht der Delphi-Crack, progge nur selten. Mache mehr in Hardware. :oops: Vielleicht 'nen Code-Schnipsel :?: :oops:
Mfg
Torsten
und danke für eure Tips :wink:
Moderiert von
Gausi: Topic aus VCL (Visual Component Library) verschoben am Fr 16.12.2005 um 10:24
Stefan.Buchholtz - Fr 16.12.05 11:12
Wenn du eine Delphi-Version hast, die XML-Komponenten mitbringt (ab Delphi 7, ob Professional oder erst Enterprise weiss ich nicht), würde ich das als XML verwalten und speichern. Das könnte dann so aussehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| <?xml version="1.0" encoding="UTF-8" ?> <konfiguration> <stringwert>Dies ist ein String</stringwert> <bytewert>54</bytewert> <stringarray count="3"> <wert>Erster Eintrag</wert> <wert>Zweiter Eintrag</wert> <wert>Dritter Eintrag</wert> </stringarray> <bytearray count="100"> <byte>5</byte> ... </bytearray> </konfiguration> |
Zur Manipulation dieser Datei benutzt du das TXMLDocument über die IXMLDocument-Schnittstelle. Zum Schreiben sieht das so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var doc : IXMLDocument; arrayNode : IXMLNode; node : IXMLNode; i : Integer; begin doc := NewXMLDocument; doc.Encoding = 'UTF-8'; doc.DocumentElement = doc.CreateElement('konfiguration', ''); doc.DocumentElement.ChildValues['stringwert'] := meinStringWert; doc.DocumentElement.ChildValues['bytewert'] := meinByteWert; arrayNode := doc.DocumentElement.AddChild('stringarray'); arrayNode.Attributes['count'] := stringArrayGroesse; for i := 1 to stringArrayGroesse do begin node := arrayNode.AddChild('wert'); node.Text := stringArray[i]; end; ... doc.SaveToFile('konfiguration.xml'); end; |
Lesen geht dann so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var doc : IXMLDocument; arrayNode : IXMLNode; node : IXMLNode; i : Integer; begin doc := LoadXMLDocument('konfiguration.xml'); meinStringWert := doc.DocumentElement.ChildValues['stringwert']; meinByteWert := doc.DocumentElement.ChildValues['bytewert']; arrayNode := doc.DocumentElement.ChildNodes['stringarray']; node := arrayNode.ChildNodes.First; i := 1; while Assigned(node) do begin stringArray[i] := node.Text; node := node.GetNextSibling; Inc(i); end; ... end; |
Vorteile dieses Verfahrens:
1. Du hast eine mit einem Texteditor lesbare KOnfigurationsdatei, das vereinfacht die Fehlersuche.
2. Die Konfiguration ist leicht erweiterbar ohne die Kompatibilität zu alten Dateinen zu verlieren.
3. XML ist plattfromneutral und damit leicht portabel.
4. Wenn du ein passendes XML-Schema erstellst, lässt sich die Korrektheit einer XML-Datei automatsch prüfen
Nachteile:
1. Binärdateien sind kleiner
2. Binärdateien sind normalerweise schneller zu lesen und schreiben
Stefan
elcomportal - Fr 16.12.05 11:38
Habe leider noch D5 standard. Im Moment ist ein Update nicht drin. Aber trotzdem interessant mit XML, wenn ich es auch nicht nutzen kann :-((
Mfg
Torsten
Gausi - Fr 16.12.05 11:42
Schau dir mal INI-Files an. Ein paar hundert Variablen kann man da schon noch drin speichern. Viel mehr sollten es aber nicht werden - dann wäre ein eigenes Dateiformat wahrscheinlich günstiger.
Zu Inifiles gibt es jede Menge hier im Forum. Einfach mal suchen:
TINIFILE,
TMEMINIFILE
DaRkFiRe - Fr 16.12.05 11:50
Arrays durchlaufen und Werte in die Datei schreiben.
Speichern:
* Integer,Byte,Word,DWORD,Char - alle haben konstante Größe (notfalls mit sizeof prüfen)
* Strings: erst Länge als DWORD schreiben, dann hinten dran den String
Entweder machst Du Chunks für die einzelnen Datentypen, für die Du je wieder einen Header machst, oder Du packst schon in den Fileheader rein, wieviel Du von jedem Datentyp in Deiner Datei gespeichert hast.
Beispielsweise so (Fileheader):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TFileHeader = wVersion: WORD; iFileSize: INTEGER; wStrings: WORD; wInts: WORD; wWords: WORD; wChar: WORD; |
Dann liest der Parser dann nacheinander Strings, Ints, Words und Chars aus (musst Du implementieren!)
Der Grundsatz: beim Datei-Laden kennt Dein Programm NUR das Format und wie es zu lesen ist.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!