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