Autor Beitrag
elcomportal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win XP home
D5 standard
BeitragVerfasst: Fr 16.12.05 00:52 
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

_________________
Starkstrom macht klein und hässlich
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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:

ausblenden 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

_________________
Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
elcomportal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win XP home
D5 standard
BeitragVerfasst: 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

_________________
Starkstrom macht klein und hässlich
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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

_________________
We are, we were and will not be.
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: 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):
ausblenden 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.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: 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. Ein sehr gutes Tutorial dazu findest du hier.

Lg Martin

_________________
Ein Nutzer der Ecke ;-)