2010-04-27 66 views
15

好的,问题来了。我在面板中有一个标签组件。该标签与alClient对齐并启用了wordwrap。文本可以从一行到几行不等。我想重新调整面板(和标签)的高度以适合所有文本。计算TLabel所需的尺寸

如何获取标签的必要高度时,我知道文字和面板的宽度是多少?

回答

15

可以使用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标志是delphi封装的windows API值DT_CALCRECTDT_WORDBREAK。你可以找到msdn

+4

您应该在TextRect行之前添加myLabel.Canvas.Font:= myLabel.Font。 – 2011-06-29 16:39:21

2

如果你能保持一致是alTop并保持自动调整大小上,然后将的TLabel自动settign标题后调整高度。

+0

这实际上不起作用或仅部分起作用。出于某种原因,该标签会将右侧的文字剪掉。它只在有新行时显示包装文本。所以,如果你有没有新的线路长文本,它不把它包起来,你不能看到整个文本 – Asped 2013-10-04 18:24:39

+0

@Asped这似乎在Delphi XE2已经为我工作,正确包装,并自动调整高度。 – Alister 2014-07-31 01:56:51

10

使用文本宽度和textHeight不同。

在这里看到一个例子: http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html

文本宽度会告诉你的文本将有多宽是,然后你可以将通过控制宽度就看你有多少行需要。该部门的其余部分应该是一个额外的行。

+0

如果u使用自动换行多则需要1条额外线 – 2013-03-07 14:32:40

+0

这是很酷的,是有可能确定的选框或大小,这可能会出问题?我注意到它随组件的字体和大小而变化......我的意思是框越大或越小... – 2014-05-18 14:41:36

3

他们的DrawTextEx文档中的影响的详细信息,您可以用一行代码,这

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

,或者您可以在Object Inspector中使用标签自动调整大小属性为true。

+1

他想重新调整高度 – 2013-03-08 09:41:51