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

Вниз

Динамическое создание формы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.063 c
3-1132305106
Anny
2005-11-18 12:11
2006.01.15
Прога считывания и обработки штрих кода...


6-1128322497
Sniper17
2005-10-03 10:54
2006.01.15
Передача значений переменных через сокеты по Internet


14-1134818415
iamdanil
2005-12-17 14:20
2006.01.15
Компилятор-шифратор


3-1132162640
keymaster
2005-11-16 20:37
2006.01.15
Как узнать структуру таблицы MS ACCESS


2-1135746291
mss
2005-12-28 08:04
2006.01.15
Проиграть два файла