Delphi PopupMenuItem Click和MouseOver之间的区别
当菜单项的子菜单悬停时,鼠标会展开子菜单,并触发单击事件 这个点击事件和用户是否真的点击有什么区别吗 我正在使用TPopupMenu作为cxButton的下拉属性 编辑Delphi PopupMenuItem Click和MouseOver之间的区别,delphi,contextmenu,delphi-2007,Delphi,Contextmenu,Delphi 2007,当菜单项的子菜单悬停时,鼠标会展开子菜单,并触发单击事件 这个点击事件和用户是否真的点击有什么区别吗 我正在使用TPopupMenu作为cxButton的下拉属性 编辑 德尔福2007没有。如果用户单击该项目或将其悬停,则会触发相同的OnClick事件。 我已经为Delphi 2009检查了这个问题。如果用户实际单击带有子菜单项的菜单项,则不会触发OnClick事件。因此,区别在于: procedure TForm1.MenuFileOpenClick(Sender: TObject); var
德尔福2007没有。如果用户单击该项目或将其悬停,则会触发相同的OnClick事件。
我已经为Delphi 2009检查了这个问题。如果用户实际单击带有子菜单项的菜单项,则不会触发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;
不确定这是否适用于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_命令启动
这取决于已经初始化的Menus.pas。但据我从中了解,即使您将此代码放在辅助装置中,这也是有保证的。如果用户单击该项或将其悬停;相同的
TMenuItem.Click
方法被调用(并且从该方法OnClick
事件触发),因此它们是相同的。正如您在这里指出的,您可以区分菜单项是否有任何子项,但无法确定用户是否单击或只是悬停。是的,您可以:如果有子菜单,单击菜单项不会导致OnClick事件。如果没有子菜单,将菜单项悬停不会导致OnClick事件。不,您不能。我们所说的情况是,当您有带有某些子项的项时;从hover触发的OnClick和真正的click没有区别。至少在D2009中是这样。好的,那么这种行为在D7之后的某个地方发生了变化。您使用的是哪个版本的Delphi?出于好奇:您为什么想知道这种或那种方法?在这两种情况下,子菜单都应该展开?@Marjan-I使用菜单系统模拟树形结构,其中不仅叶节点是可选择的,因此它需要在悬停时展开,而且在单击时“选中”。我想现在我有了这个答案,我将重新设计该屏幕的GUI,使其更加合理。