Delphi MainFormOnTaskBar模态窗口错误

时间:2010-09-22 22:55:43

标签: delphi windows-vista modal-dialog delphi-2007

HI

我正在使用Delphi 2007并将MainFormOnTaskBar属性设置为true。

我遇到的问题是这个。

如果您从主窗体中打开子窗口,然后从刚刚打开的子窗口显示一个消息对话框。当您关闭消息对话框然后关闭子窗口时,主窗体将被发送到屏幕上任何其他应用程序的背面。

在Windows Vista和Windows 7下会发生这种情况。有谁知道为什么会发生这种情况,我该如何解决?

3 个答案:

答案 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自动分配的影响。不过,阅读文档后的一些实验应该会有所回报。