AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variable Records speichern

Ein Thema von Blackheart · begonnen am 15. Jan 2009 · letzter Beitrag vom 16. Jan 2009
Antwort Antwort
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#1

Variable Records speichern

  Alt 15. Jan 2009, 13:43
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.
Blackheart
  Mit Zitat antworten Zitat
Benutzerbild von sofl
sofl

Registriert seit: 19. Okt 2005
Ort: Dresden
16 Beiträge
 
Delphi 2006 Architect
 
#2

Re: Variable Records speichern

  Alt 15. Jan 2009, 14:41
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Variable Records speichern

  Alt 15. Jan 2009, 14:48
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#4

Re: Variable Records speichern

  Alt 15. Jan 2009, 14:51
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!
Ralph
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#5

Re: Variable Records speichern

  Alt 15. Jan 2009, 15:33
Warum Records? Warum nicht, Objekte? Die könnten sich dann jeweils selbst serialisieren.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Variable Records speichern

  Alt 15. Jan 2009, 15:39
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
Blackheart
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: Variable Records speichern

  Alt 15. Jan 2009, 17:01
Also "gehen" tut es schon
- ob es sinnvoll ist, ist 'ne andere Frage
Ralph
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Variable Records speichern

  Alt 15. Jan 2009, 19:10
Hallo,

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#9

Re: Variable Records speichern

  Alt 16. Jan 2009, 07:36
jupp, dann kracht es.
aber ich glaub ich bin zu blind ... wo fehlt fa ein fs. ? nja, vieleicht wurde es auch schon korrigiert
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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