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

问题描述 投票:-4回答:2

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

问题是当组件添加到表单时,OnChange事件发生在FormCreate之前。如何在所有创作发生之后延迟我的活动?

我想我可以向组件发布消息并对此作出反应,但之后我只想在创建状态时postmessage。有没有更好的办法?

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;
delphi components
2个回答
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;

0
投票

好的,谢谢Remy Lebeau,他帮助我更好地理解了我的问题。因为我的组件默认填充了内容,所以我放弃了在初始填充期间发生的更改通知(一旦句柄可用就会发生)。

因此,现在在组件创建期间(因此在FormCreate之前)不再发生选择更改事件。

© www.soinside.com 2019 - 2024. All rights reserved.