У меня есть приложение Delphi 2006, которое может открывать модальное диалоговое окно в ответ на состояние ошибки. Кажется, что он входит в состояние, когда один из этих модальных диалогов открыт, расположен перед основной формой, но ни одна из форм не отвечает на сообщения. Нажатие на любой из них дает «бонк». Приложение работает нормально, пользовательский интерфейс обновляет основную форму, но вы ничего не можете сделать. Я предполагаю, что под основной формой, скорее всего, есть еще один модальный диалог. Является ли это одним из моих или один из Windows, я понятия не имею.
Прочее:
Я открываю модальные диалоги с помощью
ModalDialog.PopupParent := MainForm ;
ModalDialog.ShowModal ;
Я откладываю эти диалоги ошибок, если открыты другие модальные диалоги:
если (Application.ModalLevel = 0), то
{открыть модальное диалоговое окно}
Мой вопрос состоит из двух частей:
Есть ли способ программно определить, какое окно имеет фокус? Затем я мог бы предпринять какое-то действие для этого сценария или, в крайнем случае, я мог бы предоставить им горячую клавишу, чтобы вывести его на передний план, или предпринять какое-то уклончивое действие (в зависимости от диалога), например, установить для ModalResult значение mrCancel.
Как может возникнуть такая ситуация? Обычно, когда я получаю модальное диалоговое окно за основной формой (я могу сделать это, открыв модальное диалоговое окно, свернув приложение из значка в трее, а затем снова восстановив приложение - основная форма приложения восстанавливается перед диалоговым окном, с диалоговое окно все еще сохраняет фокус), я могу снова вывести его на передний план, щелкнув значок в трее, или закрыть его с помощью клавиши Esc
, но в этом случае это не сработало.
**ОБНОВЛЕНИЕ* *
Исправление Миши работало, кроме диалогов, не относящихся к Delphi, таких как TSaveDialog. Я также смог заставить их работать, добавив Application.ModalPopupMode := pmAuto ;
непосредственно перед вызовом Execute
.
Под «заработало» я имею в виду, что диалоговое окно сохранения было впереди после следующей последовательности:
тогда как он находился за основной формой без ModalPopupMode := pmAuto
.
Так что я надеюсь, что эти изменения помогут решить (пока еще не воспроизведенную) проблему.