Delphi - 在第二台显示器上打开表格

Min*_*gas 1 forms delphi multiple-monitors

我需要这个解决方案的帮助.有几种形式的应用程序.需要在选定的监视器上打开其中一个表单.例如:解决方案1.如果使用多个监视器,则OnCreate表单,并在最后一个监视器上打开.我试试这个代码,但没有运气:

  Application.CreateForm(TfrmDashboard, frmDashboard);
  for I := 0 to Screen.MonitorCount -1 do
  begin
    // Checking Screen Position
    ShowMessageFmt('%d, %d, %d, %d',
              [Screen.Monitors[i].BoundsRect.Left,
              Screen.Monitors[i].BoundsRect.Top,
              Screen.Monitors[i].BoundsRect.Right,
              Screen.Monitors[i].BoundsRect.Bottom]);
  end;

  if Screen.MonitorCount > 1 then
  begin
      frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Top;
      frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Left;
  end;
Run Code Online (Sandbox Code Playgroud)

解决方案2.将表单拖动到选定的监视器,并将OnDestroy事件的Top和Left位置写入INI文件.下次表格在同一台显示器和相同位置打开.我试试这段代码,但也没有运气:

procedure TfrmDashboard.FormCreate(Sender: TObject);
var
    ini: TIniFile;
begin
    ini:= TIniFile.Create(extractfilepath(paramstr(0))+'Dashboard.ini');
    Left:= StrToInt(ini.ReadString('Left', 'Form_Left', '0'));
    Top:= StrToInt(ini.ReadString('Top', 'Form_Top', '0'));
    ini.Free;
end;

procedure TfrmDashboard.FormDestroy(Sender: TObject);
var
    ini: TIniFile;
begin
    ini:= TIniFile.Create(extractfilepath(paramstr(0))+'Dashboard.ini');
    ini.WriteString('Left', 'Form_Left', IntToStr(Left));
    ini.WriteString('Top', 'Form_Top', IntToStr(Top));
    ini.Free;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

frmDashboard.Top:= ...
frmDashboard.Top:= ...
Run Code Online (Sandbox Code Playgroud)

这似乎是一个简单的复制粘贴错误.你设定Top了两次.大概你的意思是:

frmDashboard.Top:= ...
frmDashboard.Left:= ...
Run Code Online (Sandbox Code Playgroud)

这段代码犯了同样的错误:

if Screen.MonitorCount > 1 then
begin
  frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Top;
  frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Left;
end;
Run Code Online (Sandbox Code Playgroud)

此外,它指的是i何时定义不明确.编译器会警告这一点.我希望你启用编译器警告和提示,并注意它们.


OnCreate如果INI文件中包含无效数据的事件处理程序将引发异常.例如,如果用户将位置值编辑为非数字,StrToInt则会引发异常.你的程序应该具有弹性.

无论是OnCreateOnDestroy事件处理程序不正确地管理INI文件对象的生命周期.如果INI文件访问失败,或者调用StrToInt失败(见上文),那么您将泄漏对象.这是要遵循的模式:

obj := TMyObject.Create;
try
  // do things with obj
finally
  obj.Free;
end;
Run Code Online (Sandbox Code Playgroud)