![]() |
dynamisch recordarray imrecord speichern
hallo zusammen, hat jemand ne ahnung wie man sowas speichern kann?
Delphi-Quellcode:
mit
type fdb = record
kunden : array of tkunden; rechnung : array of trechnung; rdaten : array of trdaten; angebot : array of tangebot; adaten : array of tadaten; end;
Delphi-Quellcode:
gehts nicht oder?
var db : fdb; //datenbankrecord
dfile: File of fdb; |
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:
und mehr würde da auch nicht gespeichert.
type fdb = record
kunden : Pointer; rechnung : Pointer; rdaten : Pointer; angebot : Pointer; adaten : Pointer; end; 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:
die Schleife könnte man dann vermutlich noch optimieren, indem man alle Array-Daten zusammenhängend abspeichert,
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)); ... 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: |
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?
|
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: ![]() und dann gibt's natürlich auch noch andere Klassen für den Zugriff ... z.B. ![]() odereinfach mal nach ![]() (gibt auch viele Beispielcodes im Forum) |
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:
aber wie krieg ich dann das laden in mein array hin?
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; 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> |
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