如何解决PopupMenuItem Click和MouseOver之间的区别
| 当菜单项具有子菜单时,鼠标悬停以展开子菜单,它将触发单击事件。 此点击事件与用户实际点击之间是否有区别? 我正在使用TPopupMenu作为cxButton的下拉属性。 编辑 德尔福2007解决方法
不确定这是否适用于D2007;在D7中您可以尝试以下吗?
type
THackPopupList = class(TPopupList)
private
FActuallyClicked: Boolean;
protected
procedure WndProc(var Message: TMessage); override;
public
property ActuallyClicked: Boolean read FActuallyClicked;
end;
{ THackPopupList }
procedure THackPopupList.WndProc(var Message: TMessage);
begin
FActuallyClicked := Message.Msg = WM_COMMAND;
inherited WndProc(Message);
end;
{ TForm1 }
procedure TForm1.MenuFileOpenClick(Sender: TObject);
var
ActuallyClicked: Boolean;
begin
ActuallyClicked := THackPopupList(PopupList).ActuallyClicked;
...
end;
initialization
PopupList.Free;
PopupList := THackPopupList.Create;
end.
说明:由悬停触发的OnClick由WM_INITMENUPOPUP启动,但是由鼠标单击触发的OnClick由该WM_COMMAND启动。
这取决于已经初始化的Menus.pas。但是,从Delphi单元的初始化顺序可以理解,即使将此代码放在辅助单元中也可以保证。
, 好吧,如果用户实际单击带有子菜单项的MenuItem,则不会触发OnClick事件。因此,区别在于:
procedure TForm1.MenuFileOpenClick(Sender: TObject);
var
ActuallyClicked: Boolean;
begin
ActuallyCLicked := TMenuItem(Sender).Count = 0;
end;
并且如果菜单项具有链接的动作:
procedure TForm1.FileOpenExecute(Sender: TObject);
var
ActuallyClicked: Boolean;
begin
if Sender is TBasicAction then
Sender := TBasicAction(Sender).ActionComponent;
ActuallyCLicked := TMenuItem(Sender).Count = 0;
end;
, 不,没有。如果用户单击该项目或将其悬停,则将触发相同的OnClick事件。
我已经在Delphi 2009中进行了检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。