2008-11-21 2 views
2

Я кодирую простой редактор кода для очень простого языка сценариев, который мы используем на работе. Мой код подсветки синтаксиса отлично работает, если я делаю это на всем RichTextBox (rtbMain), но когда я пытаюсь заставить его работать только на этой строке, я могу запустить функцию с изменениями rtbMain, это становится странным. Я не могу понять, почему. Неужели я так и делаю?Выделение синтаксиса VB.NET в Rich Text Box

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 
+0

Что вы имеете в виду "это становится странно"? – EndangeredMassa 2008-11-21 15:08:11

ответ

11

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

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

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

2

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

Roger Alsing-х SyntaxBox

0
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 
Смежные вопросы