Если вы не хотите, чтобы пользователь дважды щелкнул, как предложил Дэвид Уилсон (с чем я бы тоже согласился), тогда вы получите желаемый результат. Он учитывает, является ли предыдущий символ переводом строки или началом текста, либо следующий символ также переводом строки или концом текста. Вы можете добавить к If
, чтобы найти «,» или «.» если нужно.
Private Sub TextBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles TextBox1.MouseDown
If e.Clicks = 1 And e.Button = MouseButtons.Left Then
Dim startIndex As Integer = TextBox1.SelectionStart
Dim wordStartFound, wordEndFound As Boolean
Dim nextIndex, indexOfStartOfWord, indexOfEndOfWord, lengthOfWord As Integer
If Not startIndex = 0 Then
While Not wordStartFound
startIndex = startIndex - 1
If TextBox1.Text.Chars(startIndex) = " " Then
indexOfStartOfWord = startIndex + 1
wordStartFound = True
ElseIf startIndex = 0 Then
indexOfStartOfWord = startIndex
wordStartFound = True
ElseIf TextBox1.Text.Chars(startIndex) = Chr(10) Then 'Line Feed'
indexOfStartOfWord = startIndex + 1
wordStartFound = True
End If
End While
Else
indexOfStartOfWord = startIndex
End If
nextIndex = startIndex
While Not wordEndFound
nextIndex = nextIndex + 1
If TextBox1.Text.Chars(nextIndex) = " " Then
indexOfEndOfWord = nextIndex
wordEndFound = True
ElseIf nextIndex = TextBox1.TextLength - 1 Then
indexOfEndOfWord = TextBox1.TextLength
wordEndFound = True
ElseIf TextBox1.Text.Chars(nextIndex) = Chr(10) Then 'Line Feed'
indexOfEndOfWord = nextIndex
wordEndFound = True
End If
End While
lengthOfWord = indexOfEndOfWord - indexOfStartOfWord
Label2.Text = TextBox1.Text.Substring(indexOfStartOfWord, lengthOfWord)
End If
End Sub
Также в вашей функции GetWordByIndex
вы разбиваете входную строку на массив
Dim words = input.Split(" ")
тогда вы говорите
If (index < 0) OrElse (index > words.Length - 1) Then
Throw New IndexOutOfRangeException("Index out of range!")
End If
но когда вы вызываете .length
для массива, он возвращает количество строк (или что-то еще в массиве). Например, если ввод был "Большая коричневая лиса перепрыгнула через ленивую собаку", words.length - 1
вернет 8. Таким образом, если ваш индекс, через который вы проходите, является началом слова «over», оно попадет в Throw New IndexOutOfRangeException("Index out of range!")
, так как индекс будет 26, что, очевидно, больше 8.
Код, который я предоставил, не использует функцию для поиска слова, но я все равно хотел бы упомянуть об этом.