Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Listview附件类型可见/不可见时的启用/禁用按钮_Delphi_Firemonkey_Delphi Xe8 - Fatal编程技术网

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

Delphi Listview附件类型可见/不可见时的启用/禁用按钮,delphi,firemonkey,delphi-xe8,Delphi,Firemonkey,Delphi Xe8,我有一个表单,上面有firemonkey列表视图。此listview中包含多个项 使用OnItemClick程序,我试图在listview附件类型(复选标记)对每个项目可见时启用按钮,在附件对所有项目不可见时禁用按钮 我有以下代码,可以在单击时在每个项目上显示附件 Tform.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin if AItem.Objects.AccessoryObject.

我有一个表单,上面有firemonkey列表视图。此listview中包含多个项

使用OnItemClick程序,我试图在listview附件类型(复选标记)对每个项目可见时启用按钮,在附件对所有项目不可见时禁用按钮

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

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;

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

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

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;
你所面临的问题是,你实际上不是在看单个项目,你只是在看整体,尽管这没有意义

当然,真正的问题是
如果(AItem.Objects.AccessoryObject.Visible)那么
是令人困惑的

Objects
是一个TListItem,它既是项本身,也可以包含许多子项。您正在查看项目本身。这显然是可见的,否则您将无法单击它。
您需要逐个查看子项,而不是主项本身


我猜你被
对象
实际上是指
对象
本身这一事实弄糊涂了。列表属性没有很好的文档记录这一事实并没有帮助

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

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;
你所面临的问题是,你实际上不是在看单个项目,你只是在看整体,尽管这没有意义

当然,真正的问题是
如果(AItem.Objects.AccessoryObject.Visible)那么
是令人困惑的

Objects
是一个TListItem,它既是项本身,也可以包含许多子项。您正在查看项目本身。这显然是可见的,否则您将无法单击它。
您需要逐个查看子项,而不是主项本身


我猜你被
对象
实际上是指
对象
本身这一事实弄糊涂了。列表属性没有很好的文档记录这一事实并没有帮助

在第二个代码中,您有
,但始终使用相同的元素可能应该类似于
AItem[i].Objects.AccessoryObject.Visible
。加上您的逻辑不清楚…block1中的代码应该压缩为:
begin AItem.Objects.AccessoryObject.Visible:=not(AItem.Objects.AccessoryObject.Visible);结束
使用了
,但始终使用相同的元素,可能类似于
AItem[i]。Objects.AccessoryObject.visible
。加上您的逻辑不清楚…block1中的代码应该压缩为:
begin AItem.Objects.AccessoryObject.Visible:=not(AItem.Objects.AccessoryObject.Visible);结束