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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2014, 09:20   #1
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию Удаление слов в RichEdit

Всем привет.
Такая проблема... надо удалить некоторые слова в RichEdit.
Написал процедуру, слова нужные удаляет, но каждый раз выскакивает ошибка:

Цитата:
RichEdit line insertion error.
Вот код процедуры:

Код:
var
 Start, Find: integer;
begin
  Start := 0;
  Find := RichEdit.FindText(Word, Start, MaxInt, [stMatchCase]);
  while Find <> -1 do
   begin
    RichEdit.SelStart := Find;
    RichEdit.SelLength := Length(Word);
    RichEdit.SelText := '';
    Start := Find + Length(Word);
    Find := RichEdit.FindText(Word, Start, MaxInt, [stMatchCase]);
   end;
end;
Процедура повешана на OnChange RichEdit-а.
В чем проблема?
Вложения
Тип файла: zip RichEdit_Error.zip (2.0 Кб, 7 просмотров)

Последний раз редактировалось Xo66um; 18.03.2014 в 16:30.
Xo66um вне форума Ответить с цитированием
Старый 18.03.2014, 09:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Start := Find + Length(Word);
Length(Word) не нужно плюсовать, там нет уже удаленного куска текста
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.03.2014, 09:47   #3
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Length(Word) не нужно плюсовать, там нет уже удаленного куска текста
Length(Word) нужен для того, чтобы повторные слова не удалялись.
Во всяком случае, даже без Length(Word) вылетает все та же ошибка.
Xo66um вне форума Ответить с цитированием
Старый 18.03.2014, 09:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

рискную предположить (могу ошибаться!!), что ошибка возникает из рекурсии: если изменить в процедуре OnChange текст, то вызовется процедура, назначенная на onChange.

попробуйте (для проверки сего факта) вынести код обработки из onChange (на onClick баттона, например). Или поставьте точку останова на начале процедуры, посмотрите, сколько раз она вызовется...

p.s. если я прав, то побороть можно легко с помощью глобального флага (переменной типа boolean)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2014, 09:56   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Процедура повешана на OnChange
Попробуйте перед выполнением кода обнилить OnChange, после восстановить.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.03.2014, 10:09   #6
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Serge_Bliznykov, вы правы, на OnClick-е ошибок не возникает.

Цитата:
Сообщение от Аватар Посмотреть сообщение
Попробуйте перед выполнением кода обнилить OnChange, после восстановить.
Не вариант, т.к. все форматирование слетает.

Сделал, спасибо всем большое, в особенности Serge_Bliznykov

Последний раз редактировалось Xo66um; 18.03.2014 в 10:19.
Xo66um вне форума Ответить с цитированием
Старый 18.03.2014, 10:22   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Не вариант, т.к. все форматирование слетает.
Придумал что-то. Из-за этого ни чего слетать не будет, тем более форматирование
Код:
procedure TForm1.RichEdit1Change(Sender: TObject);
begin
  RichEdit1.OnChange:=nil;
//здесь ваш код
  RichEdit1.OnChange:=RichEdit1Change;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.03.2014, 10:29   #8
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Аватар, при восстановлении RichEdit обновляется, и все форматирование слетает. Ошибку все также не исправляет.

Delphi 7 (Win7 Макс., x64, SP1)

Последний раз редактировалось Xo66um; 18.03.2014 в 16:35.
Xo66um вне форума Ответить с цитированием
Старый 18.03.2014, 16:33   #9
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Собственно, демку ошибки прикрепил к первому сообщению. Если кто-нибудь посмотрит, и предложит методы исправления этой ошибки - буду признателен.

Обращаю также ваше внимание на то, что если вручную вводить специальное слово в RichEdit, то ошибки не возникает, также ошибки нет, если закинуть вызов процедуры удаления в поток, или вынести вызов этой процедуры на обработчик любого компонента (например OnClick TButton).

P.S.
Извините, думал, сообщения "склеются" при добавлении нового

Последний раз редактировалось Xo66um; 18.03.2014 в 17:15.
Xo66um вне форума Ответить с цитированием
Старый 19.03.2014, 07:38   #10
opencloser
Пользователь
 
Регистрация: 04.03.2014
Сообщений: 15
По умолчанию

Не подходит вариант: прочитать, отредактировать прочитанное и переписать заново ?
opencloser вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
«HighLight» или выделение «ключевых слов» в RichEdit (Delphi 7) munthrekosh Общие вопросы Delphi 5 02.03.2012 12:47
RichEdit - Выделение цветом слов fakir9999 Компоненты Delphi 3 15.06.2009 15:39
RichEdit - Выделение цветом слов fakir9999 Помощь студентам 11 29.05.2009 09:30
помогите с организацией поиска слов в richedit BuT@JL Общие вопросы Delphi 1 30.04.2009 15:23
Количество слов в richedit blackstersl Общие вопросы Delphi 2 11.03.2009 15:10