Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   dynamisch recordarray imrecord speichern (https://www.delphipraxis.net/124159-dynamisch-recordarray-imrecord-speichern.html)

clock50 15. Nov 2008 23:27


dynamisch recordarray imrecord speichern
 
hallo zusammen, hat jemand ne ahnung wie man sowas speichern kann?
Delphi-Quellcode:
type fdb = record
     kunden : array of tkunden;
     rechnung : array of trechnung;
     rdaten : array of trdaten;
     angebot : array of tangebot;
     adaten : array of tadaten;
    end;
mit
Delphi-Quellcode:
var db : fdb; //datenbankrecord
    dfile: File of fdb;
gehts nicht oder?

himitsu 16. Nov 2008 02:16

Re: dynamisch recordarray imrecord speichern
 
in diesem Fall garnicht.

bei "File of fdb" sieht für die ganzen Lese-/Schreibfunktionen das Array nur so aus
Delphi-Quellcode:
type fdb = record
   kunden : Pointer;
   rechnung : Pointer;
   rdaten : Pointer;
   angebot : Pointer;
   adaten : Pointer;
  end;
und mehr würde da auch nicht gespeichert.

Falls es unbedingt eine binäre Datei sein muß, dann "var dfile: File;" oder "var dfile: File of Byte;"
und die Daten mußt du dann selber Stück für stück schreiben/lesen.
ud wie kommt auf den Inhalt an.

theoretisch könnte man es so machen ... jeweils Array-Länge und dann Array-Daten

Delphi-Quellcode:
type tdb = record
     kunden : array of tkunden;
     rechnung : array of trechnung;
     rdaten : array of trdaten;
     angebot : array of tangebot;
     adaten : array of tadaten;
    end;

var db : tdb;
    dfile: File;
    Len, i: LongInt;

// schreiben
Len = Length(db.kunden);
BlockWrite(dfile, Len, SizeOf(Len));
for i := 0 to High(db.kunden) do
  BlockWrite(dfile, db.kunden[i], SizeOf(tkunden));
Len = Length(db.rechnung);
BlockWrite(dfile, Len, SizeOf(Len));
for i := 0 to High(db.rechnung) do
  BlockWrite(dfile, db.rechnung[i], SizeOf(trechnung));
...

// lesen
BlockRead(dfile, Len, SizeOf(Len));
SetLength(db.kunden, Len);
for i := 0 to High(db.kunden) do
  BlockRead(dfile, db.kunden[i], SizeOf(tkunden));
BlockRead(dfile, Len, SizeOf(Len));
SetLength(db.rechnung, Len);
for i := 0 to High(db.rechnung) do
  BlockRead(dfile, db.rechnung[i], SizeOf(trechnung));
...
die Schleife könnte man dann vermutlich noch optimieren, indem man alle Array-Daten zusammenhängend abspeichert,

aber wie sehen eigentlich die anderen Typen aus?
tkunden, trechnung, trdaten, tangebot und tadaten ... sind da eventuell auch noch andere "dynamische" Daten enthalten, wie z.B. Strings, andere Arrays und Co.?


PS: man könnte es auch ganz schön (ich weiß, sowas hört man selber von mir, da ich bisher selber zu gern solch binäre Dateien verwendet hatte) mit XML oder Co. versuchen :angel2:

clock50 16. Nov 2008 15:03

Re: dynamisch recordarray imrecord speichern
 
also ich habe auch felder mit string ca. 2500 zeichen. das geht dann nicht und mit xml habe ich noch nicht gearbeitet. gibt es da ne komponete oder muss ich mir das selbst schreiben?

himitsu 16. Nov 2008 22:27

Re: dynamisch recordarray imrecord speichern
 
Also die Strings mußt du dann auch wieder selber behandeln, da sie ja wiederrum außerhalb (über 'nen "Pointer") des enthaltenden Records/Arrays liegen.

Mit den kompletten Definitionen könnte man(ich) zwar "leicht" die passenden Schreib- und Lesefunktionen erstellen, aber wenn du dann mal das Format änderst (also die Definition der Records/Arrays änderst ... z.B. einen neuen Wert einfügen), dann hast'e ein Problem bei der Umwandlung der gespeicherten Daten. (XML wäre da flexiebler, da es sich sozusagen in der Datei die Daten passend zusammensucht und es auch nicht sooo schlimm ist, wenn ein Wert fehlt, oder zuviel ist)


bezüglich XML:
Hier im Forum suchenTXMLDocument ist bereits in Delphi integriert
und dann gibt's natürlich auch noch andere Klassen für den Zugriff ... z.B. Hier im Forum suchenThaXML
odereinfach mal nach Hier im Forum suchenXML suchen und etwas umschauen, was es sonst noch gibt.
(gibt auch viele Beispielcodes im Forum)

clock50 20. Nov 2008 06:59

Re: dynamisch recordarray imrecord speichern
 
hallo, also ich habs mit xml versucht aber an einer stelle komme ich nicht weiter.
speichern mache ich so:
Delphi-Quellcode:
procedure tform1.speichern;
var i : longword;
begin
with JvSimpleXML1.Root.Items.Add('kunden') do
 begin //nr, knr, anrede, name, vorname, land, plz, ort, strasse, tel, fax, mail
  for i := 0 to length(db.kunden)-1 do
  begin
  items.Add('nr',db.kunden[i].nr);
  items.Add('knr',db.kunden[i].knr);
  items.Add('anrede',db.kunden[i].anrede);
  items.Add('name',db.kunden[i].name);
  items.Add('vorname',db.kunden[i].vorname);
  items.Add('land',db.kunden[i].land);
  items.Add('plz',db.kunden[i].plz);
  items.Add('ort',db.kunden[i].ort);
  items.Add('strasse',db.kunden[i].strasse);
  items.Add('tel',db.kunden[i].tel);
  items.Add('fax',db.kunden[i].fax);
  items.Add('mail',db.kunden[i].mail);
  end;
 end;
JvSimpleXML1.savetofile(pphat+dverz+dbank);
end;
aber wie krieg ich dann das laden in mein array hin?
ich habe dann in der xml datei dann etwa sowas stehn
Delphi-Quellcode:
  <?xml version="1.0" encoding="iso-8859-1" ?>
- <kunden>
  <nr>1</nr>
  <knr>1</knr>
  <anrede>Herr</anrede>
  <name>Muster</name>
  <vorname>Heinz</vorname>
  <land>D</land>
  <plz>11111</plz>
  <ort>Neustadt</ort>
  <strasse>Halbestrasse 5</strasse>
  <tel>0000-00000</tel>
  <fax>0000-00000</fax>
  <mail>2</mail>
  <nr>1</nr>
  <knr>1</knr>
  <anrede>Herr</anrede>
  <name>Muster</name>
  <vorname>Heinz</vorname>
  <land>D</land>
  <plz>11111</plz>
  <ort>Neustadt</ort>
  <strasse>Halbestrasse 5</strasse>
  <tel>0000-00000</tel>
  <fax>0000-00000</fax>
  <mail>2</mail>
  </kunden>

automatix 20. Nov 2008 07:56

Re: dynamisch recordarray imrecord speichern
 
Hallo!

Ich weiß ja nicht wofür Du genau dieses benötigst.
Aber wenn Du in eine Datei speichern willst wäre es vielleicht ein Möglichkeit die Klassen TKunden etc. statt von TObject von TPersistent abzuleiten und deren Funktion zu nutzten.
Oder vielleicht eine Schmalspur Datenbank wie sqlite nutzen.

Btw., da dieser Record zum speichern in eine Datei nicht wirklich taugt, würde ich da statt der Arrays eher eine TObjectList verwenden.

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz