在设计器中触发的 Firemonkey 自定义控件单击事件
Firemonkey custom control click events firing in designer
我有一个自定义的 Firemonkey 控件,它有几个子组件。这些子组件具有与其关联的 OnClick 事件,这些事件在控件的构造函数中设置。我注意到当我在设计视图中单击自定义控件时,这些子组件的 OnClick 事件被触发。
我是否需要采用特定设置或最佳实践来防止这种情况发生?
有什么我可以检查我的 C++ 代码以查看此事件是否在设计器中 运行 与 运行 时间?类似于:
void __fastcall MyControlOnClick( TObject * Sender )
{
if( InDesigner == false )
{
//do stuff here
}
}
使用ComponentState
属性。当您的控件在窗体设计器中使用时,它会启用一个 csDesigning
标志。
void __fastcall MyControl::SubControlClick(TObject *Sender)
{
if( !ComponentState.Contains(csDesigning) )
{
//do stuff here
}
}
或者,简单地不要在设计时分配 OnClick
处理程序:
__fastcall MyControl::MyControl(TComponent *Owner)
: TBaseControl(Owner)
{
...
FSubControl = new TWhatever(this);
if( !ComponentState.Contains(csDesigning) )
FSubControl->OnClick = &SubControlClick;
...
}
我有一个自定义的 Firemonkey 控件,它有几个子组件。这些子组件具有与其关联的 OnClick 事件,这些事件在控件的构造函数中设置。我注意到当我在设计视图中单击自定义控件时,这些子组件的 OnClick 事件被触发。
我是否需要采用特定设置或最佳实践来防止这种情况发生?
有什么我可以检查我的 C++ 代码以查看此事件是否在设计器中 运行 与 运行 时间?类似于:
void __fastcall MyControlOnClick( TObject * Sender )
{
if( InDesigner == false )
{
//do stuff here
}
}
使用ComponentState
属性。当您的控件在窗体设计器中使用时,它会启用一个 csDesigning
标志。
void __fastcall MyControl::SubControlClick(TObject *Sender)
{
if( !ComponentState.Contains(csDesigning) )
{
//do stuff here
}
}
或者,简单地不要在设计时分配 OnClick
处理程序:
__fastcall MyControl::MyControl(TComponent *Owner)
: TBaseControl(Owner)
{
...
FSubControl = new TWhatever(this);
if( !ComponentState.Contains(csDesigning) )
FSubControl->OnClick = &SubControlClick;
...
}