我可以看到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
?
答案 0 :(得分:1)
感谢Tom在评论中提供的一些故障排除帮助,我发现了什么问题以及如何解决问题。
问题的根源在于我的TListBox
控件被赋予ItemHeight
的自定义值,但默认情况下它们有0
。当ItemHeight
为0
时,您可以设置单个项目的高度。但是,当ItemHeight
为其他任何内容时,无论您为每个项目分配什么,列表框控件都会接管并强制将所有项目设置为该高度。
所以解决这个问题的步骤是:
TListBox.ItemHeight
属性设置回0
TListBoxItem.Height
属性设置为所需的高度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
属性中存储所需的高度来实现此目的(尽管Tag
是NativeInt
和Height
为Extended
,因此准确性将会丢失)...
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;