我实现了一个适用于几乎任何版本的 Delphi 的解决方案——它最初是在 Delphi 7 中实现的,虽然我没有在早期版本中测试过它(但如果你自己使用 Delphi 7,那么这就是你所需要的知道,对吧?)。:)
iirc 这至少部分是 Allen Bauer 帖子的灵感来源。您可以在一些视频中看到我的实现,并从我的博客下载代码:
您感兴趣的帖子被标记为“多播”。最终代码的下载链接可在这篇文章中找到。
在我的方法中,您从 TMultiCastEvent 派生一个类。您的派生类所要做的就是实现一些简单的类型安全保护,以添加、删除和调用具有特定签名的事件。
TNotifyEvent 的实现 - procedure(Sender: TObject) - 提供了“让你继续”的实现(我最“有用的”多播事件是简单的通知)以及如何为特定的多播事件类派生的示例事件签名。
一旦你有了你的多播事件类,你就可以使用常规的“事件处理程序”与多播版本互换,例如给定一些带有多播 On_Click 事件的虚构按钮类(我采用了在事件中插入下划线的约定将其标识为多播的名称,而不是常规的“单播”事件):
将处理程序分配给单播单击事件的代码:
Button.OnClick := MyClickHandler;
可以直接将相同的处理程序添加到多播通知事件:
MultiCastButton.On_Click.Add(MyClickHandler);
我的实现还包括许多改进,例如能够禁用事件并在实现对象被销毁时自动从处理程序中删除处理程序(这涉及少量的内务处理,如果需要可以忽略,但在某些情况下可能很有用情况)。
所有这些都在我的博客文章中进行了描述和演示。
享受。:)