Перейти к содержанию
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 эмодзи.

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

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

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

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