当菜单项有子菜单时,鼠标悬停在子菜单上会触发点击事件。
此点击事件与用户实际点击后是否存在差异?
我正在使用TPopupMenu作为cxButton的下拉属性。
修改 德尔福2007
答案 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所理解的那样,即使您将此代码放在辅助单元中,也能保证这一点。