gpt4 book ai didi

Delphi TPageControl 没有响应点击选项卡

转载 作者:行者123 更新时间:2023-12-03 19:45:01 29 4
gpt4 key购买 nike

我在主窗体上有一个带有 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 处理程序在第一次之后不会被触发。呸呸呸。

    我仍然无法理解为什么它现在可以工作,这有点令人担忧。我如何让它再次最小化?

    最佳答案

    完全从 5 年前的内存开始工作,但这里是:

    TPageControl 为其中的每个页面使用不同的窗口句柄。标签栏是它自己的窗口句柄,TPageControl 负责监听标签的变化并做出相应的页面隐藏/显示。因此,当您单击一个选项卡并且该选项卡跳转到包的前面时,TPageControl 应该隐藏当前页面窗口并显示与所选选项卡对应的页面窗口。

    通常,VCL 控件在实际需要它之前不会创建它们的窗口句柄——例如,当它实际显示时。这减少了窗口句柄消耗。在 Windows 3.1 和 Win95 中至关重要,但在当今基于 NT 的 32 位操作系统中并不那么重要。

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

    单击选项卡时未绘制页面的原因有几种可能性:

  • 耗尽 GDI 窗口句柄池。除非您使用的是 16 位 Windows 操作系统,否则极不可能。 (Win 3.1 或 Win95)
  • 内存泄漏导致您的应用程序溢出到交换文件中并破坏硬盘。该应用程序将几乎停止运行,并且看起来像是被卡住了,不时会出现 UI 事件的打嗝。
  • 在没有消息循环的后台线程上创建窗口句柄。你在后台线程中做任何事情吗?在后台线程中触摸 VCL 控件会导致过早创建窗口句柄,并且窗口句柄将绑定(bind)到创建它的线程。如果该线程没有消息循环,则该窗口句柄将永远不会收到任何消息,因此它永远不会在屏幕上绘制自己。

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

    关于Delphi TPageControl 没有响应点击选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242359/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com