delphi - Delphi中处理TMenuItem.Action.Visible的变化
问题描述
在 Delphi 中,我想处理TMenuItem.Action.Visible
菜单项的属性更改。这作为弹出菜单项放置在TAdvGlowButton.DropDownMenu
属性中。
首先我尝试使用 的OnUpdate
事件TAction
,但是当菜单弹出而不是Visible
真正完成属性更改时,它被提出来太晚了。
同样,用一个处理程序覆盖ActionLink.OnChange
菜单项的属性,该处理程序同时执行原始处理程序和自己的处理程序,也无济于事。
有没有人有解决这个问题的想法?
我希望在Visible
设置属性时引发事件处理程序,而不仅仅是在弹出菜单时。
这些动作不是我创造的。因此,我无法更改它们的类型以使该事件可从外部访问(受保护 -> 公开)。
解决方案
改变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
中连接事件,但它是一种非常方便的方式,可以在某些操作属性更改时获得通知。
推荐阅读
- java - 将标签添加到pdf文件java
- c# - 部分视图中的 ng-app 和 ng-controller 不起作用
- c# - 如何仅从 WPF MVVM 中的调度程序线程以外的线程更新可观察集合中的属性?
- php - 如何按月对mysql中的concat进行分组并显示?
- django - django-auth-ldap 成员组不工作
- python - jira python api问题与search_issues给出不同的结果
- javascript - 如何使用 javascript 和 php 在 $_GET 处获取数组?
- mysql - 在所有表中插入单个 table_name 作为列值
- bash - 如果找到,则使用 awk 替换特定列值
- apache-spark - Hiw 在循环中插入数据框的列值