Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-19328
asafr
2002-01-21 17:23
2002.03.07
Питер, пирушка!!! возможно...


6-19290
kex
2001-12-19 12:05
2002.03.07
Как узнать программно свой IP?


14-19298
EugeneT
2002-01-17 13:50
2002.03.07
Разработка кросс-платформенных приложений (D6)


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


4-19395
JS
2002-01-06 00:56
2002.03.07
Загрузка DLL в чужой процесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский