Не могу фокусировать приложение Firemonkey, когда модальное диалоговое окно открыто, если только само модальное диалоговое окно не нажано

1

У меня есть приложение, в котором пользователям при входе в систему предлагается приглашение с модальным диалогом, где они должны выбрать объект, из которого они хотят работать. На этом этапе приложение выглядит следующим образом:

Изображение 174551

Модальный диалог показан путем вызова этого метода:

bool __fastcall ShowFacChoiceForm()
{
    TFacChoiceForm *Form = new TFacChoiceForm( Application );

    bool Result = ( Form->ShowModal() == mrOk );

    delete Form;

    return Result;
}

В этом случае TFacChoiceForm наследует от TForm поэтому ShowFacChoiceForm() вызывает стандартный метод TForm.ShowModal описанный здесь.

Проблема, с которой я сталкиваюсь, заключается в том, что если мое приложение теряет фокус, оно не может снова стать активным окном, если не щелкнуть сам модальный диалог. Чтобы лучше проиллюстрировать это, я приведу следующий сценарий:

Позвольте сказать, что в пятницу днем, и я решил немного уйти и прочитать некоторые веб-комиксы. Открыв мое приложение, я открою еще одно окно поверх него:

Изображение 174551

Затем из ниоткуда мой босс приходит на обзор производительности, и я пытаюсь переориентировать свое приложение, щелкнув где-то на главной форме. Например, в положении этого красного X на следующем изображении.

Изображение 174551

На приведенном выше изображении я щелкнул по краю X. Теперь и форма, содержащая веб-комикс, и мое приложение неактивны. Таким образом, мое приложение не появляется в передней части экрана.

Однако, если я могу щелкнуть где-нибудь в модальном диалоге, например, красный X на следующем изображении...

Изображение 174551

... тогда мое приложение выходит на фронт, как и следовало ожидать.

Изображение 174551

Чтобы решить эту проблему, я рассмотрел использование чего-то вроде SetForegroundWindow из Windows API, но мне не удалось найти способ инициировать событие, так как моя основная форма не запускает события, пока у меня модальный диалог открыт.

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

  • 0
    Если вместо передачи Application в конструктор TFacChoiceForm вы передаете основную форму (или любую форму, вызывающую модальную форму), решает ли это проблему в соответствующем контексте?
  • 0
    @AnthonyBurg К сожалению, это не похоже на работу.
Теги:
modal-dialog
firemonkey
c++builder-xe8

1 ответ

0

Если вы установите modalresult для mrcancel в ondeactivate модального диалога, тогда основная форма получит фокус при его нажатии. Затем вы можете проверить, зарегистрирован ли пользователь в событии mousedown основной формы, а если нет, снова покажите модальный диалог.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню