delphi - 扩展屏幕中所有菜单项的 OnClick 事件以执行另一段代码

标签 delphi delphi-5

我想为屏幕上的所有 TMenuItems 设置一个事件 OnClick 来执行该事件当前执行的操作,以及另外几行代码。我目前使用的是 Delphi 5

例如,假设我有一个 TMenuItem ,其代码为:

procedure TdesktopForm.MenuFoo1Click(Sender: TObject);
begin
  ShowMessage(TComponent(Sender).Name)
end;

我还有以下程序:

procedure TdesktopForm.bar;
begin
  ShowMessage('extra')
end;

我希望每次单击 TMenuItem 时程序都会显示 TMenuItem 的名称以及“额外”消息。

所示的示例只是我的问题的演示,因为在真实的软件中我有超过 300 个菜单项,我想通用地执行此操作,因此我不必向所有当前的菜单点击添加额外的代码行,当我添加新菜单项时也不添加它们。执行顺序(在菜单单击和额外的代码块之间)并不重要。

我尝试使用TActionList,但我无法检索触发该操作的对象,因此,我无法打印它的名称。我尝试使用 ActiveControl,但它总是返回当前聚焦的焦点对象,而不是我单击的实际菜单。而且,TAction 执行事件会覆盖我的 TMainMenu.OnClick 事件

最佳答案

只要所有事件处理程序在某个时刻(无论是在设计时还是在运行时)分配并且之后不更改,您就可以执行以下操作:

  1. 枚举菜单中的所有菜单项
  2. 为每个对象创建一个如下所述的对象

    type
      TEventInterceptor = class(TComponent)
      private
        FOrigEvent: TNotifyEvent;
        FAdditionalEvent: TNotifyEvent;
        procedure HandleOnClick(_Sender: TObject);
      public
        constructor Create(_MenuItem: TMenuItem; _AdditionalEvent: TNotifyEvent);
      end;
    
    constructor TEventInterceptor.Create(_MenuItem: TMenuItem; _AdditionalEvent: TNotifyEvent);
    begin
      inherited Create(_MenuItem);
      FOrigEvent := _MenuItem.OnClick;
      FAdditionalEvent := _AdditionalEvent;
      _MenuItem.OnClick := HandleOnClick;
    end;
    
    procedure TEventInterceptor.HandleOnClick(_Sender: TObject);
    begin
      FOrigEvent(_Sender);
      FAdditinalEvent(_Sender);
    end;
    

请注意,此代码完全未经测试,甚至可能无法编译。 我也不确定这是否适用于 Delphi 5。不过它适用于 Delphi 6,所以机会很大。

编辑: 一些附加说明(感谢您的评论):

  • 从 TComponent 继承此类使得表单在销毁时自动释放它。
  • HandleOnClick 应该在调用之前检查 FOrigEvent 是否已分配。

关于delphi - 扩展屏幕中所有菜单项的 OnClick 事件以执行另一段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55476267/

相关文章:

delphi - 从命令行增加 Delphi XE 项目版本号

delphi - Delphi的Exit语句危险吗?

string - 我可以访问从 Delphi CreateProcess 命令返回的字符串吗?

delphi - Delphi Indy SMTPServer读取多部分消息

delphi - 在我的应用程序的安装程序中嵌入 Firebird 安装的最佳方式是什么?

windows - 我的 32 位应用程序可以做什么来消耗数 GB 的物理 RAM?

delphi - 如何更新旧版 Windows 用户界面的外观?

delphi - 为什么在Delphi中调用函数时不用逗号分隔参数?

delphi - 如何处理 D5/D7 中的 PByte 指针操作(运算符不适用于该操作数类型)

delphi - 在 Delphi 中为不可见 ActiveX 对象事件处理程序生成代码