- PR -

VB.NETでのフォーム遷移について

投稿者投稿内容
青@
会議室デビュー日: 2004/02/22
投稿数: 10
投稿日時: 2004-03-03 16:11
いつも参考にさせていただいております。
下記に確認内容をまとめてみました。


#Form@がスタートアップに設定されていたとします。

Form@の「ボタン」で以下の2つを記述し・・・
 処理1:FormAをShow
 処理2:Form@をClose

これを実行した場合にアプリケーション全体が終了してしまいます。
(インスタンス化させた元フォームをクローズさせるので
 当たり前と言えばそれまでなんですが・・・)


★1つのEXEで画面を次々と遷移させる場合に、
 前画面をCloseさせる方法がありましたら教えてください。

 上記はVB6.0では問題無かった処理ですが、
 VB.NETで小難しい振り分け処理をコーディングすることなく
 Form間だけで実現させる方法はありますか?
maru
常連さん
会議室デビュー日: 2001/10/09
投稿数: 23
投稿日時: 2004-03-03 16:18
Dammyの非表示フォームを用意しておいて
Form1をShow
Form2をShow
Form1をClose
すると言うのはどうですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-04 08:18
 メインとなるフォームをCloseすると、CloseはDisposeの別名でもあるため(異論はあろうかと思いますが、System.Windows.Forms.Formにおいては、と限定して)、アプリケーション全体をDisposeすることになります。したがって、CloseせずにHideします。

 下のリンクから私のウェブページへ行って、VS.NETのページ、一番下にテストプロジェクトがありますので、参考にしてください。
ヤクルト400
会議室デビュー日: 2004/02/16
投稿数: 18
投稿日時: 2004-03-04 09:28
便乗して質問させてください。
ちょうど聞きたいと思っていたので・・・

Form@がスタートアップの画面です。
Form@:FormAをインスタンス化する
Form@:FormAのOwnerにForm@をセットする
Form@:Form@がFormAをShowする
Form@:Form@をHideする
FormA:FormAをCloseする
FormA:Owner(Form@)をShowする

と書いてある時に、FormAのCloseのタイミングでEXEが終了してしまいます。
Form@もFormAもSytem.Windows。Forms.Formを継承したFormXを継承して
作成した画面なので、これも当然といえば当然なのですが、
どうすればスマートな遷移にできるでしょうか・・・?


あ・・・
すみません、JittaさんのVS.NETのページを見ていないですが、
とりあえず投稿させてください。
今の環境は自席ではネットができるけれど、VS.NETが入っていない(とても動かせるスペックではない)、
開発用の別フロアではハイスペックマシンがあるけれど、ネットができないという不便な状況なので・・・
今から開発用フロアに行って確認させて頂きます。
じいじ
大ベテラン
会議室デビュー日: 2003/11/11
投稿数: 223
投稿日時: 2004-03-04 09:59
おじゃまします。私の場合
Form@がメインメニューになっていて、他のFormへ行ってまたForm@へ戻ってくる、つまり再び表示する可能性のあるFormは、「Hide」で処理しています。
たくさんのFormがHideになったら困るでしょうけど・・・・
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-03-04 10:03
引用:

Jittaさんの書き込み (2004-03-04 08:18) より:
 メインとなるフォームをCloseすると、CloseはDisposeの別名でもあるため(異論はあろうかと思いますが、System.Windows.Forms.Formにおいては、と限定して)、アプリケーション全体をDisposeすることになります。したがって、CloseせずにHideします。



Closeしてはだめというのはその通りですが、
Disposeを引き合いに出しているのは違うと思います。

スタートアップの設定で例えばForm1を指定した場合、
Form1に下記のコードを書いたのと同じことになります。

Public Shared Sub Main
Application.Run(New Form1())
End Sub

このことは、VS.NETで新規アプリを作成し、
特にコーディングせず、スタートアップ指定をForm1にした場合と
スタートアップ指定をSub Mainにして上記のコードをForm1に書いた場合と
それぞれでexeを作成し、ildasm.exeでILコードを見ることで確認できます。

#下記引用では丸付き数字は普通の数字に変更し、便宜のため各手順に番号をふってます。
引用:

ヤクルト400さんの書き込み (2004-03-04 09:28) より:
Form1がスタートアップの画面です。
(1)Form1:Form2をインスタンス化する
(2)Form1:Form2のOwnerにForm1をセットする
(3)Form1:Form1がForm2をShowする
(4)Form1:Form1をHideする
(5)Form2:Form2をCloseする
(6)Form2:Owner(Form1)をShowする



この手順通りなら(5)で終了はしませんけど・・・
その代わり、(5)の手順でForm2をCloseした時点でForm2の
OwnerプロパティもNothingになるようで、
(6)でNullReferenceExceptionの例外が発生します。

単純に(5)、(6)の順序を逆にすれば特に問題ありません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-04 10:16
引用:

ヤクルト400さんの書き込み (2004-03-04 09:28) より:

Form@がスタートアップの画面です。

  1. Form@:FormAをインスタンス化する
  2. Form@:FormAのOwnerにForm@をセットする
  3. Form@:Form@がFormAをShowする
  4. Form@:Form@をHideする
  5. FormA:FormAをCloseする
  6. FormA:Owner(Form@)をShowする

と書いてある時に、FormAのCloseのタイミングでEXEが終了してしまいます。


 5と6は順番を入れ替えた方がよいと思います。Form.Closeは、Form.Showに対してはDisposeと同等なので、破棄した後にプロパティを操作しようとしていることになります。もちろん、Closingイベントで6を行うのであれば、まだ破棄されていないので、大丈夫ですが。


 簡単なPG作りましたが、アプリまで落ちることはありませんよ?

frm1:ボタンクリックでfrm2.show : me.hide
frm2:ボタンクリックでme.owner.show : me.close

*番号付け間違い。
hideするならownerに設定する必要はないのでは?←「自分が閉じた後に表示するフォーム」を知らなければいけないのか。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-04 11:57 ]
青@
会議室デビュー日: 2004/02/22
投稿数: 10
投稿日時: 2004-03-04 10:51
 ご返答頂いた方々、ありがとうございました!
(参考、勉強になりました)

とりあえず遷移元はHIDEで対応していきます〜

Jittaさん、サンプル頂きました♪

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