Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
263 / 109 / 26
Регистрация: 16.03.2013
Сообщений: 272
1

Как правильно уничтожать Tframe

25.09.2015, 06:37. Показов 2841. Ответов 8
Метки нет (Все метки)

Доброго всем времени суток.
Прошу помочь.
В проекте при нажатии на кнопку динамически создаётся новая страница на TPageControl.
И на эту страницу помещается динамически созданный Tframe (на котором лежит TSynEdit, 2 TdbGridEh, Toraquery, TOraSession, TOraDataSource... в общем много всякой фигни).
Когда я нажимаю кнопку, TTabSheet и фрейм со своим содержимым должны удалиться и освободить оперативную память.
Но если после создания фрейма память, занятая приложением увеличивается на 1МБ (смотрю в Диспетчере Задач), то при закрытии уменьшается примерно на 100КБ. Т.е. 900КБ остаются где-то висеть.

Вот процедура удаления:
Delphi
1
2
3
4
for i:= 0 to frame1.ControlCount-1 do
   frame1.Components[i].Free;//удаляю все компоненты на фрейме (не знаю, уничтожаются ли они автоматом  при уничтожении фрейма)
   frame1.Free; //уничтожаю сам фрейм
   PageControl1.ActivePage.Free; //уничтожаю текущую страницу, которая создавалась специально для фрейма.
Скажите, пожалуйста, что я делаю не так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2015, 06:37
Ответы с готовыми решениями:

TFrame в TFrame Rad
Доброго времени суток. Есть достаточно емкий VCL проект, для удобства разбил его на части при...

Как создать TFrame в XE3
Как в новых Delphi создать новый фрейм? В меню File > New не обнаруживается ни Delphi Projects,...

Как вручную уничтожать массивы, зная, что они уже не нужны программе
Помогите разобраться. Программа выдает ошибку "System.OutOfMemoryException" на строку string ...

Как сделать так, чтобы в программе можно было уничтожать динамические переменные с помощью dispose?
Помогите сделать ток чтоб в программе можно было уничтожать динамические переменные с помощью...

8
176 / 161 / 17
Регистрация: 21.04.2013
Сообщений: 3,737
25.09.2015, 06:52 2
Памяти - то разные бывают... диспетчер задач какую показывает память?
1
Модератор
3477 / 2600 / 741
Регистрация: 19.09.2012
Сообщений: 7,967
25.09.2015, 09:50 3
Вообще, для удаления достаточно одной 4-й строчки.
Попробуй несколько раз вкладку создать/удалить и посмотри что будет с памятью происходить.
1
263 / 109 / 26
Регистрация: 16.03.2013
Сообщений: 272
25.09.2015, 10:34  [ТС] 4
Цитата Сообщение от FIL Посмотреть сообщение
Попробуй несколько раз вкладку создать/удалить и посмотри что будет с памятью происходить.
С каждым созданием/удалением вкладки память увеличивается и увеличивается. Получается, если долго работать в проге, она постепенно скушает всю память и не подавится
0
пофигист широкого профиля
4455 / 2943 / 830
Регистрация: 15.07.2013
Сообщений: 16,921
25.09.2015, 11:37 5
Цитата Сообщение от FIL Посмотреть сообщение
Вообще, для удаления достаточно одной 4-й строчки.
Не факт. Зависит от того кто владелец всего этого барахла.
1
5085 / 3965 / 1309
Регистрация: 14.04.2014
Сообщений: 18,249
Записей в блоге: 18
25.09.2015, 11:53 6
Лучший ответ Сообщение было отмечено ProRockX как решение

Решение

смотри код создания фрейма
1)
если
frame1:=TMyFrame.Create(NewTabSheet);
то
NewTabSheet.Free;
освободит и сам фрейм
и больше ничего делать не нужно
2)
вдруг в самом фрейме создается и не освобождается что-то
1
263 / 109 / 26
Регистрация: 16.03.2013
Сообщений: 272
25.09.2015, 16:30  [ТС] 7
Цитата Сообщение от krapotkin Посмотреть сообщение
смотри код создания фрейма
1)если
frame1:=TMyFrame.Create(NewTabSheet);
то
NewTabSheet.Free;
освободит и сам фрейм
и больше ничего делать не нужно
Мдааа, у меня было так:
Delphi
1
frame1:=TMyFrame.Create(self);
Исправил и тут при создании вкладки тоже. При удалении делаю Free только вкладке, всё хорошо.
Цитата Сообщение от krapotkin Посмотреть сообщение
2)вдруг в самом фрейме создается и не освобождается что-то
Открыл юнит с фреймом, запустил поиск по слову Create. Действительно нашёл 1 стринглист, который объявлялся в процедуре локально, создавался, но не уничтожался. Правильно ли я понимаю, он остаётся висеть в памяти?
Больше явных созданий чего-либо без последующего Free в юните фрейма и в тексте процедур других юнитов, которые вызываются из фрейма, я не нашёл.
Куда-бы дальше копнуть?
0
5085 / 3965 / 1309
Регистрация: 14.04.2014
Сообщений: 18,249
Записей в блоге: 18
25.09.2015, 20:58 8
если больше нет, то течь не должно
1
пофигист широкого профиля
4455 / 2943 / 830
Регистрация: 15.07.2013
Сообщений: 16,921
26.09.2015, 01:28 9
Цитата Сообщение от ProRockX Посмотреть сообщение
Правильно ли я понимаю, он остаётся висеть в памяти?
Правильно. Стринглист не имеет владельца, так что никто его автоматически не уничтожит.
Сам создал - сам и уничтожай.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2015, 01:28

Как лучше - создавать и уничтожать несколько команд или каждый раз просто менять свойство команды
У меня несколько команд: 1) запрос к одной таблице; 2) очистка второй таблицы; 3) вставка данных во...

Как уничтожать динамические объекты и вообще объекты, если это необходимо сделать в их процедурах?
Создать отдельную процедуру CloseObject(Object: TObject) и вызывать ее в конце процедуры или так...

Tframe
Есть несколько созданых фреймов, как сделать чтобы выводился определенный фрейм в зависимости от...

Использование TFrame
Добрый день. Уже давно пользуюсь фреймами в стиле -> создаю отдельный фрейм для каждой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru