Пользовательские элементы управления Firemonkey запускаются в конструкторе

У меня есть пользовательский элемент управления Firemonkey, который имеет несколько подкомпонентов. Эти подкомпоненты имеют связанные с ними события OnClick, которые настраиваются в конструкторе элемента управления. Я заметил, что когда я нажимаю на пользовательский элемент управления в моем представлении дизайна, события OnClick этих подкомпонентов запускаются.

Есть ли особые условия или лучшие практики, которые мне нужно использовать, чтобы этого не случилось?

Есть ли что-то, что я могу проверить в своем коде C ++, чтобы увидеть, выполняется ли это событие в конструкторе vs во время выполнения? Что-то вроде:

void __fastcall MyControlOnClick( TObject * Sender )
{
if( InDesigner == false )
{
//do stuff here
}
}

0

Решение

Использовать 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;
...
}
2

Другие решения

Других решений пока нет …