隐藏隐藏列表框项目后面的空白区域

时间:2015-04-03 16:33:24

标签: delphi firemonkey delphi-xe7

我可以看到other people have had this issue,建议的解决方案对我不起作用。

我有一个列表框,其中包含许多在设计时填充的静态项目,在运行时,某些列表框项目的可见性已更改。但是,那些不可见的项目会在该项目所属的列表框中留下空白区域。它建议将隐形物品高度设置为0,它显然对人有用,但它不适合我。

这是我为了适应这个目的而写的一个常用功能:

procedure FixHidden(AListBox: TListBox);
var
  X: Integer;
  I: TListBoxItem;
begin
  for X := 0 to AListBox.Count-1 do begin
    I:= AListBox.ItemByIndex(X);
    if I.Visible then
      I.Height:= AListBox.ItemHeight
    else
      I.Height:= 0;
  end;
end;

在逐步执行代码时,我可以确认I.Height:= 0;Height实际为0.但是,问题仍然存在,并且列表中仍然存在空白框,好像列表框控件忽略了我设置项目的高度。

如何在列表框中隐藏真正隐藏的隐藏项目,包括其背后的空白区域,而不删除这些项目?我的应用程序有许多不同的列表框控件具有相同的问题,因此全局解决方案将是理想的。

注意:这是使用Windows 32作为平台。

修改

我做了几次试验,并发现了一些东西。在设计时,列表框项Height属性默认为父列表框的ItemHeight属性。如果我在设计时更改特定项目的Height,它会立即恢复到以前的状态。那么问题就变成了......为什么Firemonkey每次更改都会恢复TListBoxItem.Height

1 个答案:

答案 0 :(得分:1)

感谢Tom在评论中提供的一些故障排除帮助,我发现了什么问题以及如何解决问题。

问题的根源在于我的TListBox控件被赋予ItemHeight的自定义值,但默认情况下它们有0。当ItemHeight0时,您可以设置单个项目的高度。但是,当ItemHeight为其他任何内容时,无论您为每个项目分配什么,列表框控件都会接管并强制将所有项目设置为该高度。

所以解决这个问题的步骤是:

  1. TListBox.ItemHeight属性设置回0
  2. 将每个项目的TListBoxItem.Height属性设置为所需的高度
  3. 修改我的程序以设置为所需的高度,而不是TListBox.ItemHeight
  4. 现在的程序如下:

    procedure FixHidden(AListBox: TListBox; AHeight: Extended = 32.0);
    var
      X: Integer;
      I: TListBoxItem;
    begin
      for X := 0 to AListBox.Count-1 do begin
        I:= AListBox.ItemByIndex(X);
        if I.Visible then
          I.Height:= AHeight
        else
          I.Height:= 0;
      end;
    end;
    

    对于原始的潜在问题,这仍然是一个相当混乱的解决方案,但它确实解决了这个问题。

    如果出于任何原因希望能够拥有不同高度的列表项,可以通过在每个列表框项的Tag属性中存储所需的高度来实现此目的(尽管TagNativeIntHeightExtended,因此准确性将会丢失)...

    procedure FixHidden(AListBox: TListBox);
    var
      X: Integer;
      I: TListBoxItem;
    begin
      for X := 0 to AListBox.Count-1 do begin
        I:= AListBox.ItemByIndex(X);
        if I.Visible then
          I.Height:= I.Tag
        else
          I.Height:= 0;
      end;
    end;