Вопрос пользователя касается проблемы с закрытием и уничтожением формы Windows Forms при отказе от закрытия через событие FormClosing. Основная проблема заключается в том, что после отмены закрытия, если код программы предполагает дальнейшее уничтожение формы (например, при вызове метода Hide), то при следующем открытии формы возникает исключение, связанное с доступом к уже уничтоженному объекту.
Описание проблемы
Пользователь использует событие FormClosing для показа сообщения с вопросом о закрытии формы. Если пользователь подтверждает закрытие, то событие отменяется, и форма скрывается (вызывается метод Hide). Однако, если пользователь отменяет закрытие, форма всё равно уничтожается, и при попытке открыть её снова, возникает ошибка, поскольку форма уже не существует в памяти.
Код пользователя
method PPMain.PPMain_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs);
begin
if MessageBox.Show('Are you sure you want to close the window?','PPMain',MessageBoxButtons.YesNo) = DialogResult.Yes then
begin
e.Cancel := true;
Hide;
end
else
e.Cancel := false;
end;
Неверное предположение
Пользователь предполагает, что установка e.Cancel := false после отказа от закрытия предотвратит уничтожение формы, но это не так.
Подтвержденный ответ
Чтобы решить проблему, необходимо изменить порядок действий в обработчике события FormClosing. Сначала необходимо отменить закрытие, а затем уже спрашивать пользователя. Если пользователь подтвердил закрытие, то можно скрыть форму без её уничтожения. В случае отказа от закрытия, форма останется открытой.
method PPMain.PPMain_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs);
begin
e.Cancel := true; // Отмена закрытия формы
if MessageBox.Show('Are you sure you want to close the window?','PPMain',MessageBoxButtons.YesNo) = DialogResult.Yes then
begin
Hide; // Скрытие формы, но не уничтожение
end;
end;
Также полезно проверять причину закрытия формы с помощью свойства e.CloseReason. Это позволяет избежать блокировки закрытия в случае, если оно вызвано системой (например, при завершении работы системы).
method PPMain.PPMain_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs);
begin
if e.CloseReason = System.Windows.Forms.CloseReason.UserClosing then
begin
e.Cancel := true; // Отмена закрытия, вызванного пользователем
if MessageBox.Show('Are you sure you want to close the window?','PPMain',MessageBoxButtons.YesNo) = DialogResult.Yes then
begin
Hide; // Скрытие формы
end;
end;
end;
Следуя этим рекомендациям, пользователь сможет избежать ошибки уничтожения формы при отмене закрытия.
Пользователь столкнулся с проблемой уничтожения формы Windows Forms в результате попытки её скрытия после отмены закрытия, что приводит к ошибке при следующем открытии, так как форма уже не существует в памяти.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.