【问题标题】:Enable/disable button when Listview accessory type is visible/not visible当 Listview 附件类型可见/不可见时启用/禁用按钮
【发布时间】:2016-04-20 15:06:23
【问题描述】:

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

【问题讨论】:

  • 在第二个代码中你有 for 但总是使用相同的元素
  • 也许应该类似于AItem[i].Objects.AccessoryObject.Visible。加上你的逻辑不清楚......
  • block1中的代码应该压缩成:begin AItem.Objects.AccessoryObject.Visible:= not(AItem.Objects.AccessoryObject.Visible); end;
  • 很抱歉不清楚。对于在列表视图中单击的每个项目,附件将可见,再次单击项目将删除附件。因此,如果配件在 1 个或更多项目上可见,则该按钮将启用,如果在所有项目上移除该配件,则该按钮将被禁用。

标签: delphi firemonkey delphi-xe8


【解决方案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 本身这一事实感到困惑。列表属性记录不充分的事实无济于事。

【讨论】:

  • 感谢您的评论,我刚刚尝试了您的建议,在 Objects[i] 之后。 它没有拾取 AccessoryObject.Visible
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2016-03-17
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多