Текущий архив: 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.49 MB
Время: 0.041 c