| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Динамическое создание и разрушение формы |
| Автор: Kirgston 7.1.2010, 20:59 |
| Всем доброго времени суток. Вот собственно что то до конца не понимаю... создаю форму так: Application->CreateForm(__classid(TForm2), &Form2); Когда моя форма отработала (ту какую я динамически создал) я делаю Form2->Free(); в итоге получаю ошибку Аксесс Виолейшен и форма не очищается из памяти а дальше там висит (ну если я правильно понял). Как правильно "удалять" форму? Под словами динамическое создание имел ввиду то что форму создаю не при старте программы а в нужный мне момент. Спасибо! |
| Автор: pdbq 7.1.2010, 21:08 | ||
возможно я не прав но попробуйте так:
|
| Автор: 586 7.1.2010, 21:32 | ||
нужно уничтожить объект, а не просто вызвать деструктор
|
| Автор: vikaz 7.1.2010, 21:36 | ||
а в чем фишка создания формы таким образом? Почему не:
|
| Автор: Kirgston 8.1.2010, 08:58 | ||||
Ну так делает Билдер. Я так же пробовал. Кстати.... Попробовал так:
В результате на строчке:
Вылетает Access Violation. |
| Автор: vikaz 8.1.2010, 09:59 | ||
Так и будет! Так как данная строчка не создает глобальный указатель Form2. Я выходил из этого, передавая нужные мне указатели. Добавлено через 47 секунд или просто переписать вот так:
|
| Автор: Kirgston 8.1.2010, 13:12 |
| Хмм... кстати вот вопросик про ту же динамическую форму... вот когда я делаю ShowModal() и открываю модально нужную мне форму. В делфях чтобы выйти из модальной формы я писал Close; Форма сразу закрывалась и управление переходило на строчку ниже после вызова модальной формы. Здесь же не так... да ладно поставил return; но чувствую что это как то нелепо... |
| Автор: SVN74 8.1.2010, 13:39 |
| Проверьте правильность включений #include - видят ли все друг друга. Создавать форму можно - Application->CreateForm(__classid(TForm2), &Form2); В обработчике Form2 (OnClose) напишите Action = caFree; - (Но после этого уже Form2 не будет доступна, поэтому необходимо будет заново создавать форму). Закрывать форму можно Form2->Close(); ------------------------------------------------------- Подумайте, нужно ли вам все время очищать память, если Form2 будет вам нужна несколько раз? Указатель на Form2 - обязательно должен быть виден всей главной форме. |
| Автор: Kirgston 9.1.2010, 10:34 | ||||
Странно чуток... static const ShortInt mrOk = 0x1; я делал модал резалт не mrOk , а просто 1 (забыл просто про mrOk). В итоге управление не передавалось в место откуда была вызвана модальная форма (конечно вызвана была из другой формы). А кода дальше исполнялся. Может я просто забыл мат часть и всё так и должно быть... а может и очередной баг Билдера 2010
Охххх благодарю!!! Совсем забыл о caFree
Хм... не знаю сколько раз нужна... но думаю нормальный пользователь запустит её ну 1, ну 2 раза и всё =). К тому же на формочке не мало компонентов. Это что то типа авто обновления. Тот же Indy TCP Client, полосочки всякие, списки и т.д. И в принципе оно не мало жрет оперативки... если скажем там 4 списочка ( ListBox ) и в каждом по 9к записей))))) (меня не бить, сделал я нормально. Бить разрабов игры для какой я делаю авто обновление |
| Автор: Kirgston 10.1.2010, 15:45 | ||
Опять не пойму... сделал вот так:
После того как происходить Форм Клоус, форм дестрой код в таймере дальше продолжает исполнятся... |
| Автор: mrbrooks 11.1.2010, 09:12 |
| Kirgston, могу посоветовать: 1. Отказаться от событий OnCreate/OnDestroy. На каком основании - смотри в хелпе или в этой ветке форума. Вопрос обсуждался. Замени соответственно на конструктор формы - где выделяешь память, тот же OnClose - для высвобождения. 2. Работу с сервером вынеси в отдельный класс. |
| Автор: Kirgston 11.1.2010, 10:22 | ||
Если не сложно скажите как приблизительно называлась тема? Перерыл 2 страницы нашел только 1 тему про форму и то не ту. |
| Автор: mrbrooks 11.1.2010, 10:43 | ||
сказать не могу, ибо не помню.
|
| Автор: Kirgston 11.1.2010, 10:45 |
| Кстати опять таки... сделал класс. Сделал свой конструктор + деструктор. Может я просто не так понимаю как оно должно работать... но... Идет код, выскочила ошибка. Я вызываю деструктор класса и ожидаю что класс удалится и код в вызваной из этого класса ф-ции не будет дальше исполнятся. Но видать я думаю не так как надо Мне тогда что писать какие то переменные типа mayterminate и проверять их мол надо ли сделать сейчас return и выйти из ф-ции класса или продолжать код? А на выходе из класса уже ставить деструкторы? |
| Автор: mrbrooks 11.1.2010, 10:58 |
| Kirgston, камрад - почитай про работу деструкторов. |
| Автор: Kirgston 11.1.2010, 17:19 |
| mrbrooks, |