Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дубликаты в ListBox [D6, WinXP]


K@KTUS ©   (2007-02-17 00:14:00) 

Подскажите как найти и удалить повторяющиеся строки из ListBox'a.


RASkov   (2007-02-18 14:30:00) [1]

> [14] Loginov Dmitry ©   (18.02.07 08:53)

Фокусники...:) ( > Фокус в том, что....) [9] Юрий Зотов ©


Loginov Dmitry   (2007-02-18 08:53:00) [2]

> [13] Германн ©   (18.02.07 01:14)


Фантастика! :))


Германн   (2007-02-18 01:14:00) [3]


> Германн ©   (18.02.07 01:02) [12]
>

Блин. Спешу, не думая :(
with ListBox do
for i:=Count-1 downto 1 do
  if Items.IndexOf(Items.String[i]) <> i then Items.Delete(i);


Германн   (2007-02-18 01:02:00) [4]


> Юрий Зотов ©   (17.02.07 16:51) [9]
> ...
> только надо добавить проверку InsexOf <> i

Да. Дал Маху. Признаюсь :)
Привожу исправленный вариант:
with ListBox do
 for i:=Count-1 downto 1 do begin
   k:=Items.IndexOf(Items.String[i]);
   if (k <> i) and (k >= 0) then Items.Delete(i);
 end;


default   (2007-02-17 17:01:00) [5]

Observer ©   (17.02.07 16:51) [10]
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1171716731&n=18


Юрий Зотов   (2007-02-17 16:51:00) [6]

> BOA_KAA ©   (17.02.07 16:19) [7]

Выражения инициализации цикла for вычисляются только один раз, перед его началом. Поэтому выхода за пределы списка не будет. Он был бы в возрастающем цикле, а в убывающем все ОК.

> Loginov Dmitry ©   (17.02.07 16:05) [5]

Полезен, только надо добавить проверку InsexOf <> i. Фокус в том, что цикл идет с конца, а IndexOf ищет с начала.


Observer   (2007-02-17 16:51:00) [7]

а как подсчитать количество одинаковых строк в ListBOx


RASkov   (2007-02-17 16:37:00) [8]

> [7] BOA_KAA ©   (17.02.07 16:19)

походу нифика ничего не меняется
 K:=1;
 for N:= 0 to K do begin
   ListBox.Items.Add(IntToStr(K));
   INC(K, 5);
 end;
Т.е. переменная K свое значение внутри цикла меняет, а граница цикла как была до вызова так и остается такой же во время цикла.
Фик его знает как оптимизатор с комппилятором мудрят.


BOA_KAA   (2007-02-17 16:19:00) [9]

в данном случае меняется не явно. Поэтому компилятор пропустит. Однако, реальна ситуация с выходом за пределы списка с АВ, соответственно


RASkov   (2007-02-17 16:13:00) [10]

> [5] Loginov Dmitry ©   (17.02.07 16:05)

Вообщето меняется... Count же убывает... имхо.

> [4] BOA_KAA ©   (17.02.07 15:59)

А что будет то?

for n:= ListBox.Items.Count-1 downto 0 do ListBox.Items.Delete(n);
нормально работает...


Loginov Dmitry   (2007-02-17 16:05:00) [11]

> [4] BOA_KAA ©   (17.02.07 15:59)


Хотя приведенный в [1] код по сути бесполезен, однако никакие границы там не меняются.


BOA_KAA   (2007-02-17 15:59:00) [12]


> Германн ©   (17.02.07 01:10) [1]

это не си. Границы цикла for нельзя менять :)


Loginov Dmitry   (2007-02-17 10:23:00) [13]


 procedure TForm1.Button1Click(Sender: TObject);
 var
   I: Integer;
   AList: TStringList;
 begin
   AList := TStringList.Create;
   for I := 0 to ListBox1.Count - 1 do
     if AList.IndexOf(ListBox1.Items[I]) < 0 then
       AList.Add(ListBox1.Items[I]);
   ListBox1.Items.Assign(AList);
   AList.Free;
 end;


RASkov   (2007-02-17 01:35:00) [14]

procedure DeleteDuplicate(Lst: TStrings);
var N, K: integer;
begin
 K:=0;
 while K<>Lst.Count do begin
  N:=K+1;
  while N<>Lst.Count do if Lst[K] = Lst[N] then Lst.Delete(N) else INC(N);
  INC(K);
 end;
end;
.......
DeleteDuplicate(ListBox1.Items);


Германн   (2007-02-17 01:10:00) [15]

with ListBox do
 for i:=Count-1 downto 1 do
   if Items.IndexOf(Items.String[i]) >= 0 then Items.Delete(i);


Наверх

Титульная страница Поиск, карта сайта Написать письмо