Рассчитать необходимый размер для TLabel

Хорошо, вот проблема. У меня есть компонент ярлыка в панели. Метка выровнена как alClient и включена функция wordwrap. Текст может варьироваться от одной строки до нескольких строк. Я бы хотел изменить размер панели (и метки), чтобы она соответствовала всему тексту.

Как получить необходимую высоту метки, когда я знаю текст и ширину панели?

Ответы

Ответ 1

Вы можете использовать метод 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 завершает вызов функции DrawTextEx из Windows API.

Флаги tfCalcRect и tfWordBreak являются оболочками delphi для значений DT_CALCRECT и DT_WORDBREAK API окон. Подробную информацию об их эффектах можно найти в документации DrawTextEx на msdn

Ответ 2

Используйте TextWidth и TextHeight.

См. пример здесь: http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html

TextWidth расскажет вам, насколько широким будет текст, а затем вы можете разделить его по ширине элемента управления, чтобы узнать, сколько строк вам нужно. Остальная часть деления должна быть дополнительной строкой.

Ответ 3

для этого можно использовать один код строки

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

или вы можете использовать свойство label autosize label для true в объекте инспектора.

Ответ 4

Если вы можете выровнять его alTop и сохранить AutoSize, тогда TLabel автоматически отрегулирует высоту после настройки заголовка.