计算TLabel所需的大小

时间:2010-04-27 13:06:34

标签: delphi

好的,这是问题所在。我在面板中有一个标签组件。标签对齐为alClient并启用了wordwrap。文本可以从一行到几行不等。我想重新调整面板(和标签)的高度以适应所有文本。

当我知道面板的文字和宽度时,如何获得标签所需的高度?

7 个答案:

答案 0 :(得分:18)

您可以使用TCanvas.TextRect方法以及tfCalcRect和tfWordBreak标志:

var
  lRect : TRect;
  lText : string;

begin
  lRect.Left := 0;
  lRect.Right := myWidth;
  lRect.Top := 0;
  lRect.Bottom := 0;

  lText := myLabel.Caption;

  myLabel.Canvas.TextRect( 
            {var} lRect, //will be modified to fit the text dimensions
            {var} lText, //not modified, unless you use the "tfModifyingString" flag
            [tfCalcRect, tfWordBreak] //flags to say "compute text dimensions with line breaks"
          );
  ASSERT( lRect.Top = 0 ); //this shouldn't have moved
  myLabel.Height := lRect.Bottom;
end;

TCanvas.TextRect从Windows API中调用DrawTextEx函数。

tfCalcRecttfWordBreak标志是windows API的值DT_CALCRECTDT_WORDBREAK的delphi包装器。您可以在msdn

DrawTextEx文档中找到有关其效果的详细信息

答案 1 :(得分:11)

使用TextWidth和TextHeight。

在此处查看示例: http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html

TextWidth将告诉您文本的宽度,然后您可以将其除以控件宽度以查看所需的行数。除法的其余部分应该是一个额外的行。

答案 2 :(得分:4)

您可以使用以下一行代码:

label.width := label.canvas.textwidth(label.caption);

或者您可以在对象检查器中将标签的autosize属性设置为true。

答案 3 :(得分:2)

如果您可以对齐alTop并在标签上保留AutoSize,则会在设置标题后自动调整高度。

答案 4 :(得分:0)

您需要通过标签左右边距减少LRect.right,然后将标签的上下边距添加到标签末尾的高度,否则文本可能不适合标签。

答案 5 :(得分:0)

在 FMX 中有一个简单的技巧: 创建标签集 Autosize := true 并使用 OnResize 事件更新父级的大小时...

Rectangle1 := TRectangle.create(Form1);
Rectangle1.parent := Form1;
Label1 := TLabel.create(Rectangle1);
Label1.parent := Rectangle1;
Label1.Align  := TAlignLayout.Top;  // keep the same width and auto size parent height
Label1.OnResize := DoReSize;
Label1.WordWrap := true;
Lable1.Autosize := true;

这里会更新父级尺寸(假设Sender对象是父级中最底层的控件,如果不是就需要安排这个函数来汇总所有组件的size和verticaly)< /p>

procedure DoParentResize(Sender : TObject);
begin
    TControl(TControl(Sender).parent).Height := TControl(Sender).Height + 4;

end;

如果我们使用 Label1.Align := TALignLayout.None;

然后我们应该在父级中添加位置:

procedure DoParentResize(Sender : TObject);
begin
    TControl(TControl(Sender).parent).Height := TControl(Sender).Position.Y + TControl(Sender).Height + 4;

end;

这会导致(几乎)所有情况的单一功能:

procedure TForm1.DoParentResize(Sender : TObject);
begin
  if TControl(Sender).Align in [TAlignLayout.None, TAlignLayout.Client, TAlignLayout.Center, TAlignLayout.VertCenter ] then
  begin
    TControl(TControl(Sender).parent).Height := TControl(Sender).Position.Y + TControl(Sender).Height + 4;
  end
  else
  begin
    TControl(TControl(Sender).parent).Height := TControl(Sender).Height + 4;
  end;
end;

答案 6 :(得分:-1)

procedure TFrm.PatternEditTyping(Sender: TObject);
begin
    (Sender as Tedit).Canvas.Font.Size := (Sender as Tedit).Font.Size;
    (Sender as Tedit).Width := (Sender as Tedit).Canvas.TextWidth((Sender as Tedit).Text);
end;

此代码在您输入Tedit.Width时会对其进行调整。只需在Canvas和Tedit中保持相同的字体系列即可。