一步一步学习使用LiveBindings(10) LiveBindings绑定到漂亮的TCombobox

这一课,将演示如何绑定到TCombobox,这个控件通常用来给用户提供选项列表。它们具有比VCL控件较强的定制性,可以使用样式窗口对每一个项进行外观的定制。

如果读者已经看过《一步一步学习使用LiveBindings(9)》,那应该会比较熟悉这一课的案例,因为笔者将上一节的案例LiveBindings_BindFormat的源代码复制到了这一节作为起点。

在上一节的员工管理窗口中,有一个Title职位字段,在真实的项目这个字段应该是一个下列拉表框供用户选择,而不是一个文本输入框,以避免用户胡乱输入太多的职位而无法管理,效果如下所示:

我们通常会有一个表来存放职位信息,接下来一步一步演示如何实现从数据源到Combobox下拉表列框的绑定。

1. 打开LiveBindings_BindFormat项目的主窗体,从工具栏中拖一个TProtoTypeBindSource控件到主窗体上,将其命名为TitleBindSource,然后右击该控件,打开Fields Editor,定义如下的几个字段和生成器。

几个字段的作用如下:

  • ContactTitle:职位名称
  • TitleImageIndex:职位的图片索引,演示如何给Combobox绑定一张图片。
  • TitleDescription:职位描述
  • TitleColor:将用于职位的颜色。

2. 在主窗体上右击鼠标,从弹出的菜单中选择“LiveBinding Wizard...”,使用向导,选择“Link a Control with a field”菜单项,创一个新的TCombobox到数据源TitleBindSource的连接,指定FieldName为ContactTitle,向导会自动将Combobox控件的Synch与TitleBindSource的*进行连接,并有一个指向Item.Text的单向连接。

绑定的连接是一个类型为TLinkListControlToField连接类型,FireMonkey的ListBox、ListView都会使用这种类型来绑定数据。

设计器中的Combobox除了Synch之外,还有如下的几个可绑定类型:

  • SelectedValue:当选中项时,SelectedValue返回的给其他数据源的数据。
  • Item.Text:显示在Combobox中的项的文本。
  • Item.ImageIndex:显示在Combobox的图片索引。
  • Item.LookupData:SelectedValue将返回的值类型,也就是要搜寻的数据。

在这里需要将SelectedValue连接到EmployeeBindSource控件的Title字段,以便将当前选中的Contact Title更新到EmployeeBindSource的底层表。

在设计器中拖动SelectedValue到EmployeeBindSource控件的Title字段,设计器会弹出一个提示:

向导会删除Synch到*的连接,接下来将如下图连接Item.ImageIndex,并指定Item.LookupData到ContactTitle,以确保SelectedValue会返回职位名称。

3. 选中Combobox控件,指定其Images属性为一个TImageList,这样就会在列表项左侧显示图片。

最终效果如下所示:

4. 在代码部分,更新了EmployeeObjectU.pas,添加了一个新的类TEmployeeTitle,现附上更新后的代码

EmployeeObjectU.pas

unit EmployeeObjectU;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, System.StrUtils; type
TEmployee = class
private
FContactBitmap: TBitmap; //联系人图片
FContactName: string; //联系人名称
FTitle: string; //职位
FHireDate: TDate; //雇佣日期
FSalary: Integer; //薪水
FAvailNow: Boolean; //是否在职
public
constructor Create(const NewName: string;
const NewTitle: string;
const NewHireDate: TDate;
const NewSalary: Integer;
const NewAvail: Boolean);
property ContactBitmap: TBitmap read FContactBitmap write FContactBitmap;
property ContactName: string read FContactName write FContactName;
property Title: string read FTitle write FTitle;
property HireDate: TDate read FHireDate write FHireDate;
property Salary: Integer read FSalary write FSalary;
property AvailNow: Boolean read FAvailNow write FAvailNow;
end; type
TEmployeeTitle = class
private
FContactTitle: string; //职位名称
FTitleColor: Cardinal; //显示颜以
TTitleImageIndex: Integer; //显示图标索引
TTitleDescription: string; //职位描述
public
constructor Create(const NewTitle: string;
const NewTitleDesc: string;
const NewTitleColor: Cardinal;
const NewImageIdx: Integer);
property ContactTitle: string read FContactTitle write FContactTitle;
property TitleColor: Cardinal read FTitleColor write FTitleColor;
property TitleImageIndex: Integer read TTitleImageIndex write TTitleImageIndex;
property TitleDescription: string read TTitleDescription write TTitleDescription;
end; implementation { TEmployee } constructor TEmployee.Create(const NewName, NewTitle: string;
const NewHireDate: TDate; const NewSalary: Integer; const NewAvail: Boolean);
var
NewBitmap: TBitmap;
ResStream: TResourceStream;
begin
//将根据联系人名称姓来关联资源文件
ResStream := TResourceStream.Create(HINSTANCE, 'Bitmap_' + LeftStr(NewName, Pos(' ', NewName) - 1), RT_RCDATA);
try
NewBitmap := TBitmap.Create;
NewBitmap.LoadFromStream(ResStream);
finally
ResStream.Free;
end; FContactName := NewName;
FTitle := NewTitle;
FContactBitmap := NewBitmap; //来自资源的图片
FHireDate := NewHireDate;
FSalary := NewSalary;
FAvailNow := NewAvail;
end; { TEmployeeTitle } constructor TEmployeeTitle.Create(const NewTitle, NewTitleDesc: string;
const NewTitleColor:Cardinal;const NewImageIdx: Integer);
begin
FContactTitle := NewTitle;
FTitleColor := NewTitleColor;
TTitleImageIndex := NewImageIdx; //来自TImageList的图片
TTitleDescription:= NewTitleDesc;
end; end.

在主窗体中,为TitleBindSource的OnCreateAdapter事件添加了如下的代码来:

procedure TfrmMain.TitleBindSourceCreateAdapter(Sender: TObject;
var ABindSourceAdapter: TBindSourceAdapter);
begin
bsEmployeeTitle:= TListBindSourceAdapter<TEmployeeTitle>.Create(self, nil, True);
//赋值给TBindSourceAdapter
ABindSourceAdapter := bsEmployeeTitle;
end;

在FormCreate中关联了List.

procedure TfrmMain.FormCreate(Sender: TObject);
begin
LoadData; //加载数据
//设置员工列表
bsEmployee.SetList(FEmployeeList, False);
bsEmployee.Active := True;
//设置员工编号列表
bsEmployeeTitle.SetList(FEmployeeTitleList, False);
bsEmployeeTitle.Active := True;
end;

最后,通过处理LinkFillControlToField.OnFillingListItem事件,让其在填充列表项时,指定一个列表项的样式:

procedure TfrmMain.LinkFillControlToFieldFillingListItem(Sender: TObject;
const AEditor: IBindListEditorItem);
begin
//指定列表项的样式
(AEditor.CurrentObject as TListBoxItem).StyleLookup :='listboxitembottomdetail';
end;

显示效果如下所示:

选择使用FireMonkey的程序员,一定时会被其强大的自定义样式定义所吸引的,在接下来的课程中,将会讨论如何自定义样式。

