Это классическая проблема.Цикл for
оценивает границы цикла один раз в начале цикла, поэтому вы запустите конец, который объясняет ошибки индекса за пределами границ.
Но даже если for
зацикливает вычисленные границы цикла каждый разкак while
это не очень поможетКогда вы удаляете элемент, вы уменьшаете Count
на 1 и перемещаете оставшиеся элементы вниз на один в списке.Таким образом, вы изменяете индекс всех тех элементов, которые еще должны быть обработаны.
Стандартный трюк заключается в циклическом циклическом просмотре списка:
for i := List.Count-1 downto 0 do
if DeleteThisItem(i) then
List.Delete(i);
Когда вы пишете его таким образом, вызов Delete
влияет на индексы элементов, которые уже обработаны .