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

Вниз

Вопрос к вам, мастера!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
4-73940
Alibaba
2002-08-07 17:29
2002.09.23
Запуск макроса Excel


1-73739
SergLight
2002-09-10 15:46
2002.09.23
Custom Hint


3-73499
Antipich
2002-08-31 19:04
2002.09.23
Таблицы *.XML


6-73804
Sergserg
2002-07-18 12:15
2002.09.23
Ошибка при отправке сообщения


1-73748
Андрусь
2002-09-11 18:12
2002.09.23
такой вот немного детский вопрос