读书人

想保存类如何实现

发布时间: 2012-02-11 09:51:34 作者: rapoo

想保存类,怎么实现?
下面是我要保存的类的代码:
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数据库保存啊!
[解决办法]
楼主还是想保存成一个文件啊。保存成的文件加密不就行了。

读书人网 >.NET

热点推荐