Как убедиться, что диалог всегда находится перед главным окном

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

  • Установите для FormStyle значение fsStayOntop. Это работает, но имеет преимущество в том, что диалог будет находиться перед ВСЕМИ окнами, даже другими приложениями. Я только хочу, чтобы это было перед моим главным окном.
  • Установите PopupMode в pmAuto. Это также работает за исключением случая, когда один диалог открывает другой диалог. Если первый диалог закрыт, второй автоматически закрывается. Это не приемлемо.
  • Используйте свойства по умолчанию для формы. Как только главное окно щелкает по открытым диалогам, оно находится за основным окном.

Любые другие предложения:-)

4 ответа

Решение

Из свойства TCustomForm.PopupParent;

Если для свойства PopupMode установлено значение pmExplicit, а PopupParent - nil, то Application.MainForm неявно используется в качестве PopupParent.

,

AFAIK Delphi 2007 поддерживает функцию MainFormOnTaskbar. С

   Application.MainFormOnTaskbar := True;

В исходном коде проекта ЛЮБАЯ форма заявки (с родительским окном по умолчанию) показана над основной формой.


Если вы не уверены, какая форма является основной формой, перейдите в Project/Options/Forms и установите правильную основную форму. Другая вероятная причина заключается в том, что вы обновляете проект с предыдущей версии Delphi, поэтому исходный код проекта не содержит вышеуказанную строку кода - добавьте эту строку вручную.

Я думаю, что ваше первое усилие, fsstayontop, является лучшим вариантом. Проблема с отображением перед другими приложениями может быть невозможна, поскольку вы действительно используете функцию Windows, а не нечто уникальное для Delphi.

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

Если ваш диалог не настолько велик, чтобы скрыть другие приложения, его можно переместить, и пользователи по-прежнему могут получать доступ к другим приложениям, не взаимодействуя с вашим диалогом. Кажется, не так уж плохо.

Вы можете попробовать просмотреть событие OnHide и сразу сделать флаг Visible равным TRUE. Это, вероятно, вызовет мерцание, хотя.

Другие вопросы по тегам