自定义组件:将事件推迟到表单创建之后



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

问题是,当组件添加到表单时,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;

只是不要在设计时将OnChange处理程序分配给组件。当 Form 准备就绪时,让 Form 在其 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;

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

因此

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

最新更新