Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Создание/удаление компонентов в RunTime 


ZEE   (2002-02-06 04:14) [0]

Проблемма собственно в удалении компонент созданных в рантайм.
Например на TPanel создаются несколько TLabel:

lb:TLabel;
...
lb:=TLabel.Create(Panel1);
lb.Parent:=Panel1;
// несколько раз
...


Вопрос: Как потом удалить эти самые лэйблы?
Пробовал так

Panel1.DeleteComponents;

и еще так

for i:=0 to Panel1.ComponentCount-1 do
Panel1.Components[i].Free;

но что-то не выходит - где же грабли?..



MBo   (2002-02-06 06:47) [1]

for i:=panel1. ControlCount-1 downto 0 do
if panel1.controls[i] is tlabel then
tlabel(panel1.controls[i]).free;



Belov   (2002-02-06 09:21) [2]

Да, только с тем учетом, что Label не является TControl

for i:=0 to Panel1.ComponentCount-1 do
begin
if Panel1.Components[i] is TLabel then
(Panel1.Components[i] as TLabel).Free
end



han_malign   (2002-02-06 09:52) [3]

Насколько я знаю компонента сама удаляет все дочерние.
З.Ы. Только проверил в RTL - 100% - удаляет (TWinControl - удаляет все дочерние контролы,TComponent - все вложенные компоненты)



han_malign   (2002-02-06 09:58) [4]

В смысле удаляет при удалениии главной компоненты.
А если не удаляя главной:

TComponent(Components[i]).Free;
Panel1.Remove(Components[i])



MBo   (2002-02-06 10:04) [5]

>Belov
Label является TControl.
Код проверен.
>han_malign
RemoveControl? это не подходит - только Parent->nil
если имеется в виду Owner, указанный в Create - да, уничтожает при своем удалении, а если его не надо удалять?



ZEE   (2002-02-06 12:10) [6]

Народ вобщем задача в том, что надо несколько раз создавать и удалять кучу компонент в РанТайм. И если не удалять созданные ранее компоненты, не приведет ли это к чрезмерному использованию ресурсов?..

И еще кое-что:
после создания этой самой "кучи компонент" (на Panel1) проверяю сколько же компонент на ней находится (Panel1.ComponentCount) - получается 0 - нету :( ... что делать?..
Кстати с ControlCount тоже пробовал - результат тот же.



MBo   (2002-02-06 12:27) [7]

чего-то ты мудришь. Вот как у меня работает.
ControlCount использовал, поскольку label можно не давать Owner-ом Panel, а Self или вообще nil

procedure TForm1.Button2Click(Sender: TObject);
var lb:tlabel;
begin
inc(i);
lb:=tlabel.create(panel1);
lb.parent:=panel1;
lb.name:="labela"+inttostr(i);
lb.top:=i*15;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
for i:=panel1.ControlCount-1 downto 0 do
if panel1.controls[i] is tlabel then
tlabel(panel1.controls[i]).free;
end;



kaif   (2002-02-06 13:01) [8]

Проблема в том, что удалять надо всегда от большего номера к меньшему.
for i:=panel1.ControlCount-1 downto 0 do
Controls[i].Free;
(если опираться на Parent)
for i:=panel1.ComponentCount-1 downto 0 do
Components[i].Free;
(если опираться на Owner. В этом случае при создании компонентов в конструкторе нужно указать владельца Create(Panel1)).
------
Если удалять в прямом порядке, будет Access Vialoation, как только i дойдет до половины диапазона, так как индекс i выйдет за пределы списка существующих к этому моменту ссылок.
------
Работают эти механизмы удалений нормально и используются повсеместно в самой VCL.



Noname999   (2002-02-07 10:43) [9]

А как насчет:

for i:= 0 ещ Panel1.ControlCount-1 do
Controls[0].Free;



Севостьянов Игорь   (2002-02-07 11:26) [10]

Согласен с этим..

han_malign (06.02.02 09:52)
Насколько я знаю компонента сама удаляет все дочерние.
З.Ы. Только проверил в RTL - 100% - удаляет (TWinControl - удаляет все дочерние контролы,TComponent - все вложенные компоненты)


Зачем эти мороки с удалением, если
lb.Parent:=Panel1;
А это значит что все дочерние конролы у Panel1 при его уничтожении тоже удаляться...
У тебя ж в коде нет удаления компонентов созданных в DesignTime...



Юрий Зотов   (2002-02-07 12:35) [11]

http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=1013072347&n=0



ZEE   (2002-02-07 18:45) [12]

Всем спасибо.
Действительно проблема была всего-лишь в обратном отсчете...



shurik9   (2002-02-21 11:45) [13]

А зачем столько гимора?
Твой лейбел запросто удалится при помощи
lb.Free;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.042 c
3-19095           jack200180            2002-02-08 16:49  2002.03.07  
РБД и ....


1-19195           sammy                 2002-02-18 14:16  2002.03.07  
условие в Install Shield


1-19252           Марина                2002-02-20 09:44  2002.03.07  
FastReport


7-19356           Ant_bofh              2001-11-29 08:59  2002.03.07  
Опять COM-порт и всё что связано :-)


4-19381           Valeron               2002-01-10 05:43  2002.03.07  
Перехват значений