Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi PopupMenuItem Click和MouseOver之间的区别_Delphi_Contextmenu_Delphi 2007 - Fatal编程技术网

Delphi PopupMenuItem Click和MouseOver之间的区别

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

当菜单项的子菜单悬停时,鼠标会展开子菜单,并触发单击事件

这个点击事件和用户是否真的点击有什么区别吗

我正在使用TPopupMenu作为cxButton的下拉属性

编辑
德尔福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,使其更加合理。