Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Удаление всех компонентов на форме...


Автор: lukas 29.4.2007, 16:49
В общем удалить то с формы все компоненты не проблема, но появились некоторые нюансы:

Задача в том, чтобы при нажатии на кнопку удалялись все компоненты, кроме тех, у которых tag=13, (а также и нажимаемая кнопка). Проблема в том, что вот как раз-то таки эту нажимаемую кнопку удалить без глюков и ошибок не получается, т.к. (по видимому) она еще используется.


Вот код (который находится в процедуре кнопки OnClick):

Код

...
  li:=TObjectList.Create;
  for k:=0 to form1.ComponentCount-1 do begin
  if (form1.Components[k].Tag<>13) then begin
       li.Add(form1.Components[k]);
     end;
  end;
  
  li.free;
...


Вылетает (частенько) вот такая ошибка:

Цитата

---------------------------
menu
---------------------------
Access violation at address 00000000. Read of address 00000000.
---------------------------
ОК   
---------------------------


Причем адреса могут быть любыми, с label-ами все нормально, и например такая же ошибка и с checkbox'ами. А удалить нажимаемый компонент позарез необходимо сразу (без всяких таймеров). 


Автор: ivan219 29.4.2007, 17:29
Может зделать через сообщения.
Хотя вот так работает без ошибок.
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Free;
end;

Автор: lukas 29.4.2007, 18:02
ivan219, кнопка немного нестандартная... lbspeedbutton, вообщем имеет цвет при выделении при нажатии и т.п. Попробуй с чекбоксом... у меня вылетает ошибка... 

Автор: ivan219 29.4.2007, 20:59
Ошибок нет.
Код

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 CheckBox1.Free;
end;

Хотя удалять компонент в его собственном обработчеки это дурной тон.
Воспользуйся лучше сообщениями.

Добавлено через 2 минуты и 33 секунды
Да а зачем их удалять может проще их скрыть???
Код

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 CheckBox1.Visible:=False;
end;

Автор: lukas 29.4.2007, 21:47
ivan219, незнаю незнаю... но visible = false мне не подходит... будут загружаться новые компоненты на форму, и если вдруг будут одинаковые названия....  smile... Ладно буду разбираться сам... *насчет visible:=false я уже делал так, но если делать так, то мой код (по некоторым причинам) намного увеличится*...  smile  Код большой... поэтому разобраться под силу только мне...=)

Автор: mr.Anderson 29.4.2007, 21:58
Цитата
Задача в том, чтобы при нажатии на кнопку удалялись все компоненты, кроме тех, у которых tag=13

Код

for i:=0 to Form1.ControlCount-1 do
 if( Form1.Controls[ i ].Tag <> 13 ) then
  Form1.Controls[ i ].Free;

Автор: Snowy 30.4.2007, 08:17
mr.Anderson, Не в ту сторону цикл крутишь.
Нужно
Код
for i := Form1.ControlCount-1 downto 0 do
 if( Form1.Controls[ i ].Tag <> 13 ) then
  Form1.Controls[ i ].Free;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)