Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable Records speichern (https://www.delphipraxis.net/127560-variable-records-speichern.html)

Blackheart 15. Jan 2009 13:43


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.

sofl 15. Jan 2009 14:41

Re: Variable Records speichern
 
Speichern

Delphi-Quellcode:
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;
Laden

Delphi-Quellcode:
FileMode := fmOpenRead;
Reset(meinedatei);
 
while not Eof(meinedatei) do
   begin
     Read(meinedatei, Archiv);
     ShowMessage(Archiv.Album+' '+Archiv.Band+' '+Archiv.Songs);
   end;
CloseFile(meinedatei);
Habs nich getestet aber so müsstes funzen.

Zusätzlich kannst du dir ja das mal anschauen

mfg sofl

Neutral General 15. Jan 2009 14:48

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:
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;
Sollte so funktionieren

Edit: Code korrigiert

taaktaak 15. Jan 2009 14:51

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!

QuickAndDirty 15. Jan 2009 15:33

Re: Variable Records speichern
 
Warum Records? Warum nicht, Objekte? Die könnten sich dann jeweils selbst serialisieren.

Blackheart 15. Jan 2009 15:39

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

taaktaak 15. Jan 2009 17:01

Re: Variable Records speichern
 
Also "gehen" tut es schon
- ob es sinnvoll ist, ist 'ne andere Frage
:zwinker:

Hawkeye219 15. Jan 2009 19:10

Re: Variable Records speichern
 
Hallo,

Zitat:

Zitat von Neutral General
Sollte so funktionieren

Das fehlende "fs." bei der Save-Routine ist sicher nur ein Flüchtigkeitsfehler.
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

himitsu 16. Jan 2009 07:36

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:
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;
lesen dann so:
Delphi-Quellcode:
fs.Read(l, SizeOf(Integer));
SetLength(x.Album, l);
if l > 0 then fs.Read(x.Album[1], l);
man könnte zwar auch mit Pointern rumjonglieren, aber empfehlen würde ich den Meisten dann doch die variante mit dem IF.
Delphi-Quellcode:
l := Length(x.Album);
fs.Write(l, SizeOf(Integer));
fs.Write(PChar(x.Album)^, l);
wer ist eigentlich auf die blöde Idee gekommen die Read/Write-Funktionen nur per Var-Parameter zu basteln :evil:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.

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