Динамически создаваемый THTMLabel.Height всегда возвращает значение по умолчанию? - PullRequest
3 голосов
/ 23 февраля 2012

Я создаю несколько динамически создаваемых меток THTMLabels, но после их создания, когда я пытаюсь получить его высоту, он всегда возвращает значение высоты по умолчанию.

Вот мой код:

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 ]

1 голос
/ 20 апреля 2016

У нас были те же проблемы, но нам удалось их решить с помощью компонента 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 должен присутствовать при вызове функции.

0 голосов
/ 02 марта 2012

Я думаю, THTMLLabel является частью библиотеки джедаев, не так ли? Эта проблема странная. Я не знаю реализацию этого элемента управления, но если у вас есть эта проблема, то может быть очень плохая реализация свойства AutoSize.

Если вы не можете проверить и исправить источник этого элемента управления, попробуйте использовать свойство BoundsRect, чтобы получить высоту:

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