Как Правильно Удалять Форму
динамического создания и удаления формы:
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);
Спасибо.
Разница в том, что в первом случае вызывается TForm::Free()
а во втором delete.
Только вот я пишу
delete MyForm;
а не
delete(MyForm);
И использую второй метод. То есть через delete. Потому что не всегда необходимо удалять форму сразу после ее закрытия. Так что удобнее везде использовать delete, чем в одном случае delete, в другом caFree. Единообразие кода достигается. Да и привычка есть - на каждый new свой delete.
std::auto_ptr<TMyForm> pMyForm(new TMyForm(NULL));
pMyForm->ShowModal();
и не надо никакого delete
У меня собственно вот в чем проблема:
есть форма, на которой размещен 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"??????
:???:
Удаляйте, батенька, лучше через delete. Потому как фиг кто знает, что там VCL творит в случае caFree. Есть такое ощущение что удаляет она эту форму отнюдь не сразу.
Эх... Дык пробовал. Не шибко помогает. Все равно возникают ошибки, приведенные вверху :(
Последний раз было примерно так:
На главной форме лежит оракловая сессия, а в дочернем окне открытый Query. При закрытии главной формы она начинает удалять все обекты которыми владеет, ессно сначало сессию потому как она была на ней изначально, затем дочернее окно. Когда дело доходит до удаления Query дочерним окном сессия уже закрыта,а Query пытаеться освободить ресурсы на сервере и все виснет минуты на 2, а потом и вываливает кучу ошибок.
Так что следи что где и в каком порядке удаляеться.
В общем, так как все телепаты в отпуске, код формы, dfm и хидер в студию. Потом уже будем гадать!