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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2010, 00:05   #1
Dima_D
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 28
По умолчанию Одинаковые строки Memo

Подскажите как в Memo найти и удалить повторяющиеся строки?
Dima_D вне форума Ответить с цитированием
Старый 12.08.2010, 00:22   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так пойдёт?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j : integer;
begin
  i := Memo1.Lines.Count-1;
  while i>=0 do begin
     j := Memo1.Lines.IndexOf(Memo1.Lines[i]);
     while (j>=0) and (j<i) and (i>=0) do begin
       Dec(i);
       Memo1.Lines.Delete(j);
       if i>=0 then
         j := Memo1.Lines.IndexOf(Memo1.Lines[i]);
     end;
     Dec(i);
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.08.2010, 00:24   #3
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

через memo1.lines
r9m вне форума Ответить с цитированием
Старый 12.08.2010, 00:43   #4
Dima_D
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 28
По умолчанию

Спасибо огромное!

Serge_Bliznykov, если не сложно прокомментируйте код,а то не могу до конца разобраться

Последний раз редактировалось artemavd; 12.08.2010 в 06:35.
Dima_D вне форума Ответить с цитированием
Старый 12.08.2010, 04:42   #5
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Оо! Да тут студент! Вам в другую тему! Тут комментировать нечего!

From artemavd: Делаю замечание. Прошу Вас воздержаться от подобных высказываний и если есть что ответить по теме, то отвечать нужно по теме, а не флудить.

Последний раз редактировалось artemavd; 12.08.2010 в 06:35.
r9m вне форума Ответить с цитированием
Старый 12.08.2010, 06:05   #6
Dima_D
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 28
По умолчанию

Это же моя тема
Просто не могу понять строку :
j := Memo1.Lines.IndexOf(Memo1.Lines[i]);
Dima_D вне форума Ответить с цитированием
Старый 12.08.2010, 06:39   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Попробую я прокомментировать:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j : integer;
begin
  i := Memo1.Lines.Count-1; //количество строк в Мемо
  while i>=0 do begin //пока количество строк больше нуля
  //присваиваем переменной j индексы массива строк i
     j := Memo1.Lines.IndexOf(Memo1.Lines[i]); 
     while (j>=0) and (j<i) and (i>=0) do begin //пока индексов и количества строк больше нуля
       Dec(i);
       Memo1.Lines.Delete(j); //удаляем индекс
       if i>=0 then
         j := Memo1.Lines.IndexOf(Memo1.Lines[i]);
     end;
     Dec(i);
  end;
end;
Поправьте если где был не прав.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 12.08.2010, 07:09   #8
K.I.S.S.
Пользователь
 
Аватар для K.I.S.S.
 
Регистрация: 11.08.2010
Сообщений: 11
По умолчанию

а самое главное -- то что то требовалось не прокомментировал)
Код:
j := Memo1.Lines.IndexOf(Memo1.Lines[i]);// присваиваем j номер строки идентичной i-той строке
ну и слово "индекс" в твоих, так сказать комментариях нужно заменить на "строка с индексом"
вот более точный комментарий
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, j : integer;
begin
  i := Memo1.Lines.Count-1; //количество строк в Мемо
  while i>=0 do begin //пока количество строк больше нуля
     j := Memo1.Lines.IndexOf(Memo1.Lines[i]);//присваиваем j номер строки идентичной i-той строке 
     while (j>=0) and (j<i) and (i>=0) do begin //пока есть строки похожие на i  и строки есть вообще и это не просматриваемая нами i-тая строка
       Dec(i);// уменьшаем количество строк в мемо
       Memo1.Lines.Delete(j); //удаляем строку идентичную i-той строке 
       if i>=0 then
         j := Memo1.Lines.IndexOf(Memo1.Lines[i]);//присваиваем j номер строки идентичной i-той строке 
     end;
     Dec(i); // переходим вверх к следущей строке
  end;
end;

Последний раз редактировалось K.I.S.S.; 12.08.2010 в 07:21.
K.I.S.S. вне форума Ответить с цитированием
Старый 12.08.2010, 07:39   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

artemavd, спасибо за помощь.
Почти всё верно, кроме одного достаточно ключевого момента.
.IndexOf() - это поиск строчки в Memo.Lines
он возвращает индекс найденной строчки или -1, если такую не нашли.
Для поиска передаём поочердной строчки мемо по индексу i
Код:
    //присваиваем переменной j номер найденной строки  (ищем строчку с индексом i
     j := Memo1.Lines.IndexOf(Memo1.Lines[i]); 
     // пока строчка нашлась и эта строчка не является текущей (т.к. сама себя она найдётся всегда) и пока строчки не кончились
     удаляем строчку и ищем следующую, пока условия выполняются
     while (j>=0) and (j<i) and (i>=0) do begin //пока индексов и количества строк больше нуля
       Dec(i);
       Memo1.Lines.Delete(j); //удаляем индекс
       if i>=0 then
         j := Memo1.Lines.IndexOf(Memo1.Lines[i]);
     end;
K.I.S.S. +1
Вы правы. всё так. Просто я не увидел Ваш пост, когда писал ответ!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.08.2010, 09:43   #10
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Совсем не обязательно, но можно добавить 2 строчки, для увеличения производительности:
Код:
begin
     Memo1.Lines.BeginUpdate;  // Отключаем прорисовку Memo
     // ... тело цикла, в котором происходит обновление Memo
     Memo1.Lines.EndUpdate;    // Включаем прорисовку Memo, отобразятся все произведенные изменения
end;
Подробности, например, здесь.
Разница ощутима будет, когда число строк ~ 1000-3000
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с excel в delphi.Выявить одинаковые строки betirsolt БД в Delphi 1 03.06.2010 22:57
Высота строки в Memo Maxs Общие вопросы Delphi 2 09.12.2009 12:35
Одинаковые строки Македонский Общие вопросы Delphi 3 05.10.2007 14:40
Удалить из Memo повторяющиеся строки Etar Компоненты Delphi 2 28.06.2007 18:34