Form.Close or Dispose в C++.NET (managed code)
Добавлено: 28 июл 2004, 21:40
Как правлильно в конкретном примере, что ниже? MSDN читал. Не бейте.
На форме frm1 : public System::Windows::Forms::Form две кнопочки - "Exit" и "Show frm2".
Когда нажимешь на кнопоку для формы frm1:
Здесь по Close() нет вопросов. Вопрос дальше....
Когда нажимаешь на кнопочку формы frm1 Show frm2", показываем вторую модальную форму frm2 : public System::Windows::Forms::Form:
_Dispose только вызывает протектед метод Dispose(true); формы frm2.
Как правлильно frm->Close(); или frm->_Dispose();???
Прикол (для unmanaged programmer-а) в том, что для вызова frm->Close() фактически вызов Dispose этой формы происходит только при завершении работы всего приложения. Другими словами, 100 раз "запускаем" модальную форму, но Dispose этой формы не будет вызвана ни разу. Только при завершении работы всего приложения Dispose будет вызвана 100 раз.
Если делать frm->_Dispose();, то Dispose модальной формы будет вызвана 200 раз:
- 100 раз после создания и закрытия формы:
- 100 раз, как и в случае frm->Close();
Такое осчусчение, что фраймворк всё равно хранит дескрипторы всех окон, и пытается очистить память в конце работы всего приложения.
На форме frm1 : public System::Windows::Forms::Form две кнопочки - "Exit" и "Show frm2".
Когда нажимешь на кнопоку для формы frm1:
Код: Выделить всё
private: System::Void btnExit_Click(System::Object * sender, System::EventArgs * e)
{
Close();
}
Когда нажимаешь на кнопочку формы frm1 Show frm2", показываем вторую модальную форму frm2 : public System::Windows::Forms::Form:
Код: Выделить всё
private: System::Void btnShow_Click(System::Object * sender, System::EventArgs * e)
{
Arms::frm2 *frm = new frm2;
frm->ShowDialog();
frm->Close();
//frm->_Dispose();
}
Как правлильно frm->Close(); или frm->_Dispose();???
Прикол (для unmanaged programmer-а) в том, что для вызова frm->Close() фактически вызов Dispose этой формы происходит только при завершении работы всего приложения. Другими словами, 100 раз "запускаем" модальную форму, но Dispose этой формы не будет вызвана ни разу. Только при завершении работы всего приложения Dispose будет вызвана 100 раз.
Если делать frm->_Dispose();, то Dispose модальной формы будет вызвана 200 раз:
- 100 раз после создания и закрытия формы:
Код: Выделить всё
private: System::Void btnShow_Click(System::Object * sender, System::EventArgs * e)
{
Arms::frmLS2 *frm = new frmLS2;
frm->ShowDialog();
frm->_Dispose();
}
Такое осчусчение, что фраймворк всё равно хранит дескрипторы всех окон, и пытается очистить память в конце работы всего приложения.