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

Окончательная точка в вопросе расчета высоты TListViewItem (TListItemText)


Евгений Корепов

Вопрос

Опубликовано (изменено)

При расчете высоты TListItemText приходилось использовать костыль - указывать размер шрифта отличный от 12 (например 12.01 и т.д.), если эти пренебречь, то расчет высоты не работал и текст или резался или высота итема оказывалась гораздо больше текста. Проблема в том, что на стадиях расчета высоты, к TListItemText еще не применен стиль, и параметры шрифта не соответствуют тому как будет выглядеть окончательный вариант на экране.

Для правильного расчета высоты нужно выдернуть шрифт из стиля, делается это вот так:

Var AFontObject : TFontObject;
    AListItemText : TListItemText;
...
  AListItemText:=TListItemText(AItem.View.FindDrawable(AName));
  if AListItemText=Nil then
    AListItemText:=TListItemText.Create(AItem);
  AFontObject:=(AListView.FindStyleResource('font') as TFontObject);
  if Assigned(AFontObject) then
    AListItemText.Font.Assign(AFontObject.Font);
//Теперь вычисление высоты имеет смысл и не нужно задавать размер шрифта - он берется из стиля.
  AListItemText.Height:=CalculateHeight(AListItemText, AListView, FTextLayout);

Или можно затолкать это действие в функцию вычисления высоты:

function CalculateHeight(const AListItemText : TListItemText; const AListView : TListView; const FTextLayout : TTextLayout) : Single;
Var AFontObject : TFontObject;
begin
  FTextLayout.BeginUpdate;
  try
    FTextLayout.Text:=AListItemText.Text;
    FTextLayout.MaxSize:=TPointF.Create(AListItemText.Width, TTextLayout.MaxLayoutSize.Y);
    AFontObject:=(AListView.FindStyleResource('font') as TFontObject);
    if Assigned(AFontObject) then
      FTextLayout.Font.Assign(AFontObject.Font)
    else
      FTextLayout.Font.Assign(AListItemText.Font);
    FTextLayout.WordWrap:=AListItemText.WordWrap;
    FTextLayout.Trimming:=AListItemText.Trimming;
    FTextLayout.HorizontalAlign:=AListItemText.TextAlign;
    FTextLayout.VerticalAlign:=AListItemText.TextVertAlign;
  finally
    FTextLayout.EndUpdate;
  end;
//  Result:=FTextLayout.Height * 1.4; // Теперь этот костыль не нужен
  Result:=FTextLayout.Height;
end;

Внимание! Если вы заполняете еще невидимый на экране ListView, не забудьте выполнить ListView.ApplyStyleLookup перед добавлением Items, иначе не получите правильный размер шрифта из стиля.

Изменено пользователем Евгений Корепов

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

  • 0
  • Модераторы
Опубликовано

у меня нет проблем с подсчетом высоты текста, в ModernLV есть код без костылей и без загрузки шрифта

    function getItemTextHeight(const AItem: TListItemText; const aWidth: Single = 0): Integer; // ZuBy
    function getItemTextButtonHeight(const AItem: TListItemTextButton; const aWidth: Single = 0): Integer; // ZuBy
    function getItemTextWidth(const AItem: TListItemText; const aHeight: Single = 0): Integer; // ZuBy
    function getItemTextButtonWidth(const AItem: TListItemTextButton; const aHeight: Single = 0): Integer; // ZuBy

в нескольких проектах используется, iOS, Android, Windows

  • 0
Опубликовано

Наткнулся на еще один нюанс - подсчет высоты текста будет неверным для невидимого ListView. Т.е. если ListView еще не разу не был показан на экране (находится на другой форме, в другом табе), то AFontObject:=(AListView.FindStyleResource('font') as TFontObject) вернет хрен знает что. Для того чтоб заработало для еще невидимого ListView, необходимо перед добавлением Item, вернее перед AItem.Adapter.ResetView(AItem), выполнить ListView.ApplyStyleLookup;

Добавлю в первую тему.

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

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