使用poDesktopCenter定位自己的Delphi 6表单最终会在“扩展”监视器上

时间:2012-06-22 04:37:31

标签: delphi multiple-monitors

我有一个Delphi 6应用程序,在主窗体出现后启动向导。向导是一种模态形式。我的一个用户将其Windows桌面扩展到多个监视器。在它们的情况下,主窗体出现在主监视器上,向导出现在扩展监视器上。这会产生混淆,因为他们认为应用程序在尝试单击主窗体时已冻结。由于向导是打开的并且是模态的,所以没有任何反应,除非他们听到警告“叮”声,告诉你表单无法接收输入。

如何确保向导表单与主表单在同一监视器上显示,在这种情况下是主监视器?我将向导表单设置为poDesktopCenter。

1 个答案:

答案 0 :(得分:8)

手册理论:

如果希望表单由poMainFormCenter居中,请使用Application.MainForm。简而言之,应用程序主表单是运行应用程序时可以看到的第一个表单,您应该认为此主表单可以位于与创建和居中新表单的活动窗口不同的监视器上。 / p>

或者,如果您希望通过Owner将表单居中,请使用恕我直言的poOwnerFormCenter以获得更好的用户体验,因为当您有两个以上的窗口相互打开时,您可以移动窗口到另一个监视器并在用户当前工作的监视器上创建新窗口。

实用用例:

用户在第一台显示器上运行您的应用程序。该应用程序从其Form2创建了MainForm。用户在第二个监视器上移动了Form2,并从那里按下了创建另一个表单Form3的按钮。

如果您将Form3设计为使用poMainFormCenter位置,则Form3将以MainForm为中心,此时此时位于不同的监视器上,恕我直言,令人困惑。

enter image description here

如果您使用这样的代码来创建和展示Form3

procedure TForm2.Button1Click(Sender: TObject);
begin
  // the Owner parameter Self (or Form2 here) in the Form3 constructor along 
  // with the Position set to poOwnerFormCenter will ensure you that the form 
  // will be centered by the current form position, so on the current monitor 
  // where the user works on as well
  Form3 := TForm3.Create(Self);
  try
    Form3.Position := poOwnerFormCenter;
    Form3.ShowModal;
  finally
    Form3.Free;
  end;
end;

您将Form3置于Form2的中心位置,但主要位于当前Form2所在的监视器上,正如您目前正在处理的那样:

enter image description here