![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тупой вопрос
Comp © (2002-11-14 17:11:00)Люди, как , ПРАВИЛЬНО!удалить стороки из Лист Бокса???
Когда удаляю 1-ну строку - то ничего, а когда несколько через оператор Фор, то он прежде чем удалить проп....дит что-то типа List index out of bounds (номер строки), а потом удалит.
Что это значит?
Comp (2002-11-14 18:57:00) [1]Всем спасибо за советы, вашу страницу сохраню.
Мне действительно надо выборочно удалять, но теперь ясно одно -
Нумерация оказывается смещается!!!
Теперь ясно.
DieHard (2002-11-14 18:17:00) [2]2Игорь Шевченко:
а если с BeginUpdate/EndUpdate? :)
Андрей Прокофьев (2002-11-14 17:59:00) [3]2 Игорь Шевченко © (14.11.02 17:47)
Насчет ListBox.Items.Clear никто и не спорит
мы уже не про удаление ВСЕХ строк
:)
Smithson (2002-11-14 17:52:00) [4]Вариант.
Skier (2002-11-14 17:47:00) [5]>Андрей Прокофьев
Тоже вариант ! :)
Игорь Шевченко (2002-11-14 17:47:00) [6]И все эти циклы будут тормозить жутко, так как при каждом удалении будет происходить перерисовка ListBox.
Все, кроме ListBox.Items.Clear.
С уважением,
Андрей Прокофьев (2002-11-14 17:45:00) [7]Skier © (14.11.02 17:43)
еще лучше label и goto !!!
Skier (2002-11-14 17:43:00) [8]Господа, Repeat... Until- FOREVER ! :)))
Андрей Прокофьев (2002-11-14 17:39:00) [9]Smithson © (14.11.02 17:33)
Нет, не согласен
for i := Self.ListBox1.Count - 1 downto 0 do
if Удалить then
Self.ListBox1.Items.Delete(i);
MBo (2002-11-14 17:37:00) [10]>Smithson
вот упрямый какой ;)
for i := Items.Count-1 downto 0 do
if (условие) then Items.Delete(i);
это и короче (else нет), и легче читается, и быстрее, т.к. цикл for шустрее while и объем сдвигаемых при удалении данных (кусков массива указателей) суммарно меньше
Андрей Прокофьев (2002-11-14 17:36:00) [11]Smithson © (14.11.02 17:33)
Не видел Вашего постинга и теперь согласен :)
Smithson (2002-11-14 17:33:00) [12]?
Андрей Прокофьев (2002-11-14 17:32:00) [13]2 Smithson © (14.11.02 17:29)
через While не "здоровее" :)
Smithson (2002-11-14 17:31:00) [14]А при while все дчень просто
I := 0;
while I < ListBox1.Count do
if Надо удалять then ListBox1.Delete(I)
else Inc(I);
Я не прав?
Smithson (2002-11-14 17:29:00) [15]но в этой ситуации еще быстрее будет ListBox1.Clear;
А вот если удаление выборочное (здесь играть, здесь не играть, ...), то через фор геморойно будет
Андрей Прокофьев (2002-11-14 17:21:00) [16]Smithson © (14.11.02 17:15)
>>При удалении данных из списков ни в коем случае нельзя >>использовать цикл фор!
?!!
for i := 0 to Self.ListBox1.Count - 1 do
Self.ListBox1.Items.Delete (0);
for i := Self.ListBox1.Count - 1 downto 0 do
Self.ListBox1.Items.Delete (i);
MBo (2002-11-14 17:18:00) [17]>Smithson
>ни в коем случае нельзя
Не только можно, но это и быстрее (конечно, при выборочном удалении)
OlegMsc (2002-11-14 17:17:00) [18]при удалении индексы смещаются
скорее всего удаляешь строку с УЖЕ не существующим индексом
Андрей Прокофьев (2002-11-14 17:15:00) [19]Если все то еще ListBox1.Items.Clear
Smithson (2002-11-14 17:15:00) [20]ListBox.Clear - это все
Теперь про итерации. При удаленииданных из списков ни в коем случае нельзяиспользовать цикл фор! Надо так
I := 0;
while I < LixtBox1.Count do ListBox1.Items.Delete(I);
Но еще раз повторю - удалять все быстрее через Clear.