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

Вниз

Создание формы и ее удаление   Найти похожие ветки 

 
-=GaLaN=- ©   (2004-02-14 18:00) [0]

Мне нужно сэкономить немного памяти. Поэтому я убрал

Application.CreateForm(TForm1, Form1);

из Project Source и вызываю его, когда мне надо - перед вызовом

Form1.Show;

Однако, помещая на событие OnClose формы Form1 команду

Form1.Destroy;

я получаю ошибку. Если же поместить выгрузку формы в другом месте, то переменная Form1 все равно не становится равной nil, и, судя по занимаемой памяти, форма не выгружается.

Так как же правильно выгрузить форму?


 
KSergey ©   (2004-02-14 18:24) [1]

1.Объясните мне тупому, плиз, на чем и каким образом вы хотели съэкономить, перенеся создание формы из одного места в другое?

2.А какого фига она станет nil? Для этого тадо либо присвоить nil, либо использовать FreeAndNil.
Впрочем, а зачем вообще это nil понадобилось? Переменная типа TMyForm занимает 4 байта в памяти хоть равна она nil, хоть не равна...

3.Никогда самостоятельно Destroy не вызывайте. Только Free.


 
esVer ©   (2004-02-14 18:25) [2]

в OnClose:
Action := caFree;
Form1:=nil;

Form1:=nil; - необязательно. Это чтобы ты спокоен был :)


 
KSergey ©   (2004-02-14 18:27) [3]

Вопросов еще можно настрогать много, но это уже будет выпендривание. А для плодотворного продолжения ответьте, пожалуйста, на первый вопрос.


 
TUser ©   (2004-02-14 18:34) [4]

Память он не сэкономит, но грузится прога будет быстрее. Надо делать так
if not assigned(FormN) then
application.CreateForm(...);


 
KSergey ©   (2004-02-14 18:43) [5]

Это смотря чт понимать под "временем загрузки проги": период до запуска Application.Run или до возможности пользователя с программой работать.


 
TUser ©   (2004-02-14 19:44) [6]

До возможности работать.


 
KSergey ©   (2004-02-14 19:52) [7]

Тогда я не понимаю, как момент создания формы или перенос ее создания из одного места в другое сможет ускорить этот процесс...
Просветите, плиз.


 
TUser ©   (2004-02-14 19:59) [8]

Призагрузке приложения до того момента как пользователь начнет работать производится создание всех используемых форм. Т.е. всего, что написано в виде Application.CreateForm. Если в проексте 2-3 формы, то это ничем не грозит, но если их там несколько сотен, то юзеру придется ждать, пока все они создадутся. Чтобы он не ждал можно их при запуске не создавать, а создавать только тогда, когда они впервые понадобятся. Для этого - [4].

На самом деле пользователь начинает работать с прогой после Application.Run, так что я не очень понимаю смысл вопроса [5].

Хотя, конечно, могу ошибаться.


 
-=GaLaN=- ©   (2004-02-14 20:04) [9]

Разве выгруз неиспользуемых форм при работе программы не высвобождает память? Т.е. у меня в программе порядка 20-и форм, но постоянно используется только одна. Вот я и хочу подгружать формы по мере их вызова, и выгружать как только их закрывают.


 
-=GaLaN=- ©   (2004-02-14 20:07) [10]

[2] работает. Только почему-то память не высвобождается.


 
-=GaLaN=- ©   (2004-02-14 20:32) [11]

Странно. Почему так? Такое ощущение, что delphi либо не выгружает формы по Action=caFree, либо всегда держит их в памяти.


 
B@RT   (2004-02-15 21:17) [12]

Для полного освобождения ресурсов памяти можно использовать:
form1.Release;
еще можно добавить form1.free, но мне кажеться, что это лищнее.


 
KSergey ©   (2004-02-16 08:14) [13]

> [8] TUser © (14.02.04 19:59)
> Призагрузке приложения до того момента как пользователь
> начнет работать производится создание всех используемых
> форм. Т.е. всего, что написано в виде Application.CreateForm.
> Если в проексте 2-3 формы, то это ничем не грозит, но если
> их там несколько сотен, то юзеру придется ждать, пока все
> они создадутся. Чтобы он не ждал можно их при запуске не
> создавать, а создавать только тогда, когда они впервые понадобятся.

А что, убрать формы из AutoCreate - это уже отменили?

> [10] -=GaLaN=- © (14.02.04 20:07)
> [2] работает. Только почему-то память не высвобождается.

На основании чего делаем такой вывод?

> [12] B@RT (15.02.04 21:17)
> Для полного освобождения ресурсов памяти можно использовать:
> form1.Release;
> еще можно добавить form1.free, но мне кажеться, что это
> лищнее.

Надо сделать что-то одно.
Вообще говоря после вызова form1.Release в конце концов и вызовется Free.


 
Digitman ©   (2004-02-16 08:37) [14]


> -=GaLaN=- © (14.02.04 20:07) [10]
> [2] работает. Только почему-то память не высвобождается.


зато при очередной загрузке формы скорость выполнения этой операции может существенно увеличиться ... как раз за счет того, что память не была отдана назад, в кучу, менеджером памяти Борланда


 
Digitman ©   (2004-02-16 08:41) [15]


> GaLaN


считай, что это своего рода "кэширование"
то что память, распределенная под форму, якобы не освободилась, ни в коем случае не говорит о ее потере - при очередных операциях запроса памяти Борланд возьмет подходящий "кусок" уже не из кучи, а их тех самых "свободных кусков", за которые ты так волнуешься .. это в ряде случаев существенно сокращает системные дисковые операции, связанные с перераспределением виртуальной страничной памяти


 
Anatoly Podgoretsky ©   (2004-02-16 09:13) [16]

-=GaLaN=- © (14.02.04 20:32) [11]
Это только ощущение


 
Alexander666 ©   (2004-02-16 10:51) [17]


> -=GaLaN=- © (14.02.04 20:32) [11]

Опять же лезу с книгами :-). Почитай у Пачеко в первом томе про формы. Там толково все объяснено, когда освобождается твоя форма, а когда нет. И почему так происходит.



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
14-94115
RealRascal
2004-02-09 17:08
2004.02.29
Самый удобочитаемый шрифт


14-94150
AZ
2004-02-03 06:22
2004.02.29
Нужна помощь в расчете пенсии (Украина).


11-93822
R
2003-06-06 18:10
2004.02.29
TPopUpMenu


6-94068
BaMnuP
2003-12-22 05:05
2004.02.29
Помогите с сокетами ! ! ! !


11-93821
=Sniper=
2003-06-14 17:13
2004.02.29
В VCL работает правильно, а в KOL неправильно