2012-02-23 5 views
3

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

Вот мой код:

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. Где я не так.? Кто-нибудь думает? Любая помощь очень ценится, спасибо.

+4

Я не знаю, что это за 'THTMLLabel', это не часть стандартного Delphi. Я заметил, что вы установили 'Autosizing' как' True'. Не могли бы вы объяснить, почему вы ожидаете значения «Высота», кроме 17? –

+0

Спасибо за ответ. Я ожидаю более высокого значения для 'Height', потому что, как вы можете видеть, я установил' Font.Size' в 18, что больше, чем значение по умолчанию, равное 8, поэтому с настройкой 'Autosizing' на 'True', фактический' Height' созданного компонента должен быть больше его значением по умолчанию. Я прав? – jhodzzz

+2

Возможно, это один случай, когда перед изменением размера шрифта вы должны установить autosizing в true? –

ответ

0

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

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

LabelHeight := THTMLabel(FindComponent('lblSen_0')).BoundsRect.Bottom; 
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, используется исключительно для целей расчета (вы можете установить видимость т o false). Компонент htmlStaticText должен иметь значение AutoSize равным true (в нашем случае для параметра AutoSizeType установлено значение «Vertical»), и при вызове функции должен присутствовать htmlStaticText.Text.