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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2011, 14:49   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Как удалить из ListBox1 строки которые встречаются в ListBox2

Как удалить из ListBox1 строки которые встречаются в ListBox2
Aleksandr вне форума Ответить с цитированием
Старый 07.06.2011, 14:52   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
for j:=0 to Listbox1.items.count-1 do begin
n:=Listbox1.ITems.Indexof(ListBox2.Items.Strings[j]);
if n>=0 then Listbox1.Items.Delete(n);
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.06.2011, 15:00   #3
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

у меня на строке
Код:
n:=Listbox1.ITems.Indexof(ListBox2.Items.Strings[j]);
выскакивает ошибка
Aleksandr вне форума Ответить с цитированием
Старый 07.06.2011, 15:05   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
n:=Listbox1.ITems.Indexof(ListBox2.Items[j]);
ZuBy вне форума Ответить с цитированием
Старый 07.06.2011, 15:08   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ни в коем-разе!! Опечатка??
Цитата:
Код:
for j:= ... Listbox1.items.count-1 
... ListBox2.Items.Strings[j]
вероятно, планировалось так:
Код:
for j:=0 to Listbox2.items.count-1 do begin
  n:=Listbox1.Items.Indexof(ListBox2.Items.Strings[j]);
  while n>=0 do begin
     Listbox1.Items.Delete(n);
     n:=Listbox1.Items.Indexof(ListBox2.Items.Strings[j]);
  end;
  if Listbox1.items.count = 0 then Break;
end;

хотя, возможно, что цикл перебора по ListBox1 был бы более эффективным...
ДОБАВЛЕНО
вот ПОЛНЫЙ вариант решения с перебором по ListBox1:
Код:
for j:=Listbox1.items.count-1 downto 0 do begin
  if Listbox2.Items.IndexOf(ListBox1.Items.Strings[j])>= 0
      then Listbox1.Items.Delete(j);
end;
а ещё лучше при этом (если исходная задача допускает, конечно!)
предварительно отсортировать содержимое ListBox2 через метод Sort
и для поиска использовать не IndexOf - а метод .Find - он намного быстрее!!!

Последний раз редактировалось Serge_Bliznykov; 07.06.2011 в 15:14.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2011, 15:13   #6
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Все равно выдает List Index out of bounds()
Aleksandr вне форума Ответить с цитированием
Старый 07.06.2011, 15:15   #7
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Всем спасибо.
Aleksandr вне форума Ответить с цитированием
Старый 07.06.2011, 15:17   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Всем спасибо.
Вы мой пост #5 перечитывали?
Я там дополнял варианты решения.

Надеюсь, что всё у Вас получилось?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2011, 15:52   #9
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Да спасибо получилось. я ответил в 6 посте вышего сообщения еще не видел.
Aleksandr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
из строки вывести на экран те символы, которые встречаются только по 1 разу Andrey770 Паскаль, Turbo Pascal, PascalABC.NET 4 29.03.2011 19:08
перенести строки из Listbox2 в Listbox1 DIgorevich Компоненты Delphi 20 16.08.2010 17:19
Из заданной символьной строки, выбрать те символы, которые встречаются в ней только один раз... Banny Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2008 06:15
Удалить из второй строки те слова, которые есть в первой строке innaa639 Паскаль, Turbo Pascal, PascalABC.NET 2 26.11.2008 15:43