Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-73699
ResTec
2002-09-11 05:38
2002.09.23
Ка создать прозрачного родителя?


3-73564
SAMVEL
2002-09-03 16:12
2002.09.23
DBGRID


1-73579
cherepovets
2002-09-10 12:55
2002.09.23
КАК Отследить


8-73763
xsav
2002-05-24 23:19
2002.09.23
Как проверить наличие музыкалки?


1-73728
race1
2002-09-09 16:06
2002.09.23
большая имага





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский