关于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还是有帮助的。

SmartBinding工作原理分析的更多相关文章

  1. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  2. Security:蠕虫的行为特征描述和工作原理分析

    ________________________ 参考: 百度文库---蠕虫的行为特征描述和工作原理分析 http://wenku.baidu.com/link?url=ygP1SaVE4t4-5fi ...

  3. Azure WAF防火墙工作原理分析和配置向导

    Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ...

  4. Hadoop生态圈-Zookeeper的工作原理分析

    Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...

  5. 原理剖析-Netty之服务端启动工作原理分析(下)

    一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...

  6. AQS工作原理分析

      AQS工作原理分析 一.大致介绍1.前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作:2.而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sy ...

  7. getaddrinfo工作原理分析

    getaddrinfo工作原理分析 将域名解析成ip地址是所有涉及网络通讯功能程序的基本步骤之一,常用的两个接口是gethostbyname和getaddrinfo,而后者是Posix标准推荐在新应用 ...

  8. Mina工作原理分析

    Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用.Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似 ...

  9. 结合 category 工作原理分析 OC2.0 中的 runtime

    绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class { Class isa  OBJC_ISA_AVAILABILI ...

随机推荐

  1. html设置多个div并排显示

    我这里以4个div为例,html代码如下: <body> <div id="column1" style="background-color: blue ...

  2. java、ruby、python、php等如何生成excel文档?

    excel在我们日常工作生活中会经常用到,通常我们都是用office软件去编写文档.但是对于格式一致的excel文档,如果还是使用人工完成,那绝不是我们软件工程师的姿态了~ 下面我就介绍一种方法,不需 ...

  3. 移动架构-UML

    UML(Unified Modeling Language),UML规范用来描述建模的概念有,类(对象的).对象.关联.职责.行为.接口.用例.包.顺序.协作,以及状态.这里对UML做一个简单介绍 前 ...

  4. Android_7.1.1_r6源码编译

    上篇文章讲述了如何下载Android源码,在篇文章就来说一说Android源码编译.其实一般来说如果修改的软件和底层没什么关系,直接提取相应的源代码到Android Studio编译就可以了,如果是与 ...

  5. CenOS 7 安装Redis

    1.Redis介绍 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.从2015年6月开始,Redis的开发由Redis Labs赞助,而2013年5月至2 ...

  6. Spring jsp 下拉列表

    完整代码 <%-- Created by IntelliJ IDEA. User: wsh Date: 2019/7/21 Time: 11:35 To change this template ...

  7. @Value注入static属性

    1. 给参数注入,执行set方法 public class SendMessageCenter {     private static String message;    private stat ...

  8. RAID(独立磁盘冗余阵列)

    Raid ​ RAID 独立磁盘冗余阵列,在本科学习时候学习过,记不清是组成原理还是操作系统,当时理解的不太清楚,现在研究生期间做存储相关项目,涉及到了Raid,于是查各种博客,为了以后便于后期查阅, ...

  9. sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解

    介绍了sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解 --服务器角色: --固定服务器角色具有一组固定的权限,并且适用于整个服务器范围. 它们专门用于管理 SQL S ...

  10. Scala调用Kafka的生产者和消费者Demo,以及一些配置参数整理

    kafka简介 Kafka是apache开源的一款用Scala编写的消息队列中间件,具有高吞吐量,低延时等特性. Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受 ...