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 user profile iconGausi: 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: Suche in der Entwickler-Ecke TINIFILE, Suche in der Entwickler-Ecke 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; // usually $0100 (High: major, Low: minor version)
iFileSize: INTEGER; // integrity check
wStrings: WORD; // how many strings are stored
wInts: WORD; // how many ints
wWords: WORD; // how many words
wChar: WORD; // how many chars


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.


Martin1966 - Fr 16.12.05 11:50

Hallo :wink2:

Eventl. wäre die Klassensammlung von Richard Kaspar etwas für dich. Richard hat eine sehr umfrangreiche und gute Klasse programmiert die das Speichern und Laden von Daten sehr gut kapselt.

Kannst es dir ja mal anschauen. Ist zwar nicht ganz so einfach zu benutzen aber dafür sehr umfangreich: RakBinaryStreamData [http://www.kasparsoft.de/RakBinaryStreamData/index.htm]. Ein sehr gutes Tutorial dazu findest du hier [http://dsdt.info/tutorials/bindatei/].

Lg Martin