我创建了一个从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;
答案 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之前发生)。