Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2009, 19:04   #11
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от chandrasecar Посмотреть сообщение
Я уже, вроде, все перепробовал, а память не очищается.
Как и многие задающие вопросы, вы не попробовали самого простого - нажать клавишу F1.
Нажали бы - уже знали, что
Цитата:
To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.
Дальше.
Цитата:
mOpenFile.Close;
mOpenFile.Free;
...
И потом как привязать код выше к кнопке на форме которую уничтожаем?
Первую строку, как вы убедились - запросто.
Но форма при всем желании не может выполнить операцию Free, поскольку для того, чтобы что-то выполнять - нужно существовать, работать. А вы ее закрыли, ее уже нет.
И сама себя она вычистить из памяти тоже не в состоянии. По-моему, это достаточно очевидно...

Последний раз редактировалось mihali4; 17.02.2009 в 19:12.
mihali4 вне форума Ответить с цитированием
Старый 17.02.2009, 19:21   #12
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Спасибо, mihali4. С Вами согласен. Но чувствую, что все равно ничего не очищается. При каждом открытии формы и использовании "Release method" (записанно на кнопку на главной форме) занимаемая программой память увеличивается на ~160 Кб.
лучший подарок женщине-программисту

Последний раз редактировалось chandrasecar; 17.02.2009 в 19:24.
chandrasecar вне форума Ответить с цитированием
Старый 17.02.2009, 19:29   #13
maladoy
delphi-ст!
Форумчанин
 
Аватар для maladoy
 
Регистрация: 02.01.2009
Сообщений: 825
По умолчанию

попробуй
Код:
 mOpenFile.hide;
mOpenFile.Free;
вступлю в команду разработчиков ПО на Delphi
maladoy вне форума Ответить с цитированием
Старый 17.02.2009, 19:31   #14
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Но чувствую, что все равно ничего не очищается. При каждом открытии формы и использовании "Release method" (записанно на кнопку на главной форме) занимаемая программой память увеличивается на ~160 Кб.
Файлы, которые вы удаляете с диска, тоже не обнуляются сразу. Только помечаются.
Когда появится необходимость, винда использует то место, которое они занимали до сих пор.
Вполне возможно, что нечто подобное происходит в вашем случае и с памятью. Винда - штука темная, кто ее знает, что она там задумала...
mihali4 вне форума Ответить с цитированием
Старый 17.02.2009, 20:51   #15
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

У меня никуда ничего не утекает, смотрите внимательно, может что-то еще забирает и не освобождает память...
Hottabych вне форума Ответить с цитированием
Старый 17.02.2009, 22:53   #16
crc83
Пользователь
 
Аватар для crc83
 
Регистрация: 24.01.2009
Сообщений: 38
По умолчанию

Попробуй создать програму MDI Application. Посмотри как там все устроено.
crc83 вне форума Ответить с цитированием
Старый 18.02.2009, 00:06   #17
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Большое всем спасибо. Я все это знаю и понимаю. Проблема нашлась: компонент ThemeEngine TeOpenPanel - именно он забирает ресурсы. Хотя, как обнаружилось позже не только он: многие компоненты для работы с папками (ListView). И с OpenDialog память не освобождается (при открытии добавляет 14 Мб). Делал пробную программку без компонентов для работы с дисками и папками - все ОК. Из-за него происходит наращивание занимаемой ОЗУ при каждом запуске-уничтожения формы. Что-то загружается в память и там остается. Что делать, пока не представляю... Если кто знает - буду благодарен.

В общем до сих пор решить эту проблему не удалось. Все притензии к Биллу.
лучший подарок женщине-программисту

Последний раз редактировалось Stilet; 23.03.2009 в 10:19.
chandrasecar вне форума Ответить с цитированием
Старый 21.02.2009, 22:55   #18
Format C:
Пользователь
 
Регистрация: 11.03.2007
Сообщений: 92
По умолчанию

Приветствую всех.

Вы же при создании в качестве держателя указываете Application (из первого поста)
Код:
mOpenFile := TmOpenFile.Create(Application);
При таком способе создания держатель сам уничтожит форму при собственном уничтожении.

Здесь есть два выхода:
Либо указывать Nil при создании
Код:
mOpenFile := TmOpenFile.Create(Nil);
Либо убрать все собственные уничтожения формы.

Лично я предпочитаю первый способ, как более гибкий.

Поправьте, если ошибся.
Format C: вне форума Ответить с цитированием
Старый 16.03.2009, 22:19   #19
Paul Hindenburg
Форумчанин
 
Аватар для Paul Hindenburg
 
Регистрация: 27.07.2007
Сообщений: 123
По умолчанию

Цитата:
Сообщение от chandrasecar Посмотреть сообщение
В общем до сих пор решить эту проблему не удалось. Все притензии к Биллу.
Билл тут не причем)))) в других программах работает все ладко, приведу например как в 1с там есть справочник - дочернее окно, может создаваться только один раз, и в тоже время можно открывать каждый элемент в отдельном окне. вот у мне одно не понятно - как создать окно этого справочника.
P.S.
я тут попутно хэлп читаю вот нашел параметр закрытия окна caHide The form is not closed, but just hidden. Your application can still access a hidden form. - перевод "Форма не закрыта, но только скрыта. Ваше приложение может все еще обращаться к скрытой форме."
Как думаете прокатат?
Ну что ж… Жизнь иногда такие фертеля выкидывает, что и фантасту не приснится…
Paul Hindenburg вне форума Ответить с цитированием
Старый 20.03.2009, 20:05   #20
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

Самого волновал этот вопрос. И по моему для того чтобы приложение занимало как можно меньше памяти, каждую форму при открытии и закрытии нужно создавать и УНИЧТОЖАТЬ.

Вот написал пример с использованием функции Assigned для проверки.
Assigned - проверяет существует ли объект. В нашем случае это будет объект типа TForm.

На главной форме:
при нажатии на кнопку создаём форму и показываем её
Цитата:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
На форме2 перед закрытием добавляем
Цитата:
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Release;
Form2:=nil;
end;
Теперь при закрытии формы у нас освобождается память т.к Release это тот же FREE, но выполненный в свою очередь, т.е сначало выполнятся все ваши сообщения обрабатываемые данной формой, а уже после она умрёт=)

Для проверки можно использовать
Цитата:
if Assigned(Form2) then
ShowMessage('Форма существует')
else ShowMessage('Форма НЕ существует');
Antony41 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уничтожение потока SNUPY Общие вопросы Delphi 2 11.02.2009 22:47
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
Создание/уничтожение объектов nimf Общие вопросы Delphi 10 14.04.2008 10:54
Уничтожение окна Kashp Win Api 20 07.09.2007 14:15