mig*_*jek 13 delphi events vcl
I'm looking for some code allowing easy asigning many event handlers to a single event of object... I needed it very much for my plugin architecture, so I implemented some replacement for that, however I don't like my solution for that, so I'd like to know what is yours idea/solution/tip ... My solution is just a list with items like
eventName: string;
proc: TMyEventProc;
where TMyEventProc takes two arguments, sender and eventData: pointer.
depending on name of the event, eventData points to different record/object.
不幸的是,这需要声明许多记录作为参数传递.该方法也非常慢,并且需要在"真实"事件被命中时实现调用所需的"回调".
Del*_*ics 10
我实现了一个适用于几乎所有Delphi版本的解决方案 - 它最初是在Delphi 7中实现的,虽然我没有在早期版本中测试它(但如果你自己使用Delphi 7,那么这就是你所需要的要知道,对吗?).:)
iirc这至少部分是Allen Bauer职位的灵感来源.您可以在某些视频中看到我的实现,并从我的博客下载代码:
您感兴趣的帖子被标记为"多播".该下载链接最后的代码是在这个职位提供.
在我的方法中,您从TMultiCastEvent派生一个类.您的派生类所要做的就是实现一些简单的类型安全保护,以添加,删除和调用具有特定签名的事件.
TNotifyEvent的一个实现 - 过程(发件人:TObject) - 提供了"让你前进"的实现(ime最"有用"的多播事件是简单的通知),也是如何为特定派生多播事件类的一个例子.事件签名.
一旦你有了多播事件类,你可以使用常规的"事件处理程序"与多播版本交替使用,例如给出一些带有多播On_Click事件的假想按钮类(我采用了在事件中插入下划线的约定)将其标识为多播的名称,与常规的"单播"事件相对应:
为单播点击事件分配处理程序的代码:
Button.OnClick := MyClickHandler;
Run Code Online (Sandbox Code Playgroud)
可以直接将相同的处理程序添加到多播Notify事件:
MultiCastButton.On_Click.Add(MyClickHandler);
Run Code Online (Sandbox Code Playgroud)
我的实现还包括许多改进,例如禁用事件的能力以及在实现对象被销毁时自动从处理程序中删除处理程序(这涉及少量的内务处理,必要时可以忽略但在某些情况下可能有用)情况).
所有这些都在我的博客文章中进行了描述和演示.
请享用.:)