关于保存自定义的对象的方法(100分)

J

Jao

Unregistered / Unconfirmed
GUEST, unregistred user!
; 我的程序会在运行期间会在Form上产生许多自定义的对象(和一般的控件如Button等很象,只是会有各种不同的属性),现在我想把它们连同Form一起保存下来,以便下一次打开时能够恢复到和当前状态一样。
我查过,似乎TStream类能够完成类似功能,可是我找不到使用它的方法,不知各位能否指点一下。如有更好的解决方案,请您一定不吝赐教,非常感谢!
 
建议看一下本论坛"Object Pascal"分类中的已答问题 "关于控件的流控制".
 
或者下载 <a href="/delphi/attachments/handel.zip">这个Delphi by Delphi</a>(带源码)
 
多谢yysun,如果那个问题的答案能行,分数能不能分我一点呀?
另外Handel在不断更新,你的这个是不是过时了呢?现在版本是
0.6,而且只有源码,下载时可以节省时间.

补充说明:控件的存储用我关于那个问题的答案是可以的,但如果是
form之类的VCL控件,存储前必须将所有Event Handler清除.
因此想要彻底"恢复原状"恐怕困难很大.
 
请教为什么要“必须将所有Event Handler清除”呢?
下次读入,控件不都没有反映了?

Form 我现在这样存:
Stream.WriteComponentRes(Form1.Name, Form1);
这样读:
for I := Form1.ComponentCount - 1 downto 0 do
Form1.Components.Free;
Stream.ReadComponentRes(Form1);
(Stream者TFileStream也)

Button 和 Menu 都起作用的。
 
你是说这些VCL读入内存之后,他们的event Handler还都能用?
 
ReadComponentRes我没用过,我使用的方法见"关于控件的流控制".
我的理解是对象中存的是eventHandler的指针,因此存储在文件中
再读出来是没有意义的.但对于动态生成的VCL而言(这位老兄的问题的情况),
反正eventHandler都是在生成后才赋值的,因此无所谓清除不清除.

但对于您所说的方法,我还得有时间的时候试验一下,暂时持保留意见 ^_^
 
感谢两位仁兄在些指点,我试了两位的方法,PASS!
不过还有一个疑问,如果我自定义对象并不能放到VCL工具条上,
只是在程序运行时才定义这个类,这个方法还能用吗?有没有什么
特殊的要求?两位的方法有什么不同之处呢?

我还想请yysun兄指点一下,您的例子中
CName := Copy(QuickRep1.ClassName, 2, 99);
为什么是2到99呢?
在load文件的过程中,要有以下语句:
for I := QuickRep1.ComponentCount - 1 downto 0 do
QuickRep1.Components.Free;
这一点真的很重要,如果没有这一段就会出错。可是为什么要Free?
这里的原因何在?请yysun兄指点,让我能用其然而又知其所以然。
谢谢!
 
我用这个方法常注意,将可能用到的Component先至少各放一个到Form上,起先不
需要者,它.visible := false;(因为我尚未弄清 RegisterClass之类的东西,
这样做有效果了,也就没再追究下去,惭愧!)

CName := Copy(QuickRep1.ClassName, 2, 99);
实际上是 CName := QuickRep1.Name;
前面就改成为:Stream.WriteComponentRes(Form1.Name, Form1)了;(往上看)

ReadComponentRes会为您自动创建它读到的Component,所以先要free掉一些。
Help文件中有说明。
 
你不必使用Tstream对Tform的格式文件*.frm进行操作
将你的自定义对象建在Tpersist,之上
如:TmyComponet=class(Tpersistent)

这样delphi会自动为你的控件的存储property值
 
我做过类似的程序,主要是使用TStream.WriteComponent方法,对于一般的控件
类没有什么太特殊的要求。如是定义的控件,对于较复杂的属性可能要自己写一个
过滤器过程。其余请参考Delphi Help.
 
我现在的疑问点在这里:如果不是Component,也就是说
我定义的对象没有注册到VCL库中,只是随着程序的运行而
产生。这样的情况能用我们上面讨论的方法吗?
 
我在"关于控件的流控制"中建议的方法是肯定可以的,
我当年就是用来存储自定义的对象,但注意必须是
TComponent的子类,即YourClass=Class(TComponent)
才可以.

TComponent和VCL库中的构件可不是一个概念哟!
 
我的问题基本解决了,可是有一个问题接着出现了:分数该给谁呢?
yysun兄和dwwang兄都给出了很好的方法,yysun兄的说明又清楚又详细
而dwwang兄又把这个问题的讨论引向了一个更深的层次,使我长了见识。
这两位仙长都不能少了供奉哟,可分数只能给一个,怎么办耶? ^_*
 
让老孙定就可以喽!
 
记住这个论坛,下次请多多关照.
 
顶部