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)
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则会引发异常.你的程序应该具有弹性.
无论是OnCreate与OnDestroy事件处理程序不正确地管理INI文件对象的生命周期.如果INI文件访问失败,或者调用StrToInt失败(见上文),那么您将泄漏对象.这是要遵循的模式:
obj := TMyObject.Create;
try
// do things with obj
finally
obj.Free;
end;
Run Code Online (Sandbox Code Playgroud)