Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2022, 19:07   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если используете Windows, то вот это должно помочь
Цитата:
EM_FMTLINES Adds or removes soft line-break characters (two carriage returns and a line feed) to the ends of wrapped lines in a multiline edit control. It is not processed by single-line edit controls.
Цитата:
Handling Wordwrap and Line Breaks

An application can use Wordwrap functions with multiline edit controls to locate the word or word fragment that should be wrapped to the next line. Using the default Wordwrap function provided by the system, lines always end at the spaces between words. An application can specify its own Wordwrap function by supplying an EditWordBreakProc Wordwrap function and sending the edit control an EM_SETWORDBREAKPROC message. An application can retrieve the address of the current Wordwrap function by sending the control an EM_GETWORDBREAKPROC message.

An application may direct a multiline edit control to add or remove a soft line break character (two carriage returns and a line feed) automatically at the end of wrapped-text lines. An application can turn this feature on or off by sending the edit control an EM_FMTLINES message. This message applies only to multiline edit controls and does not affect a line that ends with a hard line break (one carriage return and a line feed entered by the user). Also in multiline edit controls, an application can specify the ES_WANTRETURN style to request that the system insert a carriage return when the user presses the ENTER key in the edit control.
Надеюсь вы знаете как перенаправлять управление окном собственной оконной функции. см. субклассинг

add: К сожалению набор свойств компонентов отличаются под Windows и Linux. Но будут проблемы с реализацией - пишите в личку. Будет свободное время - набросаю пример.

Последний раз редактировалось macomics; 09.05.2022 в 19:14.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 19:25   #12
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
An application can use Wordwrap functions with multiline edit controls to locate the word or word fragment that should be wrapped to the next line. Using the default Wordwrap function provided by the system, lines always end at the spaces between words. An application can specify its own Wordwrap function by supplying an EditWordBreakProc Wordwrap function and sending the edit control an EM_SETWORDBREAKPROC message. An application can retrieve the address of the current Wordwrap function by sending the control an EM_GETWORDBREAKPROC message.
Перевод.
Приложение может использовать функции Wordwrap с элементами управления многострочным редактированием, чтобы найти слово или фрагмент слова, который следует перенести на следующую строку. Используя функцию переноса слов по умолчанию, предоставляемую системой, строки всегда заканчиваются пробелами между словами. Приложение может указать свою собственную функцию Wordwrap, предоставив функцию Wordwrap EditWordBreakProc и отправив элементу управления edit сообщение EM_SETWORDBREAKPROC. Приложение может получить адрес текущей функции переноса слов, отправив элементу управления сообщение EM_GETWORDBREAKPROC.


Цитата:
Сообщение от macomics Посмотреть сообщение
An application may direct a multiline edit control to add or remove a soft line break character (two carriage returns and a line feed) automatically at the end of wrapped-text lines. An application can turn this feature on or off by sending the edit control an EM_FMTLINES message. This message applies only to multiline edit controls and does not affect a line that ends with a hard line break (one carriage return and a line feed entered by the user). Also in multiline edit controls, an application can specify the ES_WANTRETURN style to request that the system insert a carriage return when the user presses the ENTER key in the edit control.
Перевод.
Приложение может направить элемент управления многострочным редактированием на автоматическое добавление или удаление символа мягкого разрыва строки (два возврата каретки и перевод строки) в конце строк с обернутым текстом. Приложение может включить или выключить эту функцию, отправив элементу управления редактированием сообщение EM_FMTLINES. Это сообщение относится только к элементам управления многострочным редактированием и не влияет на строку, которая заканчивается жестким разрывом строки (один возврат каретки и ввод строки пользователем). Также в многострочных элементах управления редактированием приложение может указать стиль ES_WANTRETURN, чтобы запросить, чтобы система вставляла возврат каретки, когда пользователь нажимает клавишу ENTER в элементе управления редактированием.
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 19:25   #13
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Ах, не говори красиво брат Аркадий! Написано много букавв на английском... Много теории...
Хотелось бы конкретики...
А так, спасибо, конечно.
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 19:46   #14
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

