Форум: "Основная";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
ВнизВопрос к вам, мастера! Найти похожие ветки
← →
Anar (2002-09-10 14:15) [0]Допустим у меня список файлов в ListBoxe:
C:\Anar\Temp\file.txt
C:\Anar\Temp\file2.exe
C:\Anar\Temp\file3.jpg
и т.д.
Создаю Button и к нему обработчик:
begin
Repeat
DeleteFile(ListBox1.Items.Index[i]);
ListBox1.Items.Delete[i];
i:=i+1;
Until ListBox1.Items.Strings="";
end;
Он короче удаляет все файлы и строки из ListBox1, но когда доходит до конца выдаёт ошибку такого рода: ListBox bound Index (точно не помню я не дома и пишу всё по памяти). Как правильно удалять по очереди все элементы из ListBox, пока там не окажется ни один элемент.
И ещё: Как известно, процесс удаления элемента из спика происходит намного быстрее, чем процесс удаления файла с жёсткого диска. Как сделать чтоб следующий элемент(файл) начал удаляться только после того как удалиться предыдущий?
← →
Song (2002-09-10 14:17) [1]А чему равно начальное значение i? Единице наверное? :-)
← →
lenin (2002-09-10 14:19) [2]Until ListBox1.Items.Count>0;
Наверное ;)
← →
Anar (2002-09-10 14:20) [3]Вру!
Код такой:
begin
Repeat
DeleteFile(ListBox1.Items.Strings[i]);
ListBox1.Items.Delete[i];
i:=i+1;
Until ListBox1.Items.Strings="";
end
← →
Anar (2002-09-10 14:21) [4]Начальное значение i=0
← →
Рыжик (2002-09-10 14:22) [5]for i:=ListBox.Items.Count-1 downto 0 do
begin
DeleteFile(ListBox1.Items.Index[i]);
ListBox1.Items.Delete[i];
end;
В таком варианте пока DeleteFile не закончится, ListBox1.Items.Delete и не начнётся.
← →
Lord Warlock (2002-09-10 14:27) [6]И что такое ListBox1.Items.Index[i]?
наверное имеется ввиду ListBox1.Items[i];
а написать лучше так
for i:=0 to ListBox1.Items.Count-1 do
begin
DeleteFile(ListBox1.Items[i]);
ListBox1.Items.Delete(i);
end;
← →
Рыжик (2002-09-10 14:27) [7]А ошибка происходт из-за того, что после первого удаления, второй элемент становится первым. Когда i=1 на самом деле удаляется с индексом 2 в первоначальном списке. Доходит где-то до середины, а дальше эл-тов нет, хотя список не пустой.
← →
Reindeer Moss Eater (2002-09-10 14:29) [8]
while ListBox.Items.Count > 0 do
begin
DeleteFile(ListBox1.Items.Index[0]);
ListBox1.Items.Delete[0];
end;
← →
Lord Warlock (2002-09-10 14:34) [9]> for i:=0 to ListBox1.Items.Count-1 do
Совсем забыл про эти грабли :))
Разумеется надо делать в цикле while с удалением первого или последнего элемента, как предложил Reindeer Moss Eater
← →
Рыжик (2002-09-10 14:40) [10]C for тоже можно, только в обратном порядке
← →
Lord Warlock (2002-09-10 14:43) [11]
> Рыжик © (10.09.02 14:40)
> C for тоже можно, только в обратном порядке
Только так:
Cnt:=ListBox1.Items.Count-1;
for i:=Cnt downto 0 do
....
или
for i:=0 to Cnt do
Не забывай что при удалении и добавлении ListBox1.Items.Count меняется, поэтому в цикле for напрямую его использовать нельзя
← →
Рыжик (2002-09-10 14:55) [12]
> Lord Warlock © (10.09.02 14:43)
for i:=ListBox.Items.Count-1 downto 0 do
ListBox.Items.Count вычислится только один раз, а дальше идёт просто уменьшение на единицу. Так что можно
← →
Lord Warlock (2002-09-10 15:03) [13]Уважаемый Рыжик ©,
for i:=ListBox1.Items.Count-1 downto 0 do
ListBox1.Items.Delete(i);
ListBox1.Items.Count вычисляется каждый проход цикла
это просто аналог
while ListBox1.Items.Count>0 do
ListBox1.Items.Delete(ListBox1.Items.Count-1)
← →
Рыжик (2002-09-10 15:12) [14]Уважаемый Lord Warlock ©
А вы просто попробуйте такой цикл
for i:=ListBox1.Count-1 downto 0 do
ShowMessage(IntToStr(i));
и посмотрите, что будет.
Здесь ListBox1.Count не меняется, но цикл идёт благополучно
← →
Lord Warlock (2002-09-10 15:17) [15]Уважаемый Рыжик ©,
попробуй в отладчике походить по циклу, который ты привел выше и посмотри ListBox1.Items.Count илиShowMessage(IntToStr(ListBox1.Items.Count));
в цикле
← →
Lord Warlock (2002-09-10 15:19) [16]..естественно вместе с ListBox1.Items.Delete, так как весь сыр-бор из-за него.
← →
Рыжик (2002-09-10 15:25) [17]В моём последнем примере в ListBox ничего не удаляется, так что ListBox.Items.Count не меняется. Согласно вашему замечанию
ListBox1.Items.Count вычисляется каждый проход цикла. Это означает, что i тоже не будет меняться и программа зациклится. Однако в действительности i уменьшается с каждым проходом цикла.
Так что цикл for это не аналог цикла while. В последнем счётчик надо изменять ручками, а в первом скётчик уменьшается или увеличивается всегда, какое бы вы ни использовали для него начальное значение.
← →
Рыжик (2002-09-10 15:30) [18]Lord Warlock © (10.09.02 15:19)
А где было мной написано что ListBox.Items.Count не изменится при удалении??? Естественно, изменится. Только это уже никак не повлияет на счётчик в цикле. А сыр-бор из-за того, что вами было сказано:
> Не забывай что при удалении и добавлении ListBox1.Items.Count
> меняется, поэтому в цикле for напрямую его использовать
> нельзя
Однако я говорю, можно ;)
← →
Anar (2002-09-11 09:55) [19]Не надо спорить, с удалением из списка строк я разобрался, лучше скажите как сделать так чтобы до того как файл не удалится с HDD следующая запись не начинала удаляться. Например, у меня файлы размером 2-3 Мб, а они не сразу удаляются с диска, в то время как записи из ListBox"а удаляются моментально.
← →
Рыжик (2002-09-11 10:10) [20]Да вроде бы DeleteFile должна закончиться, только когда удаление завершится полностью. А потом уже программа перейдёт на следующую строчку. Или нет?
← →
Anar (2002-09-11 10:17) [21]Нет, нет. Ты сам попробуй, убедишься. Если б можно было бы так как ты раньше сказал, то второй раз я бы не спросил.
← →
Рыжик (2002-09-11 11:08) [22]Пробую в отладчике и убеждаюсь: пока не удалится файл, на следующую строку не переходит. Может ты чего-то не договариваешь? Опиши подробней свою ситуацию.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c