- - PR -
VB.NETでのフォーム遷移について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-04 11:53
Form.Showで呼び出したときのClose → Disposeと同等の処理が行われる Form.ShowDialogで呼び出したときのClose → 破棄はされないが再利用禁止 アプリケーションルートとなったときのClose → ??? 3つの動作があるということになりますか??
メインフォームのCloseメソッドをコールした段階でどのような処理が行われるのかわかりませんが、Disposeはされるようです。←いや、そういう問題じゃないって
MSのガイドラインでは、リソースを閉じる操作はDisposeに集約するようになっています。「リソースが閉じ」ということは、Disposeがコールされていると考えても良いと思います。 ↑↑↑ 「アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装」これはアンマネージリソースのみ?しかし、Win32APIを使用している以上、アンマネージリソースも使っているはず。 *追加 > アプリケーション全体をDisposeすることになります。 これが問題ですね。確かに、これは間違いです。適切な言葉が思い浮かばなかったのです。 「アプリケーションが動作する土台を閉じてしまうので、アプリケーションが終了するのと同等です」?? [ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-04 12:00 ] | ||||||||||||
|
投稿日時: 2004-03-04 13:31
#参考になるかどうか判りませんが...。
私の場合、フォーム遷移する/しないに関わらず、「入り口と出口はそれぞれ一つ」を心がけ、常にSub Mainをスタートアップに指定しています。 以下の例では、各フォームをメインとなるクラスのメンバとして、フォームの Load および Closed イベントを捕まえて、カウンタが 0 になったら(開いているフォームが無くなったら)、アプリケーションを終了しています。 こんな感じの作りにすると、各フォーム側ではアプリケーション全体の状態とかをそれほど意識しなくても済むのではないでしょうか。
| ||||||||||||
|
投稿日時: 2004-03-04 13:58
メインフォームをCloseするとアプリケーションが終了する理由ですが、 Application.Run メソッド (Form)のヘルプに書いてあります。 >> このメソッドは、 Closed イベントの mainForm パラメータにイベント ハンドラを追加します。 >> イベント ハンドラは、 ExitThread を呼び出して、アプリケーションをクリーンアップします。 メインフォームをCloseするとApplication.ExitThreadが呼ばれるため、 Applicatoin.Run(Form)の実行が終了し、そのままMainメソッドを抜けアプリが終了します。 | ||||||||||||
|
投稿日時: 2004-03-04 14:06
ApplicationContextを使う手もあるみたいですね
(追加)
[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2004-03-04 14:20 ] | ||||||||||||
|
投稿日時: 2004-03-04 20:43
おそくなりました、便乗質問していたヤクルト400です。
ご回答ありがとうございます。
よねKENさん、Jittaさんのご指摘どおり、逆にするとアプリが終了することは なくなりました。 でもなぜか、FormAで持っているDataGridだけ画面から消えてなくなり、 FormAは閉じてくれません。 デバッグすると、上記の処理は確かに通っているのに、画面がそのまま残っています。 ShowDialogにすると大丈夫なんですけど・・・ もともとSubMainにしようか迷っていたので、今回はきくちゃんさんのSubMainに変更して 対応しようかと考えています。
はい、FormAからForm@は直接見えないので、「Form1.Show」という記述ができず、Ownerにセットしています。 ご回答いただいたみなさん、ありがとうございました |