В чем проблема написать функцию поиска конца строки?
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 20:05   #15
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Написать функцию поиска конца строки не составляет труда: найти символы #10 и #13.
Закавыка в другом - каким-то образом понять и отразить- где заканчивается одна длинная строка и начинается следующая длинная строка.
При свойстве Memo WordWrap=true каждая длинная строка разобьётся на несколько более коротких.
Хотелось бы готовых наработок, чтобы самому не ковыряться.

Вероятно, надо использовать Memo.Lines.CommaText = список одной строкой, разделенной запятыми (при этом строки с пробелами заключены в двойные кавычки) и ковырять...
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 20:33   #16
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Viktor61 Посмотреть сообщение
Закавыка в другом - каким-то образом понять и отразить- где заканчивается одна длинная строка и начинается следующая длинная строка.
DrawText(..., DT_CALCRECT);

ADD:
Цитата:
Сообщение от Viktor61 Посмотреть сообщение
Вероятно, надо использовать Memo.Lines.CommaText = список одной строкой, разделенной запятыми (при этом строки с пробелами заключены в двойные кавычки) и ковырять...
Так в callback EM_GETWORDBREAKPROC первым параметром приходит строка для анализа, а третий параметр длина строки в символах.

Последний раз редактировалось macomics; 09.05.2022 в 21:27.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 22:13   #17
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Функция DrawText рисует отформатированный текст в заданном прямоугольнике.

Значение DT_CALCRECT
Выясняет ширину и высоту прямоугольника. Если имеется несколько строк текста, функция DrawText использует ширину прямоугольника, указанную параметром lpRect и продлевает основу прямоугольника, чтобы ограничить последнюю строку текста. Если самое большое слово шире, чем прямоугольник, ширина дополняется. Если текст - меньше, чем ширина прямоугольника, ширина уменьшается. Если есть только одна строка текста, DrawText изменяет правую сторону прямоугольника так, чтобы она ограничивала последнюю букву в строке. И в том, и в другом случае, DrawText возвращает значение высоты отформатированного текста, но не выводит текст.
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 22:18   #18
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Каким образом это помогает определять конец длинной строки?
Идея рисовать по сути на Канвасе, вместо того, чтобы использовать свойства Мемо? Ну не знаю... Не окажется ли этот путь более трудоемким и богатым на ошибки?
Viktor61 вне форума Ответить с цитированием
Старый 09.05.2022, 22:20   #19
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Отлично. В переводчик вы запихнуть текст смогли. Теперь что не понятно. У вас есть Memo (он же Edit, многострочный). Узнаете его размеры Rect, выясняете влезает в эту Rect область вычисленная DrawText для DC этого Memo.
В callback вам также приходит вторым параметром индекс разбиения строки. От него и можно плясать уменьшая или увеличивая текст, вычисляя Rect.

Если используете FIXED_PITCH, то еще проще. Зная ширину символа, вычисляете произведение длина строки на ширину символа.

add:
Цитата:
Сообщение от Viktor61 Посмотреть сообщение
Если имеется несколько строк текста, функция DrawText использует ширину прямоугольника, указанную параметром lpRect и продлевает основу прямоугольника, чтобы ограничить последнюю строку текста.
Это как раз та разбивка, которую вы возможно хотите получить.

Последний раз редактировалось macomics; 09.05.2022 в 22:30.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 22:29   #20
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

EM_GETWORDBREAKPROC
2 параметра:
- wParam = 0; / / не используется; должна быть нулевой
- lParam = 0; / / не используется; должно быть равно нулю

Третий - третий параметр длина строки в символах? М.б. имеется какая-то более новая версия EM_GETWORDBREAKPROC?
Viktor61 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенос данных из одной БД в другую Максикок SQL, базы данных 1 15.03.2015 22:54
Перенос данных из одной таблицы в другую atenon Фриланс 5 23.07.2014 06:18
Перенос данных из одной книги в другую and150382 Microsoft Office Excel 3 26.03.2013 12:21
перенос из одной таблицы БД в другую WishHunter Помощь студентам 9 21.02.2013 08:15
Перенос данных из одной БД в другую demiancz БД в Delphi 1 11.03.2012 18:53