質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

9244閲覧

VB.NET ボタンを押すとテキストボックス内の文字列の表示がMsgBoxで表示される

Nendo

総合スコア2

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/05/12 22:46

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/05/12 22:50

書いてある通り、TextBox1 が Nothing だということです。msg が初期化される時点でまだ TextBox1 は作られていません。
Nendo

2020/05/12 22:58

TextBox1を作成する必要があるということでしょうか。 サンプルコードをご教示頂ければ幸いです。
Zuishin

2020/05/12 23:05 編集

TextBox1 はデザイナで作っているんでしょう? それが実際にインスタンス化されるのは InitializeComponent を呼んだ後です。それまで待ってください。
Nendo

2020/05/12 23:15

フォームロード内でDim msg As String = TextBox1.Text と記載する必要があるということでしょうか。
Zuishin

2020/05/12 23:18

宣言と初期化を同時に行う必要はありません。 Dim msg As String msg = TextBox1.Text のように別々に行うことができます。
Nendo

2020/05/12 23:22

Form1_Load内で Dim msg As String msg = TextBox1.Text と記載したところ、msgは宣言されていませんとエラーが発生いたしました。 宣言されているのではないでしょうか。
Zuishin

2020/05/12 23:31 編集

変数にはスコープがあり、{} の中で宣言したローカル変数はその外からは見えません。つまり、Form1_Load の中で宣言されたものは Button1_Click からは見えません。 この質問のコードの場合は、ローカル変数ではなくインスタンスフィールドとして宣言されているために、クラス内のすべてのインスタンスメソッドから見ることができます。(宣言がメソッド内ではなく、クラス内にあります) したがって、同じ位置で msg を宣言し、Form1_Load で初期化すればコンパイルは通るということになります。ただし、y_waiwai さんのおっしゃる通り、Form1_Load で初期化した場合、その時点での Text プロパティが msg に保存されます。変数の中身は自動更新されません。
Nendo

2020/05/12 23:38

ご教示頂きまして、ありがとうございます。 同じ位置で msg を宣言し、Form1_Load で初期化の部分が分からないのですが、 サンプルコードをご教示頂ければ幸いです。
Zuishin

2020/05/12 23:42

> Dim msg As String = TextBox1.Text これを次のように書き換えます。 Dim msg As String 変数に最初の値を代入することを初期化と呼びます。質問のコードでは宣言と初期化を同時に行っていますが、これを宣言のみにし、msg の初期化は TextBox1 が初期化されるのを待ってから行うということです。
Nendo

2020/05/12 23:57

Dim msg As Stringと宣言後、 msg = TextBox1.Textと記載したら、 宣言が必要ですとエラーが発生いたしました。 こちらの対処法をご教示頂ければ幸いです。
Zuishin

2020/05/13 00:02

宣言する場所を変えていませんか?
Nendo

2020/05/13 00:07

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 このように記述したのですが、文字列が表示されません。 ご教示頂ければ幸いです。
Zuishin

2020/05/13 00:39

こちらでも試してみましたが、エラーは発生しませんね。 文字列が表示されないのは、msg に値が代入されているのが Form1_Load だけだからです。すでに書いたように、その時点でのプロパティが msg に保存され、自動更新はされません。その時点で Text1.Text は空文字列なので、それが表示されています。
Nendo

2020/05/13 00:42

ご丁寧にご回答頂きまして、ありがとうございました。 もう少し原因を調べてみます。 度々申し訳ございませんでした。
Zuishin

2020/05/13 00:44 編集

原因は明らかです。値を更新していないからです。dodox86 さんの回答を見てください。
Nendo

2020/05/13 00:55

msg = TextBox1.Text ShowMsg(msg) と記述したところ、テキストが表示されました。 ありがとうございました。
Zuishin

2020/05/13 00:58

解決したのであればベストアンサーを選んでください。
guest

回答2

0

ベストアンサー

既にZuishinさんにコメントをいただいているように、Windows Formsのフォーム中の各TextBox等の各コントロールは、Visual Studioのフォームデザイナーで自動生成されたソースファイル中でインスタンスが生成されます。これに依存せずに各コントロールを自分で作ることもできますが、十分理解してから使用するべきです。

今回の質問では、ボタンをクリックしたときにTextBox1Textプロパティを参照すればよいです。

VB

1' Form1.vb 2Public Class Form1 3 Private Sub ShowMsg(msg As String) 4 MessageBox.Show(msg) 5 End Sub 6 7 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 8 ' このイベントハンドラーが使えるときには、TextBox1のインスタンスが生成されていて、使える状態になっている。 9 ShowMsg(TextBox1.Text) 10 End Sub 11End Class

プロジェクトをビルドすると、Visual Studio のフォームデザイナーで「Form1.Desginer.vb」と言うソースファイルが出来上がります。Form1と、TextBox1Button1のインスタンスが生成されていることが分かります。

VB

1<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 2Partial Class Form1 3 Inherits System.Windows.Forms.Form 4 5 'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。 6 <System.Diagnostics.DebuggerNonUserCode()> _ 7 Protected Overrides Sub Dispose(ByVal disposing As Boolean) 8 Try 9 If disposing AndAlso components IsNot Nothing Then 10 components.Dispose() 11 End If 12 Finally 13 MyBase.Dispose(disposing) 14 End Try 15 End Sub 16 17 'Windows フォーム デザイナーで必要です。 18 Private components As System.ComponentModel.IContainer 19 20 'メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。 21 'Windows フォーム デザイナーを使用して変更できます。 22 'コード エディターを使って変更しないでください。 23 <System.Diagnostics.DebuggerStepThrough()> _ 24 Private Sub InitializeComponent() 25 Me.TextBox1 = New System.Windows.Forms.TextBox() 26 Me.Button1 = New System.Windows.Forms.Button() 27 Me.SuspendLayout() 28 ' 29 'TextBox1 30 ' 31 Me.TextBox1.Location = New System.Drawing.Point(44, 48) 32 Me.TextBox1.Name = "TextBox1" 33 Me.TextBox1.Size = New System.Drawing.Size(100, 28) 34 Me.TextBox1.TabIndex = 0 35 ' 36 'Button1 37 ' 38 Me.Button1.Location = New System.Drawing.Point(44, 83) 39 Me.Button1.Name = "Button1" 40 Me.Button1.Size = New System.Drawing.Size(75, 23) 41 Me.Button1.TabIndex = 1 42 Me.Button1.Text = "Button1" 43 Me.Button1.UseVisualStyleBackColor = True 44 ' 45 'Form1 46 ' 47 Me.AutoScaleDimensions = New System.Drawing.SizeF(11.0!, 21.0!) 48 Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 49 Me.ClientSize = New System.Drawing.Size(800, 450) 50 Me.Controls.Add(Me.Button1) 51 Me.Controls.Add(Me.TextBox1) 52 Me.Name = "Form1" 53 Me.Text = "Form1" 54 Me.ResumeLayout(False) 55 Me.PerformLayout() 56 57 End Sub 58 59 Friend WithEvents TextBox1 As TextBox 60 Friend WithEvents Button1 As Button 61End Class 62

投稿2020/05/13 00:25

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nendo

2020/05/13 00:56

ご教示頂きまして、ありがとうございます。 Callを使う必要はないのですね。 承知いたしました。
guest

0

Dim msg As String = TextBox1.Text

TextBox1というのはForm1のインスタンスが生成されないと生成されません。

また、ボタンを押したときの文字列を表示するなら、ボタンを押したときの文字列をとってくる必要があります

投稿2020/05/12 23:16

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nendo

2020/05/13 00:56

ご教示頂きまして、ありがとうございました。 文字列の取得ができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問