如何防止在FormClosing事件中关闭和处置winform



这个问题看起来可能是重复的,但我只是在测试程序时遇到了这个问题,我有点困惑于如何解决它。

我有一个winform,它有一个表单关闭事件。在这种情况下,我会弹出一个消息框,询问用户:"你确定要关闭窗口吗?"如果他们按下"是"按钮,应用程序会关闭窗口,并阻止其按预期进行处理。所以,我可以再次打开它。然而,如果他们没有按下按钮,它仍然会关闭窗口,但现在窗口已被释放。因此,当我再次尝试打开它时,它引发了一个异常,"无法访问已释放的对象"。当按下"否"按钮时,我希望winform保持打开状态,而不是被释放。

这是我的代码:

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=true来关闭窗口并告诉它隐藏,那么做相反的事情(e.Cancel=false且不隐藏)将阻止winform关闭并被处理。

你如何解决这个问题?

提前感谢,

e.Cancel = true阻止窗口关闭-它停止关闭事件。

e.Cancel = false允许"关闭事件"继续(导致窗口关闭并被处理;假设没有其他事情阻止它)。

你似乎想这样做:

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.Cancel := true;阻止窗口关闭。如果用户说是,则会提示用户Hide;隐藏窗口(不进行处理)。如果用户单击"否",则不会发生任何事情。

检测正在执行的近距离动作可能是个好主意。使用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

相关内容

  • 没有找到相关文章

最新更新