请问个位高手,如何保存动态生成的Delphi控件(包括所属的子控件)和控件的属性值到单一的文件!保存后又如何完整读取出来? (50分)

  • 主题发起人 主题发起人 pizilai
  • 开始时间 开始时间
P

pizilai

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]请问个位高手,如何保存动态生成的Delphi控件(包括所属的子控件)和控件的属性值到
单一的文件!其中也包括自定义的组件!!(注意是动态生成的!!!)
保存后又如何完整读取出来?能否贴点例子出来啊?先谢谢各位高手了!比较急!
 
TStream.WriteComponent ReadComponent
或者通过RTTI自己读写
 
谢谢 zjan521:
知道用TStream.WriteComponent ReadComponent这种方法,但是不会写啊!我写了一部分,但是写两个以上并读取的时候出错了,它提示说没有父窗体!麻烦你和各位高手帮我更正一下,谢谢!再次谢谢了!
procedure TMainForm.SaveFileActExecute(Sender: TObject);
var
OutPut: TMemoryStream;
ResName:string;
I,J:Integer;
begin
ResName:='c:/myshow.dat';
If FileExists(ResName) Then DeleteFile(ResName);
Output:=TMemoryStream.Create;
For I:=0 to ProxyForm.FProxyCompList.Count-1 do
Begin
OutPut.WriteComponent(ProxyForm.FProxyCompList.Items);
With (ProxyForm.FProxyCompList.Items As TBGPanel) Do
Begin
For J:=0 to CompList.Count-1 do
Begin
OutPut.WriteComponent(CompList.Items[J]);
End;
End;

End;
Output.SaveToFile(ResName);
Output.Free;
end;
//写控件是没有出错的,但是读就有错了!

procedure TMainForm.OpenFileActExecute(Sender: TObject);
var
Input: TMemoryStream;
ResName:string;
TmpCmpt,ChildCmpt:TComponent;
begin
RegisterClass(TBGPanel);
RegisterClass(TMoveImagePanel);
RegisterClass(TMoveMovicePanel);
RegisterClass(TMoveRichEditPanel);
RegisterClass(TTimePanel);
ResName:='c:/myshow.dat';
If Not FileExists(ResName) Then Exit;
Input:=TMemoryStream.Create;
Input.LoadFromFile(ResName);
Input.Position:=0;
TmpCmpt:=Input.ReadComponent(Nil); //这里就开始出错了
While TmpCmpt<>Nil Do
Begin
If TmpCmpt.ClassType=TBGPanel Then
Begin
ProxyForm.InsertComponent(TmpCmpt);
(TmpCmpt as TBGPanel).Parent:=ProxyForm;
ProxyForm.FProxyCompList.Add(TmpCmpt);
ChildCmpt:=Input.ReadComponent(Nil);
While (ChildCmpt<>Nil) and (ChildCmpt.ClassType<>TBGPanel) Do
Begin
TmpCmpt.InsertComponent(ChildCmpt);
(ChildCmpt as TWinControl).Parent:=(TmpCmpt as TBGPanel);
(TmpCmpt as TBGPanel).CompList.Add(ChildCmpt);
ChildCmpt:=Input.ReadComponent(Nil);
End;
If (ChildCmpt<>Nil) and (ChildCmpt.ClassType=TBGPanel) Then
TmpCmpt:=ChildCmpt;
End;
End;
Input.Free;
ShowMessage('Over!');
end;

{
注:FProxyCompList:TComponentList; 在ProxyForm中每动态增加一个控件就用
FProxyCompList.add(NewComponent);来把控件增加到控件列表中
Property CompList:TComponentList read FCompList write FCompList;
以下是我自定义的控件,他们都继承了TPanel类
RegisterClass(TBGPanel);
RegisterClass(TMoveImagePanel);
RegisterClass(TMoveMovicePanel);
RegisterClass(TMoveRichEditPanel);
RegisterClass(TTimePanel);}
 
做得太复杂,实在是没有必要吧???

即然控件本身是动态生成的,你把生成的描述,属性值保存在一个文件不就行了,下次读出这些属性,再重新生成一下控件就完了
 
有两个全局函数就是专门干这个用的,往下看:
WriteComponentResfile('test.dat',memo);//此句把memo控件保存起来

Memo:=ReadComponentResFile('test.dat',nil) as Tmemo;//此句是读出。

 
用dream controls 4.12
 
To 桦树皮:
能保存控件,但是不能保存它的子控件啊!
能否写个例子!谢谢了!
To 87150:

我把dream controls 4.12 下载了,但是与此问题好象没有什么关系啊!谢谢!你能否提供一个dream controls 4.12 !
 
费解。。把关键(已经或者可以被用户改变过的)属性写进一个INI文件里不就完了。读的时候。把属性再:=VCL;你那样做的话。你的存盘文件会有多大?????存那么多无用的东西。我觉得不值。
 
保存之前Visible:= False;
读出之后设置Parent然后Visible:= True
(ReadComponent是针对Component的 Control如果Visible = True是必须Parent<>nil的/普通的比如TEdit,特殊有不需要的)
 
^_^[:)],帮顶一下
 
我认为比较好的方式是生成一个XML文件
 
wr960204:
XML文件如何保存啊?我是用Delphi 6.0编程的,不是Delphi 8 or .NET。能否举个例子啊?谢谢啦!
 
http://www.aidelphi.com/6to23/docu/ReadDFMFile.rar
一个把窗体保存在dfm文件中,应用程序需的时候再从文件中读出来的例子,也就是说dfm文件不编译进EXE文件,而是单独以文件的形式存在,这样别人无法利用十六进编辑软件改动界面了
看一下这个DEMO对你有没有用吧
 
我想你不会为了保存而保存吧,我觉得用RTTI方法存XML比较好,可以实现用户定制界面的目的
 
yutouda_cn:
RTTI方法,有demo吗?
 
小弟新手,提个建议各位看可行吗.
你把动态生成的控件写入流文件.也可以实现相同的功能
 
作者: Theodoros Bebekis.
如何保存控件及其属性到磁盘或Blob字段
http://www.csdn.net/dev/delphi/Samples/saveprop.zip
 
app2001:
谢谢,正在研究...
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部