delphi ListView附件项目显示问题

1l5u6lss  于 2023-04-20  发布在  其他
关注(0)|答案(2)|浏览(126)

我正在使用一个简单的过程来更新列表视图项(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

8oomwypt

8oomwypt1#

在 Delphi FMX控件中应用样式查找存在许多问题。最常见的问题是,在代码中创建FMX样式化对象后,其样式数据尚未加载,因为只有在渲染对象时才需要它。所以简而言之,对象必须初始化其视图,以便能够自定义其样式数据之一。对于常规FMX对象,有一个属性“StylesData”允许在视图初始化之前对每个项目进行自定义。但是对于TListViewItem,这个属性不存在,并且在创建所述项目时没有明确的方法来获得每个项目的自定义。至少在今天的 Delphi XE 11.3中是这样的。
解决方案是在TListView组件中实现OnUpdateObjects事件,并在此事件期间设置样式所需的任何特定值。
因此,您的项目创建代码变为:

procedure UpdateList(lv: TListView);
var
  Litem: TListViewItem;
  iName: TListItemText;
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'];

    Litem.Tag  := FDQuery.FieldValues['Value']; 
    FDQuery.Next;
  end;

  lv.EndUpdate;
end;

和OnUpdateObjects事件:

procedure TForm1.LVUpdateObjects(const Sender: TObject; const aItem: TListViewItem);
var
  iAcc: TListItemAccessory;

begin
  if not assigned(aItem) then Exit;
  iAcc := aItem.Objects.AccessoryObject;
  if assigned(iAcc) then
  begin
    iAcc.Visible := aItem.Tag > 0;
  end;
end;

这是唯一的方法,我发现这样做的每一个项目自定义的今天。

i5desfxk

i5desfxk2#

这就是我所做的:

while not FDQuery.Eof do
  begin
    Litem := lv.Items.Add;
    
    **ListView1.ApplyStyleLookup;** //Add this line

    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;

相关问题