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

Как увеличивать ListBoxItem в зависимости от количества текста?


Rusland

Вопрос

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

  • 0
1 час назад, krapotkin сказал:

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

Так вот и не понятно как ее посчитать?

Приведите пожалуйста свой вариант, как вы считаете для ListBox и ListView?

Ссылка на комментарий
  • 1
  • Модераторы
function TextHeight(const AText: string; aTextSettings: TTextSettings; const aWidth: Single): Single;
// uses FMX.TextLayout, FMX.Graphics, System.Math
var
  Layout: TTextLayout;
  aRect: TRectF;
  aWW: boolean;
begin
  Result := 0;
  if AText.IsEmpty then
    Exit;

  aWW := Pos(#13#10, AText) > 0;
  if (aTextSettings.WordWrap) or (aWW) then
    aRect := RectF(0, 0, aWidth, MaxSingle)
  else
    aRect := RectF(0, 0, MaxSingle, MaxSingle);
  Layout := TTextLayoutManager.DefaultTextLayout.Create;
  try
    Layout.BeginUpdate;
    Layout.TopLeft := aRect.TopLeft;
    Layout.MaxSize := PointF(aRect.Width, aRect.Height);
    Layout.WordWrap := aTextSettings.WordWrap;
    Layout.HorizontalAlign := TTextAlign.Leading;
    Layout.VerticalAlign := TTextAlign.Leading;
    Layout.Font.Assign(aTextSettings.Font);
    Layout.Color := aTextSettings.FontColor;
    Layout.RightToLeft := false;
    Layout.Text := AText;
    Layout.EndUpdate;
    aRect := Layout.TextRect;
  finally
    FreeAndNil(Layout);
  end;
  Result := aRect.Bottom;
end;

вызов функции, тут расчёт высоты делается для TText (родной autosize косячит при большом кол-ве текста)

    aTextSettings := TTextSettings.Create(nil);
    aTextSettings.Trimming := TTextTrimming.None;
    aTextSettings.Font.Size := mText.Font.Size;
    aTextSettings.WordWrap := true;

    mText.Height := TextHeight(mText.Text, aTextSettings, mText.Width - (mText.Margins.Left + mText.Margins.Right));
    PresentedScrollBox1.RealignContent; // пересчёт контента родителю

Самое важное это сделать пересчёт  размеров контента РОДИТЕЛЮ, иначе высота будет не правильная. Незнаю почему так сделано, но только так получается добиться правильной высоты текста (проверял на TListBox, TListView, TText)

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

Я такое использую для вычисления высоты текста. Может пригодится)

function CalculateTextHeight(aText: String; aWidth: Single; aMinHeight: Single; aMaxHeight: Integer; aFont: TFont) : Single;
  begin
    if not Assigned(FTextLayout) then
      FTextLayout := TTextLayoutManager.DefaultTextLayout.Create;

    FTextLayout.BeginUpdate;
    try
      FTextLayout.Text := aText;
      FTextLayout.MaxSize := TPointF.Create(aWidth, 1000);
      FTextLayout.WordWrap := True;
      FTextLayout.Font.Assign(aFont);
      FTextLayout.HorizontalAlign := FMX.Types.TTextAlign.Leading;
      FTextLayout.VerticalAlign := FMX.Types.TTextAlign.Leading;
    finally
      FTextLayout.EndUpdate;
    end;
    Result := FTextLayout.Height;
    if aMinHeight>0 then
      if Result < aMinHeight then
        Result := aMinHeight;
    if aMaxHeight>0 then
      if Result > aMaxHeight then
        Result := aMaxHeight;
  end{ function CalculateTextHeight };

FTextLayout : TTextLayout - глобальная приватная переменная.

Изменено пользователем umkes
Ссылка на комментарий
  • 0
1 час назад, krapotkin сказал:

 

Сделал по тому как указано в той теме и стиль с Item-а слетел. У меня для него прописан Stylelookup - задан серый фон, белый шрифт, а получается по умолчанию.

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Rusland сказал:

ZuBy, umkes в какой момент надо вызывать ваши функции? После присвоения текста делать расчет и задавать новую высоту?

да все верно

Ссылка на комментарий
  • 0
1 час назад, Rusland сказал:

Сделал по тому как указано в той теме и стиль с Item-а слетел. У меня для него прописан Stylelookup - задан серый фон, белый шрифт, а получается по умолчанию.

Не верно я написал, стиль не слетает. Просто если текст отсутствует, то процедура и "обнуляет" высоту item-а - а под ним белым-бело. Это то и сбило с толку. Теперь проверяю чтобы Height не стал меньше чем был изначально.

А так вариант Ярослава годный и удобный ИМХО. Только чтобы принудительно заставить отработать, мне приходится после присвоения значения (после ListBox1.EndUpdate;) делать: ListBoxItem1.RecalcSize;

Всем спасибо.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...