Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизСоздание формы и ее удаление Найти похожие ветки
← →
-=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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c