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
本身感到困惑。列表 属性 记录不完整这一事实无济于事。
我有一个带有 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
本身感到困惑。列表 属性 记录不完整这一事实无济于事。