下面是我要保存的类的代码:
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文件、注册表等介质)这里谢谢了先!!!
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文件、注册表等介质)这里谢谢了先!!!
解决方案 »
- RemObjects动态创建控件的问题
- delphi中使用xmlhttp的问题。
- 极度郁闷中... 求教:三层COM+(没用Midas)中,为什么我在Initialize中初始化的变量,在同一对象中,访问不了?
- 谁能介绍一本用DELPHI开发组件的好书,分不够再加
- 我这样将图片存入数据库为什么错?
- 在delphi中的DBGrid中怎样得到某一行的一个字段的值?
- 在写一份英文简历,每个项目下面都要些段很长的项目描述Description,共写八个项目,应该每个描述都不同才好,但不知道该怎么写这种描述
- 请问如何检测到ListView的Column宽度改变?
- dbgrid内有5个lookup字段,如果要添加新纪录,应如何操作及写sql语句?
- 怎麼樣去掉MDIchildform左上角的系統菜單,右上角的最大/小化按鈕??
- 我问大家一个菜鸟问题,是关于串口读写的。
- 又一问题(我怎么又说又了呢):获取一个程序的句柄后想得到窗体里所有输入输出的组件输入输出的文本内容,应该怎么做最方便?
保存对象??? 用objectlist,把你创建的对象一个一个加进去(像stinglist那样)
相信你也看出来了,我就想保存这个类的实例的属性。还请指教!!!
因为如果我保存到ini文件或者注册表文件,很容易被别人看到和修改,所以想到直接保存成一个文件。还请多帮忙!!!
to boruo3000(),也是一个方法,我也早想到了,不过不是嫌麻烦吗!!!也给你5分!!每次都是自己搞定,哎!!!多写了4行代码就解决了,用你们说的方法,我要写多少行代码阿!!!