[Решено] RichMemo: PosEx и SelStart

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

[Решено] RichMemo: PosEx и SelStart

Сообщение kotompazb »

Понадобилось мне тут соорудить поиск текста в RichMemo и столкнулся я с неожиданным (для меня) эффектом.
Оказалось, что позиция в Text RichMemo, найденная PosEx, не соответствует позиции того же символа для SelStart (больше на число предшествующих строк).
Например для текста:

Код: Выделить всё

1
2
3
4
5
test

PosEx('test',RichMemo1.text,1)=16,
а чтобы выделить это слово, надо установить RichMemo1.SelStart:=10;
То есть, SelStart:=PosEx('test',RichMemo1.text,1)-LinesNum-1;//-1 потому что с 0
где LinesNum - число строк (переводов строки) до найденного слова.

То есть получается так:
Длина строк 1..5 = 1 - не учитывается перевод строки,
Для SelStart перевод строки - это 1 символ,
Для PosEx перевод строки - 2 символа (насколько я понял, и #13, и #10 считаются отдельно).

Костыли:
Переводить значения, считая количество строк и их длину.

Вопрос: Может, как-то можно не так коряво?
Последний раз редактировалось kotompazb 15.11.2015 21:31:04, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

ответ = в разных кодировках результат берёте.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

vitaly_l писал(а):ответ = в разных кодировках результат берёте.

Да. Точно. Utf8Pos значит надо мне. Щас буду пробовать.

Добавлено спустя 12 минут 46 секунд:
Что-то, видимо, я не так понял, ибо результат одинаковый.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

kotompazb писал(а):ибо результат одинаковый.

просто pos без utf8
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Просто Pos не позволяет задать смещение, поэтому и использовал PosEx.
Тогда я не смогу задать, откуда искать, либо придется делать поиск в копии части текста.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

kotompazb писал(а):Вопрос: Может, как-то можно не так коряво?

разница объясняется тем, что RichMemo (и его SelStart) в частности считает символ переноса за 1 символ (LF).
В то время, как .Text может возвращать перенос строки на Винде, как 2 символа (CRLF).
Pos или PosEx совершенно ни при чём :)

в одной из последних ревизий RichMemo эта разница, вроде бы, была убрана (т.е. даже .text вернёт LF для переноса строки).
Какой у тебя richmemo?

кстати, в самом RichMemo есть метод Search.
Подразумевается, что он работает более экономно с точки зрения памяти.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

скалогрыз писал(а):разница объясняется тем, что RichMemo (и его SelStart) в частности считает символ переноса за 1 символ (LF).
В то время, как .Text может возвращать перенос строки на Винде, как 2 символа (CRLF).
Pos или PosEx совершенно ни при чём

Вот я об этом же в первом посте и писал.
скалогрыз писал(а):в одной из последних ревизий RichMemo эта разница, вроде бы, была убрана (т.е. даже .text вернёт LF для переноса строки).
Какой у тебя richmemo?

1.0 однако.
скалогрыз писал(а):кстати, в самом RichMemo есть метод Search.
Подразумевается, что он работает более экономно с точки зрения памяти.

А вот насчет этого я не в курсе был. Щас посмотрю.

Спасибо.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

kotompazb писал(а):1.0 однако.

ну как бы - не самая лучшая версия, с кучей особенностей. Возьми лучше trunk!

Добавлено спустя 34 секунды:
kotompazb писал(а):А вот насчет этого я не в курсе был. Щас посмотрю.

в 1.0 этого метода нет.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

скалогрыз писал(а):в 1.0 этого метода нет.

Ага. Уже заметил.
скалогрыз писал(а):Возьми лучше trunk!

А где? :)
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

kotompazb писал(а):А где?

Вот тут пара ссылок по вкусу!
т.е. можешь или архив взять с исходниками либо через свн
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

Ну через свн мне качать нечем (не умею), а по файликам нервы сдадут.
Поэтому архив.
Еще раз спасибо.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

kotompazb писал(а):Ну через свн мне качать нечем (не умею)

хм а git умеешь?
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

скалогрыз писал(а):хм а git умеешь?

неа. ну просто не было необходимости. я просто стараюсь пользоваться только тем, что есть "искаропки". В данном случае мне просто очень лениво было придумывать, как раскрасить текст самому. Да и вряд ли бы придумал. А надо.

Добавлено спустя 22 часа 6 минут 49 секунд:
Ну собственно проблема с поиском, которая породила тему, решилась (спасибо автору) с помощью метода Search минут за 5.
Всем спасибо.
Ответить