初识kbmmw 中的smartbind功能

关于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 的更高级的功能。

原文地址:https://www.cnblogs.com/xalion/p/10852685.html