Удаление всех компонентов определенного класса в форме (Delphi)
Это, наверное, глупый вопрос, но мой мозг просто приготовлен достаточно, я думаю, что я буду использовать один из моих "жизненных линий", чтобы узнать, смогу ли я получить помощь от моих друзей.;)
Мне нужно удалить все вхождения определенного типа компонента в моей основной форме (некоторые из них находятся внутри панелей или таблиц, но все они принадлежат и принадлежат одной и той же форме). Вот что у меня сейчас:
for i := 0 to frmMain.ComponentCount - 1 do
begin
if frmMain.Components[i] is TMyClass then frmMain.Components[i].Destroy;
end;
Проблема в том, что (и я знал, что это было бы до того, как я ее скомпилировал), что, как только я уничтожу компонент, переформатирует список компонентов формы, и я окажусь вне пределов.
Какой лучший способ решить эту проблему? Я подумал о добавлении "найденных" компонентов в автономный массив, а затем пройти через это после этого цикла, чтобы удалить их, что, я думаю, будет работать... но это лучший подход?
ТИА
ОБНОВЛЕНИЕ:
Вы, ребята, рок. Благодарю.:)
Ответы
Ответ 1
Ты почти прав. Ваша петля должна выглядеть как
for i := frmMain.ComponentCount - 1 downto 0 do
begin
if frmMain.Components[i] is TMyClass then
frmMain.Components[i].Free;
end;
Таким образом, вызов функции "frmMain.ComponentCount" выполняется в начале и не снова.
Вы также должны позвонить Free, как указано выше, а не Destroy - я не могу вспомнить, почему на данный момент.
Бри
Ответ 2
Начинайте сверху и работайте назад.
а именно:
for i := frmMain.ComponentCount - 1 downto 0 do
begin
if frmMain.Components[i] is TMyClass then frmMain.Components[i].Free;
end;
Позвоните бесплатно вместо Destroy. Бесплатные звонки Уничтожьте после проверки действительной ссылки.
Ответ 3
Это может не случиться в вашем случае, но проверка if frmMain.Components[i] is TMyClass
также вернет true для классов-потомков TMyClass
. Если вы действительно ищете удаление одного определенного класса, вам может потребоваться добавить дополнительную проверку ClassName
.
Ответ 4
То же решение с while-loop:
i := 0;
while i < frmMain.ComponentCount do
begin
if frmMain.Components[i] is TMyClass then
frmMain.Components[i].Free
else
inc(i);
end;
Ответ 5
Для Fine Contrle в форме или панели можно использовать этот код
var
i:Integer;
begin
for i := 0 to Panel1.ControlCount - 1 do
begin
if Panel1.Controls[i] is TEdit then
Tedit(Panel1.Controls[i]).text := '';
end;
Ответ 6
Если вам нужно проверить и уничтожить названный известный компонент
Используйте
If YourComponent <> Nil Then
YourComponent.Free;