Подтвердить что ты не робот

Удаление всех компонентов определенного класса в форме (Delphi)

Это, наверное, глупый вопрос, но мой мозг просто приготовлен достаточно, я думаю, что я буду использовать один из моих "жизненных линий", чтобы узнать, смогу ли я получить помощь от моих друзей.;)

Мне нужно удалить все вхождения определенного типа компонента в моей основной форме (некоторые из них находятся внутри панелей или таблиц, но все они принадлежат и принадлежат одной и той же форме). Вот что у меня сейчас:

for i := 0 to frmMain.ComponentCount - 1 do  
  begin  
    if frmMain.Components[i] is TMyClass then frmMain.Components[i].Destroy;  
  end;    

Проблема в том, что (и я знал, что это было бы до того, как я ее скомпилировал), что, как только я уничтожу компонент, переформатирует список компонентов формы, и я окажусь вне пределов.

Какой лучший способ решить эту проблему? Я подумал о добавлении "найденных" компонентов в автономный массив, а затем пройти через это после этого цикла, чтобы удалить их, что, я думаю, будет работать... но это лучший подход?

ТИА


ОБНОВЛЕНИЕ:

Вы, ребята, рок. Благодарю.:)

4b9b3361

Ответ 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;