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
これに関するヒントは大歓迎です。
前もって感謝します、
ダニエル