Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окрашивание строки RichEdit при обнаружении дублей 
V
    Опции темы
Retriza
  Дата 31.8.2015, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Доброго времени суток. 
Суть проблемы такова: 
У меня есть RichEdit со списком прокси(ip:port). Есть кнопка. Хочу сделать так, чтобы при нажатии на кнопку, строка с дубликатом окрашивалась в красный цвет. 
Я гуглил, возможно плохо, но всё-таки нашёл ответ. Только там дубликат удаляется. Вот я попытался переделать, чтобы строка не удалялась, а окрашивалась:
Код

procedure TForm2.Button1Click(Sender: TObject);
var i,j:integer;
begin
For i:=RichEdit1.Lines.Count-1 downto 0 do
For j:=i-1 downto 0 do
If RichEdit1.Lines[i]=RichEdit1.Lines[j] then
RichEdit1.SelAttributes.Color:=clRed;
end;

...но не получается. Никаких изменений после нажатия на кнопку нет. Скажите, пожалуйста, где ошибка? Или этот код не подходит для окрашивания строки, только для удаления? Не могу понять. 
Ах да. Пытался потом привязать окрашивание на событие OnChange, но срабатывает не на дубликат. Оно глобально меняет атрибут Color для всех строк. И при дальнейшем изменении содержимого RichEdit, всё окрашивается красным цветом. 
Нашёл ещё вот такой код, но он предназначен для удаления дубликатов :(
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
 i := 0;
 while i < RichEdit1.Lines.Count do
 begin
   if RichEdit1.Lines.IndexOf(RichEdit1.Lines[i]) < i then
     RichEdit1.Lines.Delete(i)
   else
     inc(i);
 end;
end;

Помогите разобраться, пожалуйста. Я в Delphi новичок. 
PM MAIL   Вверх
Poseidon
Дата 31.8.2015, 10:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Retriza @  31.8.2015,  05:59 Найти цитируемый пост)
Вот я попытался переделать, чтобы строка не удалялась, а окрашивалась:
Для того, что бы изменить атрибуты текста в RichEdit (SelAttributes) нужно для начала этот текст выделить. Для выделения текста служат SelStart и SelLength.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Retriza
Дата 31.8.2015, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Цитата(Poseidon @ 31.8.2015,  10:34)
Цитата(Retriza @  31.8.2015,  05:59 Найти цитируемый пост)
Вот я попытался переделать, чтобы строка не удалялась, а окрашивалась:
Для того, что бы изменить атрибуты текста в RichEdit (SelAttributes) нужно для начала этот текст выделить. Для выделения текста служат SelStart и SelLength.

