【问题标题】:The difference between PopupMenuItem Click and MouseOverPopupMenuItem Click 和 MouseOver 的区别
【发布时间】:2011-09-13 18:49:03
【问题描述】:

当一个菜单项有一个子菜单时,鼠标悬停会展开子菜单,它会触发一个点击事件。

这个点击事件和用户实际点击有什么区别吗?

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

编辑 德尔福 2007

【问题讨论】:

  • 您使用的是哪个版本的 Delphi?
  • 出于好奇:您为什么想知道一种方式或另一种方式?在这两种情况下子菜单都应该展开?
  • @Marjan - 我正在用菜单系统模仿树形结构,其中不仅叶节点是可选的,因此它需要在悬停时展开,但在单击时需要“选中”。我想我会重新设计那个屏幕的 GUI,现在我有了这个答案。

标签: delphi contextmenu delphi-2007


【解决方案1】:

不确定这是否适用于 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 unit initialization order 了解到的那样,即使您将此代码放在辅助单元中也是可以保证的。

【讨论】:

    【解决方案2】:

    不,没有。如果用户单击该项目或将其悬停,则会触发相同的 OnClick 事件。
    我已经检查了 Delphi 2009

    【讨论】:

      【解决方案3】:

      好吧,如果用户实际点击了带有子菜单项的 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;
      

      【讨论】:

      • 如果用户点击该项目或将其悬停;调用了相同的TMenuItem.Click 方法(并从该方法中触发OnClick 事件),因此它们是相同的。正如您在此处指出的那样,您可以区分菜单项是否有任何子项,但您无法确定用户是单击还是悬停。
      • 是的,你可以:如果有子菜单,单击菜单项不会导致 OnClick 事件。如果没有子菜单,悬停菜单项不会导致 OnClick 事件。
      • 不,你不能。我们谈论的是当您拥有带有一些子项目的项目时的情况;从悬停触发的 OnClick 和真正的点击之间没有区别。至少在 2009 年。
      • 好的,那么这个行为在 D7 之后的某处有所改变。
      猜你喜欢
      • 2011-12-22
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多