none
孫フォームから子ホームへ値を渡せないのですが。 RRS feed

  • 質問

  •  

    すいません。お願いします。

    とても初心的な問題ですが。

    親フォーム、子フォーム、孫フォームと開いています。

    すべてモーダルです。

    親子の間では、自由に値の受け渡しができます。

    ところが、子と孫の間では子から孫へは値を渡せるのですが、

    孫から子へ渡せないのです。

    propertyに書き込んでも子に戻ると値が消えてしまいます。

    friend 変数にしても同じです。

    どうしたらいいのでしょうか。

    お願いします。

     

    2008年9月8日 0:05

回答

  • さすがにこれだけでは想像するしかありませんが、暗黙のインスタンスが原因かもしれません。もしそうでなければ、孫から子へ値を渡している部分のコードの掲載をお願いします。特に子のインスタンスに関する部分が怪しいんじゃないかと想像します。

    2008年9月8日 0:24
    モデレータ
  • やはり暗黙のインスタンスが原因でしたね。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を使わないというポリシーで統一するなどの対策が必要だと思います。

    2008年9月8日 9:37
    モデレータ

すべての返信

  • さすがにこれだけでは想像するしかありませんが、暗黙のインスタンスが原因かもしれません。もしそうでなければ、孫から子へ値を渡している部分のコードの掲載をお願いします。特に子のインスタンスに関する部分が怪しいんじゃないかと想像します。

    2008年9月8日 0:24
    モデレータ
  • 簡単なのを作ってみましたが、同じ結果でした。

    Public Class Form1
        Friend a1 As String
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        End 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 Class

     

    Public 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 Sub

        Private 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 Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Close()
        End Sub
    End Class

     

    Public 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 Sub

        Private 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 を使っても同じでした。

    こういうものなのでしょうか。

     

     

     

     

    2008年9月8日 8:35
  • なんか解決したみたいです。

    Form1の

    Dim f As New Form2を

    Dim f As Form2 = Form2

    に変更したら、大丈夫でした。

    普通はこうやるものなのですか。初心ですいませんでした。

     

    2008年9月8日 8:45
  • やはり暗黙のインスタンスが原因でしたね。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を使わないというポリシーで統一するなどの対策が必要だと思います。

    2008年9月8日 9:37
    モデレータ
  • こんにちは。中川俊輔 です。

     

    trapemiyaさん、回答ありがとうございます。

     

    窓際族さん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、trapemiyaさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    窓際族さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年9月19日 9:27