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

При установки WordWrap у TListViewItem.Objects.Text неверно отображается текст в Android


BurcevD

Вопрос

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

  • 0

При использовании данного примера вываливается целая куча ошибок. Кто может помочь? :)

[dcc32 Error] uMain.pas(38): E2238 Default value required for 'aFont'
[dcc32 Error] uMain.pas(81): E2076 This form of method call only allowed for class methods or constructor (TTextLayout.BeginUpdate)
[dcc32 Error] uMain.pas(83): E2233 Property 'Text' inaccessible here
[dcc32 Error] uMain.pas(84): E2233 Property 'MaxSize' inaccessible here
[dcc32 Error] uMain.pas(85): E2233 Property 'WordWrap' inaccessible here
[dcc32 Error] uMain.pas(86): E2233 Property 'Font' inaccessible here
[dcc32 Error] uMain.pas(87): E2233 Property 'HorizontalAlign' inaccessible here
[dcc32 Error] uMain.pas(88): E2233 Property 'VerticalAlign' inaccessible here
[dcc32 Error] uMain.pas(90): E2076 This form of method call only allowed for class methods or constructor (TTextLayout.EndUpdate)
[dcc32 Error] uMain.pas(92): E2233 Property 'Height' inaccessible here
Ссылка на комментарий
  • 0
  • Модераторы
function TextHeight(const AText: string; aTextSettings: TTextSettings; const MaxWidth: Single): Single;
// uses FMX.Graphics, FMX.TextLayout, FMX.Types, Math
var
  Layout: TTextLayout;
  aRect: TRectF;
  aWW: Boolean;
begin
  Result := 24;
  if AText.IsEmpty then
    Exit;

  aWW := Pos(#13#10, AText) > 0;
  if (aTextSettings.WordWrap) or (aWW) then
    aRect := RectF(0, 0, MaxWidth, 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.Text := AText;
    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.EndUpdate;
    aRect := Layout.TextRect;
  finally
    FreeAndNil(Layout);
  end;
  Result := aRect.Bottom;
end;

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

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
  • Модераторы

FWorkRectF - там хранится максимальное значение по ширине, куда нужно втиснуть текст при использовании WordWrap.

MaxSingle - делфовая константа

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

Там ещё нужно задать для TS WordWrap := true; если нужно чтобы перенос строк был правильный.

Поэтому и неправильно считает

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

ZuBy, можете помочь? При большом тексте все равно некорректный подсчет.

А вообще глупый вопрос - у меня в программе выводится по 50-70 блоков текста (абзацы довольно-таки большие), есть ли смысл вообще заморачиваться с TListView? Может можно и TListBox обойтись?

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

ZuBy, можете помочь? При большом тексте все равно некорректный подсчет.

А вообще глупый вопрос - у меня в программе выводится по 50-70 блоков текста (абзацы довольно-таки большие), есть ли смысл вообще заморачиваться с TListView? Может можно и TListBox обойтись?

Вам не кажется что вы что-то делаете не так? Ни ListView ни ListBox для этого не предназначены. Думаю, я Вам помог

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

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

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

Спасибо огромное! Некорректно отображает высоту итема при большом тексте :(

 

Нашел "проблему": при значении шрифта итема по-умолчанию (Default) расчет происходит неверно. Стоит только выставить шрифт вручную, например Size = 14, расчеты все верны, высота итема корректна.

Ссылка на комментарий
  • 0
В 18.12.2015 в 10:55, Равиль Зарипов (ZuBy) сказал:
function TextHeight(const AText: string; aTextSettings: TTextSettings; const MaxWidth: Single): Single;
// uses FMX.Graphics, FMX.TextLayout, FMX.Types, Math
var
  Layout: TTextLayout;
  aRect: TRectF;
  aWW: Boolean;
begin
  Result := 24;
  if AText.IsEmpty then
    Exit;

  aWW := Pos(#13#10, AText) > 0;
  if (aTextSettings.WordWrap) or (aWW) then
    aRect := RectF(0, 0, MaxWidth, 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.Text := AText;
    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.EndUpdate;
    aRect := Layout.TextRect;
  finally
    FreeAndNil(Layout);
  end;
  Result := aRect.Bottom;
end;

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

Прошу прощения, что поднимаю некротему, но уже устал биться с такой проблемой - В Listbox выводится от 2х до 4х итемов с текстом разной длины, попытался применить этот код, нашел еще другие варианты, уже дошел до того, что тупо создаю label, присваиваю ему текст и autosize в true, высоту label присваиваю итему. Но проблема в том, что любой из кодов нормально работает, если listbox видим на главной форме. Ежели размещаю на другой форме, или на tabcontrol на не основном табе, то почему то код начинает работать только со второго раза. В первый вообще непонятно какие размеры ставятся. Почему так?

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

правильный ответ обычно в том, не как работает, а когда?

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

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

Поэтому вряд ли там есть серьезные ошибки. Только те известные, что связаны с округлением и шрифтом default, который можно задать default + 0.01 и все опять работает.

Например, если вычислить в FormCreate, то размеры элемента не установлены, и на вход мы подадим ерунду.

Логичнее всего делать это в OnResize контейнера. Но помнить, что если мы в результате поменяем его размеры, OInResize возникнет снова, и надо это исключить

 

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

Listbox выводится от 2х до 4х итемов

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

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...