Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как программно уничтожать программно созданные компоненты? [D5, Win2k]


Jony ©   (2002-06-25 15:22:00) 

Программно создаю кнопки (SpeedButton). В определенный момент их нужно уничтожить. Создаваться то они создаются. А вот как их разрушить? Любая ссылка на них (кроме самого процесса создания) вызывает ошибку "Идентификатор не определен".


Jony   (2002-06-26 11:31:00) [1]

to Fiend
Большое спасибо! Вот теперь все получилось как надо.


Fiend   (2002-06-26 11:12:00) [2]

Сделай так

В главной форме при открытии нужной формы
try
frmMain.btnReestr := TSpeedButton.Create(Указатель на "нужную" форму);
with frmMain(здесь надо бы добавить .btnReestr если задаёшь св-ва кнопки) do begin
// задание свойств
в задании свойств не забудь указать Parent:= frmMain.tbTask; чтобы кнопка отображалась на этой панели
end;
except
end;

А следующее тебе не нуна ваще, т.к. владелец тех созданных кнопок - есть новое окно, след-но, када оно будет уничтожаться, то уничтожит всех потомков

А вот при закрытии в frmReestr.destroy
var
c: TComponent;
begin
c := FindComponent("btnReestr");
end;не находит она этот компонент (с = nil).
Варианты
c := FindComponent("frmMain.btnFPrxRstr");
или
c := FindComponent("frmMain.tbTask.btnFPrxRstr");
тоже не проходят.

и не надо ничё искать и уничтожать руками


Jony   (2002-06-26 11:01:00) [3]

Владелец у них - главная форма приложения, а уничтожаться они должны при закрытии той формы, с открытием которой они создаются.
PS. В попыхох не переделал реальный код второй части. В общем сейчас все у меня выглядит следующим образом:

В главной форме при открытии нужной формы
try
frmMain.btnReestr := TSpeedButton.Create(frmMain.tbTask);
with frmMain do begin
// задание свойств
end;
except
end;


А вот при закрытии в frmReestr.destroy
var
c: TComponent;
begin
c := FindComponent("btnReestr");
end;
не находит она этот компонент (с = nil).
Варианты
c := FindComponent("frmMain.btnFPrxRstr");
или
c := FindComponent("frmMain.tbTask.btnFPrxRstr");
тоже не проходят.


Fiend   (2002-06-26 10:44:00) [4]

а шо ты за имя такое интересное пишешь "frmWWMMain.btnFPrxRstr".
и ваще, я тебе уже сказал, шо уничтожать их не надо, укажи просто кому они принадлежат, т.е. владельца(читай меня выше), и он их сам деструктурирует


Jony   (2002-06-26 09:58:00) [5]

to Fiend:
Не проходит и такая детализация, пробовал.


Fiend   (2002-06-25 18:12:00) [6]

а это потому, что у тебя новый батон не форме принадлежит а frmMain.tbTask, следовательно если ты реально хочешь его найти, то вызывать FindComponent нада у frmMain.tbTask а не у формы


Jony   (2002-06-25 18:07:00) [7]

В главной форме при открытии нужной формы
try
frmMain.btnReestr := TSpeedButton.Create(frmMain.tbTask);
with frmMain do begin
// задание свойств
end;
except
end;


Сама btnReestr определена в varглавной формы.
здесь все нормально.
А вот при закрытии в frmReestr.destroy
var
c: TComponent;
begin
c := FindComponent("btnFPrxRstr");

не находит она этот компонент (с = nil). Вариант
c := FindComponent("frmWWMMain.btnFPrxRstr");
тоже не проходит.

Извините, нужно убегать. Продолжим завтра.


Fiend   (2002-06-25 18:06:00) [8]

а зачем их ручками уничтожать.
Я так понял, что ты их динамикчески создаёшь. А раз так то в Create(Owner) укажи свою форму, которая когда закроется, грохнит всех кем владеет.


Anatoly Podgoretsky   (2002-06-25 18:02:00) [9]

MBo © (25.06.02 17:07)

Это можно сократить до FindComponent("SPButton1").free;


Игорь Шевченко   (2002-06-25 17:54:00) [10]

Jony © (25.06.02 17:40)

Код бы не помешал


MBo   (2002-06-25 17:47:00) [11]

как создаешь? как ищешь?


Jony   (2002-06-25 17:40:00) [12]

Что-то не получается. Я пытаюсь создать в проекте что-то вроде TaskBar. Кнопки я создаю в главной форме при открытии формы, а уничтожать их нужно при закрытии формы, т.е. в самой форме, для которой создается кнопка. FindComponent не находит кнопку ни саму, ни с формой. А создать кнопку в FormCreate самой формы тоже не получается не находит программа ее определения, даже если сунешь его в саму процедуру.


MBo   (2002-06-25 17:07:00) [13]

плохо искал, в хелпе есть
var c:tcomponent;
c:=FindComponent("SPButton1");
if c<>nil then c.free;


Jony   (2002-06-25 16:51:00) [14]

Я и присваиваю им уникальные имена, но если без списка, то любая ссылка на эти имена и выдает ошибку. Если FindComponent позволяет делать что-то другое, то опять же ни в хелпе, ни в книгах я об этой функции ничего не нашел.


Jony   (2002-06-25 16:51:00) [15]

Я и присваиваю им уникальные имена, но если без списка, то любая ссылка на эти имена и выдает ошибку. Если FindComponent позволяет делать что-то другое, то опять же ни в хелре, н в книгах я об єтой функции ничего не нашел.


MBo   (2002-06-25 16:29:00) [16]

имена им уникальные присваивай
тогда можно и без списка, FindComponent


Jony   (2002-06-25 16:23:00) [17]

>MBo
Спасибо большое, вроде работает. Но сразу возникает вопрос. Список постояннго в динамике. Как отловить именно тот итем, который мне нужно уничтожить? Я что-то не нашел свойства в TList, по которому можно было бы определить нужный объект.


MBo   (2002-06-25 15:38:00) [18]

>Jony
при создании вноси объекты, например, в список

but:=tspeedbutton.create(self);
...
ButList.Add(but);
...
TSpeedButton(ButList[i]).Free;


VAleksey   (2002-06-25 15:36:00) [19]

а nil не нужен ?
> sdram © (25.06.02 15:27)


sdram   (2002-06-25 15:27:00) [20]

присвой
SpeedButton.parent := Form1
Form1 - имя формы, а удалить вызови SpeedButton.Free


Наверх

Титульная страница Поиск, карта сайта Написать письмо