PR

VB.NET(VB2022)のTextBoxの実装とイベントの追加方法

VB.NET
本記事はプロモーションが含まれています。

こんにちは、ENGかぴです。

VB.NET(Visual Basic 2022)はMicroSoft社がVisual Studioで提供している開発環境です。Visual Basic 2022のデスクトップアプリでテキストボックス(TextBox)の実装とイベントの追加方法をまとめました。

TextBoxを実装したアプリの動作確認としてテキストボックスに入力した文字列をバイナリデータに変換して表示します。また、テキストボックスに入力する文字に制限をかけて16進数の文字列を10進数に変換して表示します。

以下は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 FormsからTextBoxを選択します。Form1を任意の名称に変更している場合はForm1を変更した名前に置き換えて下さい。

TextBoxの追加
TextBoxの追加

TextBoxを選択した状態でForm1.vb[デザイン]内を動くマウスのポインタが選択したコントロールのアイコンになるので、左クリックするとボタンが配置されます。左クリックした状態でマウスを移動することでサイズを調整しながら配置することもできます。

マウスによる配置の移動やサイズの移動もできますが、コントロールのプロパティで直接指定する方法もあります。プロパティで直接指定する方法でボタンの位置とサイズを指定する方法を説明します。本記事で使用するプロパティ項目は以下の通りです。

項目説明
Textテキストボックスの初期の文字を指定する。
Location フレーム上部左端から見た時のコントロール左上の座標を指定する。
Sizeコントロールのサイズを指定する。
KeyPress入力するテキストを制限する。
使用するプロパティの項目

TextBoxに入力する文字が多くなるとサイズプロパティを超えてしまって全体の文字が見えなくなるため入力する内容に応じて適切なサイズになるように調整することをお勧めします。

複数行文字を入力する場合はMultilineプロパティをTrueにすることでHeight方向にTextBoxを広げて配置することができます。また、CRLF(改行:リターンキー)を含めた文字を入力することができます。

広告

その他コントロールの実装

各種コントロールを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)に遷移します。次のイベントを追加します。

  1. Button1をクリックしたときに呼び出すClickイベント
  2. Button2をクリックしたときに呼び出すClickイベント
  3. TextBox2の入力するテキストを制限するKeyPressイベント

1と2のイベントは対象のボタンをダブルクリックすると追加されます。3のKeyPressイベントはコードエディターでイベントを追加します。

KeyPressイベントを追加する方法
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をページコード番号または文字列で指定する方法を記載しています。

ページコードに0を指定すると既定のページコード(私の環境ではSHIFT-JIS)を指定できます。使用するコンピューターによって規定値が異なることがあるため、規定値を使用すると意図せず文字化けなどの原因になることがあります。

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ビット符号付の整数で管理した方が良い場合もあります。

CDec()メソッドを使用する場合は数値のオーバーフローに注意する必要があるためサイズがオーバーしないように管理する必要があります。

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に置き換えます。また入力を修正のしやすさのためバックスペースキ許可します。

DeleteキーはKeyPressイベントに含まれていないためTextBoxの文字を削除することができます。

スポンサーリンク

動作確認(デバッグ)

イベントの処理を追加した後は動作確認(デバッグ)を行います。デバッグは実際のアプリケーションの動作を模擬して実行するものです。デバッグの開始はエディタ上部の「▶開始」をクリックすると開始します。

動作確認の結果
動作確認の結果

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言語開発環境の作り方までをまとめています。

VSCodeをインストールしてC/C++の開発環境を作る

PR: 未経験OK、20代の理系に特化した就職、転職サービス UZUZ(ウズウズ)

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました