Перейти к содержанию
Fire Monkey от А до Я
  • 0

Автоматический переход на вторую строку TLabel


97mik

Вопрос

Рекомендуемые сообщения

  • 0

Нашёл:

function TForm1.CalculateTextHeight(ACanvas: TCanvas; const AText: string; const AWidth: Single; 
  const AFontSize: Single): Single;
var
  R: TRectF;
begin
  R := RectF(0, 0, width, 10000);
  ACanvas.Font.Size := AFontSize;
  ACanvas.MeasureText(R, AText, True, [], TTextAlign.taLeading, TTextAlign.taLeading);
  Result := R.Bottom;
end;
...
Label1.Width := 100;
Label1.Text := 'text';
Label1.Height := CalculateTextHeight(Label1.Canvas, Label1.Text, Label1.Width, Label1.Font.Size);
Изменено пользователем admin
Отформатирован код, согласно принятым стандартам стилистического оформления кода в Delphi
Ссылка на комментарий
  • 0
  • Администраторы

TLabel имеет стандартный механизм автоматического вычисления размеров метки на основании текста и параметров.

 

Чтобы заставить Label автоматически менять ширину с учетом переносов, достаточно:

Label1.AutoSize := True;
Label1.WordWrap := True;

Ниже приведены результаты работы этого способа при изменении ширины формы и автоматически выравненной меткой по верхнему краю Align := TAlignLayout.alTop;

post-1-0-09107500-1390236139.jpgpost-1-0-25146600-1390236139_thumb.jpg

Ссылка на комментарий
  • 0
  • Модераторы

Если выставить:

 Label1.Align := alTop;
 Label1.AutoSize := True;
 Label1.WordWrap := True;

то при компиляции под андроид, Label1.WordWrap := True; автоматически превращается в Label1.WordWrap := False; и перенос не работает.

Ссылка на комментарий
  • 1
  • Администраторы

Да, согласен.

 

На XE5 Update 2 наблюдается, описанное вами поведение. На текущий момент это уже исправлено. Поэтому предлагаю для XE5 программное решение этой задачи:

procedure TForm1.FormCreate(Sender: TObject);
begin
  FTextLyout := TTextLayoutManager.DefaultTextLayout.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FTextLyout);
end;

procedure TForm1.Label1Resize(Sender: TObject);
var
  LabelTmp: TLabel;
begin
  if Sender is TLabel then
  begin
    LabelTmp := Sender as TLabel;
    FTextLyout.BeginUpdate;
    try
      FTextLyout.Text := LabelTmp.Text;
      FTextLyout.MaxSize := TPointF.Create(LabelTmp.Width, 1000);
      FTextLyout.WordWrap := LabelTmp.WordWrap;
      FTextLyout.Font := LabelTmp.Font;
      FTextLyout.HorizontalAlign := LabelTmp.TextAlign;
      FTextLyout.VerticalAlign := LabelTmp.VertTextAlign;
    finally
      FTextLyout.EndUpdate;
    end;

    LabelTmp.Height := FTextLyout.Height;
  end;
end;

Основная идея следующая: мы используем TTextLayout и параметры метки для вычисления размера текста в TLabel. На основании этого задаем новую высоту для метки.

 

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

 

Событие TLabel.Label1Resize нужно задать событию OnResize у меток, где вы хотите автоматически вычислять высоту метки.

 

Рабочий пример можно скачать тут: LabelAutosizeDemo.zip

Ссылка на комментарий
  • 0
  • Администраторы

Не за что.

 

Если задаете текст вручную, то нужно вызывать перерасчет высоты. Поскольку я привел код для варианта при условии не изменяемости текста.

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...