- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Delphi 2009中,我做了一个简单的:
FindDialog.Execute;
FindDialog 窗口按其应有的方式保留在程序主窗口的顶部。
但是,如果我在自己的程序窗口上从其他程序打开另一个窗口,FindDialog 窗口将保留在另一个窗口的顶部。
如果我使用另一个程序(例如记事本)中的 FindDialog 尝试此操作,则不会发生这种情况。在记事本及其 FindDialog 上打开另一个程序的窗口将同时覆盖记事本和 FindDialog 窗口。这似乎是正确且预期的行为。
这是我做错了什么还是Delphi实现FindDialog的方式有问题?我可以做些什么来让它以记事本的方式工作吗?
<小时/>谢谢大家的评论。您无法重现我的问题这一事实已经表明这是其他原因造成的。这将帮助我追踪它。当我发现一些东西时,我会进行更多研究并在此处发布更多信息。
<小时/>非常有趣。我的 PrintDialog 没有保持在顶部。仍然不知道为什么我的 FindDialog 会这样做。还在研究中...
<小时/>我将调用更改为:FindDialog.Execute(Handle);仍然位居榜首。
<小时/>我在主窗体中添加了另一个 FindDialog(这次是 FindDialog1),并在程序启动时执行它。它具有相同的保持领先行为。这至少表明它与我的 FindDialog 或我与之相关的自定义无关。所以它一定是我主窗体中的一个设置。
<小时/>看来我不是唯一遇到这种情况的人。请参阅:Resource Tuner: Version History它似乎是一个 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。
...但我仍然真的不明白这一点(Delphi 关于 NormalizeTopMosts 的帮助)非常令人困惑,并且并不表明它应该这样做。
希望这个“修复”不会导致其他问题。
最佳答案
查看 VCL 代码,查找对话框保持在顶部的唯一可能方式是,当调用“执行”时已经有一个最顶部的窗口。这就是它的编码方式,对话框由“TRedirectorWindow”拥有,而“TRedirectorWindow”由应用程序中 z 顺序的顶部窗口拥有。如果此“顶部窗口”是最顶部窗口,则查找对话框也是最顶部窗口。
procedure TForm1.Button1Click(Sender: TObject);
var
f: TForm;
begin
f := TForm.CreateNew(Self);
f.FormStyle := fsStayOnTop;
f.Show;
FindDialog1.Execute;
end;
或者,
procedure TForm1.Button1Click(Sender: TObject);
begin
FormStyle := fsStayOnTop;
FindDialog1.Execute;
FormStyle := fsNormal;
end;
以上示例将创建一个最顶层的查找对话框。但是留在顶部的表单可能不会被忽视,所以我想这不会是您问题的根源。
无论如何,要么是这样,要么您通过其他代码片段以某种方式更改了对话框上的样式。
顺便说一句,不要费心测试将各种句柄传递给 FindDialog1.Execute()
,它不会有效果,请参阅我对您的问题的评论。
编辑:
这个怎么样:
procedure TForm1.Button4Click(Sender: TObject);
var
f: TForm;
begin
f := TForm.CreateNew(Self);
f.FormStyle := fsStayOnTop;
f.Show;
f.Hide;
FindDialog1.Execute;
end;
重点是,窗口不必可见即可被 EnumThreadWindows
枚举。 。因此,任何现有的置顶表单都可能导致查找对话框表现出此行为。
测试和观察比猜测更好。在启动查找对话框之前运行以下测试。这结合了“dialogs.pas”执行的逻辑来查找对话框的基础,并且如果对话框位于最顶层,则会引发异常。
function EnumThreadWndProc(hwnd: HWND; var lParam: LPARAM): Bool; stdcall;
var
Window: TWinControl;
begin
Result := True;
Window := FindControl(hwnd);
if Assigned(Window) and (Window is TForm) then begin
Result := False;
lParam := Longint(Window);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
OnTopForm: Longint;
begin
OnTopForm := 0;
EnumThreadWindows(GetCurrentThreadId, @EnumThreadWndProc, LPARAM(@OnTopForm));
// if (OnTopForm <> 0) and (TForm(OnTopForm).FormStyle = fsStayOnTop) then
if (OnTopForm <> 0) and (GetWindowLong(TForm(OnTopForm).Handle,
GWL_EXSTYLE) and WS_EX_TOPMOST = WS_EX_TOPMOST) then
raise Exception.Create('darn! got one: ' + TForm(OnTopForm).Name);
end;
另一个测试可能是在启动对话框之前调用应用程序的 NormalizeTopMosts
,但我知道在某些 Delphi 版本中,此方法已损坏并且无法完成其工作。
关于delphi - 如何防止 FindDialog 保持在最前面 (Delphi)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5373946/
请在标记为重复之前阅读。 我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过
我想设置一个小程序,从数据库中检索信息,然后根据请求将该信息分发给另一个程序。例如,一个名为“Master”的程序将从数据库中检索数据并创建一个对象集合(列表、数组等,无论哪种效果最好),然后一个名为
我有两台电脑,都装有 XE2。我以为我在两者上安装了相同的安装,但在其中一个上安装第 3 方软件包时遇到问题,而另一个则正常。 无论如何,我希望两者都一样。最简单的人可能只是通过移入我的 Dropbo
有冲突吗? 最佳答案 所有新版本的 Delphi 始终可以安全地安装到旧版本的下一个版本。 每个新版本都应安装在其自己的目录中。 如果您要安装多个版本,请始终先安装最旧的版本,然后再安装最新版本。 我
快速提问:如果我从代码中删除 // 或 (* *) 中的注释,Delphi 2007 的执行时间会受到影响吗?最终结果是一个可能包含数千行注释的 EXE 文件。 最佳答案 编译器会简单地忽略注释,并且
我必须对照另一个文件检查文件的每一行。 如果第二个文件中存在第一个文件中的一行,则必须删除它。 现在,我正在使用2个列表框,并且“对于listbox1.items.count-1可以开始...” 我的
我正在尝试在访问数据库中添加一些数据。但是我有麻烦,因为这会返回错误: ADOQuery1 missing sql property 实现了对代码的几次修改,到目前为止没有任何效果。 我究竟做错了什么
我用Delphi 5编写了一个程序,在Windows 8 32位PC上可以正常运行。我发现在Windows 7 64位笔记本电脑上运行它最终会导致reallocmem错误,而该错误在32位PC上不会发
看来这是我需要的工具,用于提取XML并与TClientDataset连接。我已经在几篇文章和文档中看到了它,但是我无法在XE2组件列表中找到它-在任何地方!应该在哪里?是否在可能未安装的可选软件包中?
我正在寻找一个非常通用的TDBTree组件,我想听听一些建议。我正在特别寻找一种显示主记录和“ n”个链接表记录的记录。 (我的意思是来自各个表的记录)。例如,TDBTree将钩接到主表,明细表1,附
我需要将按钮制作成旋转三角形的形状(或者说是任何多边形)。谁能提供任何建议? 最佳答案 查看Win32 API CreatePolygonRgn()和SetWindowRgn()函数,以创建一个HRG
你好专家 我的JvPasswordForm1有一个旧的JVC组件。 似乎该组件不再存在:它替换为哪个组件? 重新获得 最佳答案 尝试查找TJvLoginDialog,TjvPassword已合并到其中
几天前,我已经设置了我的开发环境(在装有Win 7的VM和域上的用户的VM上安装了delphi 2009),并安装了我的组件(jedi's,devExpress,ADS等)。 今天,我启动机器,打开d
开始对控件进行子分类的正确位置/时间是什么? 恢复原始窗口proc的正确时间是几点? 现在我在表单创建过程中子类化: procedure TForm1.FormCreate(Sender: TObje
有人可以给我一些有关如何登录访问的网页(使用任何网络浏览器)的指示吗?我应该建立一个全球代理....钩住网络....吗?我需要记录的只是页面地址,而不是其中包含的信息。 我正在使用Delphi。 谢谢
我创建了一个像 TMyClass = class(TObject) private FList1: TObjectList; FList2: TObjectList; public end;
我有一个BPG文件,我已对其进行修改以用作我们公司的自动构建服务器的make文件。为了使其正常工作,我必须进行更改 用途*用途 'unit1.pas'中的unit1 * unit1 'unit2.pa
我将Delphi 7代码迁移到了Delphi XE4。我在Delphi XE4的LoadFromStram方法中遇到错误,但对于Delphi 7来说也可以正常工作。 错误: First chance
我正在尝试学习一些新技巧,以便更好地组织我在 Delphi 中的单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但是我还没有成功地在类中创建一个工作类,虽然它编译得很好,但在执行代
我有一个包含许多类的大单元,现在我想通过将某些类分成新的单元来重构该单元。 我不得不承认我缺乏使用Delphi内置IDE功能的经验。利用内置功能“查找|查找对类型的本地引用”并没有多大帮助,因为类方法
我是一名优秀的程序员,十分优秀!