我有两个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已经具有自己的鼠标事件处理程序。
我尝试了两个面板的
OnMouseEnter
和OnMouseLeave
,但是没有用; #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/