Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Полноценный поиск и замена текста


Автор: Paranoik 15.6.2006, 22:38
Народ, никто не подскажет процедурки поиска и замены текста, чтобы все элементы в диалогах поиска и замены работали. У TFindDialog - только слово целиком, с учетом регистра, направление: вверх, вниз, а у TReplaceDialog - только слово целиком и с учетом регистра соответственно. И плюс все это должно работать для поиска и замены в TRichEdit. 

Автор: Yanis 15.6.2006, 22:46
А поиск в RichEdit отношения к этим диалогам никакого не имеет. Скажу больше: TFindDialog и TReplaceDialog ничего не ущут и ничего не заменяют smile  

Автор: Paranoik 15.6.2006, 22:49
Чего ?...  smile 
Ну в общем мне процедуры поиска и замены нужны, со всеми возможностями (регистр, поиск вверх, вниз и др.)...  

Автор: Sunvas 16.6.2006, 00:27
Вот тебе пример для "вверх" и "вниз".
Код

Editor: TMemo;
{........}
procedure TForm1.FindDialogFind(Sender: TObject);
var
 SelPos,X,i:integer;
 s,textE:string;
label 1;
begin
 if frDown in FindDialog.Options
  then Editor.SelStart:=Editor.SelStart+Editor.SelLength; // это для "поиск далее"
 textE:=Editor.Text;
 X:=Editor.SelStart+1;
 if frDown in FindDialog.Options
 then
  textE:=Copy(textE,X,Length(textE)-X+1)
 else
  textE:=Copy(textE,0,X-1);
 s:=FindDialog.FindText; // переменной s присваивается строка, которую нужно найти
 if frDown in FindDialog.Options
  then
  { код поиска вниз }
   begin
    SelPos := Pos(s,textE);
    if SelPos > 0
     then
      begin
       Editor.SelStart := SelPos + X - 2;
       Editor.SelLength:=length(s);
      end
     else ShowMessage(pchar('Текст "'+ FindDialog.FindText+'" не найден.'));
   end
  else
  { код поиска вверх }
 begin
  for i:=length(textE)-length(s) downto 1 do
   if copy(textE,i,length(s))=s
    then
     begin
      Editor.SelStart := i-1;
      Editor.SelLength:=Length(s);
      goto 1;
     end;
  ShowMessage(pchar('Текст "'+ FindDialog.FindText+'" не найден.'));
  1:
 end;
end;

Дальше сам. Не трудно будет дописать еще и "с учетом регистра". А "слово целиком" просто делается - просто проверяешь есть ли перед и после выделения проблел. 

Автор: Yanis 16.6.2006, 08:46
Цитата(Paranoik @  15.6.2006,  23:49 Найти цитируемый пост)
Чего ?... 
Поиск зависит не от диалогов, а только от того как ты его реализуешь.

Цитата(Paranoik @  15.6.2006,  23:49 Найти цитируемый пост)
Ну в общем мне процедуры поиска и замены нужны, со всеми возможностями (регистр, поиск вверх, вниз и др.)...  
А сразу нельзя так было вопрос задать? Позволю процитировать справку:

Цитата
VCL Reference Help.
This example requires a TRichEdit, a TButton, and a TFindDialog.
Clicking the button click will display a Find Dialog to the right of the edit control.  Filling in the "Find what" text and pressing the Find Next button will select the first matching string in the Rich Edit control that follows the previous selection.
Код
procedure TForm1.Button1Click(Sender: TObject);

begin
  FindDialog1.Position := Point(RichEdit1.Left + RichEdit1.Width, RichEdit1.Top);
  FindDialog1.Execute;
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { begin the search after the current selection if there is one }
    { otherwise, begin at the start of the text }
    if SelLength <> 0 then

      StartPos := SelStart + SelLength
    else

      StartPos := 0;

    { ToEnd is the length from StartPos to the end of the text in the rich edit control }

    ToEnd := Length(Text) - StartPos;

    FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(FindDialog1.FindText);
    end;
  end;
end;


Функция FindText как раз и делает то, что ты хочешь в зависимости от последнего параметра. 

Автор: Paranoik 16.6.2006, 17:31
Угу... пасиба большое! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)