1

基本的に、次のようなテキストボックスに一連の行があります。

### = 1232, 1234, 1236, 1238, 123A, 123C ; comment here テキストボックスのキャレット(カーソルパイプのもの)が次のような数字になっているときにボタンを表示したいと思います。

... , 12|31, ....または ... , 123|1, ....など(パイプはカレットです)

数字に含まれているかどうかを確認し、ボタンがクリックされたときに数字を取得するコードを記述しましたが、selectionchangedイベントにコードを挿入すると正しく機能しません。

ああ、数字は最大8桁の長さと16進数にすることができます。

4

1 に答える 1

1

TextBoxには、ユーザーがキャレットを移動したことを通知するイベントはありません。Application.OnIdleイベントで可能なものを合成する必要があります。すべての入力イベント(マウス、キーボード)が処理された後に実行されます。少し余分な不要な作業を行いますが、このコードは「人間の時間」で実行されるため、気付くことはありません。例えば:

Public Class Form1

  Public Sub New()
    InitializeComponent()
    AddHandler Application.Idle, AddressOf UpdateButtonState
  End Sub

  Private Sub updateButtonState(ByVal sender As Object, ByVal e As EventArgs)
    Const hexdigits As String = "0123456789ABCDEF"
    Dim caretPos As Integer = TextBox1.SelectionStart
    Dim enable As Boolean = caretPos > 0 AndAlso caretPos < TextBox1.Text.Length
    If enable Then
      Dim left As Char = Char.ToUpper(TextBox1.Text(caretPos - 1))
      Dim right As Char = Char.ToUpper(TextBox1.Text(caretPos))
      If Not hexdigits.Contains(left) OrElse Not hexdigits.Contains(right) Then enable = False
    End If
    Button1.Enabled = enable
  End Sub
End Class

余分な作業が気になる場合は、テキストボックスにフォーカスがあるかどうかを確認し、最後のSelectionStart値を追跡します。

于 2009-12-27T13:05:52.550 に答える