Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2017, 13:24
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Поиск текста в RichEdit через FindDialog

Здравствуйте, уважаемые форумчане!
Сразу оговорюсь - ПОИСК РАБОТАЕТ! Есть только один нюанс, который мне не побороть. Проблема связана с поиском в окне RichEdit, в котором строки выходят за размеры самого окна (Настройка ползунка установлена в ssBoth). При повторном нажатии кнопки "Поиск", если искомое слово находится за пределами окна, ползунок не сдвигается вниз и, следовательно, найденный текст не видно.

Кнопка вызова окна поиска
Код:
procedure TForm1.Button5Click(Sender: TObject);
  begin
  SPos := RichEdit1.SelStart; { Запоминание позиции курсора }
  with FindDialog1 do
  begin
    FindText := RichEdit1.SelText; { Начальное значение текста поиска - текст, выделенный в RichEdit }
    Position := Point(Form1.Left, Form1.Top + RichEdit1.Top + RichEdit1.Height); { Позиционирование окна диалога внизу RichEdit }
    Execute; { Выполнение }
  end;
end;

Процедура обработки поиска текста
Код:
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  with FindDialog1 do
  begin
    RichEdit1.SelStart := Pos(AnsiLowerCase(FindText),
    AnsiLowerCase(Copy(RichEdit1.Lines.Text, SPos + 1, Length(RichEdit1.Lines.Text)))) + SPos - 1;
    if RichEdit1.SelStart >= SPos then
    begin
      RichEdit1.SelLength := Length(FindText); { Выделение найденного текста }
      SPos := RichEdit1.SelStart + RichEdit1.SelLength + 1; { Изменение начальной позиции поиска }
    end
    else
      if MessageDlg('Текст "' + FindText + '" не найден. Продолжать поиск?',
                    mtConfirmation, mbYesNoCancel, 0) <> mrYes then
        CloseDialog;
  end;
  RichEdit1.SetFocus;
end;

Заранее признателен за любую помощь!
Ответить с цитированием
  #2  
Старый 20.03.2017, 14:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Видимо после { Выделение найденного текста } можно попросить рича прокрутиться до него, типа как RichEdit1.Perform(EM_SCROLLCARET, 0, 0)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ffpereverzev (21.03.2017)
  #3  
Старый 20.03.2017, 19:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

не уверен, что в RichEdit сработает, но для Memo можно было просто установить SelStart на соотв. символ и контрол сам проматывался до нужной позиции. Ну и можно так же поставить selLength, и тогда найденный текст будет сразу выделен.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
ffpereverzev (21.03.2017)
  #4  
Старый 21.03.2017, 09:06
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Откорректировал процедуру поиска текста:

Код:
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  with FindDialog1 do
  begin
    RichEdit1.SelStart := Pos(AnsiLowerCase(FindText),
    AnsiLowerCase(Copy(RichEdit1.Lines.Text, SPos + 1, Length(RichEdit1.Lines.Text)))) + SPos - 1;
    if RichEdit1.SelStart >= SPos then
    begin
      RichEdit1.SelLength := Length(FindText); { Выделение найденного текста }
      SPos := RichEdit1.SelStart + RichEdit1.SelLength + 1; { Изменение начальной позиции поиска }
      RichEdit1.Perform(EM_SCROLLCARET,0,0);
      RichEdit1.SetFocus;
    end
    else
      if MessageDlg('Текст "' + FindText + '" не найден. Продолжать поиск?',
                    mtConfirmation, mbYesNoCancel, 0) <> mrYes then
        CloseDialog;
  end;
  RichEdit1.SetFocus;
end;

Теперь скроллбар прокручивается нормально, но появилась новая напасть: пока поиск идет в видимой части RichEdit, то выделение слова полностью соответствует искомому, но как только поиск начинается за видимой областью, то каретка (и выделение) начинают свое движение. То есть выделение сдвигается относительно искомого слова вправо. И чем дальше поиск - тем больше сдвиг.
Ответить с цитированием
  #5  
Старый 21.03.2017, 09:14
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Хм...выяснил, что все работает и без танцев с бубнами простой настройкой окна RichEdit (изменение опции hideSelection в False). Но проблема со смещающимся выделением осталась. Видимо это проблема обработки текста. Был бы признателен за советы мудрых и бывалых.

На текущий момент процедуру вернул обратно:

Код:
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  with FindDialog1 do
  begin
    RichEdit1.SelStart := Pos(AnsiLowerCase(FindText),
    AnsiLowerCase(Copy(RichEdit1.Lines.Text, SPos + 1, Length(RichEdit1.Lines.Text)))) + SPos - 1;
    if RichEdit1.SelStart >= SPos then
    begin
      RichEdit1.SelLength := Length(FindText); { Выделение найденного текста }
      SPos := RichEdit1.SelStart + RichEdit1.SelLength + 1; { Изменение начальной позиции поиска }
      //RichEdit1.Perform(EM_SCROLLCARET,0,0);
      //RichEdit1.SetFocus;
    end
    else
      if MessageDlg('Текст "' + FindText + '" не найден. Продолжать поиск?',
                    mtConfirmation, mbYesNoCancel, 0) <> mrYes then
        CloseDialog;
  end;
  RichEdit1.SetFocus;
end;
Ответить с цитированием
  #6  
Старый 21.03.2017, 09:45
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

То есть получается вот какая штука:

1. Я запускаю поиск не трогая текст в окне RichEdit (не спуская видимый текст ползунком) - в этом случае текст ищется нормально, полностью соответствуя параметрам поиска (например, я ищу слово "Архив" длиной в 5 символов, тогда при поиске, в видимой части, выделяется слово "Архив", без смещений);
2. Если я сдвигаю ползунок вниз и устанавливаю курсор в появившуюся область, то при поиске появляется сдвиг (ищу слово "Архив", а нахожу, например "хивов" или "хиват". То есть количество выделяемых символов верное, но идет сдвиг +2);
3. При дальнейшем поиске сдвиг увеличивается, причем всегда на число, кратное 2-ум.

Последний раз редактировалось ffpereverzev, 22.03.2017 в 06:21.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter