如何调整ListBox项高度以适应Firemonkey(android)中的文本?

时间:2014-01-26 07:12:22

标签: android delphi firemonkey delphi-xe5

我正在使用此代码将项目添加到列表框中,但我无法弄清楚如何动态调整项目的高度以适应文本:

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需要,为了澄清我的问题,如何获得列表框项中文本的高度?

4 个答案:

答案 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

<{> Here's a list 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修复高度和一些控件”。这是因为:

  1. 每个平台的UI样式指南定义了标准控件大小的规则。
  2. Firemonkey使用光栅样式,因此您无法更改某些控件大小,因为您将失去视图质量
  3. 但是,您可以删除此约束。看看我的解决方案(自动翻译为Google):Can not increase the height TProgressBar

    这篇关于TProgressBar的文章,但你也可以将此方法用于TListBoxItem。