我有一个监控应用程序,可以自动将其主窗口放在辅助监视器上(如果可用)。
我正在尝试使用备忘录添加“启动画面”以显示启动时的进度。我希望启动画面在主(默认)监视器上显示10秒钟(在主窗口出现后仍然可见,但是启动画面有控制因此也可以手动关闭)。启动屏幕在初始化的早期就出现了预期,但是当它出现时,我用来将主窗体移动到辅助监视器的代码停止工作。主窗体最终定位在主监视器的左上方。我已经确认报告了是否显示了相同的显示器数量和相同的像素尺寸。
这是我用来定位主窗体的代码:
if ExtraMonitorToUse < screen.monitorcount then // it is available for use
with screen.monitors[ExtraMonitorToUse] do // set the main form to top left of selected monitor
begin
WriteGenLog(format('Self: original coordinates: L%d T%d <--- screen.monitors: L%d, T%d ',[self.left, self.top, left, top]), true);
self.left := left;
self.top := top;
WriteGenLog(format('Self: new coordinates: L%d T%d ', [self.left, self.top]), true);
WriteGenLog(format('Moved form to Monitor %d ', [Monitornum]), true);
end;
以下是我创建启动画面的方法:(在应用程序的DPR文件中)
begin
{ Create the splash Screen }
Splash := TSplash.Create(Application);
{ Show the splash Screen }
Splash.show;
{ Update the splash Screen so that all components on it are
visible }
Splash.update;
Application.Initialize;
<..... snip .... >
end;
如果我在前面的代码块中注释掉“Application.Initialize”上面的行,则主窗体定位可以正常工作。 为什么创建Splash表单会导致主窗体的定位停止工作?
编辑 - 来自日志文件的更多信息......
以下是启用启动画面的日志结果:
Monitor 0 Primary
Monitor 0 Workarea L0 T0 R1920 B1200
Monitor 0 Workarea L0 T0 R1920 B1200
Monitor 1 Workarea L1920 T0 R2560 B480
Monitor 1 Workarea L1920 T0 R2560 B480
Self: original coordinates: L268 T142 <--- screen.monitors: L1920, T0
Self: new coordinates: L1920 T0
Moved form to Monitor 1
以下是启动画面注释掉的日志结果:
Monitor 0 Primary
Monitor 0 Workarea L0 T0 R1920 B1200
Monitor 0 Workarea L0 T0 R1920 B1200
Monitor 1 Workarea L1920 T0 R2560 B480
Monitor 1 Workarea L1920 T0 R2560 B480
Self: original coordinates: L268 T142 <--- screen.monitors: L1920, T0
Self: new coordinates: L1920 T0
Moved form to Monitor 1
就所报告的职位而言,一切都是一样的。但是,“自我”的地位变化是行不通的。它也不会与Splash屏幕混淆,因为闪屏的位置也保持在主显示器的中心位置。