Разница между щелчком PopupMenuItem и MouseOver - PullRequest
3 голосов
/ 13 июня 2011

Когда у пункта меню есть подменю, при наведении курсора мыши подменю расширяется и запускается событие щелчка.

Есть ли разница между этим событием клика и тем, действительно ли пользователь щелкает?

Я использую TPopupMenu как раскрывающееся свойство cxButton.

EDIT Delphi 2007

Ответы [ 3 ]

0 голосов
/ 13 июня 2011

Что ж, если пользователь фактически щелкает элемент 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;
0 голосов
/ 13 июня 2011

Не уверен, что это будет работать с 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 , это гарантировано, даже если вы поместите этот код во вспомогательный модуль.

0 голосов
/ 13 июня 2011

Нет, нет.Если пользователь щелкает элемент или наводит на него курсор, происходит то же самое событие OnClick .
Я проверил это для Delphi 2009 .

...