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

複数フォームの遷移

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

複数フォームを持ったアプリケーションで、
以下のようにフォームの遷移をさせたいと考えています。
(実際はフォームは6つあります)

form1 ボタンクリック
 ↓
form1を非表示 form2を表示
 ↓
form2 ボタンクリック
 ↓
form2を非表示 form3を表示
 ↓
form3 戻るボタンクリック
 ↓
form3を非表示 form1を表示

form1に戻るとき、form2に遷移する前と同じ状態のform1に戻したいと思っています。
そのため、ボタンクリックイベントの度に新たにフォームを生成するのではなく、
一度生成したらformの表示・非表示を切り替えることで
画面の遷移を行いたいのです。

form1,2,3をPublicで宣言すればよいのかと考え、
スタートアップをSub Main()とし、以下のようにソースを作成したのですが、
form1,2,3を上手く参照することができません。

どのようにしたらよいか、ご教授いただけたらと思います。
よろしくお願いします。


Public Module Module1
Public form1 As form1
Public form2 As form2
Public form3 As form3

Public Sub Main()
form1 = New Form1()
form2 = New Form2()
form3 = New Form3()

form1.ShowDialog()
End Module


Public Class Form1
Inherits System.Windows.Forms.Form

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As S ystem.EventArgs) Handles Button1.Click

form1.Hide()
form2.ShowDialog()

End Sub
End Class
はじめまして。

この場合、Module1.vb内で各フォームを宣言するのではなく、
各フォーム内で次のフォームを宣言すれば良いと思います。

Form1では、

private frm2 as Form2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

frm2 = New Form2()
Me.Hide()
frm2.ShowDialog()
End Sub

のような感じで。。

他にも良い方法はあるような気はしますが・・・・
少しでも参考になれば幸いです。
SH様
返信ありがとうございます。

教えていただいた方法は、ボタンクリックイベントを起こすたびに、
新たなフォームのインスタンスが作成することになりますよね。
遷移以前のフォームの状態をそのまま引き継ぎたいので、
一つのインスタンスを使いまわしたいと考えているのです。

イベントのたびにインスタンスをNew()するのではなく、
一度だけNew()すればいいと思うのですが、
どこで(どのタイミングで?)Newするのが適当なのでしょうか…。
> イベントのたびにインスタンスをNew()するのではなく、
> 一度だけNew()すればいいと思うのですが、

SHさんのコードの

frm2 = New Form2()

を

If frm2 Is Nothing Then
    frm2 = New Form2()
End If

にすれば、一度だけインスタンスを作れるかと思います。
■No1608に返信(lightsさんの記事)

こんなのもありかもしれません。
(思いつきです。動かないかも)

Public Module Module1
    Public frm1 As Form1
    Public frm2 As Form2

    Public Sub Main()
        Dim form_visivle As Boolean
        
        frm1 = New Form1()
        frm2 = New Form2()
        frm1.Show()
        form_visivle = True
        Do While form_visivle
            Application.DoEvents()
            form_visivle = (frm1.visible Or frm2.visible)
        Loop
    End Sub
End Module

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As S ystem.EventArgs) Handles Button1.Click
      
      frm2.Show()
      frm1.Hide()

    End Sub
End Class


Application.DoEventsを使うので嫌られそうですが。
なんどもすみません。自己レスです。

> frm1.Hide()

Me.Hide()ですね・・・
ケメ様
レスありがとうございました。

次のように表記することで、一度作ったインスタンスを使いまわすことが
できるようになりました。

> If frm2 Is Nothing Then
> frm2 = New Form2()
> End If

もう一つ教えていただいた方法も試してみようと思います。

いろいろありがとうございました。
解決済み!

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