# 一步一步学习使用LiveBindings(10) LiveBindings绑定到漂亮的TCombobox的更多相关文章

  1. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...

  2. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域

    原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...

  3. 一步一步学习SignalR进行实时通信_2_Persistent Connections

    原文:一步一步学习SignalR进行实时通信_2_Persistent Connections 一步一步学习SignalR进行实时通信\_2_Persistent Connections Signal ...

  4. 一步一步学习Vim 全图解释

    转载:http://linux.chinaunix.net/techdoc/desktop/2009/01/03/1056322.shtml 一步一步学习Vim 全图解释 以下注释,根据图示和自己实践 ...

  5. 一步一步学习JNI

    本文来自网易云社区 作者:孙有军 前言 本篇的主要目的就是JNI开发入门,使大家对JNI开发流程有一个大致的了解,后续再进行深入学习. JNI不是Android特有的,JNI是Java Native ...

  6. 一步一步学习GTK

    完成课设,偶然碰到GTK,索性学习一遍 转载自ikoDotA の BLOG (一).一步一步学GTK+之开篇 一.什么是GTK+ GTK+ 是一种函数库是用来帮助制作图形交互界面的.整个函数库都是由C ...

  7. 一步一步跟我学习lucene(18)---lucene索引时join和查询时join使用演示样例

    了解sql的朋友都知道,我们在查询的时候能够採用join查询,即对有一定关联关系的对象进行联合查询来对多维的数据进行整理.这个联合查询的方式挺方便的.跟我们现实生活中的托人找关系类似,我们想要完毕一件 ...

  8. 12.Linux软件安装 (一步一步学习大数据系列之 Linux)

    1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...

  9. 一步一步安装UEFI分区方式的windows 10 企业版

    发现很多坛友不会安装UEFI分区的windows 10 从启动设置,到分区,到最后的引导与激活都是很大的问题. 在我看来这是最不容易出错的安装方式适合于刚刚上手的菜鸟,自己按照图片一步一步的就可以安装 ...

  10. (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...

随机推荐

  1. odoo14里面开发一个简单的action.client 的tag 模板例子

    1.js模板  web_template.js odoo.define('web', function (require) { "use strict"; var core = r ...

  2. 安全漏洞修复导致SpringBoot2.7与Springfox不兼容,问题排查与处理

    开心一刻 2021,朋友某一次核酸检测,跟我聊天朋友:今天我们小区做核算,队长死了我:卧槽,过劳死吗朋友:?????我:啊?朋友:队 长死了,队伍很长!我:哈哈哈,我以为做核算的队长死了呢 背景介绍 ...

  3. Strands Agents(一)Strands Agents 介绍

    Strands Agent AWS 最新开源的 Strands Agents SDK 是一款采用模型驱动架构的 AI 代理开发框架,旨在通过极简开发方式,帮助开发者快速构建和部署 AI 代理.它将代理 ...

  4. python实现字符输入实时读取

    原理:通过opencv中的waitKey来实现 示例代码: def key_control(): while 1: cv2.imshow('tmp', np.zeros(shape=(100, 100 ...

  5. 【转载】controller-runtime之manager的实现

    介绍 在controller-runtime中使用一个 Manager 的接口来管理 Controller,除了控制器其实还可以管理A dmission Webhook,也包括访问资源对象的clien ...

  6. 详解鸿蒙Next仓颉开发语言中的动画

    大家上午好,今天来聊一聊仓颉开发语言中的动画开发. 仓颉中的动画通常有两种方式,分别是属性动画和显示动画,我们今天以下面的加载动画为例,使用显示动画和属性动画分别实现一下,看看他们有什么区别. 显示动 ...

  7. 雷池WAF磁盘空间告急?手把手教你轻松清理

    一.为什么磁盘会满?--了解空间去哪了 雷池WAF在保护你的网站时,会持续记录各种安全数据.主要占用空间的有两大"仓库": 防护日志仓库(数据库) ● 存放内容:攻击记录.人机验证 ...

  8. 使用 ftrace 跟踪内核丢包问题定位的实践

    本文分享自天翼云开发者社区<使用 ftrace 跟踪内核丢包问题定位的实践>,作者:f****n 数据包的丢失可能会导致性能下降或服务中断.为了诊断内核中是否有丢包问题,我们可以使用 ft ...

  9. ArkUI-X平台桥接Bridge说明

    简介 平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递.ArkUI侧调用平台的方法.平台调用ArkUI侧的方法. 以Android平台为 ...

  10. java反射简单的一些用法

    记录一下反射的用法 用org.springframework.util里面的工具类去反射注解的字段值 Class<?> clz = Class.forName("..." ...