前言:
本博客前面有文章描述过如何将一个对象的属性和界面元素(比如,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);