我正在使用一个简单的过程来更新列表视图项(DynamicAppearance),但遇到了问题。我需要该列表视图项(TAccessoryObjectAppearance,AccessoryType:复选标记)将在运行时显示(选中)/或不显示,具体取决于提供的值。它应该是:
但我得到了:
在设计时,我将Item设置为“不可见”。
下面是不起作用的代码:
procedure UpdateList(lv: TListView);
var
Litem: TListViewItem;
iName: TListItemText;
iCheck: TListItemAccessory;
begin
FDQuery.Open('SELECT Name, Value FROM tbl_values');
lv.Items.Clear;
lv.BeginUpdate;
while not FDQuery.Eof do
begin
Litem := lv.Items.Add;
iName := Litem.Objects.FindObjectT<TListItemText>('Name');
iName.Text := FDQuery.FieldValues['Name'];
iCheck := LItem.Objects.FindObjectT<TListItemAccessory>('Check');
if FDQuery.FieldValues['Value'] > 0 then
iCheck.Visible:= True
else
iCheck.Visible := False;
FDQuery.Next;
end;
lv.EndUpdate;
end;
此过程在www.example.com事件上运行form.show。
但随后我运行另一个过程,该过程更改了数据库表中的一些值,并再次运行相同的过程(UpdateList)来更新列表视图项值。现在复选标记正确显示:
我做错了什么?
Delphi 10.2.1
2条答案
按热度按时间8oomwypt1#
在 Delphi FMX控件中应用样式查找存在许多问题。最常见的问题是,在代码中创建FMX样式化对象后,其样式数据尚未加载,因为只有在渲染对象时才需要它。所以简而言之,对象必须初始化其视图,以便能够自定义其样式数据之一。对于常规FMX对象,有一个属性“StylesData”允许在视图初始化之前对每个项目进行自定义。但是对于TListViewItem,这个属性不存在,并且在创建所述项目时没有明确的方法来获得每个项目的自定义。至少在今天的 Delphi XE 11.3中是这样的。
解决方案是在TListView组件中实现OnUpdateObjects事件,并在此事件期间设置样式所需的任何特定值。
因此,您的项目创建代码变为:
和OnUpdateObjects事件:
这是唯一的方法,我发现这样做的每一个项目自定义的今天。
i5desfxk2#
这就是我所做的: