こんにちは、ENGかぴです。
VB.NET(Visual Basic 2022)でテキストボックス(TextBox)のコントロールの追加、イベントの追加方法をまとめました。実装例として入力テキストをエンコーディングして使用する方法、入力文字の制限の方法をまとめました。
Windowsフォームアプリケーション(.NETFramework)のデスクトップアプリを対象としています。以下はVisual Basic 2022をVB2022とします。
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
TextBoxを実装する
VB2022のプロジェクトを作成します。初期配置されているフォームにコンポーネントを実装しイベントを追加します。プロジェクトの作り方は下記記事を参考にしてください。
Visual Studio 2022によるVBの開発環境の作り方
本記事ではプロジェクト名とソリューション名を「textbox」にしています。
TextBoxを使って作成するアプリ
本記事ではTextBoxに入力したテキストをUTF-8及びSHIFT-JISのページコード(文字コード)でバイナリデータに変換し、バイナリデータからテキストに変換する方法を説明します。また、テキスト入力を制限する方法を説明し、例として16進数の数値を10進数に変換して動作確認を行います。
SHIFT-JISは日本語に特化した文字コードですが、UTF-8においても日本語対応が進んでいるためSHIFT-JISよりも使用される傾向があります。文字コードによるバイナリデータの違いを確認するため同じ文字列からバイナリデータを生成します。
TextBoxの追加
Form1.vb[デザイン]にTextBoxを追加します。ツールボックスのすべてのWindowsフォームからTextBoxを選択します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。
ツールボックスのTextBoxを選択するとForm1内でマウスのポインタがTextBoxのアイコンなります。この状態で左クリックするとTextBoxが配置できます。左クリックを維持したままマウスのポインタを操作することでサイズを調整しながら配置することもできます。
上記以外にTextBoxの位置やサイズをプロパティで指定する方法があります。左クリックである程度のサイズで配置しプロパティで微調整すると効率よく配置できます。
本記事で使用するプロパティ項目は以下の通りです。
項目 | 説明 |
---|---|
Text | テキストボックスの初期の文字を指定する。 |
Location | フレーム上部左端から見た時のコントロール左上の座標を指定する。 |
Size | コントロールのサイズを指定する。 |
KeyPress | 入力するテキストを制限する。 |
TextBoxに入力する文字が多くなるとサイズプロパティを超えてしまって全体の文字が見えなくなるため入力する内容に応じて適切なサイズになるように調整することをお勧めします。
広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール
その他コントロールの実装
各種コントロールをFormに各種コントロール追加します。コントロールの実装とイベントの追加の方法を下記記事にまとめています。
VB.net(VB2022)のボタンの実装とイベントの追加方法
ツールボックスからコントロールを追加し、一部のプロパティを変更します。
コントロールの赤文字がサイズ、青文字がロケーションとします。ロケーションとサイズは目安なので任意でも問題ありません。
TextBox1とTextBox2のサイズとロケーションを指定して揃えて配置します。TextBox1のTextプロパティを「あいうえ王」(任意の文字でよい)、TextBox2のTextプロパティを「FFFF」(任意の16進数の値)に変更します。
Label1~10を配置します。Label3のTextプロパティを「テキスト変換 Text→utf-8:」に変更し、Label4のTextプロパティを「テキスト変換 Text→shift-jis:」に変更します。
Label5のTextプロパティを「テキスト変換 utf-8→Text:」に変更し、Label6のTextプロパティを「テキスト変換 shift-jis→Text:」に変更します。
Label9のTextプロパティを「16進数→10進数」に変更します。
Button1はTextBox1とTextBox2に入力した文字をSHIFT-JIS及びUTF-8に変換したバイナリデータの表示に使用します。Textプロパティを「テキスト変換」に変更し、BackColorプロパティをWebタブからLightGreenに変更します。
Button2はButton1で変換したバイナリデータを文字コードをSHIFT-JIS及びUTF-8で解釈してテキストに変換するために使用します。また、TextBox2に入力した16進数の値を10進数に変換します。Textプロパティを「データ変換」に変更し、BackColorプロパティをWebタブからLightGreenに変更します。
変数の宣言
アプリで共通する変数を宣言する場合はフォームクラス内で変数を宣言する必要があります。VBの場合はDimでメモリに変数を割り当てます。
Public Class Form1
Dim txtbuf() As Byte '文字のバイナリデータを格納
Dim txtbuf2() As Byte
Dim txtbuf3() As Byte
End Class
例ではアプリ全体で使用するtxtbuf()を宣言しています。クラス内で宣言した場合はアプリを終了しない限りメモリを割り当てた状態になります。
txtbuf()はTextBox1のテキストをUTF-8の文字コードで変換した結果を格納します。txtbuf2()はTextBox1のテキストをSHIFT-JISの文字コードで変換した結果を格納します。txtbuf3()はTextBox2のテキストをUTF-8の文字コードで変換した結果を格納します。
イベントの追加
TextBox1などのコントロールに対してイベントの追加を行う必要があります。エディターを選択している状態でF7を押すか、右クリックで表示されるメニュー「コードの表示(C)」を選択するとコードの編集画面(Form1.vb)に遷移します。次のイベントを追加します。
- Button1をクリックしたときに呼び出すClickイベント
- Button2をクリックしたときに呼び出すClickイベント
- TextBox2の入力するテキストを制限するKeyPressイベント
1と2のイベントは対象のボタンをダブルクリックすると追加されます。3のKeyPressイベントはコードエディターでイベントを追加します。
コントロール選択でTextBox2を選択します。コントロール選択の横にあるイベント一覧からKeyPressを選択するとイベントが追加できます。イベントを選択すると自動でイベントのハンドラが生成されます。
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
'処理を追加
End Sub
自動生成されたサブルーチンの後方にHandles TextBox2.KeyPressのように記述されている部分がイベントの発生要因になります。生成したサブルーチンに処理を追加します。
Button1:文字列をバイナリデータに変換する
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextDatachg()
End Sub
Button1をクリックするとクリックイベントが発生します。イベント内で自作の関数のTextDatachg()を呼び出します。
Private Sub TextDatachg()
'Dim data() As Byte = Encoding.GetEncoding(codepage:=65001).GetBytes(TextBox1.Text)
Dim data() As Byte = Encoding.GetEncoding("utf-8").GetBytes(TextBox1.Text)
Dim str As String = ""
Dim i As Integer
txtbuf = data
For i = 0 To data.Length - 1
str &= data(i)
str &= " "
Next
Label1.Text = str
End Sub
TextDatachg()関数はTextBoxのテキストを指定した文字コードでバイナリデータに変換する自作の関数です。
System.Text.EncodingクラスのGetEncoding()メソッドで指定した文字コード(ページコード)のエンコーディング(文字をルールに従って変換する)を取得します。ページコードは文字列で指定する方法と番号で指定する方法があります。例はUTF-8をページコード番号または文字列で指定する方法を記載しています。
GetBytes()メソッドで指定したテキストをバイナリデータに変換し結果をdata()の配列で格納します。
変換後のバイナリデータを表示するためdata()配列のサイズに合わせて文字列を生成してLabelのTextプロパティに指定して表示します。
Button2:バイナリデータをテキストに変換
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
DataTextchg()
End Sub
Button2をクリックするとクリックイベントが発生します。イベント内で自作の関数のDataTextchg()を呼び出します。
Private Sub DataTextchg()
Dim str As String = ""
Dim str3 As String = ""
If txtbuf IsNot Nothing Then'データが
str = Encoding.GetEncoding("utf-8").GetString(txtbuf)
End If
If txtbuf3 IsNot Nothing Then
str3 = Encoding.GetEncoding("utf-8").GetString(txtbuf3)
str3 = "&h" & str3
End If
Label7.Text = str
Label10.Text = Val(str3)
'Label10.Text = CDec(str3)
End Sub
DataTextchg()関数はバイナリデータをテキストに変換する自作の関数です。
txtbuf()やtxtbuf3()はButton1をクリックして生成したバイナリデータを格納していますが、初期条件ではバイナリデータが空で配列がNothing状態になっていることがあります。この場合処理ができずアプリが強制終了するため配列が空でないことを確認して処理を行います。
System.Text.EncodingクラスのGetEncoding()メソッドで文字列をバイナリデータに変換すると同様にしてエンコーディングを取得します。GetString()メソッドでテキスト変換するバイナリデータを指定します。メソッドの戻り値が変換後のテキストになるのでLabelのTextプロパティに指定して結果を表示します。
txtbuf3()は16進数のテキストをバイナリデータに変換した配列なのでテキストに変換後10進数に変換する準備として16進数であることを示す”&h”を挿入してテキストを生成しています。
16進数を10進数に変換する方法としてVal()メソッドを使用しています。Val()メソッドは適切な型の数値に変換してくれますが、型があいまいなためCDec()メソッドで64ビット符号付の整数で管理した方が良い場合もあります。
10進数に変換した結果をLabelのTextBoxで指定して結果を表示します。
TextBox2:入力するテキストを16進数の文字に制限する
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
Select Case e.KeyChar
Case "0" To "9"
Case "a" To "f"
e.KeyChar = Chr(Asc(e.KeyChar) - Asc("a") + Asc("A"))
Case "A" To "F"
Case ControlChars.Back
Case ControlChars.CrLf
Case Else
e.KeyChar = Nothing
End Select
End Sub
TextBox2に入力するテキストを制限するためキーボード入力でイベントが発生するKeyPressイベントで入力された文字を判定します。
イベントが発生するとSystem.Windows.Forms.KeyPressEventArgsクラスでインスタンス化した引数のeにイベントデータが格納されます。KeyCharプロパティに入力されたキーのアスキーコードが格納されているためKeyCharの値で入力を許可する文字であるかの判定を行います。
許可する文字をSelect Case分のCaseで指定します。指定しない文字列はCase ElseとしてKeyCharをNothingに書き換えて入力を無視します。
16進数の値に入力を限定するため許可する文字は0~9、A~Fになります。小文字のa~fを入力した場合アスキーコードの演算でA~Fに置き換えます。また入力を修正のしやすさのためバックスペースキ許可します。
動作確認(デバッグ)
イベントの処理を追加した後は動作確認(デバッグ)を行います。デバッグは実際のアプリケーションの動作を模擬して実行するものです。デバッグの開始はエディタ上部の「▶開始」をクリックすると開始します。
TextBox1の初期テキストはそのままでTextBox2のテキスト3E8に変更します。「テキスト変換」をクリックするとTextBox1のテキストをUTF-8及びSHIFT-JISで変換したバイナリデータを表示します。
文字コードによってバイナリデータが異なっていることが分かります。次に「データ変換」をクリックするとボタン下のラベルにバイナリデータをUTF-8及びSHIFT-JISのテキストに変換します。
TextBox1のテキストと同様の文字になっていることが分かります。また、TextBox2に入力した16進数の3E8が10進数に変換されて1000になっていることが分かります。
変換して元に戻しているだけなので同様の文字になるのは自明ですが、文字コードが異なる場合の結果についても確認します。
ソースコードでTextBox1のテキストをバイナリデータに変換する際にUTF-8ではなく規定値の0でデータ変換します。
Dim data() As Byte = Encoding.GetEncoding(0).GetBytes(TextBox1.Text)
「テキスト変換」をクリックするとUTF-8と異なる結果になっています。この状態で「データ変換」をクリックするとUTF-8でテキストを変換しようとするため、変換ができず文字化けしていることが分かります。
同一のアプリを使用する場合であってもコンピューター端末によってページコードの規定値が異なれば文字化けの原因になるためページコードを明確に指定することを推奨します。
コードのデバッグを行う場合は、コードエディタでブレークポイントを置くことで一時的にプログラムを停止させることができます。
ブレークポイントはコードエディターの最左部分をクリックして●マークが表示されれば設置できています。例ではButton1がクリックされた時に発生したイベントの先頭部分にブレークポイントを置いています。この状態でButton1をクリックするとブレークポイントでプログラムが一時停止します。
F11を押すとステップ実行になるため1行ずつ内容を確認しながらデバッグを行うことができます。上部の「▶続行(C)」をクリックするとブレークポイント状態から通常の動作に復帰します。
PR:(即戦力のスキルを身に着ける:DMM WEBCAMP 学習コース(はじめてのプログラミングコース))
ソースコード全体
以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。
Imports System.Text
Public Class Form1
Dim txtbuf() As Byte '文字のバイナリデータを格納
Dim txtbuf2() As Byte
Dim txtbuf3() As Byte
Private Sub TextDatachg()
'Dim data() As Byte = Encoding.GetEncoding(codepage:=65001).GetBytes(TextBox1.Text)
Dim data() As Byte = Encoding.GetEncoding(0).GetBytes(TextBox1.Text)
Dim data2() As Byte = Encoding.GetEncoding("shift-jis").GetBytes(TextBox1.Text)
Dim data3() As Byte = Encoding.GetEncoding("utf-8").GetBytes(TextBox2.Text)
Dim str As String = ""
Dim str2 As String = ""
Dim i As Integer
txtbuf = data
For i = 0 To data.Length - 1
str &= data(i)
str &= " "
Next
txtbuf2 = data2
For i = 0 To data2.Length - 1
str2 &= data2(i)
str2 &= " "
Next
txtbuf3 = data3
Label1.Text = str
Label2.Text = str2
End Sub
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox2.KeyPress
Select Case e.KeyChar
Case "0" To "9"
Case "a" To "f"
e.KeyChar = Chr(Asc(e.KeyChar) - Asc("a") + Asc("A"))
Case "A" To "F"
Case ControlChars.Back
Case ControlChars.CrLf
Case Else
e.KeyChar = Nothing
End Select
End Sub
Private Sub DataTextchg()
Dim str As String = ""
Dim str2 As String = ""
Dim str3 As String = ""
If txtbuf IsNot Nothing Then
str = Encoding.GetEncoding("utf-8").GetString(txtbuf)
End If
If txtbuf2 IsNot Nothing Then
str2 = Encoding.GetEncoding("shift-jis").GetString(txtbuf2)
End If
If txtbuf3 IsNot Nothing Then
str3 = Encoding.GetEncoding("utf-8").GetString(txtbuf3)
str3 = "&h" & str3
End If
Label7.Text = str
Label8.Text = str2
Label10.Text = Val(str3)
'Label10.Text = CDec(str3)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextDatachg()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
DataTextchg()
End Sub
End Class
コントロールの番号やイベントハンドラーなどのプロパティ名などを変更している場合はソースコードのイベントハンドラーをお使いのイベントハンドラーに置き換えてください。
関連リンク
VB.NET(VB2022)のデスクトップアプリで動作確認したことを下記リンクにまとめています。
VB.NET(VB2022)のデスクトップアプリ開発でできること
マイクロソフトはVisual Studio以外にもVSCodeという便利なエディターを提供しています。下記リンクではVSCodeのインストールの仕方からC言語開発環境の作り方までをまとめています。
PR:無料トライアル実施中【PC専用】AIスライド資料作成ツールの利用:イルシル
最後まで、読んでいただきありがとうございました。