zoukankan      html  css  js  c++  java
  • SmartBinding工作原理分析

    关于kbmMW SmartBinding,我翻译了作者写的几篇文章,其强大的绑定机制,将可视控制与各种数据源灵活绑定在一起,实现了类似DBEdit数据敏感控件的效果,可以及大的减少我们的代码,实现界面与逻辑分离的代码设计,从而实现易于维护与管理的代码,怎一个爽字了得。如果不了解kbmMW SmartBinding,可以参看译过的文章。

    kbmMW SmartBinding如此强大,那么他是如何实现及工作的呢?让我们一起走进kbmMW SmartBinding的源代码,欣赏kbmMW作者的实现。

    通过前文,我们知道,要进行绑定首先要引用kbmMWSmartBind单元,然后使用全局对象Binding进行绑定操作:

     Binding.Bind(Edit1,'Text',Text1,'Text');

    上面这行代码,将一个Edit控件绑定到一个Text控件上,当我们在Edit中输入内容时,会自动更新Text对象显示的内容。

      bnd:= Binding.Bind(dm.mt,'f1',stringGrid1,'#1');
      Binding.Bind(dm.mt,'f2',stringGrid1,'#2');
      Binding.Bind(dm.mt,'@',StringGrid1,'@',[mwboTwoWay]);

    上面这三行代码,将数据集mt中的字段与StringGrid对象进行绑定,实现类似DBGrid显示数据集的效果。

    现在把Binding对象作为切入点,来看看是什么情况?

    var
      Binding:TkbmMWBindings;

    上面的代码,声明了Binding对象,原来他是TkbmmWBindings类型。Binding对象在kbmMWSmartBind单元中作为全局对象声明,并且在Initialization部分自动建立,所以当我们引用了kbmMWSmartBind单元,就可以直接使用Binding对象!

    接下来,我们继续查看TkbmmWBindings的实现代码。

    第一个方法是Create方法,在这个方法中,初始化很多内部对象,其中有一个FScheduler对象,是我非常熟悉的TkbmMWScheduler类型的对象,并且通过该对象建立一个调度事件FUpdateEvent,该事件,每100毫秒调用一次Update方法。看到这里让我明白,原来TkbmMWBindings就是用一个调度对象FScheduler实现数据源与可视控件的同步,具体的同步逻辑,在Update方法中实现。默认情况下是100毫秒执行一次同步,可以通过属性UpdateFrequency来修改这个时长。

    接下来,我们看一下这个Update方法如何实现的同步数据源与目标控件?在这个方法中,基于两个列表对象FNonSyncList、FSyncList执行的更新,这里同样用FScheduler.Run执行的,即开启新的线程执行的同步方法,换句话说,当FNonSyncList对象中有内容,则用线程执行UpdateNonSync方法,当FSyncList对象中有内容,则用线程执行UpdateSync方法,UpdateSync方法在主线程中执行的。说到这里,我明白了为什么要用两个列表对象FNonSyncList、FSyncList,原来一个是在线程中更新的列表,另一个是在主线程中更新的列表。当然了,你也会明白,我们通过Binding.Bind方法绑定的内容,都会存到FNonSyncList或FSyncList中。

    Update方法先说到这里,接下来我们看看Bind方法,是如何实现的逻辑?

    Binding.Bind(Edit1,'Text',Text1,'Text');

    我们跟踪上面这个调用,会调用这个方法:

    function TkbmMWBindings.Bind(const ASource:TValue; const ASourceMember:string;
                                 const ADestination:TValue; const ADestinationMember:string;
                                 const AOptions:TkbmMWBindingOptions = []):IkbmMWBinding;

    这个方法中,根据参数列表,会建立一个TkbmMWBinding对象,再通过内部方法InternalBind把这个对象加到FNonSyncList或FSyncList中。当数据源或目标控件是从TControl继承来的,则填加到FSyncList中,否则填到FNonSyncList中

    读到这里,我们清楚了一个逻辑,那就是TkbmMWBindings用FNonSyncList及FSyncList这两个列表对象来管理TkbmMWBinding对象,我们定义的每一个绑定都被建成一个TkbmMWBinding对象。然后呢,用FScheduler每100毫秒调用Update来同步每个绑定对象。

    暂时可以告一段落,有时间再继续写更详细的内容,我们知道上面的原理,在项目中使用SmartBinding还是有帮助的。

  • 相关阅读:
    Django对静态文件的处理——部署阶段
    使用Django来处理对于静态文件的请求
    Django1.7如何配置静态资源访问
    Spring WebSocket中403错误解决
    FastJSON JSONObject 字段排序 Feature.OrderedField
    国际化(i18n) 各国语言缩写
    【转】java.io.Closeable接口
    【转】spring bean 卸载
    This content should also be served over HTTPS
    Failed to close the ServletOutputStream connection cleanly, Broken pipe
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/11809895.html
Copyright © 2011-2022 走看看