Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi record speichern (https://www.delphipraxis.net/4123-record-speichern.html)

theomega 16. Apr 2003 09:22


record speichern
 
Hallo Leute
ich habe ein Paar types deklariert:
Delphi-Quellcode:
type TModActionWhat=(mawinsertafter,mawinsertbefore,mawreplace,mawmessage,mawnewfile);

type TModAction=record
      action: TModActionWhat;
      cstr1:string;
      cstr2:string;
      insreturn:boolean;
      datei:string;
end;

type TMod=record
modname:string;
moddesc:string;
modbemerkungen:string;
modversion:string[200];
modforversion:string;
author:string[200];
authormail:string;
authorpage:string;

actions:array of TModAction;
end;
Jetzt würde ich gerne genau ein TMod in eine Datei speichern und herausladen. Das Problem dabei ist, dass dynamische Array. Leider weiß ich nicht, wie groß es ist. Deshalb streikt Delphi auch bei
Code:
var datei: file ot TMod
Wie kann ich das Problem lösen?

Danke
TO

rossmann 16. Apr 2003 09:46

type
TMod = record
modname : string;
moddesc : string;
modbemerkungen : string;
modversion : string[200];
modforversion : string;
author : string[200];
authormail : string;
authorpage : string;
end;

TModAction = record
cstr1 : string;
cstr2 : string;
insreturn : boolean;
datei : string;
end;



TForm1 = class(TForm)
Button1 : TButton;
procedure Button1Click(Sender : TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
Hi Theomega

vieleicht so !


var
Form1 : TForm1;
actions : array of TModAction;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender : TObject);
var s : TMemoryStream;
x : integer;
begin
x := Length(actions);
s := TMemoryStream.Create;
s.WriteBuffer(Actions, x);
s.SaveToFile('c:\action.rec');
end;

roderich 16. Apr 2003 09:56

a) actions beschränken auf feste Größe
Aber dann ist das Array nicht mehr dynamisch, und außerdem verschenkst Du bei wenigen actions viel Speicherplatz

b) 2 Dateien, eine für die TMod's, eine für die actions, mit Referenz aus der ersten Datei in die zweite.
Aber das ist eine Fummelei, und fehleranfällig

c) Abspeichern in eine DB

d) Abspeichern im INI-File-Format. Dann kannst Du einfach eine ganze section einlesen bzw. schreiben mit den actions, die zu einem TMod gehören.

Gruß
Roderich

theomega 16. Apr 2003 09:56

Und wie lade ich? Die Größe ist mir dann ja nicht bekannt!

mirage228 16. Apr 2003 10:07

du könntest in einer extra section in der ini die länge abspeichern.

rossmann 16. Apr 2003 10:19

[B]
Ich denke so wird es gehen lesen und schreiben :-)


[delphi]
type
TMod = record
modname : string;
moddesc : string;
modbemerkungen : string;
modversion : string[200];
modforversion : string;
author : string[200];
authormail : string;
authorpage : string;
end;

TModAction = record
cstr1 : string;
cstr2 : string;
insreturn : boolean;
datei : string;
end;



TForm1 = class(TForm)
Button1 : TButton;
Button2: TButton;
procedure Button1Click(Sender : TObject);
procedure Button2Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1 : TForm1;
actions : array of TModAction;

implementation

{$R *.dfm}
////////////////////
///// SCHREIBEN
////////////////////
procedure TForm1.Button1Click(Sender : TObject);
var s : TFileStream;
x : integer;
begin
x := Sizeof(actions);
s := TFileStream.Create('c:\test.rec',fmCreate);
try
s.WriteBuffer(Actions, x);
finally
s.Free;
end;
end;

////////////////////
///// LESEN
////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var s : TFileStream;
x : integer;
begin
s := TFileStream.Create('c:\test.rec',fmOpenRead);
try
x := s.Size;
s.ReadBuffer(Actions, x);
finally
s.Free;
end;
end;

theomega 16. Apr 2003 10:22

Das geht leider nicht. Die Datei nacher ist nur 4 Bytes groß und sie enthält keinen der Strings. Das Array enthält auf jeden Fall Werte, daran liegt es also nicht!

rossmann 16. Apr 2003 10:33

Tschuldigung die größe in WriteBuffer ist ein Int64 Type



Delphi-Quellcode:
procedure TForm1.Button1Click(Sender : TObject);
var s : TFileStream;
   x : Int64;
begin
   SetLength(actions, 20);
   actions[0].cstr1 := Edit1.Text;
   x := Sizeof(actions);
   s := TFileStream.Create('c:\test.rec', fmCreate);
   try
      s.WriteBuffer(Actions, x);
   finally
      s.Free;
   end;
end;

procedure TForm1.Button2Click(Sender : TObject);
var s : TFileStream;
   x : Int64;
begin
   s := TFileStream.Create('c:\test.rec', fmOpenRead);
   try
      x := s.Size;
      s.ReadBuffer(Actions, x);
   finally
      s.Free;
   end;
   Edit1.Text := actions[0].cstr1;
end;

theomega 16. Apr 2003 10:43

ich habe diesen code hier genommen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
f: TFileStream;

begin

f := TFileStream.Create('C:\mod.mod',fmCreate);

moder.modname := 'xxx';
moder.moddesc := 'xxx';
moder.modbemerkungen := '-';
moder.modversion := '1';
moder.modforversion := '2.81';
moder.author := 'xxx';
moder.authormail := 'xxx';
moder.authorpage := 'http://www.thewiggle.org/';


moderaction[0].action := mawinsertbefore;
moderaction[0].cstr1 := 'TEXT01';
moderaction[0].cstr2 := 'TEXT02';
moderaction[0].insreturn := true;
moderaction[0].datei := 'templates/default/frame.html';

moderaction[1].action := mawinsertafter;
moderaction[1].cstr1 := 'TEXT12';

showmessage(inttostr(sizeof(moderaction)));

//f.Write(moder,sizeof(TMod));
f.WriteBuffer(moderaction,sizeof(moderaction));


f.Free;

end;
Und hier sieht man schon. Das showmessage gibt 4 aus. Das Array soll also nur 4 bytes groß sein.

rossmann 16. Apr 2003 10:53

Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe dir mein Testprogramm in ein Zip angehangen
damit funktioniert es .


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr.
Seite 1 von 2  1 2      

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