![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание формы
Antonn © (2005-12-13 10:57:00)Здравствуйте! Проконсультируйте по такой проблеме, пожалуйста. Мне нужно создавать форму в рuн-тайм, и убивать ее после ее закрытия. Как я делал:
создавал в проекте еще одну форму(TSnowForm), удалял из *.dpr проекта строчку о создании этой новой формы, в обработчике OnClose выставлял Action:=caFree;
в первой форме (и главной) писал такой код:
procedure TMainForm.FormCreate(Sender: TObject);
begin
RegisterClasses([TSnowForm]);
end;
procedure TMainForm.CreateNewWind;
var SomeComponent:TComponent;
begin
SomeComponent:= TComponentClass(FindClass('TSnowForm')).Create(self);
(SomeComponent as TSnowForm).Name:='Snow';
(SomeComponent as TSnowForm).Left:=200;
(SomeComponent as TSnowForm).Top:=200;
(SomeComponent as TSnowForm).Show;
end;
при вызове CreateNewWind;, создается форма. Теперь в дизайне на эту форму кладу кучу визуальных компонентов(Tcombobox,Tlabel,TScrollbox,Tpanel,Tbutton).
Снова в ран-тайме создаю окно и закрываю его. Уничтожаться ли сами компоненты на форме, или для каждого нужно в OnClose вызывать free? И вообще, можно ли так делать (есть проект с формами, которые используются редко, но контроллов на них тьма, хочу по мере надобности создавать форму)?
alex_*** (2005-12-13 18:39:00) [1]которые постояно открываются - пусть Application создает, то бишь сделай их auto-create
Antonn (2005-12-13 18:26:00) [2]я почему спрашивал - наблюдал в Диспетчере задач за состоянием виртуальной памяти, открываю форму(те создаю), делаю дела в ней, закрываю. В Диспетчере при открытии объем памяти увеличивается, при закрытии умешьшается, но меньше, т.е. как бы что то остается, при последующих открытиях/закрытиях память расширяется до первого открытия/закрытия. Т.е. когда я форму задействую, у меня остается часть памяти, которая ни увеличивается, ни уменьшается. Думал утечка - но она единоразовая какая то. Потому и задал вопрос в форуме.
Переделал проект - 2 метра оперативки освободил:)
единственное неудобство, при открытии(создании) этих нафороченных(перегруженных) форм, заметен подзатуп программы. Раньше затуп был один на этапе загрузки, теперь при каждом обращении:)
TStas (2005-12-13 18:13:00) [3]>Defunct
>уничтожаемая форма является и их Owner'ом и Parent'ом.
Важно, что Owner'ом. Именно он ответственен за создание/уничтожение
Defunct (2005-12-13 16:55:00) [4]> Andron.Ru © (13.12.05 11:26) [3]
Причем тут Form2?
> Antonn © (13.12.05 10:57)
> в обработчике OnClose выставлял Action:=caFree;
> но контроллов на них тьма, хочу по мере надобности создавать форму)?
Action := caFree приводит к уничтожения формы.
Все контролы этой формы уничтожатся вместе с формой в любом случае, т.к. уничтожаемая форма является и их Owner'ом и Parent'ом.
alex_*** (2005-12-13 11:39:00) [5]из dpr руками без особой надобности не надо вырезать ничего. Надо редактировать список форм/модулей для auto create
Andron.Ru (2005-12-13 11:26:00) [6]В обработчике закрытия создаваемой формы можно еще добавить
Action := CaFree;
Form2 := nil;
В последствии чтобы можно было открывать ее только однократно
А в обработчике например нажатия кнопки можно написать так
procedure TForm1.Button1Click(Sender: TObject);
begin
if form2 = nil then
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
end;
тока из Dpr незабывай вырезатьApplication.CreateForm(TForm2, Form2);
Компоненты уничтожаются вместе с формой..
msguns (2005-12-13 11:17:00) [7]>можно ли так делать ?
Так нужноделать.
Более того, в MDI приложениях без этого не обойтись.
alex_*** (2005-12-13 11:12:00) [8]var frm: TMyForm;
Begin
frm := TMyForm.Create(Application);
try
...
frm.ShoModal();
...
finally
frm.Free();
end;
end;
по умолчанию все формы auto-create. Надо снять галочку в настройках чтобы самому по мере надобности создавать формы