Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 16.12.2009
Сообщений: 7

Грамотно уничтожить форму

05.02.2010, 20:12. Показов 5844. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как уничтожить форму чтобы полностью очистить от нее и ее компонентов память. Причем уничтожить именно форму а не приложение. Т.к. главная форма приложения не уничтожается. Просто методом Close () похоже форма полностью не уничтожается. Мне надо полность уничтожить форму.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2010, 20:12
Ответы с готовыми решениями:

Как уничтожить форму?
У меня тестирующая программа и во время прохождения теста в меню можно выбрать "Перезапустить тест". То есть форму с тестом нужно...

Как уничтожить форму?
В программе создаю форму для редактирования справочника цехов. FShop:=TFShop.Create(FMain);В самой форме по закрытию: Action :=...

Как уничтожить форму?
В программе две формы. По нажатию кнопки на первой открывается вторая. На второй форме есть достаточно большое количество компонентов,...

14
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.02.2010, 20:33
Если ты имеешь в виду дочернюю форму, то в ней надо реализовать обработчик событий OnClose, в которой пишешь код "Action = caFree;". Это заставит управляющий (системный) код при нажатии на закрытие окна (или вызове Close) вызвать деструктор для экземпляра окна
1
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
06.02.2010, 04:16
Цитата Сообщение от Evg Посмотреть сообщение
Если ты имеешь в виду дочернюю форму, то в ней надо реализовать обработчик событий OnClose, в которой пишешь код "Action = caFree;". Это заставит управляющий (системный) код при нажатии на закрытие окна (или вызове Close) вызвать деструктор для экземпляра окна
Хм...странно. А почему тогда при каждом открытии и закрытии модальной формы память кушается?
У меня получается, что занимаемое место приложением возрастает на 16Кб после повторного открытия формы.

Добавлено через 19 минут
"Также не стоит для удаления объекта библиотеки VCL использовать метод Free(). Лучше использовать метод delete, гарантированно вызывающий деструктор объекта и освобождающий память, выделенную оператором new."

http://www.realcoding.net/article/view/813
0
06.02.2010, 10:54

Не по теме:


Цитата Сообщение от http://www.realcoding.net/article/view/813
Использование блока try/__finally гарантирует защищенность кода при возникновении исключительной ситуации, т.е. в случае исключительной ситуации форма будет удалена.
C++
1
2
3
4
5
6
7
8
try
{
   throw Exception("Exception");
}
__finally
{
   cout<<"мимо кассы"<<endl;
}
Цитата Сообщение от http://www.realcoding.net/article/view/813
Не стоит применять код вида:

TFormX * FormX = new TFormX(0);
FormX->ShowModal();
delete FormX;

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

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.02.2010, 10:59
El Fuego, ты для порядку закинь короткий пример
0
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
06.02.2010, 14:07
Цитата Сообщение от Evg Посмотреть сообщение
El Fuego, ты для порядку закинь короткий пример
Всё дело в VCL Forms, как я понял именно в нём создаётся форма. Поэтому данный метод применим. Я делаю это так:

C++
1
2
3
4
5
void __fastcall TForm1::N18Click(TObject *Sender)
{
Application->CreateForm(__classid(TForm5), &Form5);
Form5->Show();
}
и соответсвенно в форме на событие OnClose

C++
1
2
3
4
void __fastcall TForm5::FormClose(TObject *Sender, TCloseAction &Action)
{
delete Form5;
}
Соответственно в свойствах выставляю создание остальных форм динамически Available
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.02.2010, 15:41
А если вместо

C++
1
Application->CreateForm(__classid(TForm5), &Form5);
написать

C++
1
Form5 = new TForm5;
то будут утечки памяти?

