Форум: "Основная";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c