FireMonkey TListView 使用 LiveBindings 绑定 TObjectList

离线安装WSL2系统 由于办公环境在内网环境中,需将开发环境部署到内网中。环境:内网:win10。 阅读详情

前言:

Delphi FireMonkey 的 LiveBindings 可以用来直接绑定界面元素和一个对象的属性,这样就可以把对象的值显示到界面上。常见的是将数据库 DataSet 的数据显示到界面上。

如果数据是一组对象,放到一个 TObjectList 里面,该如何做?

以下操作在 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. 有一个存储对象的列表:

FDevList: TObjectList<TMyDev>;

3. 拖一个 PrototypeBindSource1 到 Form1 上面。双击它,弹出字段编辑器窗口。
 3.1. 字段编辑器窗口左上角有个 add new 的图标,或者右键点击字段编辑器窗口出下拉菜单选择 add,添加一个字段。
 3.2. 字段编辑器窗口里面,选择添加的字段,给它的 Name 属性设置名字,给 FieldType 属性设置这个字段的数据类型。这里要注意,字段名字要和该字段对应的对象的属性名字完全一样。
 3. 拖一个 ListView 到 Form1 上面。右键点击下拉菜单,选择 Bind Visually 菜单,IDE 的底部出现可视化绑定的界面,在这个界面里面拉线实现绑定。
 3.1. 把 ListView1 的 Synch 拉线连接 PrototypeBindSource1 的星号(*)上面。
 3.2. 把 ListView1 的 ItemText 拉线连接 PrototypeBindSource1 的 DevID 字段;

4. 选择界面上的 PrototypeBindSource1,在 IDE 的属性窗口的事件页,看到 PrototypeBindSource1 只有一个事件,双击这个事件产生代码框架,代码如下:

procedure TForm1.PrototypeBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
begin
  //PrototypeBindSource1 的事件,在这里指定它的 ABindSourceAdapter 是一个 TListBindSourceAdapter
  // 这个 TListBindSourceAdapter 对应一个 TObjectList
  ABindSourceAdapter := TListBindSourceAdapter<TMyDev>.Create(Self, FDevList, True);
end;

5. 上述 4 这个事件早于 FormCreate 事件,而这里又用到 FDevList 对象。因此,需要在 FormCreate 之前就要创建 FDevList 对象。因此,这里可以有两个办法:
5.1. constructor Create(AOwner: TComponent); override; 覆盖掉 Form 的 Create 方法,在这个方法里面创建 FDevList。

constructor TForm1.Create(AOwner: TComponent);
begin
  FDevList := TObjectList<TMyDev>.Create;
  inherited;
end;

5.2. 直接在前述事件里面创建:

procedure TForm1.PrototypeBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
begin
  FDevList := TObjectList<TMyDev>.Create;
  ABindSourceAdapter := TListBindSourceAdapter<TMyDev>.Create(Self, FDevList, True);
end;

6. 运行期增加的对象的数据,显示到 ListView1 里面:

procedure TForm1.BtnAddClick(Sender: TObject);
var
  ADev: TMyDev;
begin
  ADev := TMyDev.Create;
  ADev.DevID := 'ID-' + Self.FCount.ToString;
  ADev.DevName := 'DevName-' + Self.FCount.ToString;
  ADev.IsOnline := 0;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  //必须调用 Refresh 否则 ListView1 里面不会显示新增加的对象。
  PrototypeBindSource1.Refresh;

  Inc(Self.FCount);
end;

以下是完整的代码:

unit Unit1;
{
  测试 LiveBindings 一个 TObjectList,显示多个对象内容到 ListView 或者 ListBox
}
interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  Data.Bind.Components, Data.Bind.ObjectScope, FMX.TabControl, System.Generics.Collections,
  FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
  System.Rtti, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.EngExt,
  Fmx.Bind.DBEngExt, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListView;

type
  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;

  TForm1 = class(TForm)
    PrototypeBindSource1: TPrototypeBindSource;
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    ListView1: TListView;
    Panel1: TPanel;
    BindingsList1: TBindingsList;
    LinkListControlToField1: TLinkListControlToField;
    BtnActive: TButton;
    Label1: TLabel;
    BtnAdd: TButton;
    procedure PrototypeBindSource1CreateAdapter(Sender: TObject;
      var ABindSourceAdapter: TBindSourceAdapter);
    procedure FormCreate(Sender: TObject);
    procedure BtnAddClick(Sender: TObject);
    procedure BtnActiveClick(Sender: TObject);
  private
    { Private declarations }
    FCount: Integer;

    FDevList: TObjectList<TMyDev>;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.BtnActiveClick(Sender: TObject);
