В Delphi 2009 я делаю простое:
FindDialog.Execute;
Окно FindDialog остается поверх главного окна моей программы, как и должно.
Однако, если я открою другое окно из какой-либо другой программы поверх окна моей собственной программы, окно FindDialog остается поверх другого окна.
Если я попробую это с помощью FindDialog из другой программы (например, Блокнота), этого не произойдет. Открытие окна другой программы через Блокнот и его FindDialog будет охватывать как окна Блокнота, так и FindDialog. Это кажется правильным и ожидаемым поведением.
Это что-то, что я делаю неправильно, или проблема в том, как Delphi реализовал FindDialog? Могу ли я что-нибудь сделать, чтобы он работал как в Блокноте?
Спасибо всем за комментарии. Тот факт, что вы не можете воспроизвести мою проблему, уже говорит о том, что это что-то еще вызвало это. Это поможет мне его отследить. Я изучу еще немного и опубликую здесь дополнительную информацию, когда что-нибудь узнаю.
Очень интересно. Мой PrintDialog не остается на вершине. Все еще не не знаю, почему мой FindDialog делает. Все еще исследую ...
Я изменил вызов на: FindDialog.Execute (Handle); Все еще наверху.
Я добавил еще один FindDialog (на этот раз FindDialog1) в свою основную форму и выполняю его при запуске моей программы. Он ведет себя так же, как и всегда. Это, по крайней мере, указывает на то, что это не имеет ничего общего с моим FindDialog или настройками, которые я сделал для этого. Так что это должно быть сеттинг в моей основной форме.
Не похоже, что я единственный, кто столкнулся с этим. См .: Resource Tuner: История версий , который выглядит как приложение Delphi, где в версии 1.99 говорится: «Исправление ошибки: окно предварительного просмотра диалогового окна (поиск) оставалось наверху при переключении на другое приложение». Я мог бы попытаться связаться с ними и посмотреть, могут ли они вспомнить, что было их исправлением. PrintDialog и FontDialog не остаются наверху и работают должным образом.
Так чем же отличаются два набора диалогов, из-за которых первые два делают это неправильно?
Кроме того, эта проблема возникает в старой версии моя программа, скомпилированная с помощью Delphi 4. Упс. Теперь я вижу, что этой проблемы не было в моей старой версии, использующей Delphi 4.
И это был пользователь, который сообщил об этой проблеме. Он использует Windows XP, а я разрабатываю для Vista, так что это происходит под разными ОС.
Подтверждение: Да, я создаю новую форму и добавляю к ней FindDialog. У FindDialog нет проблемы. Это означает, что что-то в моей программе заставляет FindDialog оставаться на вершине. Теперь мне просто нужно выяснить, что это такое. Есть еще идеи? Если кто-то дает мне ответ, который даже дает мне подсказку, чтобы помочь мне решить эту проблему, то они я получу принятый ответ.
Решение: правка Сертака к его ответу дала мне обходной путь:
Application.NormalizeTopMosts;
FindDialog.Execute();
Application.RestoreTopMosts;
Это не позволяет FindDialog быть TopMost, когда приложение не TopMost.
... Но я все еще действительно не понимаю Не понимаю этого (справка Delphi по NormalizeTopMosts) очень сбивает с толку и не указывает, что он должен это делать.
Надеюсь, это «исправление» не вызовет других проблем.