Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Дубликаты в ListBox   Найти похожие ветки 

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

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


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

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


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

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);


 
Loginov Dmitry ©   (2007-02-17 10:23) [3]


 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;


 
BOA_KAA ©   (2007-02-17 15:59) [4]


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

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


 
Loginov Dmitry ©   (2007-02-17 16:05) [5]

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


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


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

> [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);
нормально работает...


 
BOA_KAA ©   (2007-02-17 16:19) [7]

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


 
RASkov   (2007-02-17 16:37) [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 свое значение внутри цикла меняет, а граница цикла как была до вызова так и остается такой же во время цикла.
Фик его знает как оптимизатор с комппилятором мудрят.


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

> 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) [10]

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


 
default ©   (2007-02-17 17:01) [11]

Observer ©   (17.02.07 16:51) [10]
http://delphimaster.net/view/2-1171716731/


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


> Юрий Зотов ©   (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;


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


> Германн ©   (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);


 
Loginov Dmitry ©   (2007-02-18 08:53) [14]

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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
2-1174906877
Roman_S
2007-03-26 15:01
2007.04.15
?????????? вместо Копировать


6-1161764071
yuriks
2006-10-25 12:14
2007.04.15
idFTP и большие файлы


2-1175098596
Углук
2007-03-28 20:16
2007.04.15
Как очистить PaintBox.Canvas?


15-1174214156
PARUS
2007-03-18 13:35
2007.04.15
Пятничные задачки.


15-1174479101
ilopX
2007-03-21 15:11
2007.04.15
Изменение звука в Windows Vista