Удаление всех компонентов определенного класса на форме (Delphi) - PullRequest
12 голосов
/ 12 февраля 2009

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

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

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

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

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

1010 * ТИА *


ОБНОВЛЕНИЕ:

Ребята, вы молодцы. Благодарю. :)

Ответы [ 6 ]

27 голосов
/ 12 февраля 2009

Ты почти прав. Ваша петля должна выглядеть как

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 - я не могу вспомнить почему в данный момент. Bri

10 голосов
/ 12 февраля 2009

Начинайте сверху и двигайтесь назад.

а именно:

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

Позвоните бесплатно вместо уничтожения. Бесплатные звонки Уничтожить после проверки действительной ссылки.

2 голосов
/ 12 февраля 2009

Это может не произойти в вашем случае, но проверка if frmMain.Components[i] is TMyClass также вернет true для классов-потомков TMyClass. Если вы действительно ищете удаление одного конкретного класса, вам может понадобиться добавить дополнительную проверку ClassName.

2 голосов
/ 12 февраля 2009

То же решение с циклом while:

i := 0;
while i < frmMain.ComponentCount do
begin
  if frmMain.Components[i] is TMyClass then
    frmMain.Components[i].Free 
  else
    inc(i);
end;
0 голосов
/ 24 декабря 2014

Для 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;
0 голосов
/ 04 февраля 2010

Если вам нужно проверить и уничтожить названный известный компонент Используйте

If YourComponent <> Nil Then
  YourComponent.Free;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...