如何让主要形式出现在第二个显示器

问题描述:

我用Delphi 10,我有两个显示器,当我创建默认的VCL应用程序并运行的主要形式总是出现在第一个显示器的应用是有办法让它出现在第二台显示器默认?如何让主要形式出现在第二个显示器

这在IDE或财产或代码可能会选择

感谢

+1

*默认*?不是。在代码中?是。 –

+2

通常我会建议你不要这样做。让用户放置表单,但记住他们留下的位置,并在下次显示时将其放回原处。您的设计远离了用户的控制。 –

+0

当第二个监视器不存在时,此设计也会失败。因此,正如David所说,常见模式是在关闭时记住表单的X,Y位置,如果这仍然是可见监视器上的可见区域,则可以在恢复时将其用作初始位置。如果您想要小心,并且在显示器布局更改时不让表单显示在用户看不到的地方,那么允许保存表单位置的代码有相当多的代码。 –

TForm具有被默认设置为dmActiveForm一个DefaultMonitor属性。当没有窗体处于活动状态时,将使用主监视器。但是,无法将DefaultMonitor专门设置为第二台显示器。

TForm也有Monitor属性,但不管是什么原因,它是只读的。

因此,可以显示特定的监视器上TForm,你可以找到在全球TScreen.Monitors[]列表中选择所需的监听,然后或者:

  1. 手动设置窗体的Left/Top属性的X/Y坐标位于显示器的BoundsRectWorkareaRect属性的范围内。

  2. 显示器传递到窗体的公共MakeFullyVisible()方法。

+0

* TForm的也有监视器属性,但不管是什么原因,它是只读的* - 我并不感到惊讶有关此属性为只读。如果您设置此属性,该表单应该做什么?我无法想象 –

+0

@SirRufo也能做到这一点'MakeFullyVisible()'alrwady做同样的事情 - 窗体移动到指定的显示器 –

+0

也许吧,但MakeFullyVisible做多只改变显示器和名称的方法告诉你那。只是改变属性可能会导致一些不需要的行为。我会将它作为只读实现 –

我有两个1600像素宽度的显示器。我的主显示器位于右侧,因此,为了在左侧放置一个窗体,我必须为他的Left属性传递负值。

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    // (3200/2 = + 1600) * -1 = -1600 
    Left := (Screen.DesktopWidth div 2) * -1; 
end; 

结果是-1600这意味着我的辅助显示器的左边最多。

您也可以通过调用Screen.Monitors[i].Left,像这样的代码获取每个监视器的“最左”位置:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    I: Integer; 
    lMens: string; 
begin 
    lMens := ''; 
    for I := 0 to Screen.MonitorCount - 1 do 
    begin 
    lMens := lMens + ' | ' 
      + Format('%d - Left = %d', [i, Screen.Monitors[i].Left]) 
    end; 
    ShowMessage(lMens); 
end; 

我希望帮助的你。