Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибки уничтожения формы в Windows Forms при отмене закрытия

Delphi , ОС и Железо , Windows

Вопрос пользователя касается проблемы с закрытием и уничтожением формы 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 18:10:22/0.0032780170440674/0