我需要这个解决方案的帮助。 有几种形式的应用程序。需要在选定的监视器上打开其中一个表单。例如: 解决方案1.如果使用多个监视器,则OnCreate表单,并在最后一个监视器上打开。我试试这段代码,但没有运气:
"GPA.1234-5678-9012-34567" (base order number)
"GPA.1234-5678-9012-34567..0" (first recurrence orderID)
"GPA.1234-5678-9012-34567..1" (second recurrence orderID)
"GPA.1234-5678-9012-34567..2" (third recurrence orderID)
解决方案2.将表单拖动到选定的监视器,并将OnDestroy事件的Top和Left位置写入INI文件。下次表格在同一台显示器和相同位置打开。我试试这段代码,但也没有运气:
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;
答案 0 :(得分:5)
frmDashboard.Top:= ...
frmDashboard.Top:= ...
这似乎是一个简单的复制粘贴错误。您设置Top
两次。大概你的意思是:
frmDashboard.Top:= ...
frmDashboard.Left:= ...
这段代码犯了同样的错误:
if Screen.MonitorCount > 1 then
begin
frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Top;
frmDashboard.Top:= Screen.Monitors[i].BoundsRect.Left;
end;
此外,当i
定义不明确时,它会引用OnCreate
。编译器会警告这一点。我希望你启用编译器警告和提示,并注意它们。
如果INI文件包含无效数据,则您的StrToInt
事件处理程序将引发异常。例如,如果用户将位置值编辑为非数字,则OnCreate
将引发异常。你的程序应该具有弹性。
OnDestroy
和StrToInt
事件处理程序都无法正确管理INI文件对象的生命周期。如果INI文件访问失败,或者对obj := TMyObject.Create;
try
// do things with obj
finally
obj.Free;
end;
的调用失败(参见上文),那么您将泄漏该对象。这是要遵循的模式:
newIncome