再谈 Delphi 的 LiveBindings 绑定界面元素和对象

本文简化了在Delphi中将对象属性与界面元素(如Label)绑定的过程。通过创建TMyDev类,设置AdapterBindSource1和DataGeneratorAdapter1,以及在Form1上进行可视化绑定,实现了运行时对象属性值(如FDev.DevName)的变化能实时反映在Label1上。此外,还介绍了如何通过Edit2与Label1的双向绑定实现内容同步更新。

前言:

本博客前面有文章描述过如何将一个对象的属性和界面元素(比如,Label1)绑定。那篇文章写得有点复杂。这里简化一下操作过程的描述。

Delphi 版本:

Delphi 10.4 社区版。

操作方法:

1. 假设有一个类定义:

TMyDev = class
  private
    FDevID: string;
    FDevName: string;
    FIsOnline: Integer;
    FIsSelected: Integer;
  public
    property DevID: string read FDevID write FDevID;
    property DevName: string read FDevName write FDevName;
    property IsOnline: Integer read FIsOnline write FIsOnline;
    property IsSelected: Integer read FIsSelected write FIsSelected;
  end;

2. 在 Form1 上面,有一个 Label1;

3. 有一个 Form1 的全局对象 FDev: TMyDev;

4. 拖一个 AdapterBindSource1 到 Form1 上面。拖一个 DataGeneratorAdapter1 到 Form1 上面。

5. 右键点击 DataGeneratorAdapter1 选择下拉菜单 Fields Editor;

6. 在 Fields Editor 窗口里面,增加字段。字段的名字和 TMyDEV 的属性名字相同,数据类型相同。

7. AdapterBindSource1 的 Adapter 的属性,在属性选择框里面,下拉,选择 DataGeneratorAdapter1。

8. 对 DataGeneratorAdapter1 和 AdapterBindSource1 的设置完成,鼠标右键点击 Form1 在下拉菜单里面选择 Bind Visually,IDE 底部会出现可视化绑定的窗口。

9. 在可视化绑定的窗口里面,找到 Label1,会显示它的 TEXT 属性;找到 AdapterBindSource1,会显示之前在 DataGeneratorAdapter1 里面添加的字段。点击 Label1 的 TEXT 拉线到  AdapterBindSource1 里面的某一个字段,这里我选择 DevName 字段。

10. 开始写代码:在 Form1 上面找到 AdapterBindSource1 选择它,然后在属性面板的 Events 事件页里面,找到事件(这里只有一个事件 OnCreateAdapter),双击这个事件,IDE 产生代码框架,代码如下:

procedure TForm1.AdapterBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
begin
  if not Assigned(FDev) then FDev := TMyDev.Create;

  FDev.FDevID := 'ID-893545';
  FDev.FDevName := 'Name - MyBLE';
  FDev.FIsOnline := 0;
  FDev.FIsSelected := 1;

  ABindSourceAdapter := TObjectBindSourceAdapter<TMyDev>.Create(AdapterBindSource1,
                                                               FDev, True);

  ABindSourceAdapter.AutoPost := False;

end;

11. 在 DELPHI IDE 里按 F9 运行程序,程序编译运行起来后,可以看到 Label1 显示的是上面的代码里面的 DevName 的值;

12. 增加一个按钮和一个 Edit1,运行期修改对象的属性值,看看 Label1 显示的内容是否跟随变化:

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDev.DevName := Edit1.Text;
  AdapterBindSource1.Refresh; //修改完对象的值后,必须执行一次 Refresh 否则界面元素 Label1.Text 没有跟随变化。
end;

13. 拖一个 Edit2 到 Form1 上,进入可视化绑定界面(鼠标右键点击 Form1 下拉菜单选择 Bind Visually),在可视化绑定界面里面,找到 Edit2,鼠标左键点下它的 TEXT 属性,拉线到AdapterBindSource1 的 DevName 字段上,建立绑定连接。此时,Label1 的 Text 属性和 Edit2 的 Text  属性,都拉线连接到 AdapterBindSource1 的 DevName 字段上面。

14. 按 F9 编译运行,此时,Label1 和 Edit2 都显示相同的内容,都是 FDev.DevName 的内容。然后在 Edit2 里面输入一些新的内容,按回车,可以看到 Label1 显示的内容变成了 Edit2 里面输入的新的字符串。这里,实际上是 Edit2 的 Text 被用户输入改变后,回车就直接改变了绑定的 AdapterBindSource1 对应的 DevName 字段的值,然后绑定到这个字段的 Label1.Text 也就跟随改变了。

总结:

设计期在 IDE 里面可视化将对象的属性值绑定到界面元素的基本框架:

1. 自己用代码定义的类,属性值是 Public 的;

2. 拖一个 DataGeneratorAdapter1 到界面上,打开它的 Fields Editor 增加字段,字段名和数据类型和类的属性名相同。

3. 拖一个 AdapterBindSource1 到界面上,指定它的 Adapter 是 DataGeneratorAdapter1;

4. 打开设计期可视化绑定的界面,做了 2,3 两步,这时候就可以在这里看到 AdapterBindSource1 有字段了,用鼠标把字段和对应的界面元素(比如 Label1)拉线连接。

5. 增加 AdapterBindSource1.OnCreateAdapter 事件的代码,主要是要在这里为它创建运行期的 Adapter:

ABindSourceAdapter := TObjectBindSourceAdapter<TMyDev>.Create(AdapterBindSource1,
                                                               FDev, True);

6. 当然,在这行代码前面,需要先创建 FDev 对象。

7. 看起来,设计期的 DataGeneratorAdapter1 仅仅是用于设计期可视化拉线用。因为设计期没有运行代码,Delphi IDE 是无法知道我们自己定义的类以及这个类有哪些属性的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值