3

この質問は重複しているように見えるかもしれませんが、プログラムをテストしているときにこの問題に遭遇したばかりで、どのように解決するかについて少し混乱しています。

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が閉じて破棄されなくなります。

これをどのように解決しますか?

少し早いですがお礼を、

4

1 に答える 1

10

e.Cancel = trueウィンドウが閉じるのを防ぎます - close イベントを停止します。

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.CloseReasonOSのシャットダウン中などに閉じるのを妨げないように使用します。

このような:

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
于 2012-07-13T13:19:44.580 に答える