在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
什么是Event Bus,可以百度一下这个关键词,了解一下。具体来说,好处有两点: 1.广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象 Delphi 现在有了开源项目,https://www.github.com/spinettaro/delphi-event-bus,目前已经发展到2.0版本,我在项目中使用感觉非常强大与稳定,支持跨平台。接下来,假设你已经下载并安装到Delphi IDE中,看看如何使用他。 2.0版本改动非常大,较1.x比,简直是脱胎换骨,用法更简洁,但功能更灵活,因为完全基于接口来实现的。 为了使用他,首先呢,我们要声明一个接口,然后再用一个类来实现这个接口: 现在声明一个接口IMemoChangeEvent: IMemoChangeEvent = interface ['{DCFE64D2-9BA8-4949-9BB1-F5CD672E51A2}'] procedure SetText(const Value: string); function GetText: String; property Text: string read GetText write SetText; end; 接着,用TMemoChangeEvent类来实现这个接口: TMemoChangeEvent = class(TInterfacedObject, IMemoChangeEvent) private FText: string; procedure SetText(const Value: string); function GetText: String; public property Text: string read GetText write SetText; end; 我们再声明一个函数,将TMemoChangeEvent实列用接口IMemoChangeEvent返回: function GetMemoEvent: IMemoChangeEvent; begin Result:= TMemoChangeEvent.Create; end; 现在,我们可以将这个接口,通过Event Bus发布出去了,下面是发布的代码: procedure TfrmMain.Memo1Change(Sender: TObject); var LEvent: IMemoChangeEvent; begin LEvent := GetMemoEvent;//取得接口 LEvent.Text := Memo1.Lines.Text;//为接口赋值 GlobalEventBus.Post(LEvent);//发布接口实例 end; 上面的代码中,GlobalEventBus是Delphi Event Bus提供的一个全局函数,返回IEventBus接口实例。 接下来,看看如何接收这个IMemoChangeEvent接口实例,看下面的代码,我们在接收对象中这样声明一个方法: [Subscribe] procedure OnMemoChange(AEvent: IMemoChangeEvent); 注意,这里用了注解[Subscribe],同时,接收方法只有一个参数AEvent,再看一下具体的实现: procedure TfrmSecond.OnMemoChange(AEvent: IMemoChangeEvent); begin MemoObserver.Lines.Text := AEvent.Text; end; 这个AEvent参数就是前面发送的接口实例。 最后,为了能让接收对象接收消息,我们还要做一步,就是把接收对象注册到Event Bus中: procedure TfrmSecond.FormCreate(Sender: TObject); begin GlobalEventBus.RegisterSubscriberForEvents(Self);//一般情况下,我们都是在对象建立时注册 end; procedure TfrmSecond.FormDestroy(Sender: TObject); begin GlobalEventBus.UnregisterForEvents(Self);//取消注册 end; 现在,基于Delphi Event Bus的发布-订阅机制就完成了。 上文中用到的代码是开源代码中的例子VCLMessageing.dpr,你下载后就有了这个,可以基于上文,运行例子,感受Delphi Event Bus带给我们的便利! 如果上面内容对你有帮助,别忘记为我点赞或者关注,为我加点动力! |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论