トップ回答者
孫フォームから子ホームへ値を渡せないのですが。

質問
回答
-
やはり暗黙のインスタンスが原因でしたね。FormはNewで明示的にインスタンス化しないで使用した場合、どこからでもアクセスできる暗黙のインスタンスが生成されます。したがって
Dim f As New Form2
とした場合は明示的なインスタンスが生成されてForm2が立ち上がりますが、Form3で
Form2.b1 = "Night!"
としているのでForm2の暗黙のインスタンスが生成され、明示的なインスタンスに"Night"という文字列を設定していないため、値が渡らないわけです。
一方、Form1で、
Dim f As Form2 = Form2
とした場合は、暗黙のインスタンスでForm2が表示されますので、Form3で
Form2.b1 = "Night!"
とした結果は、暗黙のインスタンスであるForm2に"Night"という文字列を設定しますので、値が渡るわけです。
暗黙のインスタンスは便利だと思いますが、うまく使わないとバグの原因になりそうです。Formのインスタンス生成にはNewを使わないというポリシーで統一するなどの対策が必要だと思います。
すべての返信
-
簡単なのを作ってみましたが、同じ結果でした。
Public Class Form1
Friend a1 As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadEnd Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As New Form2
f.a1 = "Hello"
f.ShowDialog(Me)
TextBox1.Text = a1
f.Close()
End Sub
End ClassPublic Class Form2
Friend a1 As String
Friend b1 As String
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = a1
Form1.a1 = "Good"
End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f As New Form3
f.a1 = "Morning"
f.ShowDialog(Me)
TextBox2.Text = b1
End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Close()
End Sub
End ClassPublic Class Form3
Friend a1 As String
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = a1
End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.b1 = "Night!"
Me.Close()
End Sub
End Class以上で、form1とform2の関係は良好ですが、form2からform3へ値を渡せても
form3からform2へ値が戻ってきません。
実際には 、property を使っても同じでした。
こういうものなのでしょうか。
-
やはり暗黙のインスタンスが原因でしたね。FormはNewで明示的にインスタンス化しないで使用した場合、どこからでもアクセスできる暗黙のインスタンスが生成されます。したがって
Dim f As New Form2
とした場合は明示的なインスタンスが生成されてForm2が立ち上がりますが、Form3で
Form2.b1 = "Night!"
としているのでForm2の暗黙のインスタンスが生成され、明示的なインスタンスに"Night"という文字列を設定していないため、値が渡らないわけです。
一方、Form1で、
Dim f As Form2 = Form2
とした場合は、暗黙のインスタンスでForm2が表示されますので、Form3で
Form2.b1 = "Night!"
とした結果は、暗黙のインスタンスであるForm2に"Night"という文字列を設定しますので、値が渡るわけです。
暗黙のインスタンスは便利だと思いますが、うまく使わないとバグの原因になりそうです。Formのインスタンス生成にはNewを使わないというポリシーで統一するなどの対策が必要だと思います。