Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как Правильно Удалять Форму

2.4K
16 сентября 2003 года
slego
25 / / 19.08.2003
Подскажите, пожалуйста, в чем разница между следующими способами
динамического создания и удаления формы:

1. TMyForm *pMyForm = new TMyForm(this);
pMyForm->ShowModal();

в обработчике события

void __fastcall TMyForm::MyFormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

2. TMyForm *pMyForm = new TMyForm(this);
pMyForm->ShowModal();

в обработчике TMyForm->OnClose(...) ничего не пишу

delete(pMyForm);

Спасибо.
358
16 сентября 2003 года
moonmike
423 / / 18.10.2002
ИМХО:
Разница в том, что в первом случае вызывается TForm::Free()
а во втором delete.
Только вот я пишу
delete MyForm;
а не
delete(MyForm);
И использую второй метод. То есть через delete. Потому что не всегда необходимо удалять форму сразу после ее закрытия. Так что удобнее везде использовать delete, чем в одном случае delete, в другом caFree. Единообразие кода достигается. Да и привычка есть - на каждый new свой delete.
2.1K
16 сентября 2003 года
maximaximax
83 / / 05.06.2003
2й способ лучше. К тому же можно написатть просто

std::auto_ptr<TMyForm> pMyForm(new TMyForm(NULL));
pMyForm->ShowModal();

и не надо никакого delete
2.4K
17 сентября 2003 года
slego
25 / / 19.08.2003
Хм... понятно... Значит ни один из них не лучше...

У меня собственно вот в чем проблема:
есть форма, на которой размещен QuickRep1.
В главной форме пишу

TMyForm *pMyForm = new TMyForm(this);
pMyForm->QuickRep1->Preview();

ну и в MyForm стоят обработчики

void __fastcall TMyForm::MyFormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

void __fastcall TMyForm::QuickRep1AfterPreview(...)
{
Close();
}

Так вот, после просмотра, по идее, по идее эта форма должна исчезнуть из этого мира, но возникают 2 ошибки (НЕ ВСЕГДА, так порой :) ):
1. Когда начинается просмотр большого QuickRep, идет его формирование и внизу можно увидеть процентную полосу. Если закрывать окно просмотра ДО ОКОНЧАНИЯ ФОРМИРОВАНИЯ, т.е. до 100%, то просто вылетает ошибка в духе "Проект выполнил недопустимую ошибку".
2. Иногда происходит другая ошибка: если несколько раз вызвать процедуру создания этой формы, то при очередной попытке создать эту форму вылазит ошибка, что "не-а, Компонент с именем TQuickRepPreview1 already exist".

Что делать, ума не приложу. Думал, может быть Я не правильно очищаю память, а это скорее всего так и есть, потому что откуда тогда взяться "уже созданному TQuickRepPreview1"??????





:???:
358
17 сентября 2003 года
moonmike
423 / / 18.10.2002
Удаляйте, батенька, лучше через delete. Потому как фиг кто знает, что там VCL творит в случае caFree. Есть такое ощущение что удаляет она эту форму отнюдь не сразу.
2.4K
17 сентября 2003 года
slego
25 / / 19.08.2003
Эх... Дык пробовал. Не шибко помогает. Все равно возникают ошибки, приведенные вверху :(
469
18 сентября 2003 года
Sli
71 / / 20.01.2000
У меня такие ошибки возникали когда был неправильный порядок удаления компонентов. Особенно проявляються такие вещи когда форма является owner'ом для других форм.
Последний раз было примерно так:
На главной форме лежит оракловая сессия, а в дочернем окне открытый Query. При закрытии главной формы она начинает удалять все обекты которыми владеет, ессно сначало сессию потому как она была на ней изначально, затем дочернее окно. Когда дело доходит до удаления Query дочерним окном сессия уже закрыта,а Query пытаеться освободить ресурсы на сервере и все виснет минуты на 2, а потом и вываливает кучу ошибок.
Так что следи что где и в каком порядке удаляеться.
358
18 сентября 2003 года
moonmike
423 / / 18.10.2002
В общем, так как все телепаты в отпуске, код формы, dfm и хидер в студию. Потом уже будем гадать!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог