在 Delphi 2009 中,我做了一个简单的操作:
FindDialog.Execute;
FindDialog 窗口应保持在我的程序主窗口的顶部。
但是,如果我通过我自己的程序窗口从其他程序打开另一个窗口,则 FindDialog 窗口仍位于另一个窗口的顶部。
如果我用另一个程序(例如记事本)中的 FindDialog 尝试此操作,则不会发生这种情况。通过记事本打开另一个程序的窗口及其 FindDialog 将覆盖记事本和 FindDialog 窗口。这似乎是正确和预期的行为。
这是我做错了什么还是德尔福实现 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;
当应用程序不是 TopMost 时,这样做可以防止 FindDialog 成为 TopMost。
...但我仍然真的不明白这一点(NormalizeTopMosts 上的 Delphi 帮助)非常令人困惑,并不表示它应该这样做。
希望这个“修复”不会导致其他问题。