我正在使用此代码将项目添加到列表框中,但我无法弄清楚如何动态调整项目的高度以适应文本:
procedure TmForm.AddItemBtnClick(Sender: TObject);
var
Item: TListBoxItem;
begin
Item := TListBoxItem.Create(nil);
Item.Parent := SomeListBox;
Item.StyleLookup := 'listboxitemstyle';
Item.Text :=
'Pe cararea lunga scurta se ducea un om venind, si-n tacerea lui ' +
'profunda se auzea borborosind. Cantr-o noapte intunecoasa soarel' +
'e lucea pe cer, iara eu cu barca in casa ma plimbam ca un boier.';
Item.WordWrap := true;
Item.StyledSettings := [TStyledSetting.ssFamily] + [TStyledSetting.ssStyle] + [TStyledSetting.ssFontColor];
Item.Font.Size := 14;
end;
我尝试使用this example中的代码(为TListBoxItem修改),但它没有用。
编辑:可以通过在上面的代码末尾添加Item.Height := 100;
来设置ListBoxItem的高度,但我需要知道文本的高度来决定文本的大小ListBoxItem需要,为了澄清我的问题,如何获得列表框项中文本的高度?
答案 0 :(得分:1)
在OnApplyStyleLookup事件中弹出调整大小代码。
写在我的头顶,经过睡觉时间:
procedure TForm1.ListBoxItemApplyStyleLookup(Sender: TObject);
var O: TFMXObject;
begin
O := (Sender as TListBoxItem).FindStyleResource('text');
if O is TText then
(Sender as TListBoxItem).Height := (O as TText).Height;
end;
当然,您需要为您创建的每个项目设置事件。
答案 1 :(得分:1)
如Mike Sutton所述,它可以完成OnApplyStyleLookup
事件。
我是用TTextLayout
:
uses
... ,FMX.TextLayout;
procedure TfrmForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var
myLayout: TTextLayout;
aPoint: TPointF;
begin
myLayout := TTextLayoutManager.DefaultTextLayout.Create;
myLayout.BeginUpdate;
// Setting the layout MaxSize
aPoint.X := ListBoxItem1.Width;
aPoint.Y := TfrmForm1.Height;
myLayout.MaxSize := aPoint;
myLayout.Text := ListBoxItem1.Text;
myLayout.WordWrap := True ;
myLayout.Font := ListBoxItem1.Font;
myLayout.HorizontalAlign := ListBoxItem1.TextSettings.HorzAlign;
myLayout.VerticalAlign := ListBoxItem1.TextSettings.VertAlign;
myLayout.Padding := ListBoxItem1.Padding;
// set other properties as needed
myLayout.EndUpdate;
ListBoxItem1.Height := Trunc(myLayout.TextHeight) + 3 ; // +3px to be sure to see entire text
end;
请注意,MaxSize
是限制性的。例如,aPoint.Y
将限制最终TextHeight
。您应该将其设置得很大,因为无论TextHeight
应该是什么,如果myLayout.TextHeight
大于myLayout.MaxSize.Y
,那么myLayout.TextHeight
将设置为myLayout.MaxSize.Y
。
TTextLayout
个属性。
答案 2 :(得分:0)
以下是Mike Sutton的代码,由我改进和测试。适用于带有详细文本的项目(.ItemData.Detail)。使用TextLayout的变体对我不起作用。
此代码已针对Windows和Android应用程序进行了测试。
procedure TTestForm.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var item: TListBoxItem absolute Sender;
function CalcHeight( SubStyle: String ): Single;
var Obj: TFMXObject; T: TText absolute Obj;
begin
Obj := item.FindStyleResource(SubStyle);
if Obj is TText
then Result := T.Canvas.TextHeight(T.Text)
+ T.Margins.Top + T.Margins.Bottom
+ T.Padding.Top + T.Padding.Bottom
else Result := 0;
end;
begin
item.Height := CalcHeight('text')
+ CalcHeight('detail');
end;
答案 3 :(得分:-1)
改变控件的大小有一个重要的事情:“对于移动平台,firemonkey修复高度和一些控件”。这是因为:
但是,您可以删除此约束。看看我的解决方案(自动翻译为Google):Can not increase the height TProgressBar
这篇关于TProgressBar的文章,但你也可以将此方法用于TListBoxItem。