首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

文件的读写有关问题,针对对象的读写

2012-03-19 
文件的读写问题,针对对象的读写!我自定义了一个类:TBWSample(这个类中只有几个整形的数组,bool型数组和TCo

文件的读写问题,针对对象的读写!
我自定义了一个类: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));


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.


[解决办法]

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

热点排行