我有两个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处理程序。

最佳答案

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

关于delphi - 是否有类似“Form1.MousePreview:= true”之类的解决方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13904037/

10-12 12:30