1

ここに新しいポスターとある種の 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
4

0 に答える 0