关于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. Nginx在线服务状态下平滑升级或新增模块

    nginx在使用过程中,有时需要在不影响当前业务的情况下,进行升级或新增模块.nginx的升级有两种方法:1.半自动化升级:2.手动升级 不过都需要先查看安装的nginx版本和配置信息,然后前往官网下 ...

  2. Mysql常见索引介绍

    索引是一种特殊的文件,包含了对数据表中所有记录的引用指针.InnoDB引擎的数据库,其上的索引是表空间的一个组成部分. (1).索引的优缺点 优点:加快搜索速度,减少查询时间 缺点:索引是以文件的形式 ...

  3. LeetCode_121. Best Time to Buy and Sell Stock

    121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...

  4. 第十九章 动态URL权限控制——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 用过Spring Security的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配:如果没有权限直接跳到相应的错误页面.Shiro也支持类似的机 ...

  5. linux系统时间设定

    更改系统时间并同步硬件时钟 sudo date -s '2018-12-27 12:46' sudo hwclock --systohc hwclock说明:hwclock --help

  6. 【数据库开发】Redis数据库设置密码

    redis配置密码1.通过配置文件进行配置yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 ? 1 #requirepass foobared 去掉行前的注释 ...

  7. mvp设计模式

    一.设计模式的简单介绍 MVP的 V 层是由UIViewController 和UIView 共同组成view 将委托presenter 对它自己的操作,(简单来说就是presenter发命令来控制v ...

  8. iText输出中文

    使用iTextAsian.jar中的字体 BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont ...

  9. docker容器端口号、时区修改

     一.修改端口号 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提 ...

  10. 快速了解NIO

    NIO的由来 我们都知道,在jdk1.4的时候就开始引入NIO了,它是基于Selector机制的非阻塞I/O,可以将多个异步的I/O操作集中到一个或几个线程中进行处理,目的就是为了代替阻塞I/O,提到 ...