Форум: "Основная";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание формы Найти похожие ветки
← →
Antonn © (2005-12-13 10:57) [0]Здравствуйте! Проконсультируйте по такой проблеме, пожалуйста. Мне нужно создавать форму в р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 11:12) [1]var frm: TMyForm;
Begin
frm := TMyForm.Create(Application);
try
...
frm.ShoModal();
...
finally
frm.Free();
end;
end;
по умолчанию все формы auto-create. Надо снять галочку в настройках чтобы самому по мере надобности создавать формы
← →
msguns © (2005-12-13 11:17) [2]>можно ли так делать ?
Так нужно делать.
Более того, в MDI приложениях без этого не обойтись.
← →
Andron.Ru © (2005-12-13 11:26) [3]В обработчике закрытия создаваемой формы можно еще добавить
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);
Компоненты уничтожаются вместе с формой..
← →
alex_*** © (2005-12-13 11:39) [4]из dpr руками без особой надобности не надо вырезать ничего. Надо редактировать список форм/модулей для auto create
← →
Defunct © (2005-12-13 16:55) [5]> Andron.Ru © (13.12.05 11:26) [3]
Причем тут Form2?
> Antonn © (13.12.05 10:57)
> в обработчике OnClose выставлял Action:=caFree;
> но контроллов на них тьма, хочу по мере надобности создавать форму)?
Action := caFree приводит к уничтожения формы.
Все контролы этой формы уничтожатся вместе с формой в любом случае, т.к. уничтожаемая форма является и их Owner"ом и Parent"ом.
← →
TStas © (2005-12-13 18:13) [6]>Defunct
>уничтожаемая форма является и их Owner"ом и Parent"ом.
Важно, что Owner"ом. Именно он ответственен за создание/уничтожение
← →
Antonn © (2005-12-13 18:26) [7]я почему спрашивал - наблюдал в Диспетчере задач за состоянием виртуальной памяти, открываю форму(те создаю), делаю дела в ней, закрываю. В Диспетчере при открытии объем памяти увеличивается, при закрытии умешьшается, но меньше, т.е. как бы что то остается, при последующих открытиях/закрытиях память расширяется до первого открытия/закрытия. Т.е. когда я форму задействую, у меня остается часть памяти, которая ни увеличивается, ни уменьшается. Думал утечка - но она единоразовая какая то. Потому и задал вопрос в форуме.
Переделал проект - 2 метра оперативки освободил:)
единственное неудобство, при открытии(создании) этих нафороченных(перегруженных) форм, заметен подзатуп программы. Раньше затуп был один на этапе загрузки, теперь при каждом обращении:)
← →
alex_*** © (2005-12-13 18:39) [8]которые постояно открываются - пусть Application создает, то бишь сделай их auto-create
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c