动态创建THTMLabel.Height总是返回默认值?

时间:2012-02-23 09:26:31

标签: delphi label

我正在创建一些动态创建的THTMLabel,但是在创建它们之后,当我试图获得它的高度时,它总是返回默认的高度值。

这是我的代码:

for i := 0 to ASentencePtr^.MUS.Count - 1 do
begin
  j := Random(slTemp.Count);
  sSen := ASentencePtr^.MUS.Strings[StrToInt(slTemp.Strings[j])] + ' / ';

  THTMLabel.Create(Self).Name := 'lblSen_' + slTemp.Strings[j];
  with THTMLabel(FindComponent('lblSen_' + slTemp.Strings[j])) do
  begin
    Font.Size := 18;
    Font.Style := [fsBold];
    Parent := FlowPanel1;
    Width := Parent.Width;
    Cursor := crHandPoint;
    DragMode := dmAutomatic;
    ControlStyle := ControlStyle + [csDisplayDragImage];
    HTMLText.Add(sSen);
    Autosizing := True;        
  end;

  slTemp.Delete(j);
end;

现在当我尝试访问THTMLabel(FindComponent('lblSen_0'))。高度时,它只返回默认值17。我哪里出错了?有人想过吗?非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题,但设法用 THTMLStaticText 组件来解决它们,这个函数在动态(高度)调整时计算高度:

function CalculateDynamicHeight( aLabel: TLabel; htmlStaticText: THTMLStaticText): Integer;
var
  lRect : TRect;
  lText : string;
begin
  lRect := Rect( 0, 0, htmlStaticText.Width, 0);
  lText := htmlStaticText.Text;

  aLabel.Caption := htmlStaticText.Text;
  aLabel.Font := htmlStaticText.Font;
  aLabel.Canvas.Font := htmlStaticText.Font;
  aLabel.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
  aLabel.Height := lRect.Bottom;

  Result := lRect.Bottom;
end;

该函数需要TLabel组件,专门用于计算目的(您可以将可见性设置为false)。 htmlStaticText组件应将AutoSize设置为true(在我们的示例中,AutoSizeType设置为asVertical),并且在调用函数时应该存在htmlStaticText.Text。

答案 1 :(得分:0)

我认为THTMLLabel是绝地图书馆的一部分,不是吗?这个问题很奇怪。我不知道这个控件的实现,但如果你遇到这个问题,那么AutoSize属性的实现可能会非常糟糕。

如果您无法检查并修复此控件的来源,请尝试使用BoundsRect属性获取高度:

LabelHeight := THTMLabel(FindComponent('lblSen_0')).BoundsRect.Bottom;