首页 > 解决方案 > Delphi中处理TMenuItem.Action.Visible的变化

问题描述

在 Delphi 中,我想处理TMenuItem.Action.Visible菜单项的属性更改。这作为弹出菜单项放置在TAdvGlowButton.DropDownMenu属性中。

首先我尝试使用 的OnUpdate事件TAction,但是当菜单弹出而不是Visible真正完成属性更改时,它被提出来太晚了。

同样,用一个处理程序覆盖ActionLink.OnChange菜单项的属性,该处理程序同时执行原始处理程序和自己的处理程序,也无济于事。

有没有人有解决这个问题的想法?

我希望在Visible设置属性时引发事件处理程序,而不仅仅是在弹出菜单时。

这些动作不是我创造的。因此,我无法更改它们的类型以使该事件可从外部访问(受保护 -> 公开)。

标签: delphi

解决方案


改变Visible动作属性的明显地方是它的OnChange事件。可惜这个事件没有public,更不用说published

尽管如此,还是有一种方法可以OnChange使用class helper.

class helper在新的(或合适的现有)单元中创建。这是一个工作示例:

unit ActionHelper;

interface

type
  TActionHelper = class helper for TBasicAction
  private
    function GetOnChange: TNotifyEvent;
    procedure SetOnChange(const Value: TNotifyEvent);
  public
    property OnChange: TNotifyEvent read GetOnChange write SetOnChange;
  end;

implementation

function TActionHelper.GetOnChange: TNotifyEvent;
begin
  Result := inherited OnChange;
end;

procedure TActionHelper.SetOnChange(const Value: TNotifyEvent);
begin
  inherited OnChange := Value;
end;

end.

每当您将此单元添加到使用子句时,您都可以将OnChange任何TBasicAction后代的属性连接到适当的事件处理程序。

虽然这直到不允许在Object InspectorOnChange中连接事件,但它是一种非常方便的方式,可以在某些操作属性更改时获得通知。


推荐阅读