【问题标题】:Is there a workaround for something like "Form1.MousePreview:=true"?是否有类似“Form1.MousePreview:=true”的解决方法?
【发布时间】:2026-02-09 18:05:02
【问题描述】:

我在一个表单上有两个 100% 重叠的面板,它们的内容不同。
默认情况下,第一个(信息的静态显示)应该是可见的,但是如果用户将鼠标移到两者附近,则另一个(用户交互)应该替换它 - 如果鼠标移开,它应该切换回来。
像这样的:

if (*the mouse is near*) then
begin
  Panel1.Hide;
  Panel2.Show;
end
else
begin
  Panel2.Hide;
  Panel1.Show;
end;

我的问题是:在哪里捕捉鼠标移动?
每个组件都有自己的 OnMouseMove 处理程序 - 当然我可以将它们中的每一个转发到表单处理程序,但我宁愿有一些更优雅(并且更易于维护)的东西。
完美的解决方案类似于Form1.MousePreview := true;

另一种解决方案是分配一个通用处理程序来转换坐标并调用表单处理程序;分配可以在 FormCreate 中完成。
但这并不像看起来那么容易,因为一个 TImage 已经有自己的鼠标事件处理程序。

我已经尝试了OnMouseEnterOnMouseLeave 的两个面板,但没有成功; #1 消失了,但 #2 没有出现。我猜那是因为如果鼠标离开 Panel2,它应该会消失 - 但如果它输入一个按钮,它也会离开它。
这就是为什么我想使用基于坐标的方法来使检查更加可靠。

也许两个面板的方法是完全错误的?

更新:是的,正如雷米所说。
我现在使用的是 TJVPageList,因为 TPageControl 有可视标签。
PageList 的OnMouseEnter 处理程序设置一页,OnMouseLeave 设置另一页;但是一旦鼠标移到 PageList 上,两个页面都开始闪烁。 我也尝试将事件处理程序添加到每个页面,但这没有任何区别。
我应该检查 所有 OnMouseEnter / Leave 事件以过滤掉 PageList、两个页面和页面上的所有组件吗?

另一个更新:我现在使用的是 TPageControl,但行为类似。
它不会闪烁,但如果我将鼠标移动到 TPageControl 上,则根本不会显示 TTabSheet。
只有当我按下鼠标左键时,才会显示 UI 表。如果我移开鼠标,另一张纸会正常显示。 (如果我按下鼠标左键,TJVPageList 也会显示 UI 页面。)
我使用了 TPageControl 和 TTabSheets 的鼠标事件处理程序(进入/离开)。

更新 3: 完成了。 静态 Panel / TabSheet / JvStandardPage (#1) 不得触发 OnMouseLeave 处理程序。

【问题讨论】:

  • 您可以通过将每个TTabSheetTabVisible 属性设置为false 来关闭TPageControl 的选项卡。
  • 非常感谢 - 我正在 TPageControl 本身上搜索该属性。

标签: delphi mouseevent vcl mousemove


【解决方案1】:

使用单个 TPageControl 而不是两个 TPanel 控件可能会更好地满足您的描述。使用TPageControl自己的OnMouseEnter/Leave事件(或拦截CM_MOUSEENTER/LEAVE消息)根据需要切换TPageControl.ActivePage

【讨论】:

  • 感谢您的提示,这比两个面板要好得多。但它仍然无法按预期工作 - 请参阅编辑后的答案