Это, наверное, глупый вопрос, но мой мозг просто приготовлен достаточно, я думаю, что я собираюсь использовать один из своих «жизненных линий», чтобы увидеть, могу ли я получить некоторая помощь от моего переполнения друзей. ;)Удаление всех компонентов определенного класса на форме (Delphi)
Мне нужно удалить все вхождения определенного типа компонента в моей основной форме (некоторые из них находятся внутри панелей или таблиц, но все включено и принадлежит одной и той же форме). Вот что у меня сейчас:
for i := 0 to frmMain.ComponentCount - 1 do
begin
if frmMain.Components[i] is TMyClass then frmMain.Components[i].Destroy;
end;
Проблема заключается в том (и я знал, что это было бы, прежде чем я скомпилировал его), что когда-то я уничтожу компонент, список компонентов повторных индексов форме, и я в конечном итоге выходит за границы.
Каков наилучший способ решить эту проблему? Я подумал о добавлении «найденных» компонентов в автономный массив, а затем пройти через это после этого цикла, чтобы удалить их, что, я думаю, будет работать ... но это лучший подход?
ТИА
UPDATE:
Вы, ребята, рок. Благодарю. :)
Уничтожить виртуально. Если объект уже был уничтожен, он потерпит неудачу. Бесплатные проверки, чтобы проверить, есть ли у него действительная ссылка перед вызовом Destroy. Здесь, вероятно, не проблема, а хорошая практика в целом. –
В этом случае можно просто вызвать Destroy.Из-за того, как VCL управляет этим списком, в этом списке вряд ли будет некорректная ссылка. Даже если бы это было так, Free не защищал бы вас, потому что он полагался на то, что экземпляр был ноль. –
Обратите также внимание на то, что цикл переходит от высокого к нулю, чтобы гарантировать, что все элементы рассмотрены, в противном случае цикл может пропускать элементы рядом с удаленным. Важно не пропустить это. – mj2008