Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.014 c
2-1135208071
kotbazilio
2005-12-22 02:34
2006.01.15
Код символа


14-1134738594
cherman
2005-12-16 16:09
2006.01.15
Сколько стоит написать программу


2-1135271634
oleggar
2005-12-22 20:13
2006.01.15
queryperformance


14-1134513986
Прожиг
2005-12-14 01:46
2006.01.15
За сколько обычно записываются DVD+R болваники?


1-1133706825
GanibalLector
2005-12-04 17:33
2006.01.15
передача массива из DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский