gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:23:22 25 4
gpt4 key购买 nike

如果我将组件放在表单上,​​我在单元代码中看不到任何类似 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 单元中定义的一个函数,负责完成繁重的工作。概括地说,它执行以下操作:

  1. 查找表单类的名称并查找该名称的 RT_RCDATA 资源。该资源就是 .dfm 文件。
  2. 找到 .dfm 资源后,就会对其进行解析。
  3. .dfm 解析处理您在设计时在对象检查器中设置的属性的分配。例如,解析可能会遇到这样的行: Caption = 'My main form' 并将其转换为字符串 'My main form' 到表单的赋值属性标题
  4. .dfm 文件是分层的。它包含在设计时定义的各种组件和控件的属性。
  5. 除了设置表单设计时组件的属性外,.dfm 流处理还会实例化这些组件。

为了让这一切发挥作用,流媒体框架依赖于 RTTI。它在编译时对类和组件一无所知。因此需要 RTTI。流媒体框架使用旧式 RTTI,事实上这就是旧式 RTTI 存在的原因。如果您想知道为什么旧式 RTTI 是这样的,请尝试从设计用于支持流媒体的角度来看待它。

关于delphi - 何时调用在表单上创建组件的代码以及设置其属性的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com