Delphi Listview附件类型可见/不可见时的启用/禁用按钮
我有一个表单,上面有firemonkey列表视图。此listview中包含多个项 使用OnItemClick程序,我试图在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.
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);结束对不起,我不清楚。对于在列表视图中单击的每个项目,附件都将可见,再次单击这些项目将删除附件。因此,如果附件在1项或更多项上可见,则按钮将启用,如果附件在所有项上移除,则按钮将禁用。感谢您的评论,我刚刚尝试了您建议的,在对象[I]之后。它没有拾取AccessoryObject.visible谢谢您的评论,我刚刚尝试了您建议的对象[I]之后的内容。它不拾取附件对象。可见