HI
我正在使用Delphi 2007并将MainFormOnTaskBar属性设置为true。
我遇到的问题是这个。
如果您从主窗体中打开子窗口,然后从刚刚打开的子窗口显示一个消息对话框。当您关闭消息对话框然后关闭子窗口时,主窗体将被发送到屏幕上任何其他应用程序的背面。
在Windows Vista和Windows 7下会发生这种情况。有谁知道为什么会发生这种情况,我该如何解决?
答案 0 :(得分:5)
我想这将是QC66892-Closing forms deactivates the application,根据该报告似乎已经修复了Delphi 2009。在质量控制报告的底部,您会找到Andreas Hausladen的评论,其中包含指向他修复错误的链接。但是你真的想要利用他的VCL Fix Pack,其中包括许多其他修复。
答案 1 :(得分:2)
我已经用两种方式解决了这个问题。
首先在Andreas Hausladen所描述的Forms.pas中将stdcall添加到DoFindWindow的末尾。这将处理隐藏子窗体(CloseAction = caHide)而不是在关闭窗体时释放。
其次 - 复制调用FindTopMostWindow的TCustomForm.CMShowingChanged中的代码,然后激活返回TCustomForm.CMRelease的窗口。
(编辑:代码块需要缩进4个空格)
procedure TCustomForm.CMRelease;
var
NewActiveWindow: LongInt;
begin
if Application.MainFormOnTaskbar then
begin
NewActiveWindow := 0;
if (GetActiveWindow = Handle) and not IsIconic(Handle) then
begin
NewActiveWindow := FindTopMostWindow(Handle);
end;
if NewActiveWindow <> 0 then
begin
SetActiveWindow(NewActiveWindow);
end;
end;
Free;
end;
这似乎已经完成了,我会继续测试以确保。
答案 2 :(得分:1)
PopupMode和PopupParent属性专门添加到TForm以解决此问题。在显示子表单之前,将它的PopupParent设置为主表单,并将PopupMode设置为pmAuto。
当显示其他窗口时,PopupParent会特别影响窗口的Z顺序。
Delphi 2007帮助有关于这两个属性的一些文档,但您必须通过TForm才能访问它们。使用'TForm,Pop'作为搜索主题(显然没有引号)到达那里。文档对PopupParent有点混乱,因为它讨论了PopupMode对PopupParent自动分配的影响。不过,阅读文档后的一些实验应该会有所回报。