当Listview附件类型可见/不可见时启用/禁用按钮

时间:2016-04-20 15:06:23

标签: delphi firemonkey delphi-xe8

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

使用OnItemClick程序我尝试在每个项目都可以看到listview附件类型(Checkmark)时启用按钮,并在所有项目上看不到附件时禁用。

我有以下代码,可以在点击时在每个项目上显示附件。

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个或更多项目上可见,则按钮将被启用,如果在所有项目上移除附件,则应禁用该按钮。

1 个答案:

答案 0 :(得分:3)

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

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,它既是项目本身,也可以包含多个子项目。你正在看项目本身。这显然是可见的,否则你将无法点击它 你需要逐个查看子项,而不是主项本身。

我猜你对Objects真正引用Object本身的事实感到困惑。列表属性记录不充分这一事实无济于事。