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还是有帮助的。
SmartBinding工作原理分析的更多相关文章
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
- Security:蠕虫的行为特征描述和工作原理分析
________________________ 参考: 百度文库---蠕虫的行为特征描述和工作原理分析 http://wenku.baidu.com/link?url=ygP1SaVE4t4-5fi ...
- Azure WAF防火墙工作原理分析和配置向导
Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ...
- Hadoop生态圈-Zookeeper的工作原理分析
Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- AQS工作原理分析
AQS工作原理分析 一.大致介绍1.前面章节讲解了一下CAS,简单讲就是cmpxchg+lock的原子操作:2.而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sy ...
- getaddrinfo工作原理分析
getaddrinfo工作原理分析 将域名解析成ip地址是所有涉及网络通讯功能程序的基本步骤之一,常用的两个接口是gethostbyname和getaddrinfo,而后者是Posix标准推荐在新应用 ...
- Mina工作原理分析
Mina是Apache社区维护的一个开源的高性能IO框架,在业界内久经考验,广为使用.Mina与后来兴起的高性能IO新贵Netty一样,都是韩国人Trustin Lee的大作,二者的设计理念是极为相似 ...
- 结合 category 工作原理分析 OC2.0 中的 runtime
绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class { Class isa OBJC_ISA_AVAILABILI ...
随机推荐
- 【Leetcode_easy】783. Minimum Distance Between BST Nodes
problem 783. Minimum Distance Between BST Nodes 参考 1. Leetcode_easy_783. Minimum Distance Between BS ...
- css+html 实现 光晕 光圈
<style> html { height: 100%;}body { height: 100%; background-color: #000; margin: 0; padding: ...
- MG7780打印机喷嘴堵塞
1.深度清洗,打印喷嘴图案,发现有颜色没有打印出来 2.墨盒一加墨水就往外冒,以为是满的,其实是内部已经堵塞而加不进去,因为出墨口并没有墨水向外流(出墨口没有盖起来).解决办法就是用没有针头的针管从加 ...
- 查询 ip占用导致ip不通的 问题 查IP对应的mac地址
IP冲突, 同一个IP配到了多余1台的机器上 ,导致IP 不通的情况,此时需要查询 都有哪台机器配置了这个IP,用 arping 命令, 具体命令 类似于 ping ,直接 arping + 目标地 ...
- 作为linux新手需掌握的常用命令大全
学了几周的linux系统,接触最多的就是各种各样的命令,此篇随笔作为对之前所学的各中命令的整理扩展. 1.man命令 man命令作为第一个要学的Linux命令是因为它的作用非常强大——可用于查看命令的 ...
- Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?
什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...
- 4、2 java 使用es
1.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Mac配置虚拟环境Virtualenv,安装Python科学计算包详解
参考: https://www.jianshu.com/p/51140800e8b4 安装 virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包,可以更 ...
- hadoop在eclipse当中如何添加源码?
[学习笔记] /*org.apache.hadoop.mapreduce.Mapper.Context,java.lang.InterruptedException,想看map的源代码,按contro ...
- ora00972标识符过长
oracle10G对于表名的长度限制是30个字节 表名超过30结果不能创建,提示ora00972-标识符过长. 需要将表名控制在30个字节以内