如何解析DFM,动态创建组件?(100分)

  • 主题发起人 主题发起人 jzrenxiaoyan
  • 开始时间 开始时间
J

jzrenxiaoyan

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手:
小妹刚开始学习DELPHI,现在有棘手问题请教:
dfm文件里存储了组件的属性信息,我如果想在一个空白的FORM下读入DFM里的属性信息,并且根据DFM的组件属性信息来在FORM上自动动态创建组件,如何实现啊?
也就是:如何解析dfm文件,动态创建组件!
谢谢!
 
读dfm文件有点麻烦,你可以将窗体上的所有控件用流的形式存入一个自己定义的二进制文件。
 
你可以看下DelphiFans里的一篇文章
http://www.delphifans.com/InfoView/Article_574.html
 
to delfier:
将窗体上的所有控件用流的形式存入一个自己定义的二进制文件这个好实现。假使有已经有了多个储存控件属性的2进制文件,我如何在读入这些文件后自动生成控件呢?(form上原来是空白的,没有任何控件,要根据所读的信息自动创建控件)
 
to hb_126,谢谢你提供的资料,还是好象还没有很好地解决我的问题。
 
你去www.delphibox.com上面下载一个CustomComponent控件或许可以帮你解决这样的问题,能留下你的QQ吗或发邮件给我:hzjieking@163.com近期我也在运行中研究这种类似于元数据驱动技术!
 
呵呵,jieking,,
我还是菜鸟啊
我都害怕和你讨论
QQ:88310936
 
看看Delphi安装目录下Demos/RichEdit中的例子吧。
 
to dreamisx:
高手,具体看什么啊?
 
将组件属性存入到XML文档中,打开窗体时再从XML文件中读出来。
 
这个问题并不复杂,做一个语法分析器,分析出每个DFM元素,就可以动态创建了,如果
从头开始编,稍微费点时间,DFM语法是一种简单的描述语言,语法本身的变化形式并不多,而且对一般应用来说DFM包括的对象太多了一些,很多语法元素用不到
DFM大致分为:
1。 描述对象 如 (object form1: TForm1)
2. 描述属性 这和程序中的赋值语句差不多
3。 文字串
4。 枚举(这个分析比较复杂一点)
 
TK128:
谢谢高手大哥,有没有源码借鉴一下啊!
都说这里的高手很厉害的,我已经等了好多天了。。。。。。
 
Delphi的“动态窗体”技术实际应用
http://www.delphifans.com/infoview/Article_574.html
看看这篇文章,应该对你有帮助.
 
很简单
1) 使用RegisterClass登记所有可能在DFM文件中出现的类
2) 加载DFM文件到Stream
3) 如果DFM是文本格式的, 使用ObjectTextToBinary转换成二进制格式
4) 使用TStream.ReadComponent读入到指定控件
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3315314
 
to Axe,
谢谢你的思路,听起来不错,能否给出源码?呵呵[:)]
 
代码如下。注意,你需要在RegisterClasses中注册所有出现在你将载入的DFM文件中的控件类。

procedure TForm1.LoadFromDFM;
var
DFMStream: TFileStream;
BinStream: TMemoryStream;
begin
DFMStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + 'MyForm.dfm', fmOpenRead);
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(DFMStream, BinStream);
BinStream.Position := 0;
BinStream.ReadComponent(Self);
finally
DFMStream.Free;
BinStream.Free;
end;
end;

procedure TForm1.RegisterClasses;
begin
RegisterClass(TButton);
RegisterClass(TEdit);
RegisterClass(TCheckBox);
RegisterClass(TRadioButton);
RegisterClass(TListBox);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses;
LoadFromDFM;
end;
 
非常感谢Axe,程序已经通过。
反过来呢,把界面上的控件属性改变后想重新存到原来的.dfm下,如何实现?
 
to Axe
前一段有事情不在,抱歉!
非常感谢你,程序已经通过。
反过来呢,把界面上的控件属性改变后想重新存到原来的.dfm下,如何实现?
帮我实现了,再给100分!!!
 
使用delphi函数
WriteComponentResFile 、ReadComponentRes、ReadComponentResFile等函数即可,具体的请查delphi帮助文件。

注意:如 Axe 所说,一定要先注册类。

到我这个ftp下载它的demos:
在DFM目录:

ftp.mlfjnp.com
帐户: dfw 密码:dfw
 
后退
顶部