Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-94116
race1
2004-02-09 15:42
2004.02.29
cd cover


7-94224
smu
2003-12-11 10:33
2004.02.29
Как правильно запустить программу, кот удалит которая ее удалит?


7-94198
Nau
2003-12-08 17:35
2004.02.29
Запуск проги до загрузки системы


6-94051
Alexis
2003-12-24 19:30
2004.02.29
поймать исключение...


1-93992
Fridom
2004-02-17 10:27
2004.02.29
Как очистить содержимое папки без её удаления?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский