BurcevD Опубликовано 10 февраля, 2015 Опубликовано 10 февраля, 2015 В режиме Win-32 текст отображается в две строчки, а в Android много различных артефактов, которые выходят за размеры компонента Цитата
0 HyperZen Опубликовано 14 декабря, 2015 Опубликовано 14 декабря, 2015 При использовании данного примера вываливается целая куча ошибок. Кто может помочь? [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 Rusland Опубликовано 18 декабря, 2015 Опубликовано 18 декабря, 2015 Плюнул копаться в 10к строках кода ListView и написал свой листвью велосипед. Делиться, делиться, делиться... с общественностью... как завещал великий Ленин Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 18 декабря, 2015 Модераторы Опубликовано 18 декабря, 2015 (изменено) 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; думаю для ширины не нужно показывать код, сами отредактируете Изменено 20 декабря, 2015 пользователем ZuBy Цитата
0 HyperZen Опубликовано 19 декабря, 2015 Опубликовано 19 декабря, 2015 (изменено) А что за компонент FWorkRectF? И что такое MaxSingle? И можно пример применения? Изменено 19 декабря, 2015 пользователем HyperZen Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 19 декабря, 2015 Модераторы Опубликовано 19 декабря, 2015 FWorkRectF - там хранится максимальное значение по ширине, куда нужно втиснуть текст при использовании WordWrap. MaxSingle - делфовая константа Цитата
0 HyperZen Опубликовано 20 декабря, 2015 Опубликовано 20 декабря, 2015 ZuBy, можете скинуть любой рабочий пример использования данной функции. Миллион ошибок у меня вылезает Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 20 декабря, 2015 Модераторы Опубликовано 20 декабря, 2015 вот держи LV_TextHeight.zip HyperZen, zairkz и Kitty 3 Цитата
0 HyperZen Опубликовано 20 декабря, 2015 Опубликовано 20 декабря, 2015 (изменено) Спасибо огромное! Некорректно отображает высоту итема при большом тексте Изменено 20 декабря, 2015 пользователем HyperZen Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 20 декабря, 2015 Модераторы Опубликовано 20 декабря, 2015 (изменено) Там ещё нужно задать для TS WordWrap := true; если нужно чтобы перенос строк был правильный. Поэтому и неправильно считает Изменено 20 декабря, 2015 пользователем ZuBy Цитата
0 HyperZen Опубликовано 20 декабря, 2015 Опубликовано 20 декабря, 2015 TS.WordWrap := true задан. Все равно некорректный подсчет ... Странно... Цитата
0 HyperZen Опубликовано 25 декабря, 2015 Опубликовано 25 декабря, 2015 А есть рабочий пример, который корректно работает с большим текстом (3-4 абзаца, например, какой-нибудь книги)? Цитата
0 HyperZen Опубликовано 5 января, 2016 Опубликовано 5 января, 2016 ZuBy, можете помочь? При большом тексте все равно некорректный подсчет. А вообще глупый вопрос - у меня в программе выводится по 50-70 блоков текста (абзацы довольно-таки большие), есть ли смысл вообще заморачиваться с TListView? Может можно и TListBox обойтись? Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 6 января, 2016 Модераторы Опубликовано 6 января, 2016 ZuBy, можете помочь? При большом тексте все равно некорректный подсчет. А вообще глупый вопрос - у меня в программе выводится по 50-70 блоков текста (абзацы довольно-таки большие), есть ли смысл вообще заморачиваться с TListView? Может можно и TListBox обойтись? Вам не кажется что вы что-то делаете не так? Ни ListView ни ListBox для этого не предназначены. Думаю, я Вам помог Цитата
0 HyperZen Опубликовано 6 января, 2016 Опубликовано 6 января, 2016 Тогда посоветуйте компонент, который мог бы в себе сочетать место для отображения текста, а также контролы для управления этим текстом (применимо к каждому блоку текста отдельно, пожалуйста. Цитата
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 6 января, 2016 Модераторы Опубликовано 6 января, 2016 TLayout + TText + TLayout с контролами для управления текстом Цитата
0 HyperZen Опубликовано 14 января, 2016 Опубликовано 14 января, 2016 Спасибо огромное! Некорректно отображает высоту итема при большом тексте Нашел "проблему": при значении шрифта итема по-умолчанию (Default) расчет происходит неверно. Стоит только выставить шрифт вручную, например Size = 14, расчеты все верны, высота итема корректна. Цитата
0 Станислав Менинник Опубликовано 18 января, 2021 Опубликовано 18 января, 2021 На дворе 10.4.1 версия, а Тримминг все так же не работает с переносом слов. Цитата
0 Razmir Опубликовано 6 сентября, 2023 Опубликовано 6 сентября, 2023 В 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 krapotkin Опубликовано 7 сентября, 2023 Опубликовано 7 сентября, 2023 правильный ответ обычно в том, не как работает, а когда? вы сами передаете в расчет максимальную ширину и высоту. По большому счету, процедура расчета примитивна после самого хитрого места - вычисления размеров одного символа. Заполняем, пока не превысим ширину. если превысили, то переходим на новую строку и, в зависимости от типа переноса, переносим нужную часть строки, и продолжаем. Поэтому вряд ли там есть серьезные ошибки. Только те известные, что связаны с округлением и шрифтом default, который можно задать default + 0.01 и все опять работает. Например, если вычислить в FormCreate, то размеры элемента не установлены, и на вход мы подадим ерунду. Логичнее всего делать это в OnResize контейнера. Но помнить, что если мы в результате поменяем его размеры, OInResize возникнет снова, и надо это исключить Цитата
0 OnePeople Опубликовано 7 сентября, 2023 Опубликовано 7 сентября, 2023 19 часов назад, Razmir сказал: Listbox выводится от 2х до 4х итемов Ну правильно компонент не перерисовывется когда он невидим иначе бы приложение тормозило конкретно. Вам или в ручную перерисовывать или зачем вам листбокс, если там несколько итемов. Возьмите лайоут, и добавляйте туда динамически контролы Цитата
Вопрос
BurcevD
В режиме Win-32 текст отображается в две строчки, а в Android много различных артефактов, которые выходят за размеры компонента
47 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.