Добавлено через 31 секунду
Просто я создаю окна через new (кроме главного окна программы, с которым я пока толком не разобрался)
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
06.02.2010, 16:55
Цитата Сообщение от El Fuego Посмотреть сообщение
C++
1
2
3
4
5
...
Application->CreateForm(__classid(TForm5), &Form5);
Form5->Show();
...
delete Form5;
/me думает (перефразируя): "Не, такой винегрет нам не нужен!"
или
C++
1
2
3
4
5
...
Form5=>>>new<<< TForm5(Owner);
Form5->Show();
...
>>>delete<<< Form5;
или
C++
1
2
3
4
5
...
>>>Application->CreateForm<<<(__classid(TForm5), &Form5);
Form5->Show();
...
Form5->>>>Free()<<<;
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.02.2010, 17:15
Из последнего поста толком ничего не понял. К 7-му посту забыл добавить, что в TForm5::FormClose вместо (неправильного кода) "delete Form5;" надо написать "Action = caFree;". Сие будет означать следующее: форму мы создаём через new, далее её показываем, но за дальнейшей судьбой не следим. Взведение флага caFree гарантирует, что "сверху" будет вызван деструктор для окна и удаление памяти. Т.е форму создали и забыли (в том плане, что не надо отслеживать и удалять её). То, как у тебя реализовано - это заведомо неправильно, т.к. из метода класса нельзя удалять объект этого класса. За руку тебя никто не схватит, но к каким последствиям это приведёт - неизвестно

Добавлено через 47 секунд
Как варинт напиши КОРОТКУЮ программу с одной кнопокй и двумя окнами. Потому как по вырезанным фрагментам сложно понять, что за окна ты создаёшь и какова должна быть логика работы программы

Добавлено через 2 минуты
Ёлы-палы... я что-то на ники даже внимания не обращал. А тут аж три человека со мной общалось...
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
06.02.2010, 19:51
Цитата Сообщение от Evg Посмотреть сообщение
Из последнего поста толком ничего не понял
Что именно? Какая буква не понятна?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.02.2010, 23:49
Цитата Сообщение от Ex_Soft Посмотреть сообщение
Что именно? Какая буква не понятна?
Я думал, что это писал El Fuego, а потому логики не понял
0
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
07.02.2010, 04:08
Цитата Сообщение от Evg Посмотреть сообщение
А если вместо

C++
1
Application->CreateForm(__classid(TForm5), &Form5);
написать

C++
1
Form5 = new TForm5;
то будут утечки памяти?

Добавлено через 31 секунду
Просто я создаю окна через new (кроме главного окна программы, с которым я пока толком не разобрался)
Для VCL нет. А что?, delete не вызывает деструктор окна с высвобождением памяти?..или я в чём-то заблуждаюсь?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.02.2010, 11:05
delete Вызывает. Но в 6-м посте ты вызываешь delete прямо из метода данного класса, что, вообще говоря, является некорректным.

Фраза "Для VCL нет" что означает? Что при создании через new проблема с утечкой памяти пропала или чего?
0
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
07.02.2010, 11:23
[QUOTE=Evg;529148]delete Вызывает. Но в 6-м посте ты вызываешь delete прямо из метода данного класса, что, вообще говоря, является некорректным.

значит допустил ошибку
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.02.2010, 11:44
> значит допустил ошибку

Для того и придумали это штуку с caFree, чтобы программисту не нужно было отслеживать закрытие окна и корректно удалять экземпляр. Потому как фиг пойми, в какое место этот код удаления ставить. Это так называемый подход "создал и забыл" - т.е. создал окно и больше о нём не заботишься, т.к. существующий механизм "наверху" сам позаботится о том, чтобы удалить экземпляр после закрытия окна
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2010, 11:44
Помогаю со студенческими работами здесь

Как уничтожить дочернюю форму при закрытии?
Ребята, помогите) собственно весь вопрос в заголовке! На второй форме находится тет и при закрытии окна процедурой Form2.Close при...

Как полностью уничтожить форму, чтобы она забыла что вообще существовала?
Как уничтожить форму и вернуть ее к первоначальному состоянию? Free, FreeAndNil, Destory не дают такого эффекта, все изменения на форме...

Уничтожить стек
Не могу сделать уничтожение стека, стек по шаблону делал: #include &lt;vcl.h&gt; #pragma hdrstop #include &lt;iostream.h&gt; #pragma...

Уничтожить вектор
После работы остается вектор с ненужными более данными. Нужно его удалить совсем. Может какая функция есть?

Уничтожить зеркало
Где-то года 2 стояла переадресация с домена www.домен.ру на www.поддомен.домен.ру Теперь сделал на www.домен.ру отдельный сайт, стал...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru