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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.09.2012, 15:02
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию richedit. Замена слов.

Друзья, такой вопрос. Как лучше реализовать замену слов в ричэдите? К примеру если в тексте встречается "abc" то заменить его на "абв". То есть у меня есть 2 тхт файла. в первом тхт собрана база слов которых надо заменить в тексте. База выглядит след.образом:
abc
wellcom
friend
work
etc.

И второй тхт в котором собрана база слов на которое должны заменяться:
абв
добро пожаловать
друг
работа
и.т.д


Я так думаю что для начала, нужно поставить на форму 3 ричэдита. В 1ый мы будем грузить собственно сам текст в котором будет происходить поиск. А в остальные 2 ричэдита загрузить наши две базы. Затем в цикле сделать поиск подходящих слов и к примеру сделать подсветку найденных слов(РИЧЭДИТ-2). Далее примерно по такому же принципу уже заменить найденные слова на нужные из ричэдит 3.
Спасибо!
Ответить с цитированием
  #2  
Старый 12.09.2012, 15:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от borockov
Я так думаю что для начала, нужно поставить на форму 3 ричэдита. В 1ый мы будем грузить собственно сам текст в котором будет происходить поиск. А в остальные 2 ричэдита загрузить наши две базы. Затем в цикле сделать поиск подходящих слов и к примеру сделать подсветку найденных слов(РИЧЭДИТ-2). Далее примерно по такому же принципу уже заменить найденные слова на нужные из ричэдит 3.
А если одно и то же слово будет найдено более одного раза, то как в таком случае делать подсветку в RichEdit2 и последующую его замену?
Ответить с цитированием
  #3  
Старый 12.09.2012, 15:28
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Почему в ричэдит2? в ричэдит 1 делаем подсветку, так как в ричэдите 1 находится текст в котором мы ищем нужные слова, а в ричэдите 2 у нас находятся слова которые нужно найти в ричэдите 1. А в ричэдите 3 слова на которые надо заменить найденые слова. щас я небольшую картинку прикреплю так я думаю понятней будет.
Ответить с цитированием
  #4  
Старый 12.09.2012, 15:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от borockov
Почему в ричэдит2? в ричэдит 1 делаем подсветку, так как в ричэдите 1 находится текст в котором мы ищем нужные слова, а в ричэдите 2 у нас находятся слова которые нужно найти в ричэдите 1. А в ричэдите 3 слова на которые надо заменить найденые слова. щас я небольшую картинку прикреплю так я думаю понятней будет.
Картинку ненадо, я всё понял
У TRichEdit есть метод FindText. Делаем цикл for для каждого слова которое нужно найти. Внутри этого цикла делаем цикл while который выполняем пока FindText находит текущее слово, при это заменяем его на то, на которое нужно заменить.
p.s. Перед всем этим желательно сделать:
Код:
  RichEdit1.Lines.BeginUpdate; // чтобы не тормозило при каждой замене
  // а после этого сделать:
  RichEdit1.Lines.EndUpdate.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
borockov (12.09.2012)
  #5  
Старый 12.09.2012, 15:49
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Цикл для каждого слова? а если у меня 1000 слов, я должен буду написать тысячу циклов? Можешь коротенький примерчик просто я незнаю как внутри цикла for использовать while, по отдельности я знаю как использовать эти циклы, но вместе как то не использовал.
Ответить с цитированием
  #6  
Старый 12.09.2012, 16:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от borockov
Цикл для каждого слова? а если у меня 1000 слов, я должен буду написать тысячу циклов?
Зачем 1000 циклов? Цикл один, просто выполняться он будет 1000 раз.
Цитата:
Сообщение от borockov
Можешь коротенький примерчик просто я незнаю как внутри цикла for использовать while, по отдельности я знаю как использовать эти циклы, но вместе как то не использовал.
Вот, вроде работает:
Код:
var
  i: Integer;
  FindWord: string;
  pos: Integer;
begin
  RichEdit1.Lines.BeginUpdate;
  try
    for i := 0 to RichEdit2.Lines.Count - 1 do
    begin
      FindWord := RichEdit2.Lines[i];
      pos := 0;
      while True do
      begin
        pos := RichEdit1.FindText(FindWord, pos, Length(RichEdit1.Text) - pos, []);
        if pos < 0 then Break;
        RichEdit1.SelStart := pos;
        RichEdit1.SelLength := Length(FindWord);
        RichEdit1.SelText := RichEdit3.Lines[i];
        Inc(pos);
      end;
    end;
  finally
    RichEdit1.Lines.EndUpdate;
  end;
end;

И вот ещё что: RichEdit2 и RichEdit3 используй только если тебе нужно чтобы пользователь видел эти списки, если же их не нужно показывать, то лучше используй вместо этого TStringList.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
borockov (12.09.2012)
  #7  
Старый 12.09.2012, 16:20
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Большое спасибо=) щас посмотрю, списки должны быть видны пользователю, так как он будет иметь возможность дополнить базу слов=) которых надо найти и которыми надо заменить=)
Ответить с цитированием
  #8  
Старый 12.09.2012, 16:31
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Друг, а куда писать этот код? чё то я не могу у richedit1 найти "findtext"
Ответить с цитированием
  #9  
Старый 12.09.2012, 16:34
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Ааа блин это же метод=) ссори всё разобрался=)
Ответить с цитированием
  #10  
Старый 12.09.2012, 16:34
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от borockov
Друг, а куда писать этот код?
Пишешь куда угодно, хоть в Button1Click
Цитата:
Сообщение от borockov
чё то я не могу у richedit1 найти "findtext"
А как ты ищешь?
Цитата:
Сообщение от borockov
Ааа блин это же метод=) ссори всё разобрался=)
Ок
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter