文件的读写有关问题,针对对象的读写
文件的读写问题,针对对象的读写!
我自定义了一个类:TBWSample(这个类中只有几个整形的数组,bool型数组和TColor数组)
在测试程序中,我有写入和读取这个类的代码如下:
procedure TfrmMain.FormCreate(Sender: TObject);
var
fp : integer;
begin
bw := TBWSample.Create(Self);
if FileExists( 'BWSample ') then
begin
fp := FileOpen( 'BWSample ',0);
if fp > 0 then
begin
FileRead(fp,bw,bw.InstanceSize);
FileClose(fp);
end;
end
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
var
fp : integer;
begin
fp := FileCreate( 'BWSample ');
if fp > 0 then
begin
FileWrite(fp,bw,bw.InstanceSize);
FileClose(fp);
end;
end;
第一次运行肯定是没问题了,但是从第二次开始,我单步调试过,启动时执行fileread后,bw中的数组的值和上次保存的值完全一样,但是窗体执行完creat事件
后就总提示读写内存错误,然后就关闭,不能正常运行。
对于对象的读写,我搞不明白,请大家指教。
我试过用WriteComponentResFile和ReadComponentResFile,不行,程序运行没问题,但是得不到上次退出时保存的数组的值。
------解决方案--------------------
这样直接将对象实例写到文件里恐怕不行,
------解决方案--------------------
对象类型继承自TComponent
用TReader.ReadComponent和TWriter.WriteComponent读写
------解决方案--------------------
去看一下《inside vcl》的第8章,VCL的持久化机制
------解决方案--------------------
ReadComponentResFile / WriteComponentResFile
------解决方案--------------------
sdzeng(大头鸟)说的:
TReader.ReadComponent和TWriter.WriteComponent
------解决方案--------------------
WriteComponent 是操作属性来的
你要自己写保存 处理
------解决方案--------------------
如果 只是 保存 数组 不用类 更方便。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
myrec = record
i: integer;
b: Boolean;
c: TColor;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
rec_list: array of myrec;
i: integer;
ms: TMemoryStream;
rec: myrec;
begin
SetLength(rec_list, 100);
for i := 0 to high(rec_list) do
begin
rec_list[i].i := i;
rec_list[i].b := i mod 2 = 0;
rec_list[i].c := clRed;
end;
// 测试 数据
ms := TMemoryStream.Create;
i := length(rec_list);
ms.Write(i, sizeof(i));
我自定义了一个类:TBWSample(这个类中只有几个整形的数组,bool型数组和TColor数组)
在测试程序中,我有写入和读取这个类的代码如下:
procedure TfrmMain.FormCreate(Sender: TObject);
var
fp : integer;
begin
bw := TBWSample.Create(Self);
if FileExists( 'BWSample ') then
begin
fp := FileOpen( 'BWSample ',0);
if fp > 0 then
begin
FileRead(fp,bw,bw.InstanceSize);
FileClose(fp);
end;
end
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
var
fp : integer;
begin
fp := FileCreate( 'BWSample ');
if fp > 0 then
begin
FileWrite(fp,bw,bw.InstanceSize);
FileClose(fp);
end;
end;
第一次运行肯定是没问题了,但是从第二次开始,我单步调试过,启动时执行fileread后,bw中的数组的值和上次保存的值完全一样,但是窗体执行完creat事件
后就总提示读写内存错误,然后就关闭,不能正常运行。
对于对象的读写,我搞不明白,请大家指教。
我试过用WriteComponentResFile和ReadComponentResFile,不行,程序运行没问题,但是得不到上次退出时保存的数组的值。
------解决方案--------------------
这样直接将对象实例写到文件里恐怕不行,
------解决方案--------------------
对象类型继承自TComponent
用TReader.ReadComponent和TWriter.WriteComponent读写
------解决方案--------------------
去看一下《inside vcl》的第8章,VCL的持久化机制
------解决方案--------------------
ReadComponentResFile / WriteComponentResFile
------解决方案--------------------
sdzeng(大头鸟)说的:
TReader.ReadComponent和TWriter.WriteComponent
------解决方案--------------------
WriteComponent 是操作属性来的
你要自己写保存 处理
------解决方案--------------------
如果 只是 保存 数组 不用类 更方便。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
myrec = record
i: integer;
b: Boolean;
c: TColor;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
rec_list: array of myrec;
i: integer;
ms: TMemoryStream;
rec: myrec;
begin
SetLength(rec_list, 100);
for i := 0 to high(rec_list) do
begin
rec_list[i].i := i;
rec_list[i].b := i mod 2 = 0;
rec_list[i].c := clRed;
end;
// 测试 数据
ms := TMemoryStream.Create;
i := length(rec_list);
ms.Write(i, sizeof(i));