我自己编写了一个类: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文件啊,或者注册表之类的地方,所以想试试这个办法,怎么也搞不通,郁闷!

解决方案 »

  1.   

    看起来保存的只是指针。只有4个字节。试试 WriteComponentResFile / ReadComponentResFile
      

  2.   

    我刚刚发现了一个问题,和楼上说的类似,我发现SizeOf(TMicroscopeCtrl) = 4?????
    我试一下楼上说的!
      

  3.   

    SizeOf(TMicroscopeCtrl); 这个不对。
    这个成了返回类类型变量的尺寸了,而不是类对象的尺寸。SizOf 对简单类型是可以的,对类是无效的。另外,保存类属性值不是你想的那么简单。