DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NETでフォームの切り替え方

環境/言語:[VB.NET]
分類:[.NET]

VB.NET
教えてください。
複数のフォームを使っていて、フォーム1にボタンを作成し、そのボタンクリックによりフォーム2を呼び出して、フォーム1を消したい時はどのようにすれば良いのでしょうか?(画面が遷移したように見せたいのです!!)
■No2371に返信(hiroさんの記事)
> VB.NET
> 教えてください。
> 複数のフォームを使っていて、フォーム1にボタンを作成し、そのボタンクリックによりフォーム2を呼び出して、フォーム1を消したい時はどのようにすれば良いのでしょうか?(画面が遷移したように見せたいのです!!)


○新しいフォームを表示する
http://dobon.net/vb/dotnet/form/showform.html

でForm2をモードレスフォームとして表示した後、

○フォームを閉じる
http://dobon.net/vb/dotnet/form/closeform.html

で自分自身(Form1)を閉じれば希望の動作が実現できると思います。
琴さんありがとうございます。
しかし、その方法は試したのですがFORM1からFORM2を呼び出す際に若干位置がずれてしまい。うまくいきません。どうすればよいのでしょうか?また[Me.Close]するタイミングが良く分かりません。よろしくお願いします。

Private Sub cmdButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdButton_Click
Dim f As New Form2
f.ShowDialog(Me)
f.Dispose()
End Sub
■No2373に返信(hiroさんの記事)
> 琴さんありがとうございます。
> しかし、その方法は試したのですがFORM1からFORM2を呼び出す際に若干位置がずれてしまい。うまくいきません。どうすればよいのでしょうか?また[Me.Close]するタイミングが良く分かりません。よろしくお願いします。
>
> Private Sub cmdButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdButton_Click
> Dim f As New Form2
> f.ShowDialog(Me)
> f.Dispose()
> End Sub

hiroさんが使用されたコードは、Form2をモーダルフォームとして表示するものです。
「ファイルを開く」のようなフォームに付随する形の表示なので画面遷移はできないと思われます。
参照されたページの下方に、Formをモードレスフォームとして表示するコードが書かれているのでそちらを使いましょう。

Form1をCloseするタイミングは、Form2が表示された直後で問題ないと思います。

位置がずれるというのはForm1と全く同じ位置にForm2を表示するということでしょうか?
それでしたらForm2を表示して、Form1をCloseする前にForm1.TopプロパティとForm1.Leftプロパティの値を、それぞれForm2.TopプロパティとFrom2.Leftプロパティに写せばForm1と同じ位置にForm2が表示されます。
>位置がずれるというのはForm1と全く同じ位置にForm2を表示するということでしょうか?

はい。そのとうりです。以下の様にしてやったらうまくできました。ありがとうございます。

Private Sub cmdButton_Click(ByVal sender As System.Object, ByVal e As               System.EventArgs) Handles cmdButton.Click
Dim f As New FORM2
 f.Show()
f.SetBounds(Me.Left, Me.Top, Me.Width, Me.Height)
'Me.Close()
End Sub

あとはFORM1を消したいのですが最後のコメントをとってやると終わってしまいます。
FORM1はメインフレームなので消すことができないのでしょうか?
■No2375に返信(hiroさんの記事)
> >位置がずれるというのはForm1と全く同じ位置にForm2を表示するということでしょうか?
>
> はい。そのとうりです。以下の様にしてやったらうまくできました。ありがとうございます。
>
> Private Sub cmdButton_Click(ByVal sender As System.Object, ByVal e As               System.EventArgs) Handles cmdButton.Click
> Dim f As New FORM2
>  f.Show()
> f.SetBounds(Me.Left, Me.Top, Me.Width, Me.Height)
> 'Me.Close()
> End Sub
>
> あとはFORM1を消したいのですが最後のコメントをとってやると終わってしまいます。
> FORM1はメインフレームなので消すことができないのでしょうか?
>

こちらでも試してみましたがMe.Closeだと終了してしまいますね。
見た目だけでいいのならMe.Hideを使う手もあります。
Form.Close()を呼び出すと終了してしまう理由ですが、
アプリケーションは起動時にSystem.Windows.Forms.ApplicationクラスのRun()メソッドを利用しています。
ここで引数としてForm1が渡されているため、このForm1が閉じられるとアプリケーションが終了したものと判断されてしまうためと思われます。
このApplication.RunメソッドはFormを引数としてとるものの他に、ApplicationContextクラスを引数としてとるものがあるので、
Formを切り替える機能を持たせたApplicationContextクラスの派生クラスを作成し、
Sub Mainからアプリケーションをスタートさせるようにして、
その中でApplicationContext派生クラスを引数にして
Application.Runメソッドを呼び出すことでこの問題を回避することができます。

なお、Form.Closedイベントなどを利用してどちらのFormも閉じられたことを感知する手段を用意して
その中でExitThread()やApplication.Exit()など、ApplicationContextを終了させなければ
アプリケーションは終了しなくなってしまう点に注意してください。

DOBON.NET | プログラミング道 | プログラミング掲示板