begin
  PrototypeBindSource1.Active := True;
end;

procedure TForm1.BtnAddClick(Sender: TObject);
var
  ADev: TMyDev;
begin
  ADev := TMyDev.Create;
  ADev.DevID := 'ID-' + Self.FCount.ToString;
  ADev.DevName := 'DevName-' + Self.FCount.ToString;
  ADev.IsOnline := 0;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  //必须调用 Refresh 否则 ListView1 里面不会显示新增加的对象。
  PrototypeBindSource1.Refresh;

  Inc(Self.FCount);
end;

constructor TForm1.Create(AOwner: TComponent);
var
  ADev: TMyDev;
begin
  {
  FDevList := TObjectList<TMyDev>.Create;

  ADev := TMyDev.Create;
  ADev.DevID := 'ID-1';
  ADev.DevName := 'DevName-1';
  ADev.IsOnline := 0;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  ADev := TMyDev.Create;
  ADev.DevID := 'ID-2';
  ADev.DevName := 'DevName-2';
  ADev.IsOnline := 1;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  ADev := TMyDev.Create;
  ADev.DevID := 'ID-3';
  ADev.DevName := 'DevName-3';
  ADev.IsOnline := 0;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  ADev := TMyDev.Create;
  ADev.DevID := 'ID-4';
  ADev.DevName := 'DevName-4';
  ADev.IsOnline := 0;
  ADev.IsSelected := 0;
  FDevList.Add(ADev);

  }

  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Text := 'FormCreate';
  FCount := 0;
end;

procedure TForm1.PrototypeBindSource1CreateAdapter(Sender: TObject;
  var ABindSourceAdapter: TBindSourceAdapter);
begin
  //PrototypeBindSource1 的事件,在这里指定它的 ABindSourceAdapter 是一个 TListBindSourceAdapter
  // 这个 TListBindSourceAdapter 对应一个 TObjectList
  FDevList := TObjectList<TMyDev>.Create;
  ABindSourceAdapter := TListBindSourceAdapter<TMyDev>.Create(Self, FDevList, True);
end;

end.

Vue2项目实战:vue2-org-tree实现动态组织架构图 本文详细介绍了如何在Vue2项目中使用vue2-org-tree组件实现动态、可交互的组织架构图。内容涵盖从快速安装、基础渲染到核心功能实战,包括水平布局、节点展开折叠、响应式数据绑定、深度自定义节点内容以及事件处理。同时提供了性能优化、样式覆盖等避坑指南,并通过一个完整的企业级Demo展示了如何打造功能丰富的架构图,助力高效开发后台管理系统。 阅读详情

相关推荐

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX

在 STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。

wangyuewu08的博客 3374

delphi XE关于Android四大组件之ContentProvider:案例delphi XE加载Android手机图片的效率

delphiXE用Android原生方法开发App 一、常用的单元引用 uses FMX.Helpers.Android; //:Android线程与线程池、Android处理基本的绘制 TUIThreadCaller = class //:线程调用类(匿名方法、异步调用与回调、强制出队) procedure CallInUIThread(AMethod: TMethodCa...

pulledup的博客 5514

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 261

【Delphi】使用 TPrototypeBindSource 和 LiveBindings 设计器示例

Delphi数据绑定示例

sensor_WU 博客 1335

Cadence psspxf实战:手把手教你仿真250MHz环形VCO的电源抑制比(附Verilog代码)

本文详细介绍了使用Cadence psspxf仿真器对250MHz环形VCO的电源抑制比(PSRR)进行仿真的全流程。从环形VCO的设计原理、Verilog代码实现,到Cadence环境配置、仿真参数设置,再到结果分析与优化技巧,提供了完整的实战指南。特别适合电路设计工程师学习如何评估和优化VCO的抗电源噪声能力。

weixin_42567752的博客 414

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果

Delphi 10.4.2是最新版本的跨平台本机应用开发工具,一套代码可编译到五个操作系统上:iOS、Android、Windows、macOS 和 Linux; 本代码仅仅数十行即可轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果,颈椎枕轻松开发自己的电子书阅读APP应用: Delphi源代码下载地址:https://download.youkuaiyun.com/download/xyzhan/15647843 unit PageTurnUnit1; interface uses

