王中王:
有方便的方法把一个TPanel对象进行Serialize嘛?包括Panel上的子对象
[阅读: 761] 2005-01-23 12:42:17
TStream.WriteComponent只保存了对象自己本身,没有包括子对象。
我的目的是:在一个Panel上对一些控件做操作,然后把当着状态保存到文件中,事后可以再Load进来。
我尝试判断对象如果是WinControl的话,对子控件递归进行该保存操作(读的时候也是),代码如下:
procedure Save(AObject: TComponent; AStream: TStream);
var
lControl: TWinControl;
I: Integer;
begin
AStream.WriteComponent(AObject);
if (AObject is TWinControl) and ((AObject as TWinControl).ControlCount > 0) then
begin
lControl := AObject as TWinControl;
for I := 0 to lControl.ControlCount - 1 do
begin
// AStream.WriteComponent(lControl.Controls[I]);
Save(lControl.Controls[I], AStream);
end;
end;
end;
procedure Load(AObject: TComponent; AStream: TStream);
var
lControl: TWinControl;
I: Integer;
begin
AStream.ReadComponent(AObject);
if (AObject is TWinControl) and ((AObject as TWinControl).ControlCount > 0) then
begin
lControl := AObject as TWinControl;
for I := 0 to lControl.ControlCount - 1 do
begin
// AStream.ReadComponent(lControl.Controls[I]);
Load(lControl.Controls[I], AStream);
end;
end;
end;
结果发现有两个问题:
1、Load的时候,加载一些第三方控件会报告“类××××没找到”错误,通过在程序补始化时RegisteClass解决了(很奇怪,程序自己加载Form资源都没有问题,为什么我这里ReadComponent会出错呢?)
2、加载一些属性结构复杂一些的第三方控件时会报告“属性XXXX没找到”错误。
是因为一些控件在进行Write和Read的时候,自己重载了一些行为,不能通过Stream的方法进行恢复嘛?
怎么做才能象Form那样自由的保存状态和加载状态呢?
http://wangzw.wordpress.com/
个性化台历、日历制作
http://shop33697570.taobao.com/
