![]() |
Variable Records speichern
Hallo Leute
Ich würde gerne variable Records speichern und hab das jetzt so versucht, bin ich da auf dem richtigen weg oder geht das so nicht. Die Strings hab ich dann in der Variable aber wie kann ich sie nun in einer Datei speichern bzw. wieder aufrufen.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TCDArchiv = record Album, Titel, Songs:String; end; type TForm1 = class(TForm) Edit_Band: TEdit; Edit_Titel: TEdit; Button1: TButton; Memo_Titel: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Archiv:TCDArchiv; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Archiv.Album:=Edit_Band.Text; Archiv.Titel:=Edit_Titel.Text; Archiv.Songs:=Memo_Songs.Text; end; end. |
Re: Variable Records speichern
Speichern
Delphi-Quellcode:
Laden
procedure TForm1.Button1Click(Sender: TObject);
var meinedatei: File of TCDArchiv; begin AssignFile(meinedatei, 'test.dat'); ReWrite(meinedatei); Archiv.Album:=Edit_Band.Text; Archiv.Titel:=Edit_Titel.Text; Archiv.Songs:=Memo_Songs.Text; Write(meinedatei,Archiv); CloseFile(meinedatei); end;
Delphi-Quellcode:
Habs nich getestet aber so müsstes funzen.
FileMode := fmOpenRead;
Reset(meinedatei); while not Eof(meinedatei) do begin Read(meinedatei, Archiv); ShowMessage(Archiv.Album+' '+Archiv.Band+' '+Archiv.Songs); end; CloseFile(meinedatei); Zusätzlich kannst du dir ja ![]() mfg sofl |
Re: Variable Records speichern
Das wird so nicht funktionieren. Es werden nur die Pointer auf die Stringdaten in der Datei gespeichert, wovon man nichts hat.
Ich würds mit nem FileStream machen:
Delphi-Quellcode:
Sollte so funktionieren
type
TCDArchiv = record Album, Titel, Songs:String; interface procedure Save(x: TCDArchiv; Filename: String); var fs: TFileStream; l: Integer; begin fs := TFilestream.Create(Filename,fmCreate); try l := Length(x.Album); fs.Write(l,SizeOf(Integer)); fs.Write(x.Album[1],l); l := Length(x.Titel); fs.Write(l,SizeOf(Integer)); fs.Write(x.Titel[1],l); l := Length(x.Songs); fs.Write(l,SizeOf(Integer)); fs.Write(x.Songs[1],l); finally fs.Free; end; end; function Load(Filename: String): TCDArchiv; var fs: TFileStream; l: Integer; begin fs := TFilestream.Create(Filename,fmOpenRead); try fs.Read(l,SizeOf(Integer); SetLength(Result.Album,l); fs.Read(Result.Album[1],l); fs.Read(l,SizeOf(Integer); SetLength(Result.Titel,l); fs.Read(Result.Titel[1],l); fs.Read(l,SizeOf(Integer); SetLength(Result.Songs,l); fs.Read(Result.Songs[1],l); finally fs.Free; end; end; Edit: Code korrigiert |
Re: Variable Records speichern
Na, auf das Ergebnis bin ich ja mal gespannt
:? // zu spät, Damit wird natürlich nur ein Record gespeichert. Um das Array zu speichern, sind Erweiterungen notwendig! |
Re: Variable Records speichern
Warum Records? Warum nicht, Objekte? Die könnten sich dann jeweils selbst serialisieren.
|
Re: Variable Records speichern
Danke für die Antworten !
Hab mich nochmal im Net schlau gemacht und hab rausgefunden das, das so mit den Records ohne feste Länge nicht funktioniert. Schade Vielen Dank nochmal |
Re: Variable Records speichern
Also "gehen" tut es schon
- ob es sinnvoll ist, ist 'ne andere Frage :zwinker: |
Re: Variable Records speichern
Hallo,
Zitat:
Was ist aber, wenn ein String leer ist und jemand den Code mit eingeschalteter Bereichsüberprüfung übersetzt? Und wie sieht das Ergebnis ab Delphi 2009 aus? Gruß Hawkeye |
Re: Variable Records speichern
jupp, dann kracht es.
aber ich glaub ich bin zu blind ... wo fehlt fa ein fs. ? nja, vieleicht wurde es auch schon korrigiert :stupid:
Delphi-Quellcode:
lesen dann so:
procedure Save(x: TCDArchiv; Filename: String);
var fs: TFileStream; l: Integer; begin fs := TFilestream.Create(Filename, fmCreate); try l := Length(x.Album); fs.Write(l, SizeOf(Integer)); if l > 0 then fs.Write(x.Album[1], l); l := Length(x.Titel); fs.Write(l, SizeOf(Integer)); if l > 0 then fs.Write(x.Titel[1], l); l := Length(x.Songs); fs.Write(l, SizeOf(Integer)); if l > 0 then fs.Write(x.Songs[1], l); finally fs.Free; end; end;
Delphi-Quellcode:
man könnte zwar auch mit Pointern rumjonglieren, aber empfehlen würde ich den Meisten dann doch die variante mit dem IF.
fs.Read(l, SizeOf(Integer));
SetLength(x.Album, l); if l > 0 then fs.Read(x.Album[1], l);
Delphi-Quellcode:
wer ist eigentlich auf die blöde Idee gekommen die Read/Write-Funktionen nur per Var-Parameter zu basteln :evil:
l := Length(x.Album);
fs.Write(l, SizeOf(Integer)); fs.Write(PChar(x.Album)^, l); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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