加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 何时调用在表单上创建组件的代码和设置其属性的代码?

发布时间:2020-12-15 09:21:10 所属栏目:大数据 来源:网络整理
导读:如果我在表单上放置一个组件,我在单元代码中看不到像MyComp:= TMyComponent.Create这样的代码.我认为组件是自动创建的,但什么时候?我将组件放在表单上后,我配置的属性也发生了同样的情况.在运行时应用它们? 解决方法 表单的属性以及表单上的所有设计时组
如果我在表单上放置一个组件,我在单元代码中看不到像MyComp:= TMyComponent.Create这样的代码.我认为组件是自动创建的,但什么时候?我将组件放在表单上后,我配置的属性也发生了同样的情况.在运行时应用它们?

解决方法

表单的属性以及表单上的所有设计时组件在构建表单期间由框架流式传输.该过程是从TCustomForm.Create中的表单构造函数触发的.那里的相关代码看起来像这样:

Include(FFormState,fsCreating);
try
  if not InitInheritedComponent(Self,TForm) then
    raise EResNotFound.CreateFmt(SResNotFound,[ClassName]);
finally
  Exclude(FFormState,fsCreating);
end;

关键是调用InitInheritedComponent.这是在Classes单元中定义的一个函数,可以完成繁重的工作.在非常广泛的概述中,它执行以下操作:

>查找表单类的名称,并查找该名称的RT_RCDATA资源.该资源是.dfm文件.
>找到.dfm资源后,将对其进行解析.
> .dfm解析处理您在Object Inspector中在设计时设置的属性的分配.例如,解析可能会遇到如下这样的一行:Caption =’我的主要形式’,然后将其转换为字符串’My main form’到表单属性Caption的赋值.
> .dfm文件是分层的.它包含在设计时定义的各种组件和控件的属性.
>除了设置表单的设计时组件的属性外,.dfm流式处理还会实例化这些组件.

为了使所有这些工作,流式传输框架依赖于RTTI.它在您的类和组件的编译时完全不知道.因此需要RTTI.流式传输框架使用旧式RTTI,事实上这就是旧式RTTI存在的原因.如果你想知道为什么老式的RTTI就是这样,那么试着从设计用于支持流媒体的角度来看它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读