Delphi开发局QQ群:32422310 1500

比亚迪开放平台接口实战:车身状态监测与智能车联应用开发

本文详细介绍了如何利用比亚迪开放平台的车身状态接口进行智能车联应用开发。通过核心类BYDAutoBodyworkDevice,开发者可以安全获取车辆VIN、车门车窗状态、蓄电池电压、方向盘转角等实时数据,并利用监听器实现状态实时响应。文章提供了从SDK集成、接口调用到典型应用场景(如远程车况检查、车队管理)的完整实战指南,助力开发者快速构建基于比亚迪车辆数据的创新应用。

weixin_29176179的博客 717

教你自定义ListView实现下拉刷新,上拉加载更多

虽然listview 快被RecyclerView取代了,但作为新人的你有必要知道。网上其实已经有很多关于listview上下拉刷新的例子,今天想带大家写一个快速实现 并且简单例子。 我先上几张效果图吧 ok 我先说一下大体思路, 我们先分别写出头布局和脚布局,稍后用 addHeaderView(headView); addFootView(footView);加载到自定义的布局中,默认全部都隐

yhy_的博客 1561

最新Codex接入DeepSeek官方API教程(无需cc-switch)

最新Codex接入DeepSeek官方API教程(无需cc-switch)

猿小白的博客 938

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

Delphi XE 10.4 FMX ListView 一个不易察觉的 BUG

Delphi XE 10.4 FMX ListView 一个不易察觉的 BUG 在使用 ListView DynamicAppearance 时发现非常强大,可以加很多东西,但没有发现复选框(哪位大佬知道望告知)是想用复选框把 ListView 实现多选, 不想 FMX 没有 MultiSelect,发现 EditMode 可以完成多选,使用中发现只要 ListView1.EditMode := True; 之前绑定的数据就不显示,为了查找原因重开了个 FMX Project 发现没问题啊!可以多选也能显示

richbirds的博客 1145

ADS1115 0-10V高精度ADC模块原理图设计,已量产

在水质监测、智能气象站、环境感知等领域,0-10V 电压输出的传感器占据了重要地位。这类传感器输出信号稳定、抗干扰能力强,但对数据采集模块的精度、线性度和易用性提出了严苛要求。本文将深度解析一款专为 0-10V 传感器设计的高精度 ADC 模块,从硬件架构、性能指标到工程化实践,全面呈现其设计思路与核心价值。

不脱发的程序猿 275

【Delphi】Delphi 中的 LiveBindings 使用场景与概念

LiveBindings 适用于需要快速绑定 UI 控件和数据源的场景,尤其在数据库应用、对象模型绑定等场景中发挥作用。你可以使用 LiveBindings Designer 进行可视化的绑定,也可以通过代码实现更灵活的绑定。LiveBindings 既支持数据库字段的绑定,也支持普通对象和列表的绑定。LiveBindings 通过提供一种灵活、动态的数据绑定机制,极大地简化了 Delphi 应用程序中的数据交互。

sensor_WU 博客 1553

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

FMX TListView 动态添加Item和Item里面的Object

