VB.NETでのフォームの呼び出し方

当社の新人プログラマーわっくんです!
この記事を作成した当時はギリギリ1年目なのでまだ新人です!心は!!(だが三十路)

VB.NETでフォームを呼び出す方法はいくつかありますが、大きく分けて「インスタンス化する方法」と「インスタンス化せずに呼び出す方法」があります。フォームは広義ではクラスと一緒で、インスタンス化しなくても呼び出すことが可能ですが、今回は基本的な呼び出し方を紹介します。

プログラマとして駆け出しの頃、VB.NETで親フォームに子フォームを呼び出すボタンが2つあり、それぞれのボタンを押すと同じ子フォームを呼び出すというシステムを触っていました。しかし、それはちょっと残念な作りでした。

  1. 親フォームからボタン1を押す。
     →ShowDialogで子フォームが呼び出されて、テキストボックスに値を入れて子フォームを閉じる。
  2. 親フォームからボタン2を押す。
     →ShowDialogで子フォームが呼び出されて、テキストボックスに①で入れた値が入っている(!)

Public Class Form1
‘ボタン1をクリック
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Form2.ShowDialog()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
‘ボタン2をクリック
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
Form2.ShowDialog()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class
上記ソースは再現のために用意しました。

スタティックなForm1(親フォーム)からスタティックなForm2(子フォーム)をShowDialogで呼び出すという簡単な作りです。コピペで再現してみて下さい。

image1 親フォームからボタン1をクリック

image2 何でもいいのでテキストボックスに値を入れて閉じる

image3 ボタン2をクリックして子フォームを呼び出すと値が残ってる!!!
※ちなみに、再びボタン1を押しても値は残っています。

これは仕様なのかなと思って確認したら、ただのバグでしたとさ(めでたし)。

いやいや、めでたくありません。インスタンス化してあげるべきです。仮にフォームを開いた時に初期値を入れておきたい場合は、その処理を記述すべきです。この現象に初めて遭遇した当時、古株のエンジニアのおじさんに相談したところ、VB6時代に頻繁に見られた現象だそうで、フォーム名をダイレクトに指定して表示させると前の値が残るので、FormLoadのイベントで各変数やコンポーネントの値を初期化する記述をガリガリ記述していたとのことです。
その当時の意図は分かりかねますが、開くたびに初期化の記述をガリガリ記載するくらいなら、インスタンス化して呼び出した方が断然早いです。

そんなわけで、今回はフォームを呼び出す際にインスタンス化する方法を紹介します。

1. フォームを呼び出す方法
1-1. Application.Run()を使用してフォームを呼び出す
さあ、実際にフォームを呼び出してみましょう。過去の記事でMainメソッドを作成しましたが、そのMainメソッドからフォームをインスタンス化して呼び出してみます。適当にForm1というフォームをインスタンス化して呼び出したのが下記のソースです。


_
Shared Sub Main()
Try
Application.Run(New Form1())
Finally
End Try
End Sub
上記のApplication.Run(New Form1())の部分がフォームの呼び出しです。Main()メソッドから呼び出したい時はApplication.Run()メソッドを使用します。たったこれだけです。
1-2. ShowDialog()を使用してフォームを呼び出す
ShowDialog()メソッドを使用してフォームを呼び出すことが出来ます。モーダルフォームとして呼び出したい時に使用します。Form1型のインスタンスobjFormを作成し、ShowDialog()メソッドを使ってフォームを呼び出します。


_
Shared Sub Main()
‘宣言&インスタンス化
Dim objForm As New Form1
Try
objForm.ShowDialog()
Finally
End Try
End Sub
尚、冒頭でサンプルとして提示した子フォーム呼び出しをちゃんとインスタンス化して呼び出したものが以下になります。


Module Module1

Sub Main()
Dim objForm As New Form1
Try
objForm.ShowDialog()
Finally
End Try
End Sub
End Module
Public Class Form1
‘ボタン1をクリック
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim objForm As Form2 = New Form2
Try
objForm.ShowDialog()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
‘ボタン2をクリック
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim objForm As Form2 = New Form2
Try
objForm.ShowDialog()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class
ボタン1とボタン2のそれぞれでフォームをインスタンス化しています。

image4 親フォームからボタン1をクリック

image5 何でもいいのでテキストボックスに値を入れて閉じる

image6 ボタン2を押下して子フォームを呼び出してみると、子フォームをインスタンス化して呼び出しているので残りません。

1-3. Show()メソッドを使用してフォームを呼び出す
ちょっとおまけの紹介です。使い方はShowDialog()メソッドと同じです。モードレスフォームとして呼び出したい時に使用します。


_
Shared Sub Main()
Dim objForm As New Form1
Try
objForm.Show()
Finally
End Try
End Sub

※モードレスフォーム:呼び出し先の画面が表示されていても呼び出し元の画面が操作出来る。

まとめ

・フォームを呼び出すにはインスタンス化して呼び出す
・ShowDialog()とShow()は性質が異なるので、時と場合によって使い分ける
DXO株式会社

DXO株式会社

〒103-0014
東京都中央区日本橋蛎殻町2-13-6
EDGE水天宮8F
E-Mail : contact-info@dxo.co.jp
URL : https://dxo.co.jp