关于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. C# http请求 设置代理(标题可以作为搜索关键字)

    例一(C# 通过代理发HTTP请求): https://q.cnblogs.com/q/88682/ 例二(C# 代理HTTP请求): https://www.cnblogs.com/ShalenCh ...

  2. nginx利用fastcgi_cache模块缓存

    nginx不仅有个大家很熟悉的缓存代理后端内容的proxy_cache,还有个被很多人忽视的fastcgi_cache.proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和 ...

  3. 转载【oracle切换表空间】

    http://blog.itpub.net/28939273/viewspace-1061476/ [root@yoon ~]# more /etc/oracle-releaseOracle Linu ...

  4. MariaDB集群配置(主从和多主)

    1.mariadb主从 主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从 ...

  5. linux下的进程间通信之消息队列

    概念: 进程彼此之间可以通过IPC消息进行通信.进程产生的每条消息都被发送到一个IPC消息队列中,这条消息一直存放在队列中,直到另一个进程将其读走为止. 优点:可以通过发送消息来几乎完全避免命名管道的 ...

  6. spacemacs:emacs和vim结合,大杀器。vim党转emacs

    结合本人基础,做下述结论.不一定准确.  基础:  1. vim操作和高级操作,熟悉.使用的spf13-vim.  2. emacs以前学过,但是按键太累,相比vim简直难受.  3. emacs命令 ...

  7. 神经网络与机器学习第3版学习笔记-第1章 Rosenblatt感知器

    神经网络与机器学习第3版学习笔记 -初学者的笔记,记录花时间思考的各种疑惑 本文主要阐述该书在数学推导上一笔带过的地方.参考学习,在流畅理解书本内容的同时,还能温顾学过的数学知识,达到事半功倍的效果. ...

  8. CentOs7环境下手动配置JDK7

    下载: JDK7下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7- ...

  9. JS将本地图片转化成base64码

    在图片上传的时候,有时候后台需要前台上传base64文件,这时候我们就需要将图片资源转化成base64,下面这段js代码就可实现此功能. 1.首先在html里定义一个input输入框: BASE64图 ...

  10. Java基础---Java 开发工具IntelliJ IDEA 安装

    1.1 开发工具概述IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量.它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公 ...