FMX TListView比较复杂,功能也比较强大。如果是比较简单的列表,可以用TListBox代替,运用比较简单。FMX TListView的设计时运用和一般的控件也不一样,不是严格的"可视即可得",这和其它的控件使用方式差别比较大,比如,如果没有和Living binding控件配合,设计时是不能直接创建Item的,设计时只是设计了Item的外观样式,Item是运行时添加的(Demo里的例子基...

weixin_33749242的博客 1794

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

实现ListView的下拉刷新和上拉加载

ListView下拉刷新实现方式分析 1、需要添加顶部下拉加载界面; 2、我们需要监听onScrollListener,来判断当前是否显示在listview的最顶部; 3、因为顶部下拉加载界面是跟随收拾滑动状态不断改变界面显示的所以我们需要监听onTouch事件,来改变当前状态以及界面显示; 4、根据当前状态加载数据; 注:布局中的listview要改成重写的那个ListView 重写...

luoguofu233的博客 486

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

delphi xe android 字节,Delphi XE LiveBindings - 比特到字节

Sir Rufo..6您必须使用BindSource进行绑定.在这个例子中我只使用了TPrototypeBindSource.没有必要为数据对象提供组件,一个简单的对象就足够了.unit DataObject;interfacetypeTBits2Byte = classprivate{ Private declarations }fBit00, fBit01, fBit02, fBit03, f...

weixin_35631730的博客 338

FireMonkey ListView 绑定数据显示多个图片

概述 采用 Delphi 的 FireMonkey 框架,可以开发运行在 WINDOWS, Android, iOS 和 MacOS 上面的代码。其中一个比较常用的界面显示控件是 TListView。 如果数据是多条,来自数据库,或者来自多个对象的对象列表(TObjectList),采用 Delphi 的数据绑定功能(LiveBindings)可以让 ListView 显示来自数据的内容。 需求: ListView 显示的多条内容,每一条,可以有一个图片,有段文字,等等。Delphi 提供了几种固定

pcplayer的博客 1482

Delphi 利用LiveBindings绑定JSON数据到列表控件

为了提供数据绑定方案,Delphi FMX 框架提供了 LiveBindings 的技术。LiveBindings 基本上是一种基于表达式的机制,其中通常有一个源组件和一个目标组件,目的是将一个或多个涉及源成员的表达式绑定到目标的一个或多个属性。为了实现这一点,系统需要在某个地方存储涉及组件(在表单、框架或数据模块中)的绑定表达式集合(TBindingList 组件)。为了使数据对表达式引擎可用,您需要使用中间组件(BindSources)在表达式引擎和实际数据存储之间充当中介。

longchanghua_enshi的专栏 1032

delphi MimeType for Restful及delphi mime-type和文件扩展名对照表

delphi MimeType for Restful MimeType是你让编写的应用Restful化编程所必须的。delphi支持哪些MimeType,如何知道这些MimeType与文件扩展名的对应关系,以及它们是文本种类、二进制种类还是未定义的。 一、先上代码 : 已附上面源码下载。由于代码引用了跨平台的文件存取,使用源码注意事项:1、在FormCre...

pulledup的博客 1002

Delphi 利用 LiveBinding 将对象绑定到界面元素

自己定义的一个类,其对象,如何绑定到界面元素? http://docwiki.embarcadero.com/RADStudio/Seattle/en/Tutorial:_Using_TAdapterBindSource_and_the_LiveBindings_Designer 另一篇文章更详细: http://www.malcolmgroves.com/blog/?p=108

pcplayer的博客 2069

Delphi XE6 学习笔记(9)手动填充ListView及ListBox

头两天,在测试用ListView显示数据集TClientDataSet时,在增加记录后,不能自动在ListView显示。今天看例子找到方法,原来用生成的LinkFillControlToField.BindList.FillList方法即可实现。 procedure TForm1.FormCreate(Sender: TObject); var   i:integer; b

newsxy的专栏 4195

ListView的查询绑定

这个问题是要实现:在同一个ListView中实现数据的显示和查询。就是第一次加载页面时ListView加载所有数据,然后用户可以在页面中进行查询动作,结果仍然在ListView中显示出来,并且删除等操作绑定依然存在。 第一步,按照普通的绑定操作将ListView与DataSource绑定好,然后DataSource先设置成DAL层中用来查询所有数据的方法,在这里我的方法是 ListAll() 。...

weixin_33816821的博客 167

FireMonkey TListView 的 Item 在设计期可视化编辑

Delphi 10.2 为FireMonkey TListView 增加了新功能;在设计期,可视化地为一个 Item 增加新的元素(Object). 详细方法参见:http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Customizing_FireMonkey_ListView_Appearance 另外,在你土鳖上,也有可视化编辑的操作视频。不

pcplayer的博客 4627

LiveBindings 绑定界面元素和存储数据的对象

Delphi 的 LiveBindings 的例子,绑定数据库控件 TDataSet 的比较多。对于 TDataSet 来说,用 LiveBindings 框架,只是可以让更多的非 TDBEdit ... 这样的数据敏感控件,可以用来显示数据。 对于 FireMonkey 来说,已经没有了数据敏感控件,要绑定数据库,只能使用 LiveBindings 框架了。 除了数据库,如果数据源是对象,该...

pcplayer的博客 2703

(原创) Delphi中LiveBinding 绑定非数据库类数据的时候显示字段自定义名称(二)

DELPHI 10.4版本后,有关Bind的源代码修改了,原来的适用于10.3.3以前的方法不适用了,再来分析下10.4版本以后适用的方法。

舞天涯的专栏 761
上一篇: Delphi FireMonkey 振动手机
下一篇: FireMonkey ListView 绑定数据显示多个图片
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值