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

想保存类,如何实现

2012-02-11 
想保存类,怎么实现?下面是我要保存的类的代码:unitStrmExmpl{$R-,T-,H+,X+}interfaceusesClassestypeTCo

想保存类,怎么实现?
下面是我要保存的类的代码:
unit   StrmExmpl;
{$R-,T-,H+,X+}
interface

uses   Classes;

type
    TContainedClass   =   class(TPersistent)
    private
        FSomeData:   Integer;
        procedure   SetSomeData(Value:   Integer);
    public
        constructor   Create();   //override;
        //   Only   published   properties
        //   are   automatically   streamed.
    published
        property   SomeData:   Integer   read   FSomeData   write   SetSomeData;        
    end;

   
    TStreamableClass   =   class(TComponent)
    private
        FContainedClass   :   array   [0..1]   of   TContainedClass;
        FSValue   :   integer;                                                 //--
        FSIndex   :   integer;
        procedure   SetSValue(Value   :   integer);
        public
            constructor   Create(AOwner:   TComponent);   override;
            destructor   Destroy;   override;
            //   Only   published   properties
            //   are   automatically   streamed.
            function   GetValue()   :   integer;
        published
            //property   ContainedClass:   TContainedClass   read   FContainedClass   write   FContainedClass;
            property   SValue   :   integer   read   FSValue   write   SetSValue;
            property   SIndex   :   integer   read   FSIndex   write   FSIndex;
    end;

implementation

procedure   TContainedClass.SetSomeData(Value:   Integer);
begin
{   Place   a   breakpoint   here   and   notice   how   the   data   is   streamed   back.   }
    FSomeData   :=   Value;
end;

constructor   TContainedClass.Create;
begin
    FSomeData   :=   42;
end;
constructor   TStreamableClass.Create(AOwner:   TComponent);
begin
    inherited   Create(AOwner);
    FContainedClass[0]   :=   TContainedClass.Create;    
    FContainedClass[1]   :=   TContainedClass.Create;
end;
destructor   TStreamableClass.Destroy;
begin
    FContainedClass[0].Free;
    FContainedClass[1].Free;
end;
procedure   TStreamableClass.SetSValue(Value   :   integer);
begin
    if   FSValue   <>   Value   then
    begin
        FSValue   :=   Value;


        FContainedClass[FSIndex].SomeData   :=   Value;
    end;
end;
function   TStreamableClass.GetValue()   :   integer;
begin
    Result   :=   FContainedClass[FSIndex].SomeData;
end;
initialization
    RegisterClasses([TContainedClass,   TStreamableClass]);
finalization

end.


下面是我自己为了保存一个类的实例的属性,   用的两中方法:
procedure   TForm1.Button1Click(Sender:   TObject);
var
    AClassInstance:   TStreamableClass;
begin
    AClassInstance   :=   TStreamableClass.Create(nil);
    //AClassInstance.ContainedClass.SomeData   :=   55;
    AClassInstance.SIndex   :=   0;
    AClassInstance.SValue   :=   55;
    AClassInstance.SIndex   :=   1;
    AClassInstance.SValue   :=   555;
    WriteComponentResFile( 'C:\Test ',   AClassInstance);
    FreeAndNil(AClassInstance);

    AClassInstance   :=   ReadComponentResFile( 'C:\Test ',   nil)   as   TStreamableClass;
    //ShowMessage(IntToStr(AClassInstance.ContainedClass.SomeData));
    AClassInstance.SIndex   :=   0;
    ShowMessage(IntToStr(AClassInstance.GetValue));
    AClassInstance.SIndex   :=   1;
    ShowMessage(IntToStr(AClassInstance.GetValue));
    FreeAndNil(AClassInstance);
end;

procedure   TForm1.Button2Click(Sender:   TObject);
var  
    Str1   :   TFileStream;          
    AClassInstance:   TStreamableClass;
begin
    //写入文件
    Str1   :=   TFileStream.Create( 'c:\aaaa ',fmOpenWrite   or   fmCreate);
    try
        AClassInstance   :=   TStreamableClass.Create(nil);
        AClassInstance.SIndex   :=   0;
        AClassInstance.SValue   :=   55;
        AClassInstance.SIndex   :=   1;
        AClassInstance.SValue   :=   555;
        //Str1.WriteComponentRes   (AClassInstance.ClassName,   AClassInstance);//save   the   entire   component
        Str1.WriteComponent(AClassInstance);
        FreeAndNil(AClassInstance);
    finally
        Str1.Free;
    end;
    //读出文件内容        
    Str1   :=   TFileStream.Create( 'c:\aaaa ',fmOpenRead);
    try                                                                                        
        AClassInstance   :=   TStreamableClass.Create(nil);
        //Str1.ReadComponentRes(AClassInstance);
        Str1.ReadComponent(AClassInstance);
        AClassInstance.SIndex   :=   0;
        ShowMessage(IntToStr(AClassInstance.GetValue));
        AClassInstance.SIndex   :=   1;


        ShowMessage(IntToStr(AClassInstance.GetValue));
        FreeAndNil(AClassInstance);                  
    finally
        Str1.Free;
    end;    
end;

大家都看到了,类中两个TContainedClass,第一个的SomeData属性是55,第二个是555。

可是我保存后再读出来的时候,ShowMessage显示的第一个是555,第二个是42。也就等于我的方法失败了!

请教各位大虾,这样的问题如何解决???
(先说明,我不想用ini文件、注册表等介质)

这里谢谢了先!!!

[解决办法]
保存类??? 类是什么你知道吗??只是一个抽象概念,怎么保存?? 保存代码就是保存类
保存对象??? 用objectlist,把你创建的对象一个一个加进去(像stinglist那样)
[解决办法]
写个控件吧
[解决办法]
暂时先路过
[解决办法]
保存类的实例的属性你可以使用Xml文件或使用SQL数据库保存啊!
[解决办法]
楼主还是想保存成一个文件啊。保存成的文件加密不就行了。

热点排行