![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дубликаты в 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);