隐藏不可见的列表框中的项目背后空白处(Hide empty space behind invisib

2019-10-22 12:44发布

我可以看到其他人有过这样的问题 ,并提出解决方案不是为我工作。

我有一些填充在设计时静态项目的列表框,并在运行时,一些列表框中的项目有自己的知名度改变。 但是,那些不可见的项目留在该项目所属的列表框中的空白处。 它提出了无形的项目高度设置为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我每次更改时间?

Answer 1:

由于汤姆一些故障排除帮助的评论,我发现发生了什么事情错了,如何解决它。

这个问题的根源是,我的事实TListBox给予对照的自定义值ItemHeight虽然在默认情况下,他们有0 。 当ItemHeight0 ,你被允许设置单个项目的高度。 然而,当ItemHeight为别的,列表框控件接管并强行将所有的物品到的高度,不管分配给每个项目什么。

因此步骤解决这个问题是:

  1. 在设置TListBox.ItemHeight属性回到0
  2. 在设置TListBoxItem.Height每个项目的属性所需的高度
  3. 修改我的程序设置到理想的高度,而不是TListBox.ItemHeight

而过程现在看起来是这样的:

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;


文章来源: Hide empty space behind invisible list box items