我创建了一个从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;
在设计时,根本不要为组件分配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;
好的,谢谢Remy Lebeau,他帮助我更好地理解了我的问题。因为我的组件默认填充了内容,所以我放弃了在初始填充期间发生的更改通知(一旦句柄可用就会发生)。
因此,现在在组件创建期间(因此在FormCreate之前)不再发生选择更改事件。