红鱼儿

SmartEvent with kbmMW #1

前言

前面的文章,我写了有关SmartBinding框架方面的内容。SmartBinding的目的是将数据容器绑定到一起,通常情况下,数据容器可以是显示数据或与数据交互的控件(Edit,ListView...),也可以是存储数据的容器,如查询结果的DataSet,ObjectList或Record等。SmartBinding还引入了数据代理,这使得将可视设计与功能同核心数据操作/检索/存储分离。

在kbmMW新版本中,增加了SmartEvent。SmartEvent的主要目的是将用户交互与业务逻辑分开,换句话说,就是避免使用事件处理机制。

可能有开发者说,用ActionList,这就是解决方法,这的确是种方法,但TActionList仍然是一种固定的,非常简单的操作事件的方法,SmartEvent比这更通用。

开始深入研究

SmartEvent到底是什么呢?

本质上说,SmartEvent就是一个发布/订阅的通知框架。

procedure TForm1.ShowSomeMessage(const AMessage:string);

这是一个常见的方法,现在我们为他定义一个“主题”,使得这个方法变成一个可以被通知的方法。

TForm1 = class...
...
[kbmMW_Event('SHOW.ERROR')]
procedure TForm1.ShowSomeMessage(const AMessage:string);
...

什么是“主题”呢?

主题就是一句话,用点分隔的单词。例如,可以将一个主题命名为:SHOW.ERROR或SHOW.INFO或SHOW.ICECREAM或SHOW.FOOD.BANANA等。

基本上,您可以定义主题。它甚至不必包含点。但是通常来说,使其具有层次结构是一个好主意,从某种意义上说,您必须以逻辑上通用的上下文词开头,并以与当前主题匹配的更专业的词结尾。

然后,当您想通知潜在订户有关您要显示的错误时,只需发送主题为“ SHOW.ERROR”的通知。

因此,现在我们知道什么是主题了,接下来学习如何订阅该主题。

在上面的情况下,我们希望每次有人发布SHOW.ERROR通知时都调用ShowSomeMessage方法。就象下面这样发出通知:

...
   Event.Notify('SHOW.ERROR','Some error happened');
...

当然,为了让ShowSomeMessage能接到通知,还需要告诉SmartEvent当前Form的实例,如在Form的OnCreate事件,写出如下代码:

...
   Event.Subscribe(self);
...

Self是Form实例,还可以引用kbmMW_Event属性标记,引用另一个实例。

 

posted on 2019-11-22 10:45  红鱼儿  阅读(311)  评论(0编辑  收藏  举报