Delphi XE5 TLabel Word Wrapping

时间:2014-05-05 04:54:59

标签: delphi word-wrap delphi-xe5 tlabel

我有一段时间试图在Delphi XE5 Firemonkey移动应用程序中使用TLabel组件正确处理自动换行。背景是我试图以编程方式在具有各种图像和标签的表单上填充TScrollBox组件,并且一些标签将需要包装。

有些帖子似乎表明,如果将组件宽度设置为预定义大小,则将AutoSize和WordWrap属性设置为true,标签将换行并根据需要调整高度。不幸的是,在我的测试中,似乎这不起作用,并且只要AutoSize为true,组件默认为单个长行文本。

      currentBlurb                 := TLabel.Create(self);
      currentBlurb.parent          := scrollNews;
      currentBlurb.Width           := scrollNews.Width - 50;
      currentBlurb.Position.X      := 25;
      currentBlurb.Position.Y      := scrollPosition;
      currentBlurb.WordWrap        := true;
      currentBlurb.AutoSize        := true;
      currentBlurb.Font.Size       := 12;
      currentBlurb.Font.Style      := [];
      currentBlurb.Visible         := true;
      currentBlurb.Text            := resultArticles.O[articleIndex].S['blurb'];
      currentBlurb.StyledSettings  := [];

Screenshot 1

其他帖子建议使用MeasureText程序来计算包装文本的高度,但是这个计算虽然接近正确的高度似乎并没有正确地为我工作,因为它随机地删除了一些底部文本。

      currentBlurb                 := TLabel.Create(self);
      currentBlurb.parent          := scrollNews;
      currentBlurb.AutoSize        := false;
      currentBlurb.WordWrap        := true;
      currentBlurb.Position.X      := 25;
      currentBlurb.Position.Y      := scrollPosition;
      currentBlurb.Width           := scrollNews.Width - 50;
      currentBlurb.Font.Size       := 12;
      currentBlurb.Font.Style      := [];
      currentBlurb.Visible         := true;
      currentBlurb.Text            := resultArticles.O[articleIndex].S['blurb'];
      currentBlurb.StyledSettings  := [];

      { The TLabel component doesn't seem to wrap as the documentation would suggest }
      { so we need to manually calculate the height of the label after wrapping      }

      rectBlurb := TRectF.Create(0, 0, currentBlurb.Width, 10000);
      currentBlurb.Canvas.MeasureText
      (
        rectBlurb,
        currentBlurb.Text,
        True,
        [],
        TTextAlign.taLeading,
        TTextAlign.taLeading
      );

      currentBlurb.Height          := rectBlurb.Height;

      scrollPosition := scrollPosition + trunc(currentBlurb.Height) + 50;

Screenshot 2

这让我疯狂了一个多星期了,所以任何帮助都会非常感激。

0 个答案:

没有答案