我有一张带有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个或更多项目上可见,则按钮将被启用,如果在所有项目上移除附件,则应禁用该按钮。
答案 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
本身的事实感到困惑。列表属性记录不充分这一事实无济于事。