-->

德尔福TPageControl没有响应点击选项卡(Delphi TPageControl not r

2019-09-25 17:16发布

我有一个在主窗体上一个TPageControl的应用程序。 该的PageControl有几个标签。 该应用程序可以被最小化到一个托盘图标。 最小化运行了一段时间后,有时,当我恢复主窗口(通过鼠标右键点击系统托盘图标),显示这是最后显示的标签,但我不能选择其它任何标签!

如果我单击另一个选项卡上,外观上的变化,使选项卡,然后似乎是一个积极的(即标签自身移动到标签行的前面),但该选项卡的身体保持原样。 我也有菜单项和快捷键选择其他选项卡,它们具有相同的行为。 如果我按Alt-O(选项)顶部的选项标签被激活,但我不能看到什么是对标签的身体 - 我仍然看到其他选项卡的内容。

我已经验证了焦点,当我点击其他选项卡,移回当我点击该选项卡上移开第一个标签。

我如果行为被限制在一个特定的标签,因为它需要一段时间,它的出现还没有建立。

有任何想法吗?

更新

有趣的说明。 我已经确定,在这种情况下出现问题。 该应用程序已启动,然后最小化到托盘。 警报条件被检测到,弹出一个窗口,并恢复主窗口(这是为了该应用的行为)。 正是在这点故障被发现 - 也就是我看不到其他选项卡,当我点击它们。

  • 启动应用程序。 标签1显示
  • 最小化应用程序。 到托盘
  • 等待弹出显示,主要形式恢复
  • 点击选项卡2 FAULT观测结果(表2的身体不显示)
  • 把断点TWinControl.CreateHandle
  • 点击选项卡3 - 休息
  • 运行 - 不显示标签3体
  • 点击选项卡1 - 不破
  • 点击选项卡3 - 不破
  • 点击选项卡4 - 休息
  • 运行 - 不显示选项卡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处理程序不会在第一时间拿到后触发。 Grrrrr。

我仍然无法捉摸,为什么现在的工作,这是一个有点令人担忧。 我如何得到它的最小化?

Answer 1:

完全由5年前的记忆工作,但这里有云:

TPageControl用来在它的每一页不同的窗口句柄。 标签栏是自己的窗口句柄,并TPageControl负责听取标签的变化,使页面的相应隐藏/显示。 所以,当你点击一个标签,标签跳转到包的面前,TPageControl应该隐藏当前网页窗口,并显示对应于所选选项卡页面窗口。

通常情况下,直到它真正需要的VCL控件不创建自己的窗口句柄 - 当它的实际显示,例如。 这减少了窗口句柄消耗。 在Windows 3.1和Win95的极为重要的,但基于32位操作系统在当今的NT不那么重要。

为了最大限度地减少资源负载和启动时间,TPageControl不创建创建控件时,其所有隐藏的页面窗口句柄。 当首次显示页面窗口句柄将被创建。

还有为什么被点击选项卡时没有被绘制在页面几种可能性:

  1. 耗尽GDI窗口句柄池。 极不可能的,除非你使用的是16位Windows操作系统。 (胜3.1或Win95的)
  2. 内存泄漏导致您的应用程序溢出到交换文件和鞭打硬盘。 该应用程序将陷于停顿附近,看起来像它的冻结,UI活动的打嗝飘飞。
  3. 上有没有消息循环后台线程创建窗口句柄。 你在做后台线程什么? 触摸在后台线程中VCL控制可能会导致过早创建的窗口句柄和窗口句柄将被绑定到创建它的线程。 如果线程没有消息循环,则该窗口句柄将永远不会收到任何消息,所以它不会自行绘制在屏幕上。

3号是你最有可能是罪魁祸首。 那么,什么是你在后台线程在做什么? ;>



文章来源: Delphi TPageControl not responding to clicks on tabs