У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка.
Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>У меня Delphi программа использует компонент Rich edit, чтобы отобразить текст с выделенными синим участками. Требуется проскроллить компонент до ближайшего синего участка. K>Когда генерируется текст для этого компонента, ему загоняется форматированный текст, например для синих участков добавляется '\plain\f3\fs16\cf1\b\i'. Я пытался запустить поиск по этим спецсимволам. Но поиск, который я запускаю, их не ищет. Вначале я использовал сообщение EM_FINDTEXT, но оно ищет только текст, неиспорченный спецсимволами форматирования. GPT посоветовал использовать EM_FINDTEXTEX, но почему-то тоже никакого результата. Подскажите что сделать.
TOM-интерфейс: ITextRange::Move+tomCharFormat, потом проверять выделение в полученном диапазоне через ITextFont.
Здравствуйте, 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, чтобы искал спецсимволы.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Я сходу не догоняю, что значит интерфейс, если это не интерфейс в языке программирования. Может есть решение попроще? Мне надо просто аналог сообщения EM_FINDTEXT, чтобы искал спецсимволы.
Это COM, вполне себе интерфейс в языке программирования. У дельфей поддержка COM была, хз как у этих ваших лазарусов
Здравствуйте, 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 не ищет никаких мифических спецсимволов. Они ищут только текст. О чем ясно сказано в документации.
Помешеньше общайтесь с чат-гапотой — эти "плятЪ" насоветуют
Здравствуйте, Carc, Вы писали:
C>Это как раз и есть интерфейс в языке программирования. C>А именно COM-интерфейс TOM — Text Object Model.
Я до сих пор не освоил интерфейсы в Delphi и тем более не знаю что такое com. Насколько я помню, com и activex это глючные технологии, и они только под Windows, а я пытаюсь поддерживать кроссплатформенность.
K>>Может есть решение попроще? C>Нет.
А может в Delphi можно что-то сделать с этим компонентом (trichedit)? Странно если нет простого решения.
C>И какие еще спецсимволы? Такого понятия в RICHEDIT нет.
Ну я имею в виду коды форматирования, вроде \par, \rtf1, \plain.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, 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-компонент и.т.д.).