質問: DialogResult.OK) Application.Exit(cea); } } ### 試したこと フラグを立ててシステム終了ボタンを押した時はフォーム終了時の処理をさせないようにすればいいと、助言をもらったが どのようにフラグを実装して、コードにすればいいのかわからない。
回答: コード読みにくいです。 インデントが無視されるので非常に読みにくい。 なので コードボタン ( ">" とあるやつ ) をクリックしてその中にコードを記述するようにしてください。 質問についてですが、これは当たり前だと思います。 今回の場合は "BtnExit" ボタン? を押すと 確認ダイアログ ( メッセージボックス ) が開いて OK/キャンセル みたいな感じで聞いて、OKなら iniファイルみたいなのに書き込んで終了する... っていうことがしたいのですよね? ですが、質問のコードでは2回出てくるのは当たり前です。 BtnExitボタンが押された -> BtnExit_Clickイベントハンドラが起動 -> そのハンドラ内のApplication.Exit(cea);により Frm_BGMain_FormClosedイベントハンドラが呼ばれる ... となっていると思います。 よって確認ダイアログが2回出てくるのは当たり前。 試しに BtnExit_Clickイベントハンドラと Frm_BGMain_FormClosedイベントハンドラにあるそれぞれの確認ダイアログの文言を変えてみてください。 2種類出ると思います。 たぶんこれが原因。 解決方法は私が思いつく方法だけ列挙しますね。 ``` 方法1: 素直に 一方だけに絞る 方法2: フィールドとして「終了許可」なるものを保持して、それがtrueのときに閉じる ``` 方法2についてですが、 例えば bool closeKey をフィールドとして保持し、コンストラクタとかで falseにしておく。 ( 閉じることを禁止にするため。 ) で、終了許可を出してもいいところ ( 今回だとBtnExit_Clickイベントハンドラ ) で closeKeyを trueに書き換える で、Frm_BGMain_FormClosedイベントハンドラが呼ばれた場合、 このcloseKey が true のときは終了し、それ以外なら「終了許可が出ていません」みたいなダイアログを出す。 ( 出さなくてもいいが、一般ユーザは何らかのトラブル(クラッシュとか) かと勘違いする可能性があるため。 ) みたいな感じでやればいいと思う。 この考えは VBAをやっているときに知りました。 すぐマクさんをヒントにしました。