Найти спецкод в компоненте Rich Edit
От: Khimik  
Дата: 22.10.23 01:59
Оценка:
У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка.
Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Найти спецкод в компоненте Rich Edit
От: Carc Россия https://vk.com/gosha_mazov
Дата: 22.10.23 02:12
Оценка:
Здравствуйте, Khimik, Вы писали:

K>У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка.

K>Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
TOM-интерфейс: ITextRange::Move+tomCharFormat, потом проверять выделение в полученном диапазоне через ITextFont.
Aml Pages Home
Re[2]: Найти спецкод в компоненте Rich Edit
От: Khimik  
Дата: 23.10.23 12:48
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Khimik, Вы писали:


K>>У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка.

K>>Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
C>TOM-интерфейс: ITextRange::Move+tomCharFormat, потом проверять выделение в полученном диапазоне через ITextFont.

Я сходу не догоняю, что значит интерфейс, если это не интерфейс в языке программирования. Может есть решение попроще? Мне надо просто аналог сообщения EM_FINDTEXT, чтобы искал спецсимволы.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Найти спецкод в компоненте Rich Edit
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.10.23 13:31
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Я сходу не догоняю, что значит интерфейс, если это не интерфейс в языке программирования. Может есть решение попроще? Мне надо просто аналог сообщения EM_FINDTEXT, чтобы искал спецсимволы.


Это COM, вполне себе интерфейс в языке программирования. У дельфей поддержка COM была, хз как у этих ваших лазарусов
Маньяк Робокряк колесит по городу
Re[3]: Найти спецкод в компоненте Rich Edit
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.10.23 13:52
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, Carc, Вы писали:


C>>Здравствуйте, Khimik, Вы писали:


K>>>У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка.

K>>>Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
C>>TOM-интерфейс: ITextRange::Move+tomCharFormat, потом проверять выделение в полученном диапазоне через ITextFont.

K>Я сходу не догоняю, что значит интерфейс, если это не интерфейс в языке программирования.

Это как раз и есть интерфейс в языке программирования.
А именно COM-интерфейс TOM — Text Object Model.

K>Может есть решение попроще?

Нет.

K>Мне надо просто аналог сообщения EM_FINDTEXT, чтобы искал спецсимволы.

Нет такого сообщения для RICHEDIT[XX]
И какие еще спецсимволы? Такого понятия в RICHEDIT нет.
EM_FINDTEXT\EM_FINDTEXTEX не ищет никаких мифических спецсимволов. Они ищут только текст. О чем ясно сказано в документации.
Помешеньше общайтесь с чат-гапотой — эти "плятЪ" насоветуют
Aml Pages Home
Re[4]: Найти спецкод в компоненте Rich Edit
От: Khimik  
Дата: 23.10.23 17:21
Оценка:
Здравствуйте, Carc, Вы писали:

C>Это как раз и есть интерфейс в языке программирования.

C>А именно COM-интерфейс TOM — Text Object Model.

Я до сих пор не освоил интерфейсы в Delphi и тем более не знаю что такое com. Насколько я помню, com и activex это глючные технологии, и они только под Windows, а я пытаюсь поддерживать кроссплатформенность.

K>>Может есть решение попроще?

C>Нет.

А может в Delphi можно что-то сделать с этим компонентом (trichedit)? Странно если нет простого решения.

C>И какие еще спецсимволы? Такого понятия в RICHEDIT нет.


Ну я имею в виду коды форматирования, вроде \par, \rtf1, \plain.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[5]: Найти спецкод в компоненте Rich Edit
От: Carc Россия https://vk.com/gosha_mazov
Дата: 23.10.23 18:05
Оценка: 2 (1)
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, Carc, Вы писали:


C>>Это как раз и есть интерфейс в языке программирования.

C>>А именно COM-интерфейс TOM — Text Object Model.

K>Я до сих пор не освоил интерфейсы в Delphi и тем более не знаю что такое com. Насколько я помню, com и activex это глючные технологии,

С фигов-то они глючные? Просто COM аккуратно надо использовать... Ну и всякие умные указатели юзать налево-направо, вроде CComPtr и всё становится сильно проще.

K>и они только под Windows, а я пытаюсь поддерживать кроссплатформенность.

Вы непоследовательны сударь!
А с каких пор EM_FINDTEXT, и чат-гапатой-четырЫ насоветованное EM_FINDTEXTEX стали кроссплатформенными? Это Windows-specific сообщения.
И повторюсь, они ни хрена не ищут управляющие коды RTF. И никогда не искали. И не будут. Как бы чат-гапата-четырЫ не бредила грезила.

K>>>Может есть решение попроще?

C>>Нет.

K>А может в Delphi можно что-то сделать с этим компонентом (trichedit)? Странно если нет простого решения.

Есть, на WinAPI. Я его привел в первом ответе. ITextRange + MoveXXX(Start, End) + tomCharFormat.

C>>И какие еще спецсимволы? Такого понятия в RICHEDIT нет.


K>Ну я имею в виду коды форматирования, вроде \par, \rtf1, \plain.

Это называется управляющие команды RTF.
Найти то их ручками в самом массиве байтов RTF-потока не проблема.
Но вот спроецировать их на индексы символов текста (тот что на экране), та еще развлекуха будет.
Я простого решения не нашел. А ручками такую проекцию делать, там очень много нюансов в RTF. Он — RTF — ну очень разный бывает.
Разные кодировки, разное число байтов на всякие переносы строк, разное отображение встроенных объектов (сколько объект в байтах занимает в RTF-потоке, а за сколько символов его "держит" RichEdit-компонент и.т.д.).

Так что мой совет: "слушать песню валенки" (ц)
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.