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

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

设计时添加各种Object的样式,见下图:

在Structure里选择"item",然后点属性里"+"属性,下拉框里显示了系统自带的各种样式。

另外,看似一个简单的运用,就是运行时添加Item和Item里的各种Object,FMX TListView 运行时添加Item比较简单,listView1.Item.Add; 就添加了一个Item。但是,发现无法顺利运行时添加Item里的各种Object(比如自带的TListItemText, TListItemImage, 等等)....

然后就在网上找,一时也没找到,看DEMO,也没有相关的代码,参考控件的Editor.pas,也看不出来什么。。。一时困境。估计对TListView的工作机制没理解。几天,在网上偶尔看到了一篇老外的贴子,正是说如何运行时添加Item的OBJECT的,试了试,结果出来了,就记录下来了:帖子见: https://stackoverflow.com/questions/29339179/create-a-customized-item-appearance-for-listview-delphi-xe7

试过这个方法,对TListView的工作方式稍微有了点理解,还真是不一般的方法。但是还有好多不了解的地方,慢慢来。

测试代码如下:

 1 unit Unit1;
 2
 3 interface
 4
 5 uses
 6   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 7   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances,
 8   FMX.ListView.Adapters.Base, FMX.ListView, FMX.Controls.Presentation, FMX.StdCtrls;
 9
10 type
11   TForm1 = class(TForm)
12     lv1: TListView;
13     btn1: TButton;
14     procedure btn1Click(Sender: TObject);
15     procedure lv1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
16   private
17     { Private declarations }
18   public
19     { Public declarations }
20   end;
21
22 var
23   Form1: TForm1;
24
25 implementation
26
27 {$R *.fmx}
28
29 procedure TForm1.btn1Click(Sender: TObject);
30 var
31   item: TListViewItem;
32   text: TListItemText;
33 begin
34   item := lv1.Items.Add;
35   //这里是实际显示出来.....
36   text := Item.Objects.FindObject(‘a1111‘) as TListItemText;
37   if Assigned(text) then
38     text.Text := ‘1234567‘;
39   item := lv1.Items.Add;
40 end;
41
42 //这里的代码相当与设计时的
43 procedure TForm1.lv1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
44 var
45   text: TListItemText;
46   image: TListItemImage;
47 begin
48   //item := lv1.Items.Add;
49   text := AItem.Objects.FindObject(‘a1111‘) as TListItemText;
50   if text = nil then
51   begin
52     text := TListItemText.Create(AItem);
53     text.Name := ‘a1111‘;
54     text.Align := TListItemAlign.Center;
55     text.Height := AItem.Height-2;
56     text.Width  := 200;
57     text.Text := ‘‘;
58     text.Data := nil;
59     text.Visible := True;
60     text.PlaceOffset.X := 2;
61     text.PlaceOffset.Y := 2;
62     text.TextColor := TAlphaColors.Red;
63   end;
64
65 end;
66
67 end.

好奇怪的方法。。。。

原文地址:https://www.cnblogs.com/jankerxp/p/10975297.html

时间: 2024-08-11 07:37:06

FMX TListView 动态添加Item和Item里面的Object的相关文章

QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)

=QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值,那么这么多类型怎么返回呢?于是,Qt提供了这个QVariant类型,你可 以把这很多类型都存放进去,到需要使用的时候使用一系列的to函数取出来即可.比如你把int包装成一个QVariant,使用的时候要用 QVariant::toInt()重新取出来.这里需要注意的是,Q

用js动态的改变img标签里面的src属性实现图片的循环切换

JS:根据循环切换的条件可以用 document.getElementById('').src=''设置, 或者jquery方法: $('#id').attr('src','图片名称’): 具体: if(true) { document.getElementById('id').src='a.png'; //or $('#id').attr('src','a.png'); }else { document.getElementById('id').src='b.png'; //or $('#id

js里面的Object基本

1 1,Object基本格式 2 <script type="text/javascript"> 3 var o = {}; 4 var o = {a:'foo',b:42,c:{}} 5 console.log(o)</script> 2,Object基本格式 <script type="text/javascript"> var a = 'foo', b = 42, c = {}; var o = { a: a, b: b,

NGUI ScrollView动态添加Item(不用GameObject.Find()去查找需要动态改变的游戏对象)

借鉴网上的提示,但具体的网址忘记保存了,因此无法放在这里!如需要注明出处,请联系本人. PS:网上说的不够详细,自己敲了下代码实现并整理了一下. 下面我用UITable组件而不是UIGrid来排序Item 将Item做成预设体,如下图中的3:QuestLog(此GO对应官方的例子中的QuestLog) 在预置体QuestLogPrefab中的GO对象QuestLog上挂脚本,如上图中1:脚本命名为QuestLogPrefab(当然类名也一样),然后在脚本里声明你需要动态改变数据的GO,记得需要p

在ASP.NET程序中用程序动态向&lt;head&gt;便签里添加&lt;meta&gt;标签

在使用ASP.NET框架开发: 若要在Html网页中加入<meta>设置,但想通过程序动态加入: 1.如果是ASP.NET4.0以前版本: 使用HtmlMeta类加入<meta>设置: //首先我们应该创立HtmlMeta类实体(命名空间:System.Web.UI.HtmlControls) HtmlMeta meta1=new HtmlMeta(); meta1.Name="keyword"; meta1.Content="ASP.NET,jQue

在python里如何动态添加类的动态属性呢?

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;

随笔 JS 字符串 分割成字符串数组 并动态添加到指定ID的DOM 里

JS /* * 字符串 分割成字符串数组 并动态添加到指定ID的DOM 里 * @id 要插入到DOM元素的ID * * 输入值为图片URL 字符串 * */ function addImages(id){ /*字符串 变量*/ var images='{$content.pictureurl} ' ; /* console.log( images ) ;*/ /*字符串分割成字符串数组 split*/ var StringArray = images.split(','); /* consol

(十三)Zabbix_linux添加定义的ITEM监控项

(十三)Zabbix_linux添加定义的ITEM监控项 背景: 1.zabbix3.4.4服务器搭建完成 思路: 1.被监控端允许自定义监控项及创建自定义监控项 2.通过zabbix服务器端用zabbix_get命令测试是否正常显示数据 3.通过web端创建监控项以及触发器 4.本内容仅供参考,以便以后学习使用. 一.被监控端配置文件 1.在配置文件zabbix_agentd.conf中设置允许添加自定义监控项,去掉前面的#,然后书写正确的路径, 2.重启客户端服务 注意:先用pkill  -

HTML标签 select 里 动态添加option

HTML标签 select 里 动态添加option: ☆ var today = new Date(); var yearNow = today.getFullYear(); var optiongYears_className = [yearNow, yearNow+1]; var $selyear = $("select#classNameYear_add"); $.each(optiongYears_className, function (i, val) { if(i==0)