Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.07;
Скачать: CL | DM;

Вниз

Создание/удаление компонентов в 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;



Страницы: 1 вся ветка

Текущий архив: 2002.03.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-19183
dart
2002-02-18 14:58
2002.03.07
Два вопроса


14-19343
evgeg
2002-01-22 23:58
2002.03.07
Что в ВУЗ-х стали не на Pascal-е учить, а на C?


3-19085
fag2000@ok.ru
2002-02-07 14:08
2002.03.07
Проблема с TDBGrid


3-19072
Ura
2002-02-01 15:55
2002.03.07
IB и скорость


3-19071
kserg@ukr.net
2002-02-08 13:35
2002.03.07
Как в DBGridEh програмно задать SortMarkedColumns ?