我有一个Delphi 6应用程序,在主窗体出现后启动向导。向导是一种模态形式。我的一个用户将其Windows桌面扩展到多个监视器。在它们的情况下,主窗体出现在主监视器上,向导出现在扩展监视器上。这会产生混淆,因为他们认为应用程序在尝试单击主窗体时已冻结。由于向导是打开的并且是模态的,所以没有任何反应,除非他们听到警告“叮”声,告诉你表单无法接收输入。
如何确保向导表单与主表单在同一监视器上显示,在这种情况下是主监视器?我将向导表单设置为poDesktopCenter。
答案 0 :(得分:8)
手册理论:
如果希望表单由poMainFormCenter
居中,请使用Application.MainForm
。简而言之,应用程序主表单是运行应用程序时可以看到的第一个表单,您应该认为此主表单可以位于与创建和居中新表单的活动窗口不同的监视器上。 / p>
或者,如果您希望通过Owner
将表单居中,请使用恕我直言的poOwnerFormCenter
以获得更好的用户体验,因为当您有两个以上的窗口相互打开时,您可以移动窗口到另一个监视器并在用户当前工作的监视器上创建新窗口。
实用用例:
用户在第一台显示器上运行您的应用程序。该应用程序从其Form2
创建了MainForm
。用户在第二个监视器上移动了Form2
,并从那里按下了创建另一个表单Form3
的按钮。
如果您将Form3
设计为使用poMainFormCenter
位置,则Form3
将以MainForm
为中心,此时此时位于不同的监视器上,恕我直言,令人困惑。
如果您使用这样的代码来创建和展示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
所在的监视器上,正如您目前正在处理的那样: