关于kbmmw smartbind 的开发原因及思路,大家可以参见官方的博客说明和红鱼儿的翻译

今天我就实例操作一下,给大家演示一下具体实现。

我们新建一个工程

放几个基本的控件

在单元里面加上引用 kbmMWSmartBind。

添加事件代码

procedure TForm1.Button1Click(Sender: TObject);
begin
Binding.Clear;
Binding.Bind(Edit1,'Text',Label1,'Caption');// 把label1 的caption 绑定到 edit1的text 上
Binding.Bind(Edit1,'Text',Button1,'Caption');// 把button1 的caption 绑定到 edit1的text 上
Binding.Bind(Edit1,'Text',Edit2,'Text',[mwboTwoWay]); //edit1和 edit2的text 双向绑定 end;

运行一下

点击按钮后,随便在edit1 和edit2里面输入文字,都会同步显示在别的控件上。

接下来我们做一个对象列表,使用bind 把对象列出来,并可以前后移动。

 TLine = class
private
FName:string;
FAddress:string;
public
constructor Create(const AName:string; const AAddress:string);
property Name:string read FName write FName;
property Address:string read FAddress write FAddress;
end; TLines = TObjectList<TLine>;

首先做一下对象定义,然后做好初始化和绑定

procedure TForm1.Button4Click(Sender: TObject);
begin
bnd:=nil;
Binding.Clear; if lines<>nil then
FreeAndNil(lines); lines:=TLines.Create;
lines.Add(TLine.Create('红鱼儿','四平'));
lines.Add(TLine.Create('努力的干','四川'));
lines.Add(TLine.Create('够浪','山东'));
lines.Add(TLine.Create('竹子','福建')); Binding.Bind(Edit3,'Text',Label2,'Caption');
Binding.Bind(Edit3,'Text',Button2,'Caption'); // 绑定列表到控件上
// 返回绑定导航
bnd:=Binding.Bind(lines,'Name',Edit3,'Text');
Binding.Bind(lines,'Address',Edit4,'Text');
if bnd.Navigator<>nil then
bnd.Navigator.First;
end;

运行

可以前后移动对象。

亦可以实现双向绑定,也就是通过控件界面修改对象属性。

  // 绑定列表到控件上
// 返回绑定导航
bnd:=Binding.Bind(lines,'Name',Edit3,'Text',[mwboTwoWay]);
Binding.Bind(lines,'Address',Edit4,'Text',[mwboTwoWay]);

下面看一下如何绑定数据表

做一个数据库连接

并在窗体上放置几个标准的控件,如图

注意,这里需要加入引用单元  kbmMWSmartBindVCL, 如果是FMX 窗体,需要引用单元 kbmMWSmartBindFMX。

加入初始化代码

procedure TForm1.initClick(Sender: TObject);

begin
bnd:=nil;
Binding.Clear;
if dataset<>nil then
FreeAndNil(dataset); uniquery1.Open; dataset:=uniquery1; bnd:=Binding.Bind(dataset,'Name',label3,'caption');
Binding.Bind(dataset,'capital',edit5,'text');
Binding.Bind(dataset,'continent',edit6,'text');
Binding.Bind(dataset,'area',edit7,'text');
Binding.Bind(dataset,'population',edit8,'text'); StringGrid1.RowCount:=dataset.RecordCount; bnd:=Binding.Bind(dataset,'Name',StringGrid1,'#0');
Binding.Bind(dataset,'capital',StringGrid1,'#1');
Binding.Bind(dataset,'continent',StringGrid1,'#2');
Binding.Bind(dataset,'area',StringGrid1,'#3');
Binding.Bind(dataset,'population',StringGrid1,'#4'); if bnd.Navigator<>nil then
bnd.Navigator.First; end;

运行程序

完美,全部正确显示出来。

我们也可以加入编辑功能

稍微处理一下代码

procedure TForm1.initClick(Sender: TObject);

begin
bnd:=nil;
Binding.Clear;
if dataset<>nil then
FreeAndNil(dataset); uniquery1.Open; dataset:=uniquery1; bnd:=Binding.Bind(dataset,'Name',label3,'caption');
Binding.Bind(dataset,'capital',edit5,'text',[mwboTwoWay]);
Binding.Bind(dataset,'continent',edit6,'text',[mwboTwoWay]);
Binding.Bind(dataset,'area',edit7,'text',[mwboTwoWay]);
Binding.Bind(dataset,'population',edit8,'text',[mwboTwoWay]); StringGrid1.RowCount:=dataset.RecordCount; bnd:=Binding.Bind(dataset,'Name',StringGrid1,'#0');
Binding.Bind(dataset,'capital',StringGrid1,'#1');
Binding.Bind(dataset,'continent',StringGrid1,'#2');
Binding.Bind(dataset,'area',StringGrid1,'#3');
Binding.Bind(dataset,'population',StringGrid1,'#4'); if bnd.Navigator<>nil then
bnd.Navigator.First; end;

修改一下,右面的grid 里面跟着变化过来了,注意这个永久保存到数据库里面了。

实现了对数据库的修改。

以上功能已经远远超过了delphi 自身的bind 功能,而且速度非常好。后面有空再讲一下kbmmw smartbind 的更高级的功能。

初识kbmmw 中的smartbind功能的更多相关文章

  1. 初识kbmmw 中的ORM

    在kbmmw 5.02.1 中,加入了ORM 的功能(这里可能和其他语言的定义不完全一样),我们就简单的认为 它就是一个类与数据库的转换吧.今天就先介绍一下如何通过kbmmw 的ORM 功能,实现类与 ...

  2. 珍惜每一滴水(kbmmw 中的内存调试)

    作为一个服务器端的应用,最基本的要求就是稳定,当然要做一个稳定的服务器端,需要涉及到很多方面, 内存泄露就是稳定的一个致命杀手,因为服务器的物理内存是有限的,即使一个功能有很小的内存泄露,经过 长时间 ...

  3. 在指定时间干,必须干(kbmmw 中的事件调度)

    从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能, 例如,权限管理.日志系统.调度系统.内存调试等功能. 今天给大家介绍一下kbmmw 的调度事件, ...

  4. 初识 MySQL 5.6 新功能、参数

    摘要: 继上一篇的文章 初识 MySQL 5.5 新功能.参数 之后,现在MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不 ...

  5. SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏

    SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!!   基础知识目前不够,有感性 ...

  6. kbmmw 中的进程管理小工具

    kbmmw 5.6.20 发布了,本版本带来一个小功能,就是可以在kbmmw 应用里面建立和管理进程, 虽然你可以直接调用windows api 做类似的事情,但是kbmmw 里面简化了操作,也加强了 ...

  7. kbmmw 中虚拟文件操作入门

    kbmmw 中一直有一个功能,但是基本上都没有提过,但是在实际应用中,却非常有用,这个功能就是 虚拟文件包功能,他可以把一大堆文件保存到一个文件里面,方便后台管理. kbmmw 的虚拟文件在单元kbm ...

  8. ADO.NET 中的新增功能

    ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...

  9. CSS3中的动画功能(一)

    css3中的动画功能分为transitions功能和animations功能,这两种功能都可以通过改变css属性值来产生动画效果.今天带大家一起来看看css3动画功能中的transitions的用法. ...

随机推荐

  1. bzoj 2798 [Poi2012]Bidding 博弈论+dp

    题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...

  2. javascript script load related【转】

    先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿……不怎么样.“这该放在哪儿?” ...

  3. 美图秀秀web开发文档

    Xiuxiu 组件 import React, { Component } from 'react'; class XiuXiu extends Component { componentDidMou ...

  4. python 之 线程池实现并发

    使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent. ...

  5. 51 Nod 1238 最小公倍数之和 V3 杜教筛

    题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}l ...

  6. CCCC L2-024 部落【并查集】

    https://www.patest.cn/contests/gplt/L2-024 首先在一行中输出这个社区的总人数.以及互不相交的部落的个数.随后对每一次查询,如果他们属于同一个部落,则在一行中输 ...

  7. IntelliJ IDEA重构技巧收集

    https://segmentfault.com/a/1190000002488608(重命名文件) http://www.jianshu.com/p/ab298b46bf50(快速生成方法) htt ...

  8. Android NDK 环境配置

    1. 下载NDK 官方链接地址: http://developer.android.com/tools/sdk/ndk/index.html 下载下来的应该是这个东西(以后可能会有更新,但步骤变动不会 ...

  9. 为什么硬盘明明还有空间,linux却说硬盘空间不足?inode;mkdir: 无法创建目录"shen1": 设备上没有空间

    现象:df -h显示硬盘还有14G空间,但是touch file/mkdir directory都失败,提示硬盘没有空间 原因:df -ia查看下inode的使用情况,发现已经爆了,(下图显示使用88 ...

  10. 使用zerorpc踩的第一个坑:

    Server端代码:注意s.run() 和 s.run的区别,一个括号搞死我了.如果不加括号,服务端服务是不会启动的,客户端就会报连接超时的错误 Server端在本机所有IP上监听4242端口的tcp ...