我在主窗体上有一个带有 TPageControl 的应用程序。pagecontrol 有几个选项卡。该应用程序可以最小化为托盘图标。有时在运行最小化一段时间后,当我恢复主窗口(通过鼠标右键单击托盘图标)时,会显示最后显示的选项卡,但我无法选择任何其他选项卡!
如果我单击另一个选项卡,则外观会发生变化,因此该选项卡似乎是活动选项卡(即选项卡本身移动到选项卡行的前面),但选项卡的主体保持原样。我也有菜单项和快捷键来选择其他选项卡,它们的行为相同。如果我键入 Alt-O(选项),顶部的选项选项卡将变为活动状态,但我看不到该选项卡主体上的内容 - 我仍然看到另一个选项卡的内容。
我已经验证,当我单击另一个选项卡时焦点会从第一个选项卡上移开,而当我单击该选项卡时焦点会移回。
我尚未确定该行为是否仅限于特定选项卡,因为它需要一段时间才能发生。
有任何想法吗?
更新
有趣的笔记。我已经确定问题是在这些情况下发生的。应用程序启动,然后最小化到托盘。检测到警报条件,弹出一个窗口并恢复主窗口(这是应用程序的预期行为)。正是在这一点上观察到了故障——即,当我单击其他选项卡时,我看不到它们。
- 启动应用程序。显示选项卡 1
- 最小化应用程序。到托盘
- 等待弹出窗口显示,主窗体已恢复
- 单击选项卡 2 FAULT OBSERVED(选项卡 2 正文不显示)
- 在 TWinControl.CreateHandle 中放置断点
- 单击选项卡 3 - 休息
- 运行 - 不显示 Tab 3 正文
- 单击选项卡 1 - 不会中断
- 单击选项卡 3 - 不会中断
- 单击选项卡 4 - 中断
- 运行 - 不显示 Tab 4 正文
- 单击选项卡 1、2、3、4 - 不会中断
因此,似乎选项卡在第一次单击时创建了它们的句柄,从那时起,它们认为它们存在,但它们不显示。如果弹出窗口被禁用,则不会观察到故障。弹出窗口由 Application.OnIdle 任务触发。
另一个更新:一些进展。在网上闲逛之后,我做了一些改变。
我删除了以下代码:
procedure RestoreMainWindow ;
begin
MainForm.WindowState := wsNormal ;
MainForm.visible := true ;
Application.Restore ;
Application.BringToFront ;
ShowWindow (Application.Handle, SW_SHOW) ; { show the taskbar button }
end ;
并将其替换为:
procedure RestoreMainWindow ;
begin
MainForm.Show () ;
MainForm.WindowState := wsNormal ;
Application.BringToFront () ;
ShowWindow (Application.Handle, SW_SHOW) ; { show the taskbar button }
end ;
我删除了:
procedure TTADMainForm.SendToTray (Sender: TObject) ;
begin
MainForm.visible := false ;
ShowWindow (Application.Handle, SW_HIDE) ; { hide the taskbar button }
end ;
...
Application.OnMinimize := SendToTray ;
并将其替换为:
procedure TTADMainForm.ApplicationEvents1Minimize(Sender: TObject) ;
begin
Hide();
WindowState := wsMinimized ;
TrayIcon1.Visible := True;
end ;
问题似乎已经消失了。然而。现在我可以在启动后最小化应用程序,弹出窗口并以模态方式显示,主窗体显示,所有选项卡显示和工作。但。我无法再次最小化表单。OnMinimize 处理程序在第一次之后不会被触发。呸呸呸。
我仍然无法理解为什么它现在可以工作,这有点令人担忧。我如何让它再次最小化?