PopupMenuItem Click和MouseOver之间的区别

时间:2011-06-13 09:07:49

标签: delphi contextmenu delphi-2007

当菜单项有子菜单时,鼠标悬停在子菜单上会触发点击事件。

此点击事件与用户实际点击后是否存在差异?

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

修改 德尔福2007

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不确定这适用于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所理解的那样,即使您将此代码放在辅助单元中,也能保证这一点。