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 Kitty, zairkz и HyperZen 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 Опубликовано 30 декабря, 2015 Поделиться Опубликовано 30 декабря, 2015 Прием Цитата Ссылка на комментарий
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 Опубликовано 6 января, 2016 Поделиться Опубликовано 6 января, 2016 Огромное спасибо! Цитата Ссылка на комментарий
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 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.