自定义组件:将事件推迟到FormCreate之后

时间:2019-03-29 21:28:44

标签: delphi components

我创建了一个从TTreeView派生的组件,并自动填充了专门的内容。我添加了自己的OnSelectionChange事件。当分配了句柄并且ComponentState <> csReading或csLoading时,从Change方法(重写TTreeView.Change方法)中调用OnSelectionChange。

问题在于,将组件添加到表单时,OnChange事件在FormCreate之前发生。如何将事件推迟到所有创作完成之后?

我想我可以向组件发布消息并对此做出反应,但是我只想在创建状态下发布消息。有更好的方法吗?

procedure TMyDescendentTreeView.Change(Node: TTreeNode);
begin
  inherited;

  if HandleAllocated and assigned( fOnSelChange) and (not ( csReading in ComponentState ))
    and (not ( csLoading in ComponentState )) then
    fOnSelChange( Self, TXYZ(Node).Data, TXYZ(Node) );
end;

2 个答案:

答案 0 :(得分:1)

在设计时,请不要为组件分配OnChange处理程序。准备好后,让表单在其OnCreate事件中通过代码动态分配处理程序:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  //...

  MyTreeView1.OnChange := MyTreeView1Change;

  // optional, call the event now...
  MyTreeView1Change(MyTreeView1, MyTreeView1.Selected);

  //...
end;

procedure TMyForm.MyTreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  //...
end;

答案 1 :(得分:0)

好的,感谢雷米·勒博(Remy Lebeau)帮助我更好地理解了我的问题。由于默认情况下我的组件已填充内容,因此我丢弃了在初始填充过程中发生的更改通知(一旦有句柄可用就会发生更改)。

因此现在选择更改事件不再在组件创建过程中发生(因此在FormCreate之前发生)。