![]() |
Record und in File speichern
hey,
habe folgenden Record:
Delphi-Quellcode:
type
TArtRec = record ID: Integer; D1: string; D2: string; end; var ArtArr: array of TArtRec; Wie speichere ich dessen Inhalt am sinnigstenn in einer File? |
Re: Record und in File speichern
Hi,
so richtig elegant geht das leider nicht. Du hast die Auswahl dir eine eigene Dateistruktur zu überlegen und die zu implementieren, kannst aber auch auf ein Ini-File, XML oder CSV zurückgreifen. Zu letzten findest du eine Menge Komponenten, teilweise auch gleich bei Delphi beiliegend. Legst du dir ein eigenes Dateiformat an, so solltest du darauf achten, dass du die Länge der Strings speichern musst. Ein String hat in Delphi eine Variable Länge von bis zu 2^{31}-1 Zeichen (sind ca. 2.1 Mrd. Zeichen). Da ein Record eine feste größe hat, musst du hier aufpassen, Strings werden nur als Zeiger im Record abgelegt. Möchtest du den Inhalt in ein Stream schreiben, musst du den Strings dereferenzieren (z.B. D1[1], wäre jetzt das erste Zeichen im String und ist damit der Anfang). Dabei geht dann aber dass davor sitzende Längenwort verloren, deswegen wie gesagt, musst du die Länge vorher abspeichern. Gruß Der Unwissende |
Re: Record und in File speichern
als Schritt Nr.1 solltest Du die String durch string[xxx] ersetzen.
Delphi-Quellcode:
Dann kannst Du folgendermassen abspeichern:
type
TArtRec = record ID: Integer; D1: string[100]; D2: string[100]; end;
Delphi-Quellcode:
Natürlich kannst Du auch das ganze Array speichern, indem Du eine geeignete Schleife um das Speichern herum legst.
procedure Speichern ();
var stream : TFileStream; filename : string; begin filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen try stream.WriteBuffer (PDeinRecord^, SizeOf (DeinRecord)); finally stream.Free; // Stream wieder freigeben end; end; |
Re: Record und in File speichern
Ok ich ahb es so gelöst!
ist da was zu verbessern drinne?
Delphi-Quellcode:
function TWK_Form.write_Data: boolean;
var f: Textfile; i: Integer; begin pro_1.MaxValue := allcnt; Result := False; AssignFile(f, FileName); try if FileExists(FileName) = False then Rewrite(f) else begin ReWrite(f); end; for i := 0 to allcnt - 1 do begin pro_1.Progress := i; WriteLn(f, IntToStr(ArtArr[i].ID) + ';' + ArtArr[i].d1 + ';' + ArtArr[i].d2); Application.ProcessMessages; end; Result := True; finally CloseFile(f); pro_1.Progress := 0; end; end; |
Re: Record und in File speichern
Ich würde nicht mit Records arbeiten, sondern mit Klassen:
![]() Und zuim Speichern würde ich eine XML-Datei nehmen. |
Re: Record und in File speichern
Geht man von Pascal in der ursprünglichen Version aus, dann ist die obige Deklaration gleichbedeutend mit:
Delphi-Quellcode:
Dann geht mdas mit dem Speichern schon sehr elegant:
TArtRec = record
ID: Integer; D1: string[255]; D2: string[255]; end;
Delphi-Quellcode:
Gruss
var i :integer;
aFile: File of TArtRec; begin AssignFile(aFile,'Filename'); Rewrite(aFile); for i := 0 to length(ArtArr)-1 do begin; Write(aFile, ArtArr[i]); end; CloseFile(aFile); end; Peter |
Re: Record und in File speichern
hmm na ja wichtig ist das die ; mit in der speicehrung zwecks CSV verwertbarkeit vorhanden sind!
|
Re: Record und in File speichern
Zitat:
Dann iterier durch das Array, schreibe jedes Record in eine Zeile einer TStringlist, trenne die Einträge durch Komma, und nutze dann die Methode TStringlist.SavetoFile zum speichern cu Peter |
Re: Record und in File speichern
ich hab dasselbe problem
Delphi-Quellcode:
was mach ich falsch?
Vert_Ent = record
vtjahr : Integer; vtproz : array [0..11] of Integer; end; Steuer = record st_bez : string[30]; st_jahr : array [0..11] of Integer; st_vert : string[10]; st_aufk : array [0..11] of longint; end; Modell = record und_bez : string[30]; und_st : array [0..31] of Steuer; end; Alles= record Vert_ast : array [0..30] of array [0..22] of string ; vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; procedure TMain.Speichern1Click(Sender: TObject); var stream : TFileStream; filename : string; begin filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen try stream.WriteBuffer (TAlles^, SizeOf (TAlles)); // hier kommt eine fehelrmeldung dass nach TAlles^ eine klammer fehlt ( und // dass eine anweisung erforderlich ist aber ein integer gefunden wurde finally stream.Free; // Stream wieder freigeben end; end; lg nico |
Re: Record und in File speichern
Zitat:
das sollte schon nicht funktionieren. Ein String hat keine feste Größe, die wird aber von einem Record benötigt. Ein String kann im Worst-Case 2^31 Zeichen enthalten, das wären gute 2 GByte pro String, bei 31 * 23 * 2 GByte dürfte das doch etwas viel werden (pro Record!). Zitat:
Gruß Der Unwissende |
Re: Record und in File speichern
danke dir
das mit TAlles war nur oben ein tippfehler - aber das war nicht das problem (hatte in der zwischenablage die erste version das hab ich dann aber selber korrigiert) ich werds mal ausprobieren vielen dank nico |
Re: Record und in File speichern
die fehlermeldungen sind noch immer die gleichen ich kenn mich gar nicht mehr aus :(
Delphi-Quellcode:
Steuer = record
st_bez : string[30]; st_jahr : array [0..11] of Integer; st_vert : string[10]; st_aufk : array [0..11] of longint; end; Modell = record und_bez : string[30]; und_st : array [0..31] of Steuer; end; Alles= record Vert_ast : array [0..30] of array [0..22] of string ; vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; // mod ist ein reserviertes wort! modular - rest .. end; . . . procedure TMain.Speichern1Click(Sender: TObject); var stream : TFileStream; filename : string; begin filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen try stream.WriteBuffer (Alles, SizeOf (Alles)); finally stream.Free; // Stream wieder freigeben end; end; end. |
Re: Record und in File speichern
Hallo Nico,
eigentlich hat Der_Unwissende in Beitrag #10 alles erklärt. Die Methode ![]() Gruß Hawkeye |
Re: Record und in File speichern
ja ungefähr weiß ich jetzt wies geht das stimmt aber ich schaffs nicht das umzusetzen
Delphi-Quellcode:
Steuer = record
st_bez : string[30]; st_jahr : array [0..11] of Integer; st_vert : string[10]; st_aufk : array [0..11] of longint; end; Modell = record und_bez : string[30]; und_st : array [0..31] of Steuer; end; Alles= record Vert_ast : array [0..30] of array [0..22] of string ; vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; // mod ist ein reserviertes wort! modular - rest .. end; ich will doch nur dieses alles record speichern und laden können das dürfte doch nicht alzu kompliziert sein(ich hab vorher nie mit assign etc gearbeitet ich orientier mich da ganz an der delphihilfe) wenn das alles gespeichert und geladen werden kann hab ich das schwierigste gescahfft bei dem programm lg nico |
Re: Record und in File speichern
Ok, der von Luckie vorgeschlagene Weg über Klassen ist sicher der beste, für den Anfang aber vielleicht etwas zu steinig. Ändere zunächst die Definition von Alles wie folgt ab:
Delphi-Quellcode:
So erreichen wir, daß Delphi einen ShortString mit einer festen Länge verwendet, der direkt in einem Stream gespeichert werden kann. Nun benötigen wir noch eine Variable, welche die zu speichernden Daten aufnimmt:
Alles= record
// Vert_ast : array [0..30] of array [0..22] of string; Vert_ast : array [0..30] of array [0..22] of string[255]; // <-- hier geändert vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; end;
Delphi-Quellcode:
In dieser Variablen legst du alle zu speichernden Daten ab. Die Methode Speichern1Click muß nur an einer Stelle geändert werden:
var
AlleDaten : Alles;
Delphi-Quellcode:
Nun sollte das Speichern funktionieren. Beim Laden der Daten ist es ähnlich. Mit ReadBuffer liest du die Daten in die Variable AlleDaten ein, anschließend kannst du sie verarbeiten.
// stream.WriteBuffer (Alles, SizeOf (Alles));
stream.WriteBuffer (AlleDaten, SizeOf (AlleDaten)); // <-- hier geändert Wenn dein Programm dann funktioniert, und du die Vorgänge nachvollziehen kannst, solltest du dich mit anderen Möglichkeiten der Datenspeicherung vertraut machen (dynamische Strukturen, Klassen). Der jetzige Weg ist ziemlich unflexibel und wird spätestens bei größeren Datenmengen zu Problemen führen. Gruß Hawkeye |
Re: Record und in File speichern
ok vielen herzlichen dank
problem ist das hier wird ja nur in den zwischenspeicher geschrieben oder? die datei sollte jederzeit speicher und ladbar sein bei den daten handelt es sich um modelle zur finanzausgleichsrechnung es wird also nicht eine allzugroße menge an daten zu speichern sein müssen also zeurst nochmals danke aber mit dieser methode werde ich leider nicht allzu viel anfangen können sofern es tatsächlich nur in den zwischenspeicher "kopiert" wird lg nico |
Re: Record und in File speichern
ich werds jetzt mal über eine stringlist probieren schaun ob ich das schön hinkriege
lg nico |
Re: Record und in File speichern
Hallo Nicodius,
Zitat:
Du kannst auch mehrere Datensätze mit der Hilfe von arrays mit setLength() anlegen und speichern.
Delphi-Quellcode:
type
Vert_Ent = record vtjahr : Integer; vtproz : array [0..11] of Integer; end; Steuer = record st_bez : string[30]; st_jahr : array [0..11] of Integer; st_vert : string[10]; st_aufk : array [0..11] of longint; end; Modell = record und_bez : string[30]; und_st : array [0..31] of Steuer; end; Alles= record // Vert_ast : array [0..30] of array [0..22] of string; Vert_ast : array [0..30] of array [0..22] of string[255]; // <-- hier geändert vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; end; //schreiben procedure TForm1.Button1Click(Sender: TObject); var AlleDaten : Alles; stream : TFileStream; filename : string; begin filename := ChangeFileExt (Application.ExeName, '.ext'); stream := TFileStream.Create (filename, fmCreate); AlleDaten.mod_[2].und_bez:= 'Haus';//Beispiel try stream.WriteBuffer(AlleDaten, SizeOf (AlleDaten)); finally stream.Free; end; end; //lesen procedure TForm1.Button2Click(Sender: TObject); var AlleDaten : Alles; stream : TFileStream; filename : string; begin filename := ChangeFileExt(Application.ExeName, '.ext'); if FileExists(filename) then begin stream := TFileStream.Create (filename, fmOpenRead); try stream.ReadBuffer(AlleDaten, SizeOf (AlleDaten)); finally stream.Free; end; caption:= AlleDaten.mod_[2].und_bez;//Beispiel end; end; |
Re: Record und in File speichern
ahhh :D jetzt versteh ichs hab leider zu lange nicht mehr mit records gearbeitet
vielen dank :) lg Nico |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 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