Enable/disable 按钮,当 Listview 附件类型为 visible/not 可见时

Enable/disable button when Listview accessory type is visible/not visible

我有一个带有 firemonkey 列表视图的表单。此列表视图中包含多个项目。

使用 OnItemClick 过程,我试图在每个项目的列表视图附件类型(复选标记)可见时启用按钮,并在附件在所有项目上不可见时禁用按钮。

我有以下代码,可以在单击时使配件在每个项目上可见。

Tform.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem);
begin
 if AItem.Objects.AccessoryObject.Visible then
 begin
   AItem.Objects.AccessoryObject.Visible := False;
 end
 else
 begin
   AItem.Objects.AccessoryObject.Visible := True;
 end;
end;

然后我添加了以下内容,认为它会给我我想要的东西。

for i := 0 to AItem.Count -1 do
begin
  if (AItem.Objects.AccessoryObject.Visible) then
  begin
    Button1.Enabled := True
  end else Button1.Enabled := False;

对于在列表视图中单击的每个项目,附件都将可见,再次单击该项目将隐藏附件。因此,如果附件在 1 个或多个项目上可见,则按钮将启用,如果附件在所有项目上都被移除,则按钮应被禁用。

如果您想知道一个项目的所有子项目是否可见,您需要实际循环遍历它们。

procedure Tform1.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem);
var
  AllVisible: boolean;
  i: integer;
begin
  AllVisible:= (AnItem.Objects.Count > 0);
  for i:= 0 to AnItem.Objects.Count -1 do begin
    AllVisible:= AllVisible and AnItem.Objects[i].AccessoryObject.Visible;  
    //A and B will only be true if both are true.
    if not(AllVisible) then break; //jump out of loop.
  end; {for i}
  Button1.Enabled:= AllVisible;
end;

你遇到的问题是你实际上并没有在看个别项目,你只是在看集体,即使那没有意义。

当然,真正的问题是 if (AItem.Objects.AccessoryObject.Visible) then 令人困惑。

Objects是一个TListItem,它既是item本身,又可以包含多个子item。您正在查看项目本身。这个明显是看得见的,不然点不了
您需要一个一个地看子项,而不是主项本身。

我猜你对 Objects 实际上指的是 Object 本身感到困惑。列表 属性 记录不完整这一事实无济于事。