Delphi XE - действия TRibbon всегда направляют фокус в MainForm
Вопрос
Когда я помещаю элемент управления TRibbon в форму, которая не является MainForm приложения, действия TRibbon (например, Cut, Paste) всегда возвращают фокус в MainForm после выполнения действия.
Это происходит, даже если TForm, содержащий TRibbon, не является дочерним по отношению к MainForm.
Я использую 64-разрядную версию Windows 7, Embarcadero RAD Studio XE версии 15.0.3953.35171.
Я неправильно использую элемент управления TRibbon или это проблема TRibbon?
Решение
Очевидно, это сделано специально. Пример фрагмента кода из "tapeactnctrls.pas":
родовое словоКак видите, не проверены условия, которые помогли бы нам избежать звонка. Тот же код также используется в обработчиках выбора пунктов меню и нажатия клавиш.
Я бы, вероятно, изменил источник, комментирующий вызовы фокуса, и попытался увидеть, есть ли какие-либо побочные эффекты.
В качестве альтернативы вы можете вернуть фокус обратно в форму после того, как она переключится на основную форму. Предположим, что ActionList1 - это TActionList, который содержит стандартные действия в не основной форме:
родовое словоОднако это приведет к тому, что основная форма будет кратковременно мигать при каждом выполнении действия. Если вы этого не хотите, вы можете изменить дизайн, чтобы основная форма знала, когда она получает нежелательный фокус, и имитировала, что она не сфокусирована.
В unit1:
родовое словоin unit2:
родовое слово
Однако этого недостаточно, если в исходном коде проекта не установлен параметр «MainFormOnTaskBar», поскольку в этом случае основная форма не только получит фокус, но и будет выведена на передний план. В этом случае обе формы могут отреагировать на нежелательное изменение / активацию фокуса, заморозив свои z-порядки. Тогда код станет для unit1:
и для unit2:
родовое слово