ошибка выделения синтаксиса (только при запуске строки) - PullRequest
0 голосов
/ 26 мая 2018

Я использовал этот код (source = youtube)

Он работает нормально, но единственная проблема в том, что он не выделяет первый символ строки после ( строка 0 )

Мой код:

    If e.KeyCode = Keys.Space Or e.KeyCode = Keys.Back Or e.KeyCode = Keys.Enter Then
        Dim selectionlength As Integer = RichTextBox1.SelectionLength
        Dim selectionstart As Integer = RichTextBox1.SelectionStart
        Dim letter As String = String.Empty
        Do Until letter = " " Or RichTextBox1.SelectionStart = 0
            RichTextBox1.SelectionStart -= 1
            RichTextBox1.SelectionLength += 1
            letter = RichTextBox1.Text.Substring(RichTextBox1.SelectionStart, 1)
        Loop
        If RichTextBox1.SelectedText = "Hello" Or RichTextBox1.SelectedText = " Hello" Then
            RichTextBox1.SelectionColor = Color.HotPink
        ElseIf RichTextBox1.SelectedText = "Dinesh" Or RichTextBox1.SelectedText = " Dinesh" Then
            RichTextBox1.SelectionColor = Color.Peru
        Else
            RichTextBox1.SelectionColor = Color.White
        End If
        RichTextBox1.SelectionStart = selectionstart
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionColor = Color.White
    End If

Вывод: Снимок экрана

Вы можете видеть вывод из прикрепленного скриншота.

Зеленые стрелки (нарисованные мной) указываютслово Hello и Dinesh не выделяются.

Я использовал несколько техник, таких как текстовое поле Fastcolored, которое мне нравится больше всего, но я хочу работать над нимЭто очень простой метод, потому что моя программа не очень большая.

Пожалуйста, дайте мне некоторое представление, где мне нужно будет внести изменения.

Вы можете ответить на vb.net или наc #.

Заранее спасибо.

Это приложение в форме окна, а не WPF

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Это решит вашу проблему:

   If e.KeyCode = Keys.Space Or e.KeyCode = Keys.Enter Then
        Dim selstrt As Integer = RichTextBox1.SelectionStart
        Dim charc As String = String.Empty
        Dim first = RichTextBox1.GetFirstCharIndexOfCurrentLine
        Do Until charc = " " Or RichTextBox1.SelectionStart = 0 OrElse RichTextBox1.SelectionStart = first
            RichTextBox1.SelectionStart = RichTextBox1.SelectionStart - 1
            RichTextBox1.SelectionLength = RichTextBox1.SelectionLength + 1
            charc = RichTextBox1.Text.Substring(RichTextBox1.SelectionStart, 1)
        Loop
        If RichTextBox1.SelectedText = "Hello" Or RichTextBox1.SelectedText = " Hello" Then
            RichTextBox1.SelectionColor = Color.HotPink
        ElseIf RichTextBox1.SelectedText = "Dinesh" Or RichTextBox1.SelectedText = " Dinesh" Then
            RichTextBox1.SelectionColor = Color.LightGreen
        Else
            RichTextBox1.SelectionColor = Color.White
        End If
        RichTextBox1.SelectionStart = selstrt
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionColor = Color.White
 End If
0 голосов
/ 26 мая 2018

Ваша проблема Do Until letter = " " Or RichTextBox1.SelectionStart = 0

Простой шаг с использованием отладчика и просмотра значений показал бы это довольно быстро.Было бы показано, что (используя слово Hello), когда selectionstart равен 0, цикл заканчивается, но вам все еще нужно обработать этот цикл еще раз, потому что в тот момент, когда он возвращается к 0, вы находитесь только на e.Решение этой проблемы состоит в том, чтобы изменить это на цикл до.

        Do
            RichTextBox1.SelectionStart -= 1
            RichTextBox1.SelectionLength += 1
            letter = RichTextBox1.Text.Substring(RichTextBox1.SelectionStart, 1)
        Loop Until letter = " " Or letter Or = vbLf Or RichTextBox1.SelectionStart = 0

Теперь следующая проблема, с которой вы столкнулись, заключается в том, что во второй строке вы не достигнете 0 "", но вы хотите закончить поиск там, так чтовам нужно включить тест для vbLf (символ перевода строки, когда происходит, когда кто-то нажимает клавишу ввода, чтобы перейти на новую строку.

Теперь, когда у вас есть новая точка остановки, вам нужно будет включить ее в свой чекдля изменения цвета

    If RichTextBox1.SelectedText = "Hello" OrElse RichTextBox1.SelectedText = " Hello" OrElse RichTextBox1.SelectedText = vbLf & "Hello" Then
            RichTextBox1.SelectionColor = Color.HotPink
    ElseIf RichTextBox1.SelectedText = "Dinesh" OrElse RichTextBox1.SelectedText = " Dinesh" OrElse RichTextBox1.SelectedText = vbLf & "Dinesh" Then
            RichTextBox1.SelectionColor = Color.Peru
    Else

Как вы можете видеть, это станет огромным блоком кода, когда вы добавите в него новые команды и правила. Например, у вас есть проблемы с пунктуацией. Этот код будетне раскрашивайте Dinesh в следующем примере: Hello is your name Dinesh? из-за?

Еще один способ форматирования кода, который я видел, - сканировать текущую строку, в которой находится пользователь, по списку известных ключевых слов, а затемотформатируйте строку в соответствии с вашими правилами форматирования для любых найденных ключевых слов. Поскольку существует способ поиска неполного текста (например, найти Динеш в Динеш?), это уменьшиткод.

Редактировать: Также забыл упомянуть.Этот код завершится сбоем, если первым символом будет пробел, Enter или Backspace.Ты знаешь почему?это простое исправление, поэтому я оставлю это на ваше усмотрение.

...