在设计器中触发的 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;
    ...
}