下面是我要保存的类的代码:
unit StrmExmpl;
{$R-,T-,H+,X+}
interfaceuses 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;implementationprocedure 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]);
finalizationend.
下面是我自己为了保存一个类的实例的属性, 用的两中方法:
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文件、注册表等介质)这里谢谢了先!!!

解决方案 »

  1.   

    保存类??? 类是什么你知道吗??只是一个抽象概念,怎么保存?? 保存代码就是保存类    
    保存对象??? 用objectlist,把你创建的对象一个一个加进去(像stinglist那样)
      

  2.   

    to dabaicai(烈士暮年) ,用词错误,不好意思。
    相信你也看出来了,我就想保存这个类的实例的属性。还请指教!!!
      

  3.   

    那就要看你所说的保存是到什么时候了,像我上面说的,如果在一个工程里面用的话,objectlist就可以
      

  4.   

    就这么说,我这个实例的属性设置好以后,每次程序启动,都还原成设置好的那次属性值。
    因为如果我保存到ini文件或者注册表文件,很容易被别人看到和修改,所以想到直接保存成一个文件。还请多帮忙!!!
      

  5.   

    保存类的实例的属性你可以使用Xml文件或使用SQL数据库保存啊!
      

  6.   

    全是废话,不过废话也给你们分,呵呵!!!to suiyunonghen(碎羽),要想用数据库,我干吗还到这里问阿!!!给你5分!!!
    to boruo3000(),也是一个方法,我也早想到了,不过不是嫌麻烦吗!!!也给你5分!!每次都是自己搞定,哎!!!多写了4行代码就解决了,用你们说的方法,我要写多少行代码阿!!!