Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 04:27   #1
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Вопрос Поиск, выделение, вопрос!?

Здрасте!
Как оформить код поиска, выделения.. и вопоса?
надо чтоб происходило так:
1.Ищим слово "Delphi" в тексте:
Цитата:
Форум программистов
Delphi программирование
Общие вопросы Delphi
2.Если найдено слово "Delphi", то это слово выделяется.
3.Если найдено слово и выделено, задается вопрос "Искать далее или заменить"!
как это сделать??
если что-то не понятно с вопросом попробую объяснить по другому.
-----
У меня есть функция поиска и замены, но я не могу с ней разобраться(((
если она чем-то поможет вот:
Код:
function SAR(RichEdit:TRichEdit;
SearchText,ReplaceText:string):Boolean;
var 
  startpos,Position,endpos:integer;
begin 
  startpos:= 0;
  with RichEdit do 
  begin 
    endpos:=Length(RichEdit.Text);
    Lines.BeginUpdate; 
    while FindText(SearchText, startpos, endpos, [stMatchCase])<>-1 do 
    begin
      endpos:=Length(RichEdit.Text)-startpos;
      Position:=FindText(SearchText, startpos, endpos, [stMatchCase]);
      Inc(startpos, Length(SearchText)); 
      SetFocus; 
      SelStart:=Position;
      SelLength:=Length(SearchText);
      richedit.clearselection; 
      SelText:=ReplaceText;
    end; 
    Lines.EndUpdate; 
  end; 
end;
IIpopoK вне форума Ответить с цитированием
Старый 07.06.2009, 12:29   #2
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

для поиска используй Pos или PosEx, для выделения текста делай
Код:
RichEdit1.SelStart:=начальная_позицыя;
RichEdit1.SelLength:=длинна_выделения;
для замены
Код:
RichEdit1.SelText:='Новый текст';
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 07.06.2009, 13:45   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Немного расширю ответ Ntlegend и твою функцию которую ты привел.
Сделал немного комментарии чтобы тебе можно было идти дальше самому :
Код:
function SAR(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean; 
var 
  startpos, Position, endpos: integer; 
begin 
  startpos := 0; 
  with RichEdit do 
  begin 
    endpos := Length(RichEdit.Text);// длина всего текста в RichEdit 
    Lines.BeginUpdate; // начало "работы"
    while FindText(SearchText, startpos, endpos, [stMatchCase])<>-1 do 
    begin 
      endpos   := Length(RichEdit.Text) - startpos; 
      Position := FindText(SearchText, startpos, endpos, [stMatchCase]); // начало найденного слова из аргумента SearchText 
      Inc(startpos, Length(SearchText)); // переместили "курсор поиска" для следующего шага чтобы не искать уже найденое
      SetFocus; // показали найденное выделение
      SelStart  := Position; // ... с этой позиции 
      SelLength := Length(SearchText); // ... этой длинны
      //richedit.clearselection; // в оригинале функции тут удаляем найденное слово
      // ... и вот тут можно вставить то , что ты хочешь - вопрос перед заменой
      // что-то типа так : 
      if MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', MB_YESNO) = mrYes then
        SelText := ReplaceText; 
    end; 
    Lines.EndUpdate; // конец "работы"
  end; 
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 08.06.2009, 08:14   #4
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Вопрос

Цитата:
Сообщение от Kotofff Посмотреть сообщение
Немного расширю ответ Ntlegend и твою функцию которую ты привел.
Сделал немного комментарии чтобы тебе можно было идти дальше самому :
Код:
function SAR(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean; 
var 
  startpos, Position, endpos: integer; 
begin 
  startpos := 0; 
  with RichEdit do 
  begin 
    endpos := Length(RichEdit.Text);// длина всего текста в RichEdit 
    Lines.BeginUpdate; // начало "работы"
    while FindText(SearchText, startpos, endpos, [stMatchCase])<>-1 do 
    begin 
      endpos   := Length(RichEdit.Text) - startpos; 
      Position := FindText(SearchText, startpos, endpos, [stMatchCase]); // начало найденного слова из аргумента SearchText 
      Inc(startpos, Length(SearchText)); // переместили "курсор поиска" для следующего шага чтобы не искать уже найденое
      SetFocus; // показали найденное выделение
      SelStart  := Position; // ... с этой позиции 
      SelLength := Length(SearchText); // ... этой длинны
      //richedit.clearselection; // в оригинале функции тут удаляем найденное слово
      // ... и вот тут можно вставить то , что ты хочешь - вопрос перед заменой
      // что-то типа так : 
      if MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', MB_YESNO) = mrYes then
        SelText := ReplaceText; 
    end; 
    Lines.EndUpdate; // конец "работы"
  end; 
end;

угу понятно! а как сделать чтобы при вопросе:
Код:
MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', mb_YesNo)
найденное слово подсвечивалось(выделялось)?
И как сделать так чтобы при нажатии на mrNo программа продолжала искать дальше? если ничего не найдено то вывести сообщение:
Код:
MessageBox(Handle, 'Не найдено ни одного совпадения!','Поиск и замена', mb_Ok)

Последний раз редактировалось IIpopoK; 09.06.2009 в 05:49.
IIpopoK вне форума Ответить с цитированием
Старый 10.06.2009, 11:06   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
найденное слово подсвечивалось(выделялось)?
Для этого после
SelStart := Position; // ... с этой позиции
SelLength := Length(SearchText); // ... этой длинны
Нужно поменять цвет в SelAttributes
Вот прям в хелпе написано:
Код:
  with RichEdit1.SelAttributes do
  begin
    Color := clRed;
    Height := Height + 5;
  end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2009, 13:43   #6
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Цитата:
Сообщение от IIpopoK Посмотреть сообщение
И как сделать так чтобы при нажатии на mrNo программа продолжала искать дальше? если ничего не найдено то вывести сообщение:
Код:
MessageBox(Handle, 'Не найдено ни одного совпадения!','Поиск и замена', mb_Ok)
При нажатии на "No" функция и так продолжит искать. ... а вот на счет того, что сказать что-нибудь если ваще ничего не нашла :
Код:
function SAR(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean; 
var 
  startpos, Position, endpos: integer; 
begin 
  Result := false;// сначала ничего нет
  startpos := 0; 
  with RichEdit do 
  begin 
    endpos := Length(RichEdit.Text);// длина всего текста в RichEdit 
    Lines.BeginUpdate; // начало "работы"
    while FindText(SearchText, startpos, endpos, [stMatchCase])<>-1 do 
    begin 
      endpos   := Length(RichEdit.Text) - startpos; 
      Position := FindText(SearchText, startpos, endpos, [stMatchCase]); // начало найденного слова из аргумента SearchText 
      Inc(startpos, Length(SearchText)); // переместили "курсор поиска" для следующего шага чтобы не искать уже найденое
      SetFocus; // показали найденное выделение
      SelStart  := Position; // ... с этой позиции 
      SelLength := Length(SearchText); // ... этой длинны
      //richedit.clearselection; // в оригинале функции тут удаляем найденное слово
      // ... и вот тут можно вставить то , что ты хочешь - вопрос перед заменой
      // что-то типа так : 
      if MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', MB_YESNO) = mrYes then
        begin
        SelText := ReplaceText; 
        Result := true;// что-то нашли и заменили
        end;
    end; 
    Lines.EndUpdate; // конец "работы"
  end; 
end;
И когда функция отработает то вернет true ,если что-то нашла и заменила или false - если наоборот. Обрабатывай в проге ее результат и выводи сообщения....
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 11.06.2009, 11:06   #7
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Восклицание

Цитата:
Сообщение от Stilet Посмотреть сообщение
Для этого после
SelStart := Position; // ... с этой позиции
SelLength := Length(SearchText); // ... этой длинны
Нужно поменять цвет в SelAttributes
Вот прям в хелпе написано:
Код:
  with RichEdit1.SelAttributes do
  begin
    Color := clRed;
    Height := Height + 5;
  end;
если сделать примерно так то цвет меняется после нажатия кнопки "Да" или "Нет", а нужно чтобы цвет менялся сразу после того как найдено слово.
-----------------------------------------------------------
Цитата:
Сообщение от Kotofff Посмотреть сообщение
При нажатии на "No" функция и так продолжит искать. ...
Просто фишка в том что функция то продолжает искать... но криво...
Сделал вот так:
Код:
//-------------------- Начало функции --------------------\\
 function Edit(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean;
var
  startpos, Position, endpos: integer;
begin
  startpos := 0;
  with RichEdit do
  begin
    endpos := Length(RichEdit.Text);// длина всего текста в котором ищим
    Lines.BeginUpdate; // начало "работы"
    while FindText(SearchText, startpos, endpos-1, [stMatchCase])<>-1 do
    begin
      endpos   := Length(RichEdit.Text) - startpos;
      Position := FindText(SearchText, startpos, endpos, [stMatchCase]); //начало найденного слова из SearchText
      Inc(startpos, Length(SearchText)); //переместить "курсор поиска" для следующего шага чтобы не искать уже найденое
      SetFocus; //показать найденное выделение
      SelStart  := Position; //с этой позиции
      SelLength := Length(SearchText); //этой длинны
      SelAttributes.Color:=clRed;
    if MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', MB_YESNO) = mrYes then
        begin
        SelText := ReplaceText;
        Lines.EndUpdate; // конец "работы"
        end
    end;
  end;
end;
//-------------------- Конец функции --------------------\\
и получается что если я буду постоянно нажимать на "Да" то функция заменяет поочередно каждое найденное слово!
А если я жму "Нет", то по сути функция должна пропустить найденное слово и искать дальше... но она не пропускает его с первого клика, а только после нажатий примерно так 2-4. вот....
Надо чтоб было так:
1. Найти слово.
2. Спросить "Заменить?" 2 варианта "да", "Нет".
3. Если "Да" - Заменить и искать дальше.
4. Если "Нет" - Пропустить слово и искать дальше.
вот так...
IIpopoK вне форума Ответить с цитированием
Старый 13.06.2009, 07:24   #8
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Восклицание

Разобратся сам, спасибо!
вот рабочий код:
Код:
//-------------------- Начало функции --------------------\\
function Edit(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean;
var
  Startpos, Position, Endpos: integer;
begin
  Startpos := 0;
  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);// длина всего текста в котором ищим
    Lines.BeginUpdate; // начало "работы"
    while FindText(SearchText, Startpos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos   := Length(RichEdit.Text) - Startpos-1;
      Position := FindText(SearchText, Startpos, Endpos, [stMatchCase]); //начало найденного слова из SearchText
      Inc(Startpos,Length(SearchText)); //переместить "курсор поиска" для следующего шага чтобы не искать уже найденое
      SetFocus; //показать найденное выделение
      RichEdit.HideSelection:=false;
      SelStart  := Position; //с этой позиции
      SelLength := Length(SearchText); //этой длинны
    if MessageBox(Handle, 'Слово найдено ! Произвести замену ?','Поиск и замена', MB_YESNO) = mrYes then
        begin
        SelText := ReplaceText;
        Lines.EndUpdate; // конец "работы"
        end
        else
        begin
        Lines.EndUpdate; // конец "работы"
        end;
      Startpos:=Position+Length(SearchText);
    end;
  end;
end;
//-------------------- Конец функции --------------------\\
IIpopoK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение в Richedit north Общие вопросы Delphi 21 22.05.2009 12:37
Поиск и выделение фрагмента в вордовском документе Bobby Общие вопросы Delphi 1 17.04.2009 17:07
вопрос по Unix'у, поиск файлов Gimi Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 1 13.03.2009 16:50
выделение StasSv Microsoft Office Excel 8 26.01.2009 14:02
выделение StasSv Microsoft Office Excel 2 10.11.2008 17:15