有没有办法在Delphi中找到未使用的事件处理程序?

Mas*_*ler 6 delphi vcl event-handling dead-code

在Delphi中查找死代码通常很简单:只需编译然后扫描缺少蓝点的例程.在大多数情况下,智能链接器非常适合跟踪它们.

问题是,这对事件处理程序不起作用,因为它们是已发布的方法,(理论上)可以通过RTTI以某种方式调用,即使这在实际操作中几乎不会发生.

我正在努力清理一个大型的VCL模板单元,它在整个历史中经过多次弯曲,折叠,旋转和切割.如果我有某种方法可以找到表单的DFM实际上没有引用的事件处理程序并删除它们,那肯定会很好.有没有简单的方法来做到这一点?例如,插件IDE专家?

Cra*_*ntz 6

这是一个有点难看(OK,这是很多丑陋的),但对于一个单元,是接近万无一失,并且不需要额外的工具:

  1. 确保将表单的当前版本签入源代码管理!
  2. 转到事件处理程序所在类的接口顶部.删除所有事件处理程序方法接口.
  3. 查看Code Explorer/Error Insight.将突出显示具有实现但没有接口的方法.删除实现.
  4. 现在保存单位.Delphi将一次一个地抱怨实际处理的每个事件都缺少事件处理程序.当错误出现时写下这些.
  5. 查看表单的原始版本,并删除列表中不存在的任何事件处理程序.


Ger*_*oll 5

使用"重命名方法"重构来重命名每个事件处理程序.选中"重构前查看参考"复选框.

检查"重构"窗口.如果事件处理程序链接到控件,则会出现"VCL Designer更新"部分,显示哪些控件链接到该方法.

这还将显示该方法是从任何其他单元调用还是以编程方式分配.

注意:这适用于D2006,在以后的版本中可能略有不同.


Mik*_*keJ 2

我认为从自动的角度来看这是不可能的。当对象内部发生特定事件时,事件处理程序被激活。在给定的运行中未触发该事件并不意味着没有执行路径可以实现该事件。

您还可以在运行时动态分配处理程序,因此无法保证在一种情况下使用的处理程序。

例如

按钮.onclick := DefaultClickHandler;

按钮.onClick := SpecialClickHandler;

假设单击处理程序与 onclick 事件签名匹配,但如果签名不正确,您将无法进行编译。


但是,您可能可以通过查找具有 (Sender: TObject) 方法签名的所有方法并将其方法与 .dfm 中的方法进行比较来找到所有废弃的处理程序(如果您是,请确保将其保存为文本)使用旧版本的delphi),在我的书中,没有自动连接的任何东西都会受到怀疑。

--

如果您不想走 cygwin 路径,您可以将 src 和 dfm 加载到两个 TStirngList 中,并从每个 TStirngList 中删除名称/标识,并生成一个包含几个循环和一些字符串操作的列表。我的猜测是大约 20 分钟的工作就能得到你可以忍受的东西。