好的,这是问题所在。我在面板中有一个标签组件。标签对齐为alClient并启用了wordwrap。文本可以从一行到几行不等。我想重新调整面板(和标签)的高度以适应所有文本。
当我知道面板的文字和宽度时,如何获得标签所需的高度?
答案 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
函数。
tfCalcRect
和tfWordBreak
标志是windows API的值DT_CALCRECT
和DT_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
中保持相同的字体系列即可。