Delphi菜单选择

时间:2011-10-03 13:53:51

标签: delphi menu listener

我的问题是如何捕捉以某种形式按下的菜单项?举个例子:

我有一个带按钮的表格。当我按下按钮时,应用程序的菜单将处于焦点,子表单等待选择菜单项。在我选择一个之后,子表单显示一条消息,其中包含我按下的菜单项的名称。

谁能告诉我怎么做?

提前致谢!

2 个答案:

答案 0 :(得分:2)

这样的事情直接回答了你的问题:

procedure TMyForm.MenuItemClick(Sender: TObject);
begin
  ShowMessage((Sender as TMenuItem).Caption);
end;

此事件处理程序应连接到您希望以这种方式运行的每个菜单项。


您似乎想要一些集中记录或监视菜单项的执行。如果您使用操作并将这些操作与菜单项相关联,那么您可以获得已执行操作的应用程序范围通知。将TApplicationEvents对象拖放到主表单上并处理其OnActionExecute事件。像这样:

procedure TMyForm.ApplicationEvents1ActionExecute(Action: TBasicAction; var Handled: Boolean);
begin
  ShowMessage((Action as TAction).Caption);
end;

只要您的应用中的任何事件被执行,就会触发。

答案 1 :(得分:1)

  • 1 /默认情况下,您将所有TMenuItem OnClick事件处理程序设置为Nil。
  • 2 /当您单击表单按钮时,为每个TMenuItem分配一个事件,此事件将仅被调用一次,并将记录“触发器”。
  • 3 /当事件被调用时,您将所有TMenuitem.OnClick重置为Nil
  • 4 /要制作此ea​​syer,请将所有MenuItem存储在TList中。

示例:

全局变量(TMyForm中的私有声明):

MyTriggerItem: TMenuItem; // used as pointer
MyMenuItemList: TList; // used to store all TMenuItem which are 'listened to'

你的TButton处理程序:

Procedure TMyForm.ButtonClick(Sender: TObject);
Var
  i: Integer;
Begin
  For i:= 0 To Pred(MyMenuItemList.Count) Do TMenuItem(MyMenuItemList[i]).OnCLick := CommonMenuItemClick;    
End;        

您的TMenuItem事件处理程序:

Procedure TMyForm.CommonMenuItemClick(Sender: TObject);
Var
  i: Integer;
Begin
  MyTriggerItem := TMenuItem(Sender);
  For i:= 0 To Pred(MyMenuItemList.Count) Do TMenuItem(MyMenuItemList[i]).OnCLick := Nil;
End;