ここに新しいポスターとある種の VB ハックがあります。
画像ボックスと 3 つのテキスト ボックスを含む Windows フォームがあります。3 つのテキストボックス (赤、緑、青) を使用して、カラー コードを表す 000 から 255 までの数値を入力します。PictureBox は、3 つの TextBox 値から得られた色を表示します。
私の検証ルーチン ValidDecCode は、入力された値が許容範囲内 (000-255) であることを確認します。
ユーザーが最初の位置に「2」を入力すると、すべて問題ありません。ユーザーが 2 番目の位置に「6」を入力すると、検証テストに合格しません。
KeyDown イベントに入った後、sender.selectionstart と sender.text の値を保存します。'6' を入力すると、selectionstart は 1 になり、テキストには検証済みのデータ '2' が含まれます。
「6」が検証テストに失敗したら、MessageBox を表示し、保存した送信者データ、テキスト、選択開始をリロードします。これにより、フォームは「6」を入力する前の状態に戻ります。TextBox には「2」が表示され、カーソルは「2」の後に配置されます。
私が奇妙だと思うのは、 MessageBox.Show() 行をコメントアウトすると、検証に失敗した後に TextBox に「26」が表示されることです。MessageBox.Show() 行ではなく、送信者データのリロードをコメント アウトすると、TextBox に「26」と表示されます。
MessageBox.Show() 行をコメントアウトしてもフォームが無効なデータを入力する前の状態に戻らない理由と、それに対して何ができるかを知りたいです。それを機能させる MessageBox の呼び出しについてはどうですか?
Private Sub RedBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles RedBox.KeyDown, GreenBox.KeyDown, BlueBox.KeyDown
Dim InChr As String
Dim InPos As Integer = sender.selectionstart
Dim InText As String = sender.text
If IsNumeric(Chr(e.KeyCode)) Then
InChr = Chr(e.KeyValue)
If Not ValidDecCode(InText + InChr, InPos) Then
MessageBox.Show("Invalid value")
sender.text = InText
sender.selectionstart = InPos
End If
Else
MessageBox.Show("Invalid value")
sender.Text = InText
sender.selectionstart = InPos
Exit Sub
End If
End Sub