【发布时间】:2015-10-15 02:45:32
【问题描述】:
为了演示这个问题,我创建了一个包含 4 个空白表单的简单应用程序。其中一个(Form1)是主要的并自动显示。显示我在代码项目中放入的其他表格:
…
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Form2.Show;
Form3.Show;
Form4.Show;
Application.Run;
end.
在第二个表单(或任何其他表单)Form2 上,我放置了一个按钮,当单击该按钮时,同步执行长(>5 秒)SQL 查询(任何,我打开存储过程)。是不是同步的,也就是app至少挂了10秒。这时候会触发windows重影。 Windows 为您可以最小化、移动和关闭的所有 Windows 陈旧应用程序创建 Windows Ghost。执行查询后,应用程序继续处理消息,一切都恢复到原来的状态。
一定是这样,但对我来说不是。事实上,解冻程序Windows的Z-order改变后,Windows的顺序是混杂的。此外,顶部(或底部)可以脱离任何窗口,我没有注意到任何模式。在取消重影时,Windows 似乎没有正确恢复 Z 顺序。
在 Delphi 2007 中也发现了这种行为。请注意,在 Delphi 调试器模式下重影被禁用,您不会看到这种行为。在没有调试器的情况下运行应用程序以查看此行为。 使用 DisableProcessWindowsGhosting 禁用模式重影后 - 一切正常。
但我不想完全禁用此模式,程序经常挂起超过 5 秒,并且此模式很有用:用户仍然可以更好地查看以某种方式重绘的 Windows,而不是根本不重绘。为异步执行查询重写一半的程序代码是一个非常耗时且耗时的任务,我们恐怕没有足够的资源,尽管这无疑是正确的做法。
MainFormOnTaskBar 属性与我的问题无关,delphi 7 中没有这样的属性。
这会影响除我之外的其他人吗?如果不是——我哪里做错了?如何强制 Windows 正确重构 Windows 的序列?
【问题讨论】: