我自定义了一个类: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,不行,程序运行没问题,但是得不到上次退出时保存的数组的值。

解决方案 »

  1.   

    我估计也不行,但是不知道如何解决!另外,bw肯定也保存在内存中某个位置,占用一定的内存。我能不能直接吧这些内存上的值读出来保存到一个文件中。然后启动时复制到新创建的bw所占用的内存上呢?如果可以,该如何操作呢?
      

  2.   

    对象类型继承自TComponent
    用TReader.ReadComponent和TWriter.WriteComponent读写
      

  3.   

    去看一下《inside vcl》的第8章,VCL的持久化机制
      

  4.   

    ReadComponentResFile / WriteComponentResFile
      

  5.   

    sdzeng(大头鸟)说的: TReader.ReadComponent和TWriter.WriteComponent
      

  6.   

    WriteComponent也不可以,我实验过了。我的组件中有个私有的数组,当我在运行期修改了数组(我用别的方法修改)后,用WriteComponent只能保存最后依次修改的数值。也就是说比如我的数组a,保存前a[0] = 1000,a[1] = 200,a[2] = 5000,a[2]是我最后修改的。那么用WriteComponent保存后,再用TReader.ReadComponent往出读的时候,就只有a[2] = 5000,a[0]和a[1]都是0。
      

  7.   

    WriteComponent 是操作属性来的
    你要自己写保存 处理
      

  8.   

    如果 只是 保存 数组 不用类 更方便。
    unit Unit1;interfaceuses
      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));
      ms.Write(rec_list[0], i * sizeof(rec));
      ms.SaveToFile('c:\1.dat');
      FreeAndNil(ms);
      //保存  SetLength(rec_list, 0);  ms := TMemoryStream.Create;
      ms.LoadFromFile('c:\1.dat');
      ms.Position := 0;
      ms.Read(i, sizeof(i));
      SetLength(rec_list, i);
      ms.Read(rec_list[0], i * sizeof(rec));
      FreeAndNil(ms);
      //读取  SetLength(rec_list, 0);
    end;end.
      

  9.   


    给个连接
    Create your own Database using Delphi's "File Of" Typed Files
    http://delphi.about.com/od/fileio/a/fileof_delphi.htm