C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Формы создание и уничтожение
nut
Отправлено: 19.02.2006, 01:22


Не зарегистрирован







пытаюсь реализовать создание новой формы, она должна вызыватся из главной формы модально, и выполнять определенные действия и показавать ход выполнение и после выполнения закрытся сама и уничтожалась, вот вопрос куда засунуть все эти действия чтобы отображался ход действий, в онКреат функции работают но ход действий неотображается, и еще как правильно удалить созданную форму пытаюсь вызвать Free вызваной формы форма исчезает но главное окно остается заблокированое
__Cheat3r
Отправлено: 19.02.2006, 05:20


Станционный диспетчер

Группа: Участник
Сообщений: 110



Используй
CODE
delete NewForm;
olegenty
Отправлено: 19.02.2006, 07:43


Ветеран

Группа: Модератор
Сообщений: 2412



CODE

{
   auto_ptr< TYourForm > ModalForm(new TYourForm(this));
   ModalForm->ShowMoadal();
}

удаление произойдёт автоматически.
nut
Отправлено: 19.02.2006, 11:44


Не зарегистрирован







delete Form; — непомагает окно уничтожается и ся прога в дауне
auto_ptr< TYourForm> ModalForm(new TYourForm(this)); — говорит что ошибка
я выкрутился так, создал Timer у которого стоит form->cllose в onclose стоит Free, Timer включается в Onactive собственно там и все действия происходят, блин НУ ЭТО ЧЕРЕЗ ЖО как можно проще сделать
olegenty
Отправлено: 19.02.2006, 11:46


Ветеран

Группа: Модератор
Сообщений: 2412



а какая ошибка-то??? хедер не подключил? так подключи!
nut
Отправлено: 19.02.2006, 13:33


Не зарегистрирован







QUOTE (olegenty @ 19/02/2006, 11:46)
а какая ошибка-то??? хедер не подключил? так подключи!

вот что говорит
[C++ Error] Main.cpp(376): E2451 Undefined symbol 'auto_ptr'
[C++ Error] Main.cpp(376): E2268 Call to undefined function 'ModalForm'
olegenty
Отправлено: 20.02.2006, 08:04


Ветеран

Группа: Модератор
Сообщений: 2412



а почему он undefined, ты не подумал?

#include < memory.h>, например, не писал? так откуда компилятор узнает, что ты подразумеваешь под auto_ptr???

Отредактировано olegenty — 20/02/2006, 09:04
BadMan
Отправлено: 20.02.2006, 23:07


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Я не понимаю, зачем такие сложности?

TMyForm *pForm = new TMyForm;

pForm->ShowModal();

Дальше 2 варианта: Если после закрытия формы нужны какие-то ее поля — значит их берем, а затем вызываем
delete pForm

Если никаких полей не нужно — в обработчике OnClose этой формы задаем акцию:
Action = caFree;
Тогда форма уничтожится сама по себе
BadMan
Отправлено: 20.02.2006, 23:10


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Забыл спросить, а что нужно показывать в процессе работы: некий индикатор типа TProgressBar или просто индикатор, что какое-то действие происходита типа "Мы не висим"?
nut
Отправлено: 21.02.2006, 02:03


Не зарегистрирован







QUOTE (BadMan @ 20/02/2006, 23:10)
Забыл спросить, а что нужно показывать в процессе работы: некий индикатор типа TProgressBar или просто индикатор, что какое-то действие происходита типа "Мы не висим"?

да именно индикатор TProgressBar
olegenty
Отправлено: 21.02.2006, 07:29


Ветеран

Группа: Модератор
Сообщений: 2412



auto_ptr — это не сложности. (см. документацию).

если при вызове new происходит исключение, что имеем? правильно, утечку ресурсов. auto_ptr гарантирует, что её не будет.
BadMan
Отправлено: 21.02.2006, 09:21


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Совершенно согласен с тем, что auto_ptr избавляет от необходимости писать оператор delete. По моему мнению если возникнт исключение в операторе new — то разницы никакой не будет пусть это конструкция
TMyForm *pForm = new TMyForm(Application);
или
Auto_ptr pForm = b(new(TMyForm(Application)));
Последняя мне видится более громоздкой, а я лично люблю сам за собой убираться (тут дело вкуса).

Конкретно к вопросу данной темы это значения не имеет — как создать форму. Вопрос как заставить двигаться прогресс.
Я думаю, что если прогресс не двигается пропущена в цикле обработки функция

Application->ProcessMessages();

Она то и заставляет VCL рисовать внутри циклов вычислений — чтоб не было мертвых окон и можно было кликнуть на кнопочку.

Т.е. последовательность такая:
в методе OnShow — инициализируем ProgressBar нужным количеством шагов и шагом приращения

а в цикле основной обработки добавляем команды:

ProgressBar->Step();
Apllication->ProcessMessages();

Все будет выводится и чудесно отображаться. А после окончания рабоыт модальной формы — уничтожаем ее одним из трех вышеописанных методов.
olegenty
Отправлено: 21.02.2006, 10:38


Ветеран

Группа: Модератор
Сообщений: 2412



разница будет. если при выполнении new возникает ошибка, то часть ресурсов, которые успели выделиться, никогда не высвобождается (до завершения работы программы и очисткой её "мусора" операционной системой). это не зависит от наличия блока try catch. а auto_ptr ГАРАНТИРУЕТ, что ПРИ ЛЮБОМ исходе ресурсы будут возвращены по выходе auto_ptr из области видимости.
BadMan
Отправлено: 21.02.2006, 17:45


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Тема превратилась в осбуждение auto_ptr smile.gif

Просто я считал, что указатель auto_ptr уничтожает выделенную память именно его типа.
Если все указатели объявлены как auto_ptr то может так и произойдет, но неужели он поможет даже в такой ситуации:
auto_ptr Некий объект создан

Дальше идут операторы, в том числе выделяющие ресурсы, например, открытие потоков, файлов (выделение буферов) и т.п.
И возникает исключение

После выхода из блока будут автоматически освобождены ресурсы, выделенные auto_ptr, но про буфера он ничего не знает, мусор останется.

Поэтому все таки я останусь при своем стиле — чистить за собой самому и всетаки использовать блоки try... catch... __finaly там где возможна утечка ресурсов.
Автоматика — автоматикой, но после закрытия приложения тоже вроде как все автоматом убирается. Кстати, объект auto_ptr — это всего лишь шаблон класса, который динамически создает класс "указатель такого-то типа" Дальше на данный указатель (уже объект класса) налагаются ограничения по его использованию.
olegenty
Отправлено: 22.02.2006, 07:21


Ветеран

Группа: Модератор
Сообщений: 2412



я его использую, когда мне долго надо результат передавать по цепочке,и лень помнить, где именно производить очистку памяти. в пределах некоторой области видимости это не так актуально...
viva
Отправлено: 23.02.2006, 17:57


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Согласен на 100% с BadMan, хотя не только использую auto_ptr, но и создал свой аналогичный класс TPointer

Вернуться в Вопросы программирования в C++Builder