Форум: "Основная";
Текущий архив: 2002.07.08;
Скачать: [xml.tar.bz2];
ВнизКак программно уничтожать программно созданные компоненты? Найти похожие ветки
← →
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
не находит она этот компонент (с = nil).
c: TComponent;
begin
c := FindComponent("btnReestr");
end;
Варианты
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c