【发布时间】:2016-03-09 01:45:17
【问题描述】:
我有一个项目(Delphi 10 Seattle,win32),其中包含许多菜单和这些菜单中的许多项目。有些菜单项是在设计时创建的,有些是在运行时创建的。
我要做的是在触发 OnClick 事件时记录有关 TMenuItem 的一些信息,例如名称/标题、时间戳等。
我可以简单地在分配给 TMenuItem OnClick 事件的每个函数的开头添加一个过程调用,但我想知道是否有更优雅的解决方案。
还要注意,我尝试过Embarcadero's AppAnalytics,但我发现它没有提供我想要的信息或灵活性,而且价格相当昂贵。
编辑:我将添加更多信息,详细说明我考虑过的选项(我可能一开始就应该这样做)。
向我要记录的每个菜单项单击添加一个简单的功能,这意味着要为很多功能执行此操作,并且必须将其添加到添加的每个新菜单项中。
procedure TSomeForm.SomeMenuItem1Click(Sender: TObject);
var
item : TMenuItem;
begin
item := Sender as TMenuItem;
LogMenuItem(item); // Simple log function added to the start of each menuitem click
end;
通过“更优雅的解决方案”,我的意思是可以添加一个“挂钩”,以便所有 TMenuItem OnClick 事件在调用分配给 OnClick 事件的过程之前触发另一个过程(它将执行日志记录)。
或者我考虑的另一个选项是创建一个从 TMenuItem 继承的类,该类将覆盖 TMenuItem.Click 并在生成 OnClick 事件之前进行日志记录。但是后来我不知道如果没有大量工作重新制作菜单,这将如何用于设计时菜单项。
【问题讨论】:
-
小提示:停止使用onlick事件,改用Actions。
-
将所有点击汇集到同一个事件,使用 Sender 评估并记录每个点击,然后将每个点击路由到自己的事件。
-
@whosrdaddy 您能否概述一下使用 Actions 而非 OnClick 的好处
-
@JohnEasley 您将如何确定将路由到哪个事件?从可维护性的角度来看,一个简单的 if 或 case 语句似乎很难阅读并且很痛苦
-
你检查发送者的名字,然后调用一个同名的过程..这根本不难维护......
标签: delphi logging analytics delphi-10-seattle