前提・実現したいこと
vb.net初心者です。
visual studio2017でWindowsフォームアプリケーションを作成しております。
フォーム上にテキストボックスとボタンのみがあり、
テキストボックス内に文字列を入力する。
ボタンを押すと、テキストボックス内に入力した文字列がMsgBoxで表示される。
※PrivateのメソッドShowMsg(msg As String)を作り、ボタンイベントから呼び出しを行う。
このようなアプリを制作中ですが、以下のようなエラーメッセージが発生いたしました。
ご教示頂ければ幸いです。
発生している問題・エラーメッセージ
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。' Kadai.Form1.TextBox1.get が Nothing を返しました。
該当のソースコード
VB.NET
1Public Class Form1 2 3 Dim msg As String = TextBox1.Text 4 5 Private Sub ShowMsg(msg As String) 6 7 MessageBox.Show(msg) 8 9 End Sub 10 11 12 13 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 14 15 Call ShowMsg(msg) 16 17 End Sub 18 19End Class 20
書いてある通り、TextBox1 が Nothing だということです。msg が初期化される時点でまだ TextBox1 は作られていません。
TextBox1を作成する必要があるということでしょうか。
サンプルコードをご教示頂ければ幸いです。
TextBox1 はデザイナで作っているんでしょう?
それが実際にインスタンス化されるのは InitializeComponent を呼んだ後です。それまで待ってください。
フォームロード内でDim msg As String = TextBox1.Text
と記載する必要があるということでしょうか。
宣言と初期化を同時に行う必要はありません。
Dim msg As String
msg = TextBox1.Text
のように別々に行うことができます。
Form1_Load内で
Dim msg As String
msg = TextBox1.Text
と記載したところ、msgは宣言されていませんとエラーが発生いたしました。
宣言されているのではないでしょうか。
変数にはスコープがあり、{} の中で宣言したローカル変数はその外からは見えません。つまり、Form1_Load の中で宣言されたものは Button1_Click からは見えません。
この質問のコードの場合は、ローカル変数ではなくインスタンスフィールドとして宣言されているために、クラス内のすべてのインスタンスメソッドから見ることができます。(宣言がメソッド内ではなく、クラス内にあります)
したがって、同じ位置で msg を宣言し、Form1_Load で初期化すればコンパイルは通るということになります。ただし、y_waiwai さんのおっしゃる通り、Form1_Load で初期化した場合、その時点での Text プロパティが msg に保存されます。変数の中身は自動更新されません。
ご教示頂きまして、ありがとうございます。
同じ位置で msg を宣言し、Form1_Load で初期化の部分が分からないのですが、
サンプルコードをご教示頂ければ幸いです。
>    Dim msg As String = TextBox1.Text
これを次のように書き換えます。
    Dim msg As String
変数に最初の値を代入することを初期化と呼びます。質問のコードでは宣言と初期化を同時に行っていますが、これを宣言のみにし、msg の初期化は TextBox1 が初期化されるのを待ってから行うということです。
Dim msg As Stringと宣言後、
msg = TextBox1.Textと記載したら、
宣言が必要ですとエラーが発生いたしました。
こちらの対処法をご教示頂ければ幸いです。
宣言する場所を変えていませんか?
Public Class Form1
    Dim msg As String
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        msg = TextBox1.Text
    End Sub
    Private Sub ShowMsg(msg As String)
        MessageBox.Show(msg)
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Call ShowMsg(msg)
    End Sub
End Class
このように記述したのですが、文字列が表示されません。
ご教示頂ければ幸いです。
こちらでも試してみましたが、エラーは発生しませんね。
文字列が表示されないのは、msg に値が代入されているのが Form1_Load だけだからです。すでに書いたように、その時点でのプロパティが msg に保存され、自動更新はされません。その時点で Text1.Text は空文字列なので、それが表示されています。
ご丁寧にご回答頂きまして、ありがとうございました。
もう少し原因を調べてみます。
度々申し訳ございませんでした。
原因は明らかです。値を更新していないからです。dodox86 さんの回答を見てください。
msg = TextBox1.Text
ShowMsg(msg)
と記述したところ、テキストが表示されました。
ありがとうございました。
解決したのであればベストアンサーを選んでください。

回答2件
あなたの回答
tips
プレビュー



