0

TextBox (WFP、しかしこれはここでは問題にならないはずです) の入力フィルターを作成する際にいくつかの困難に直面していますが、 すべて
の入力を抑制する必要があります : +、-、*、/


はい、目標は一種の数式評価を行うことです。この部分は、Sriptcontrol-Method でうまく機能します ( http://www.vb-tips.com/Eval.aspxから) また、Regex でフィルター処理するいくつかのリードを見つけました (申し訳ありませんが、ソースを思い出せません...) :

 Regex("[\d\(\)\+\-\*\/]")

問題は、たとえば文字 '+' が e.Key 引数に表示されないこと
です NumPad-'+' を押すと
e.Key=85
e.Key.Tostring=Add

キーボード '+'
e.Keyから試行中=141
e.Key.ToString=OemPlus

したがって、正規表現はこれらの許可された文字に一致するものを見つけることはありません。
Windows は私が打ったキーを認識し、表示された文字をキーボードに配置するので、ユーザーが打とうとしているキーを「正確に」キャ​​ッチする方法が必要であるに違いありません :-)
また、修飾子を抑制する必要がありました- chars (AltGr+2: ドイツ語レイアウトの四角形など)

ここに私のコードを貼り付けます (実験中のため、少し乱雑になる可能性があります)

        Private Sub tb_PreviewKeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs) Handles TB0.PreviewKeyDown
        Dim s As TextBox = sender
        Debug.WriteLine(e.Key.ToString & " -" & e.Key)
        Dim rx As New Regex("[\d\(\)\+\-\*\/]|Add|Subtract|Divide|Multiply|Return|Tab|Back")
        If Not rx.IsMatch(e.Key.ToString) Then
            e.Handled = True
            Return
        End If
        If e.Key = Key.Enter Or e.Key = Key.Tab Then
            If s.Text.Trim = "" Then Return
            If Not IsNumeric(s.Text) Then
                Try
                    Dim ev As New MSScriptControl.ScriptControl
                    ev.Language = "VBScript"
                    ev.AllowUI = False
                    ev.Reset()
                    s.Text = CStr(Math.Round(CDbl(ev.Eval(s.Text))))
                    s.SelectAll()
                Catch ex As Exception
                    s.SelectAll()
                    e.Handled = True
                    Return
                End Try
            End If
            s.SelectAll()
        End If
    End Sub


これに関するヒントは大歓迎です。
前もって感謝します、
ダニエル

4

1 に答える 1