Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255

Поиск в RichEdit

11.01.2012, 00:43. Показов 4316. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Нужна помощь вот в чем!

Организовал поиск по RichEdit'у с выделением все четко! на форуме тем много!

C++
1
2
3
4
5
6
7
    RichEdit1->HideSelection = false;
     if (Pos(Edit1->Text,RichEdit1->Text) != 0)
     {
        RichEdit1->SelStart = RichEdit1->Text.TrimRight().Pos(Edit1->Text) - 1;
        RichEdit1->SelLength = Edit1->Text.Length() + 1;
     }
    else ShowMessage("Не найдено!");
Но дело в том что, в каждой строчке идет смещение подсветки текста на один вправо!

В первой строчке в норме ищет, во второй идет смещение на один символ вправо, в третьей на три символа! и получаеться что в n строчке слово вообще не подсветиться!

Нужно както узнать в какой строчке найдено слово и сместить на номер строки влево, верно??

C++
1
Text.TrimRight().Pos(Edit1->Text) - 1;
Спасибо!
Миниатюры
Поиск в RichEdit   Поиск в RichEdit   Поиск в RichEdit  

1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2012, 00:43
Ответы с готовыми решениями:

Поиск в RichEdit
Здраствуйте!!! Вопрос в следущем: Хочу с одного RichEdit3 сверять текст с RichEdit2 при условии что он находиттса между Если ...

Поиск слова в RichEdit
Как найти слово, например введенное в Edit? спаисибо

RichEdit поиск в строке
Поиск в строке RichEdit Есть три RichEdit1,..2,..3. В первом RichEdit1 считывает, в третьем находит похожий, выводит во второй. С...

13
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
11.01.2012, 11:40
Все нормально должно быть. Только лучше записывай результат поиска в переменную, чтобы 2 раза не искать и зачем Trim использовать?
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
11.01.2012, 14:20  [ТС]
DefineTrueFalse, Оно нормально ищет(выделяет) только по первой строчке в RichEdit!


Даже и без

C++
1
TrimRight()
Вот

C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm6::BitBtn1Click(TObject *Sender)
{
    RichEdit1->HideSelection = false;
     if (Pos(Edit1->Text,RichEdit1->Text)!=0)
     {
        RichEdit1->SelStart = RichEdit1->Text.Pos(Edit1->Text) - 1;
        RichEdit1->SelLength=Edit1->Text.Length();
     }
    else ShowMessage("Не найдено!");
}
Идет не понятное смещение!
Миниатюры
Поиск в RichEdit   Поиск в RichEdit   Поиск в RichEdit  

0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.01.2012, 14:39
очень похоже на глюки юникода
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
11.01.2012, 14:44  [ТС]
С Английским текстом тоже самое!
Миниатюры
Поиск в RichEdit   Поиск в RichEdit  
0
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
11.01.2012, 14:45  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
очень похоже на глюки юникода
Есть варианты решения данной проблемы?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
11.01.2012, 15:30
Проверял на BCB6, все ок. Но сомневаюсь, что проблема в RAD'е или винда "корейская". Попробуй поэскпериментировать с WantReturns, а так же половить результат получения позиции и сравнить с каким-нибудь Memo. А черновое решение - производить поиск построчно.
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
11.01.2012, 20:06  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Проверял на BCB6, все ок.
BCB6 вообще не распознает:

C++
1
Pos(Edit1->Text,RichEdit1->Text)
C++
1
[C++ Error] Unit1.cpp(21): E2268 Call to undefined function 'Pos'
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.01.2012, 03:10
Не надо таких жестокостей ))) Я думаю, что последний "косяк" исправляется заменой на:
C++
1
2
3
// ...
RichEdit1->Text.Pos(Edit1->Text)
// ...
0
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
12.01.2012, 03:29  [ТС]
DefineTrueFalse, Да действительно в 6 билдере работает нормально!

Значить проблема в C++ builder XE!

C++
1
2
3
4
5
6
7
RichEdit1->HideSelection = false;
         if (RichEdit1->Text.Pos(Edit1->Text))
         {
                RichEdit1->SelStart = RichEdit1->Text.Pos(Edit1->Text) - 1;
                RichEdit1->SelLength=Edit1->Text.Length();
         }
        else ShowMessage("Не найдено!");
Но все же должно быть какое то решение!
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
12.01.2012, 07:32
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Но все же должно быть какое то решение!
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
А черновое решение - производить поиск построчно.
Если и так будет смещение, тогда надо проверить на другой машине готовый проект. Не будет и там корректно работать - тогда проверить напрямую через WinAPI. А вот если и это не поможет, то уже будет интересно.
0
Freeze729
28.09.2012, 11:58
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  int temp=RichEdit1->SelStart; //смотрим где был курсор  
  TColor cc=clBlue; //цвет выделения
  AnsiString ss="искомый набор символов";
  for (int i = 1; i <= RichEdit1->Text.Length(); i++)
  {
 
     if (RichEdit1->Text.SubString(i,ss.Length())==ss)
     {
         RichEdit1->SelStart=i;
         //ставим курсор на искомую позицию
         RichEdit1->SelStart=i-RichEdit1->Perform(EM_EXLINEFROMCHAR, 0, RichEdit1->SelStart)-1;
         //ставим на позицию снова + учитывая номер строки
         RichEdit1->SelLength=ss.Length();
         RichEdit1->SelAttributes->Color=cc;
     }
  }
  RichEdit1->SelStart=temp; //возвращаем курсор на место
  RichEdit1->SelAttributes->Color=clWindowText; //возвращаем цвет по умолчанию
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.09.2012, 19:59
Все это, конечно, малость запоздало, но вот перечитал темку и вспомнил кой-чего.
Не так давно встречал подобную проблему в XE. Если правильно помню, вся фишка там в том, что метод Pos() и маркер выделения SelStart почему-то по-разному считают количество символов в тексте: перенос строки в richedit выглядит как "\r\t" и Pos считает эту последовательность за два символа, а SelStart считает за один. В итоге получаем смещение, равное количеству переносов строк.

EM_EXLINEFROMCHAR позволяет узнать строчку, в которой найдено совпадение. Но, возможно, есть недостаток - если смещение превысит длину текущей строки, то на выходе опять получим смещение на символ вправо, так как мы неверно определили строку.
Я, помнится, просто избавлялся от "\r\t" в тексте.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.09.2012, 21:59
Нумерация символов в RichEdit1->Text и RichEdit1->SelStart не совпадают...
Что с этим делать я также не разобрался...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2012, 21:59
Помогаю со студенческими работами здесь

Поиск слов в RichEdit
int found = 0; found =Form1-&gt;RichEdit1-&gt;Text.Pos(Form2-&gt;Edit1-&gt;Text); if (found &gt; 0) { ...

RichEdit поиск и замена текста
Доброго времени суток. Мне нужно действовать по такому алгоритму: Если в RichEdit1 содержится текст :), то я заменяю этот текст на...

RichEdit и FindText, поиск текста в обратном направлении
Как искать текст вперед я разобрался: if...

Из RichEdit в RichEdit без потери форматирования
Есть RichEdit1 с форматированным текстом(цвет, стиль и тп.) нужно передать этот текст в переменную а затем в RichEdit2 чтобы при вставке в...

RichEdit
\\Надо получить в одной строке два значения (№счёт и через пробел значение переменой х) При нажатии Button2 int i++; int x = 100; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru