Подсветка синтаксиса VB.NET в расширенном текстовом поле - PullRequest
2 голосов
/ 21 ноября 2008

Я пишу простой редактор кода для очень простого языка сценариев, который мы используем на работе. Мой код с подсветкой синтаксиса работает нормально, если я делаю это на всей RichTextBox (rtbMain), но когда я пытаюсь заставить его работать только на этой строке, чтобы я мог запустить функцию с изменениями rtbMain, это становится странным , Я не могу понять, почему. Правильно ли я об этом говорю?

rtbMain - основное текстовое поле. frmColors.lbRegExps - список слов, которые нужно выделить (позже он будет иметь несколько более мощные регулярные выражения.) frmColor.lbHexColors - это еще один список с соответствующими шестнадцатеричными цветами для слов.

Private Sub HighLight(ByVal All As Boolean)
    Dim RegExp As System.Text.RegularExpressions.MatchCollection
    Dim RegExpMatch As System.Text.RegularExpressions.Match
    Dim FirstCharIndex As Integer = rtbMain.GetFirstCharIndexOfCurrentLine
    Dim CurrentLine As Integer = rtbMain.GetLineFromCharIndex(FirstCharIndex)
    Dim CurrentLineText As String = rtbMain.Lines(CurrentLine)
    Dim CharsToCurrentLine As Integer = rtbMain.SelectionStart
    Dim PassNumber As Integer = 0

    LockWindowUpdate(Me.Handle.ToInt32) 'Let's lock the window so it doesn't scroll all crazy.
    If All = True Then 'Highlight everything.
        For Each pass In frmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
                rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
            Next
            PassNumber += 1
        Next
    Else 'Highlight just that row.
        For Each pass In FrmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(CurrentLineText), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index + (CharsToCurrentLine - RegExpMatch.Length), RegExpMatch.Length)
                rtbMain.SelectionColor = Color.Blue
            Next
        Next
    End If

    rtbMain.Select(CharsToCurrentLine, 0) 'Reset colors and positon and then unlock drawing.
    rtbMain.SelectionColor = Color.Black
    LockWindowUpdate(0)
End Sub

Ответы [ 3 ]

11 голосов
/ 22 ноября 2008

Хорошо, я понял это. Я вызывал функцию even для rtbMain.TextChange, думая, что это сработает, только если текст действительно изменился. Нет, нет, он также сработает, если форматирование будет изменено. таким образом, каждый раз, когда он что-то менял, когда делал первый проход и выделял все, он запускал, чтобы выделить строку. Это будет происходить до тех пор, пока не останется ничего изменить.

Я установил логическую переменную для погоды или нет, в данный момент она подсвечивалась, и добавил условие if внутри подпрограммы TextChange

P.S. У меня нет значка самообучения, поэтому приветствуются любые положительные оценки: P

2 голосов
/ 22 ноября 2008

Это на самом деле не отвечает на ваш вопрос, но если вы пишете свой собственный редактор, вам может быть лучше использовать некоторую существующую работу с открытым исходным кодом, которая была сделана для .NET. Я бы порекомендовал:

Синтаксис Роджера Алсинга 1004 *

0 голосов
/ 22 апреля 2009
Private Sub HighLight(ByVal All As Boolean)
    Dim RegExp As System.Text.RegularExpressions.MatchCollection
    Dim RegExpMatch As System.Text.RegularExpressions.Match
    Dim FirstCharIndex As Integer = rtbMain.GetFirstCharIndexOfCurrentLine
    Dim CurrentLine As Integer = rtbMain.GetLineFromCharIndex(FirstCharIndex)
    Dim CurrentLineText As String = rtbMain.Lines(CurrentLine)
    Dim CharsToCurrentLine As Integer = rtbMain.SelectionStart
    Dim PassNumber As Integer = 0

    LockWindowUpdate(Me.Handle.ToInt32) ''lets lock the window so it doesnt scroll all crazy 
    If All = True Then ''highlight everything
        For Each pass In frmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
                rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
            Next
            PassNumber += 1
        Next
    Else ''higlight just that row 
        For Each pass In FrmColors.lbRegExps.Items
            RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(CurrentLineText), LCase(pass))
            For Each RegExpMatch In RegExp
                rtbMain.Select(RegExpMatch.Index + (CharsToCurrentLine - RegExpMatch.Length), RegExpMatch.Length)
                rtbMain.SelectionColor = Color.Blue
            Next
        Next
    End If

    rtbMain.Select(CharsToCurrentLine, 0) ''reset colors and positon and then unlock drawing
    rtbMain.SelectionColor = Color.Black
    LockWindowUpdate(0)
End Sub
...