Спасибо! Погуглю и попробую.
UPD.
Не получается :( Такая же проблема, как и во втором случае с событием OnChange - существующие дубликаты не выделяются цветом. Вместо этого выделяются ВСЕ последующие строки :(

Это сообщение отредактировал(а) Retriza - 31.8.2015, 18:46
PM MAIL   Вверх
Poseidon
Дата 31.8.2015, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Retriza @  31.8.2015,  14:43 Найти цитируемый пост)
существующие дубликаты не выделяются цветом. Вместо этого выделяются ВСЕ последующие строки :(
SelStart определяет позицию начала выделения. SelLength - количество символов выделения. Что Вы передаете в эти параметры?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Retriza
Дата 31.8.2015, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Да, я знаю. Я погуглил. 
Передаю то, что нашёл в сети, погуглив. Просто не до конца понял, как их правильно использовать. 
Вот такое передаю:
Код

RichEdit1.SelStart:=0;
RichEdit1.SelLength:=Length(RichEdit1.Text);
RichEdit1.SelAttributes.Color:=clRed;

А этот код вообще является работоспособным в обнаружении дубликатов строк? Ошибка только в выделении цветом строки?
PM MAIL   Вверх
Poseidon
Дата 31.8.2015, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



SelStart:=0 - выделение начинается с 0, т.е с начала текста.
SelLength:=Length(RichEdit1.Text) - длина выделения - весь текст.

Не удивительно, что выделяется все. Вам надо в SelStart передавать начало выделяемого текста, а в SelLength длину этого выделяемого текста.

Это сообщение отредактировал(а) Poseidon - 31.8.2015, 19:57


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Retriza
Дата 31.8.2015, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Цитата(Poseidon @ 31.8.2015,  19:56)
SelStart:=0 - выделение начинается с 0, т.е с начала текста.
SelLength:=Length(RichEdit1.Text) - длина выделения - весь текст.

Не удивительно, что выделяется все. Вам надо в SelStart передавать начало выделяемого текста, а в SelLength длину этого выделяемого текста.

Хм. А как тогда передать в SelStart дубликат строки? 
Мне нужно, чтобы Вы меня подтолкнули в нужное русло. Готовый код решения мне не нужен, я хочу сам понять принцип работы. 
UPD.
А ещё такой вопрос возник - выделяться будет только дубликат или оригинал тоже?
UPD2.
Хм. Изменил вот так: 
Код

procedure TForm2.Button1Click(Sender: TObject);
var i,j:integer;
begin
For i:=RichEdit1.Lines.Count-1 downto 0 do
For j:=i-1 downto 0 do
If RichEdit1.Lines[i]=RichEdit1.Lines[j] then
RichEdit1.SelStart:=StrToInt(RichEdit1.Lines[i]);
RichEdit1.SelLength:=RichEdit1.Lines.Count;
RichEdit1.SelAttributes.Color:=clRed;
end;

Но почему-то затрагивает не только дубликат. А и другую строку. Тоже выделяет её. Нет. Вообще криво выделяет. Где-то снова ошибся.

Это сообщение отредактировал(а) Retriza - 31.8.2015, 20:35
PM MAIL   Вверх
Poseidon
Дата 31.8.2015, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



1) Выделять будет то, что укажите. Для указания и служат SelStart (откужа начинать выделение) и SelLength (сколько букв выделять).
2) Почитайте про понятие "логические  скобки".
3) Если в RichEdit будут буквы, то код StrToInt(RichEdit1.Lines[i]) вызовет исключение. И это совсем не начало выделения.
4) RichEdit1.Lines.Count - это не длина текста, а количество строк в RichEdit.

Вы не совсем правильно понимаете работу SelStart и SelLength. Объясню на примере. Допустим у нас есть строка "Hello world". Нам надо выделить в этой строке слово "world". Для этого надо в SelStart передать 6 (позиция начала слова world в строке - 6й символ). В SelLength передать 5 (всего в слове world 5 символов). В вашем случае в SelStart надо передавать позицию начала дуликата, а в SelLength - количество символов дубликата.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Retriza
Дата 31.8.2015, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Цитата(Poseidon @ 31.8.2015,  20:53)
1) Выделять будет то, что укажите. Для указания и служат SelStart (откужа начинать выделение) и SelLength (сколько букв выделять).
2) Почитайте про понятие "логические  скобки".
3) Если в RichEdit будут буквы, то код StrToInt(RichEdit1.Lines[i]) вызовет исключение. И это совсем не начало выделения.
4) RichEdit1.Lines.Count - это не длина текста, а количество строк в RichEdit.

Вы не совсем правильно понимаете работу SelStart и SelLength. Объясню на примере. Допустим у нас есть строка "Hello world". Нам надо выделить в этой строке слово "world". Для этого надо в SelStart передать 6 (позиция начала слова world в строке - 6й символ). В SelLength передать 5 (всего в слове world 5 символов). В вашем случае в SelStart надо передавать позицию начала дуликата, а в SelLength - количество символов дубликата.

Понял! Спасибо большое! Почитаю побольше об этом и к практике сразу.
PM MAIL   Вверх
Retriza
Дата 12.9.2015, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 31.8.2015

Репутация: нет
Всего: нет



Уже не нуждаюсь в этом. 
Тему можно закрыть.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1280 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.