我自己编写了一个类:TMicroscopeCtrl,测试这个类的时候,我在form的这个地方定义了一个实例
private
{ Private declarations }
mc : TMicroscopeCtrl;
在form的create和Destroy事件中的代码如下:procedure TfrmMain.FormCreate(Sender: TObject);
var
fp : integer;
begin
if FileExists('ControlMic.dat') then
begin
fp := FileOpen('ControlMic.dat',fmOpenRead);
if fp >= 0 then
begin
FileRead(fp,mc,sizeof(TMicroscopeCtrl));
FileClose(fp);
end;
end
else
begin
mc := TMicroscopeCtrl.Create(Self);
end;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
var
fp : integer;
begin
fp := FileCreate('ControlMic.dat');
if fp >= 0 then
begin
FileWrite(fp,mc,SizeOf(TMicroscopeCtrl));
FileClose(fp);
end;
end;
这样做的目的是因为这个类的属性值我想保存下来。
不知道我这样写有没有什么问题?现在出现这样的问题:
我的类中有包含一个私有的串口控件(也就是SPCOMM),第一次运行这个程序,肯定没有问题。但是当保存成文件再一次运行的时候,就会出现stack overflow的错误。我单步调试看过, mc中的串口控件是nil或者是1,根本不是我保存时候看到那个值,而且mc的其他属性值,也不是我保存之前给mc设置的那些值,真搞不懂,怎么没有存上呢?还是我读写的时候出现了错误?
使用这个方式,我是参照了一个bcb中的写法,我仔细查看了,没什么太大的差别,但是bcb中的就好用。我不想把这些属性值写到什么ini文件啊,或者注册表之类的地方,所以想试试这个办法,怎么也搞不通,郁闷!
private
{ Private declarations }
mc : TMicroscopeCtrl;
在form的create和Destroy事件中的代码如下:procedure TfrmMain.FormCreate(Sender: TObject);
var
fp : integer;
begin
if FileExists('ControlMic.dat') then
begin
fp := FileOpen('ControlMic.dat',fmOpenRead);
if fp >= 0 then
begin
FileRead(fp,mc,sizeof(TMicroscopeCtrl));
FileClose(fp);
end;
end
else
begin
mc := TMicroscopeCtrl.Create(Self);
end;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
var
fp : integer;
begin
fp := FileCreate('ControlMic.dat');
if fp >= 0 then
begin
FileWrite(fp,mc,SizeOf(TMicroscopeCtrl));
FileClose(fp);
end;
end;
这样做的目的是因为这个类的属性值我想保存下来。
不知道我这样写有没有什么问题?现在出现这样的问题:
我的类中有包含一个私有的串口控件(也就是SPCOMM),第一次运行这个程序,肯定没有问题。但是当保存成文件再一次运行的时候,就会出现stack overflow的错误。我单步调试看过, mc中的串口控件是nil或者是1,根本不是我保存时候看到那个值,而且mc的其他属性值,也不是我保存之前给mc设置的那些值,真搞不懂,怎么没有存上呢?还是我读写的时候出现了错误?
使用这个方式,我是参照了一个bcb中的写法,我仔细查看了,没什么太大的差别,但是bcb中的就好用。我不想把这些属性值写到什么ini文件啊,或者注册表之类的地方,所以想试试这个办法,怎么也搞不通,郁闷!
我试一下楼上说的!
这个成了返回类类型变量的尺寸了,而不是类对象的尺寸。SizOf 对简单类型是可以的,对类是无效的。另外,保存类属性值不是你想的那么简单。