2016-01-27 4 views
1

Итак, моя программа читает текстовый файл в richtextbox. Например, я хочу, чтобы все слова "echo" "pause" "setlocal" to be blue, "%" to be orange», "rem" "::" to be green и так далее. Много разных слов получить разные цвета. Да, идея так RichTextBox читает .bat файлы, такие как Notepad ++ сделать цвет-накрест.VB.net richtextbox несколько цветов для указанных слов

Я понял, как установить цвет к одному слову

Private Sub PreviewRTB_TextChanged(sender As Object, e As EventArgs) Handles PreviewRTB.TextChanged 
    PreviewRTB.Multiline = True 
    PreviewRTB.ScrollBars = ScrollBars.Vertical 

    'Set Colors 
    Dim index As Integer = 0 
    Dim c_blue As String = "Echo" 

    While index <> -1 
     index = PreviewRTB.Find(c_blue, index, RichTextBoxFinds.WholeWord) 
     If index <> -1 Then 
      PreviewRTB.SelectionStart = index 
      PreviewRTB.SelectionLength = c_blue.Length 
      PreviewRTB.SelectionColor = Color.Blue 
      index += c_blue.Length 
     End If 
    End While 

но где я поставил остальные слова при тусклом c_blue? Я попытался Dim c_blue As String = "Echo" & "setlocal" & "pause" также пытался использовать + между ними, как хорошо, но это Безразлично» t Работа. И как я продвигаюсь, чтобы добавить другой цвет к другим словам? Спасибо!

+0

Если вы действительно не хотите делать эту часть самостоятельно, вам лучше использовать что-то специально для этого - например [ScintillaNET] (https://github.com/jacobslusser/ScintillaNET). –

ответ

1

Для простого окрашивания, при условии, что текст не слишком долго, что-то, как это будет делать:

Dim KeyWords As List(Of String) = New List(Of String)(New String() {"this", "word", "color"}) 
Dim KeyWordsColors As List(Of Color) = New List(Of Color)(New Color() {Color.Blue, Color.Red, Color.Green}) 
Private Sub PreviewRTB_TextChanged(sender As Object, e As EventArgs) Handles PreviewRTB.TextChanged 
    Dim words As IEnumerable(Of String) = PreviewRTB.Text.Split(New Char() {" "c, ".", ",", "?", "!"}) 
    Dim index As Integer = 0 
    Dim rtb As RichTextBox = sender 'to give normal color according to the base fore color 
    For Each word As String In words 
     'If the list contains the word, then color it specially. Else, color it normally 
     'Edit: Trim() is added such that it may guarantee the empty space after word does not cause error 
     coloringRTB(sender, index, word.Length, If(KeyWords.Contains(word.ToLower().Trim()), KeyWordsColors(KeyWords.IndexOf(word.ToLower().Trim())), rtb.ForeColor)) 
     index = index + word.Length + 1 '1 is for the whitespace, though Trimmed, original word.Length is still used to advance 
    Next 
End Sub 

Private Sub coloringRTB(rtb As RichTextBox, index As Integer, length As Integer, color As Color) 
    Dim selectionStartSave As Integer = rtb.SelectionStart 'to return this back to its original position 
    rtb.SelectionStart = index 
    rtb.SelectionLength = length 
    rtb.SelectionColor = color 
    rtb.SelectionLength = 0 
    rtb.SelectionStart = selectionStartSave 
    rtb.SelectionColor = rtb.ForeColor 'return back to the original color 
End Sub 

Идея здесь довольно прямо вперед:

  1. Список слова, которые вы хотите, чтобы цвет
  2. Список цвета этих слов
  3. Когда текст RTB изменяется, разобрать его String.Split слово за словом (заметим, что условие «РТБ текст изменен» может быть изменено все, что вы хотите)
  4. Проверьте проанализированное слово. Если он найден, начните окрашивать это слово. Если нет, покрасьте его цветом по умолчанию
  5. Перейти к следующему слову, до завершения чтения текста.
  6. Не забудьте увеличить текущий индекс проверки в соответствии с word.Length+1 для пробельных

Результат будет выглядеть примерно так:

enter image description here

Следующая (2)

enter image description here

Next (3)

enter image description here

Следующая (4)

enter image description here

Следующая (5)

enter image description here

Примечание: Если текст становится слишком длинным , подумайте о создании таймера (или около ), чтобы периодически проверять RTB вместо проверки текста при изменении текста. Таким образом, когда текст изменился. Вы сбросите таймер . Когда текст иногда не изменяется, вы начинаете с реализовать логику раскраски для всего текста. Таким образом, вы значительно улучшите работу проверки цвета слова .

+0

Спасибо за отличный вклад. Дайте это попробовать очень скоро. – MadsTheMan

+0

@MadsTheMan да :) для простого текста, это будет делать. Это определенно не достаточно хорошо, если вы хотите проверить что-то сложное, как код на C#, хотя ... – Ian

+0

Достаточно справедливо, я думаю, что это будет сделано для моих целей. :) Я тестирую его сейчас. До сих пор я вижу, что выход работает, когда у него есть «!» "" "?" любой из тех, что вы указали в части text.split. Однако «" (пространство), похоже, не работает. Так, например, вывод 'echo' не выводит цвет, но' echo! 'Дает цвет эха. Любые идеи, почему это так? Это то, что у меня есть в расколе 'PreviewRTB.Text.Split (New Char() {" "," c ".", ",", "?", "!"}) ' – MadsTheMan