![]() |
record speichern
Hallo Leute
ich habe ein Paar types deklariert:
Delphi-Quellcode:
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
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;
Code:
Wie kann ich das Problem lösen?
var datei: file ot TMod
Danke TO |
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; |
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 |
Und wie lade ich? Die Größe ist mir dann ja nicht bekannt!
|
du könntest in einer extra section in der ini die länge abspeichern.
|
[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; |
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!
|
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; |
ich habe diesen code hier genommen:
Delphi-Quellcode:
Und hier sieht man schon. Das showmessage gibt 4 aus. Das Array soll also nur 4 bytes groß sein.
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; |
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 03:45 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