我正在寻找一些代码,可以轻松地将许多事件处理程序放到单个对象事件中......我非常需要它来插件体系结构,所以我实现了一些替换,但我不喜欢我的解决方案,所以我想知道你的想法/解决方案/提示是什么...我的解决方案只是一个包含像
eventName: string;
proc: TMyEventProc;
其中TMyEventProc接受两个参数,sender和eventData:pointer。
根据事件的名称,eventData指向不同的记录/对象。
不幸的是,这需要声明许多记录作为参数传递。 该方法也非常慢,并且需要在“真实”事件被命中时实现调用所需的“回调”。
答案 0 :(得分:10)
我实现了一个适用于几乎所有Delphi版本的解决方案 - 它最初是在Delphi 7中实现的,虽然我没有在早期版本中测试它(但如果你自己使用Delphi 7,那么那就是所有你需要知道的,对吧?) :)
这至少部分是Allen Bauer职位的灵感来源。您可以在某些视频中看到我的实施,并下载代码from my blog:您感兴趣的帖子被标记为“多播”。最终代码的下载链接是available in this post。
在我的方法中,您从TMultiCastEvent派生一个类。您的派生类所要做的就是实现一些简单的类型安全保护,以添加,删除和调用具有特定签名的事件。
TNotifyEvent的一个实现 - 程序(Sender:TObject) - 提供了“让你前进”的实现(ime最“有用的”多播事件是简单通知),也是如何派生多播事件的一个例子特定事件签名的类。
拥有多播事件类后,您可以与多播版本交替使用常规“事件处理程序”,例如:给出了一个带有多播On_Click事件的虚构按钮类(我采用了在事件名称中插入下划线以将其标识为多播,与常规“uni-cast”事件相对应的约定):
为单播点击事件分配处理程序的代码:
Button.OnClick := MyClickHandler;
可以直接将相同的处理程序添加到多播Notify事件:
MultiCastButton.On_Click.Add(MyClickHandler);
我的实现还包括许多改进,例如能够禁用事件并在销毁实现对象时自动从处理程序中删除处理程序(这涉及少量内务处理,如果需要可以忽略但可以忽略在某些情况下有用)。
所有这些都在我的博客文章中进行了描述和演示。
享受。 :)
答案 1 :(得分:2)
Allen Bauer a blog post about multicast events可能会有所帮助。但它仅适用于Delphi 2009或更高版本。
编辑:如果你还在D7上,如果你不需要太多不同的事件签名,你仍然可以做这项工作。尝试查看Allen的代码,看看是否可以将其改编为非通用解决方案。
答案 2 :(得分:1)
如果你正在实现一个插件系统,我想,你不能只是逃避事件处理程序 - 无论是否多播。我建议看一下observer pattern。在多播事件附近可能听起来有点过于冗长,但在需要时至少会更灵活。
答案 3 :(得分:0)
您可以使用观察者设计模式。以下是delphi实现的示例:http://blogs.teamb.com/joannacarter/2004/06/30/690