Как убедиться, что диалог всегда находится перед главным окном
Я еще не нашел лучшего решения для этого. У меня есть немодальное диалоговое окно, которое может быть открыто в неограниченных случаях горячей клавишей в приложении. Даже сам диалог может открыть новый экземпляр. Я хочу, чтобы эти диалоги всегда были перед главным окном приложения. Я попробовал пару вещей.
- Установите для 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. Это, вероятно, вызовет мерцание, хотя.