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

Вниз

Как программно уничтожать программно созданные компоненты?   Найти похожие ветки 

 
Jony ©   (2002-06-25 15:22) [0]

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


 
sdram ©   (2002-06-25 15:27) [1]

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


 
VAleksey ©   (2002-06-25 15:36) [2]

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



 
MBo ©   (2002-06-25 15:38) [3]

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

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


 
Jony ©   (2002-06-25 16:23) [4]

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


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

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


 
Jony ©   (2002-06-25 16:51) [6]

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


 
Jony ©   (2002-06-25 16:51) [7]

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


 
MBo ©   (2002-06-25 17:07) [8]

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


 
Jony ©   (2002-06-25 17:40) [9]

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


 
MBo ©   (2002-06-25 17:47) [10]

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


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

Jony © (25.06.02 17:40)

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


 
Anatoly Podgoretsky ©   (2002-06-25 18:02) [12]

MBo © (25.06.02 17:07)

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


 
Fiend ©   (2002-06-25 18:06) [13]

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


 
Jony ©   (2002-06-25 18:07) [14]

В главной форме при открытии нужной формы
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:12) [15]

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


 
Jony ©   (2002-06-26 09:58) [16]

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


 
Fiend ©   (2002-06-26 10:44) [17]

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


 
Jony ©   (2002-06-26 11:01) [18]

Владелец у них - главная форма приложения, а уничтожаться они должны при закрытии той формы, с открытием которой они создаются.
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 11:12) [19]

Сделай так

В главной форме при открытии нужной формы
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:31) [20]

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



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

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

Наверх




Память: 0.51 MB
Время: 0.015 c
4-23828
MisterBin
2002-05-09 15:41
2002.07.08
Ну ответьте плиз


8-23681
ravil
2002-03-03 02:42
2002.07.08
image


3-23490
Wild
2002-06-17 10:25
2002.07.08
TQuery + SQL Server CURSOR


1-23585
awaken
2002-06-24 15:37
2002.07.08
Как уничтожить форму из самой себя?


1-23650
Looser
2002-06-26 08:14
2002.07.08
Есть ли возможность поместить TStrings в ListView.Items?