nut |
Отправлено: 19.02.2006, 01:22 |
|
Не зарегистрирован
|
пытаюсь реализовать создание новой формы, она должна вызыватся из главной формы модально, и выполнять определенные действия и показавать ход выполнение и после выполнения закрытся сама и уничтожалась, вот вопрос куда засунуть все эти действия чтобы отображался ход действий, в онКреат функции работают но ход действий неотображается, и еще как правильно удалить созданную форму пытаюсь вызвать Free вызваной формы форма исчезает но главное окно остается заблокированое |
|
__Cheat3r |
Отправлено: 19.02.2006, 05:20 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 110
|
Используй |
|
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
Просто я считал, что указатель 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 |
|