- PR -

フォームの閉じ方

投稿者投稿内容
シルバ
会議室デビュー日: 2006/09/22
投稿数: 19
投稿日時: 2007-01-16 10:48
バージョン:VB2005 OS:WindowsXP

 親フォームから子フォームを開き、そこから更に子フォームを開いたときに、子フォームのウィンドウのクローズボタン(×ボタン)を押すと全てのフォームを閉じる様にしたいのですがどうすればいいのでしょうか?
 以前 Application.Exit というのを使っていたのですが、.exeでは大丈夫でしたが開発環境でデバッグしてこの動作をすると必ず親の親フォームでエラーが起きます。
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2007-01-16 11:16
親/子の関係は?
MDI の子なの、独立Formを親子関係で結合しているのか、それ以外なのか。
いずれにしても、 Errorの内容をかきませう。

単純な親子孫関係なら通常終了しますが。
-最後追加しました-
_________________
ognac@わんくま同盟

[ メッセージ編集済み 編集者: ognac 編集日時 2007-01-16 11:19 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-01-16 11:17
引用:

 以前 Application.Exit というのを使っていたのですが、.exeでは大丈夫でしたが開発環境でデバッグしてこの動作をすると必ず親の親フォームでエラーが起きます。


どんなエラー?
コンパイル時に、Warning無視してなくない?
シルバ
会議室デビュー日: 2006/09/22
投稿数: 19
投稿日時: 2007-01-16 11:51
返信ありがとうございます。この方法でよいのかわからなかったのでエラー表示を書くのを忘れてました

    オブジェクト参照がオブジェクト インスタンスに設定されていません。

というエラーが起きます。プログラムを簡単に書くと
ボタンを押すとFORM1のButton_Clickイベントで子フォームを開く

Me.Visible = False
FORM2.ShowDialog(Me)
Me.Visible = True
FORM2.Dispose() '後始末

フォーム2の×ボタンを押すとFORM2のFormClosingイベントでプログラムを終了

    Application.Exit

というものです。




ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2007-01-16 12:11

>フォーム2の×ボタンを押すとFORM2のFormClosingイベントでプログラムを終了
>    Application.Exit

Dialog状態のフォーム2の中から Application.Exit を呼ぶの?
作法としてまずくありありません?

以下の処理
>FORM2.ShowDialog(Me)
>Me.Visible = True
>FORM2.Dispose()

を否定する流れにするのは如何なものかと。

Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Application.Exit()
End Sub
この記述だと traceするとApplication.Exit()が二回走る動きをしますよ。(アレなぜ?)


_________________
ognac@わんくま同盟
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-01-16 12:14
デバッグしましたでしょうか。行き当たりばったりでは何も解決しません。
少なくともスタックトレースを見て、どのメソッドで問題が起きてるか限定しましょう。
ユーザーコードで問題が起きているなら、デバッグモードだと問題が起きた行番号まで分かります。
_________________
囚人のジレンマな日々
シルバ
会議室デビュー日: 2006/09/22
投稿数: 19
投稿日時: 2007-01-16 13:22
 デバッグ時にはエラーは起こりませんでした。FORM2の×ボタンを押すとFORM1の

    FORM1.ShowDialog(Me)

でエラーが起きます。

確かに2回通ってしまうので一応1回しか通らないようにはしました。
この方法ではたぶんダメだと思うので、何か別の方法を教えていただきたいのですが…。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-16 15:25
引用:

シルバさんの書き込み (2007-01-16 10:48) より:

親フォームから子フォームを開き、そこから更に子フォームを開いたときに、子フォームのウィンドウのクローズボタン(×ボタン)を押すと全てのフォームを閉じる様にしたいのですがどうすればいいのでしょうか?


子フォームが Close された時に、親フォームを閉じるのですか?
これは、Windows のお作法に反しています。
というより、勝手に子供が親をどうこうしてはいけないでしょう。

引用:

以前 Application.Exit というのを使っていたのですが、


これも誤りです。

メイン フォームが存続している状態で、Application.Exit メソッドを使ってはいけません。
すべての Form を閉じれば、アプリケーションは正しく終了します。

引用:

FORM2.ShowDialog(Me)
Me.Visible = True
FORM2.Dispose()


本題とは関係ないですが、Dispose メソッドは一刻も早く呼び出すべきです。
また、Try ~ Finally か Using で保証すべきです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)