Delphi 2009以错误的顺序创建我的组件

Del*_*ber 4 delphi components delphi-2009

三个组成部分,一起工作:
*COMPA,一个TComponent的后代,一个策划组件知道很多事情,绑在一起的东西
*CompB的,一个TComponent后代,从中矿的一些数据是COMPA和仰卧起坐吧.除其他外,还可以向CompC提供要呈现的数据
  - 具有CompA
*CompC 类型的已发布属性 ,TComponent后代,可在设计时设置的TFrame后代绘图表面,以使用CompB作为数据提供者
  - 具有已发布的属性类型CompA
  - 具有CompB类型的已发布属性

我想我已经读过,即使我不知道在哪里,Delphi的流引擎从.dfm读取所有组件并构建依赖图.然后,此图表用于按正确顺序创建所有组件.对于所列出的组件应该是COMPA第一(因为它使用没有其他的的),则CompB的(它使用COMPA并且必须之后创建),最后compc命令,因为它具有另一种组分类型的属性.

这不会发生.CompC是在CompB之前创建的.如果我使用文本编辑器重新排列.dfm文件中的顺序,它可以工作.属性值不在任何构造函数中使用,仅在Loaded过程中使用.但是,无论dfm中的组件顺序如何,都必须有一种方法使其工作?

我现在已经连续两天撞到墙上了,我需要有人告诉我忘记了哪个关键字,或者我的设计有什么错误.

Mar*_*ema 6

如果您的组件在很大程度上依赖于创建顺序,那么依赖于流机制总是会遇到麻烦.只需在表单/数据模块上添加或删除(另一个)组件就可以使您的订单失效.

为了确保正确的创建顺序,您最好在运行时创建它们.请注意,在运行时创建组件时,不会调用Loaded方法.您可能需要自己动手或将代码移动到创建组件后调用的某个init方法.


jac*_*ate 6

我怀疑您的错是您正在尝试访问设置器上的其他对象属性以用于同级指针,却忘记了在dfm加载阶段(运行时),您无法确定指向组件所依赖的其他组件的指针仍然有效,因为可能尚未创建其他组件。自从Delphi 1起,这种方式就起作用了。

因此,通常会将其他组件状态的读取(例如)推迟到重写的Loaded方法中。

当流系统从其表单文件加载表单或数据模块时,它首先通过调用其构造函数来构造表单组件,然后从表单文件中读取其属性值。在读取了所有组件的所有属性值之后,流式传输系统按照创建组件的顺序调用每个组件的Loaded方法这使组件有机会初始化依赖于其他组件或自身其他部分的值的任何数据。注意:对同级组件的所有引用都在调用Loaded时解决。加载是同级指针在流入后可以使用的第一个地方

因此,通常在同级指针属性的设置方法上,通常会执行以下类型的检查:

procedure TMyComponent.SetDataSource(Value: TDataSource);
begin
  FDataSource := Value;
  //streaming in stage
  if not (csLoading in ComponentState) then
    ReadDataSourceProperties;
end;

procedure TMyComponent.Loaded;
begin
  ReadDataSourceProperties;
end;
Run Code Online (Sandbox Code Playgroud)

看一下VCL源代码,您会找到数百个示例。