RichTextBox. Изменения цвета текста выбранных слов

Loner95

Доброе время суток))Помогите пожалуйста с решением моей задачи.. И так вот собственно и сама задача у нас есть RichTextBox, так же нужен как я уже успел понять массив. В который я указу те слова которые будут окрашиваться в цвет (тот что я задам). но у меня пока не выходит это сделать(( пытался изучить в просторах интернета но в голову влезло слишком много информации не нужной и я окончательно запутался.. Помогите пожалуйста...так же на этом форуме набрел на следующий код
Dim Words_dont_come_easy = {"ey", "ye", "tratata"}
For Each Slovo In Words_dont_come_easy
            Dim Sovpadeniya As MatchCollection = Regex.Matches(WhereFind, Slovo, RegexOptions.IgnoreCase)
            For Each Sovpalo In Sovpadeniya
                RichTextBox1.SelectionStart = Sovpalo.Index
                RichTextBox1.SelectionLength = Sovpalo.Length
                RichTextBox1.SelectionBackColor = Color.DarkGreen
                RichTextBox1.SelectionColor = Color.Red
            Next Sovpalo
Next Slovo
но код не работает да и среда ругается на него.так же нашел еще вот фрагмент кода, но он не подойдет так как тут программа перекрасит одно слово только.. А планировалось несколько..
Dim Words_dont_come_easy As String = "ey"
        Dim allIp As MatchCollection = Regex.Matches(RichTextBox1.Text, Words_dont_come_easy)
        For Each ip As Match In allIp
            RichTextBox1.SelectionStart = ip.Index
            RichTextBox1.SelectionLength = ip.Length
            RichTextBox1.SelectionBackColor = Color.DarkGreen
            RichTextBox1.SelectionColor = Color.Yellow
        Next
Заранее большое спасибо.
14 ответов

Loner95

перекрасит одно слово только
Маски допишите через прямую черту
        Dim Words_dont_come_easy As String = "поиск|обработчик"
        Dim allIp As MatchCollection = Regex.Matches(RichTextBox1.Text, Words_dont_come_easy)
        For Each ip As Match In allIp
            RichTextBox1.SelectionStart = ip.Index
            RichTextBox1.SelectionLength = ip.Length
            RichTextBox1.SelectionBackColor = Color.DarkGreen
            RichTextBox1.SelectionColor = Color.Yellow
        Next


Loner95

Спасибо большое))А что нужно будет сделать если мне нужно будет 2 массива для проверки? скажем так в первом массиве я напишу так что бы слова он окрашивал одним цветом а в другом естественно другим цветом..


Loner95

Loner95, выполнить данную процкдуру еще раз, но с другим цветом и другой маской слов. Но лучще делать все сразу в одном цикле, но с разными условиями.


Loner95

Вот такой интересный баг я нашел Вставил код в RichTextBox
Dim Words_dont_come_easy As String = "ура|опа"
        Dim allIp As MatchCollection = Regex.Matches(RichTextBox1.Text, Words_dont_come_easy)
        For Each ip As Match In allIp
            RichTextBox1.SelectionStart = ip.Index
            RichTextBox1.SelectionLength = ip.Length
            RichTextBox1.SelectionBackColor = Color.White
            RichTextBox1.SelectionColor = Color.Red
        Next
Получилось вот что: пишу текст скажем так фразу "Привет мир!!" потом нажимаю Enter что бы перейти на следующую строку пишу дальше то слово что указанно в коде "Ура" получается все так как на картинке 1. Потом нажимаю Enter и происходит следующие. Удаляется слово "Ура" а курсор потом спускается на следующую строку. Почему все так ?


Loner95

выполнить данную процкдуру еще раз, но с другим цветом и другой маской слов. Но лучще делать все сразу в одном цикле, но с разными условиями.
Интересно даже стало.. Но как это будет выглядеть могли бы вы продемонстрировать?


Loner95

баг
Это не баг, если Вы выделяете текст - то снимайте выделение.
Но как это будет выглядеть могли бы вы продемонстрировать?
Да ничего там особо интересного нет, заводите хеш-таблицу с ключами-цветами и в бой
        Dim HT As New Hashtable
        HT.Add("Dim", Color.Red)
        HT.Add("String", Color.Blue)
        HT.Add("As", Color.Green)
        HT.Add("RichTextBox1", Color.Cyan)
 
        Dim Words_dont_come_easy As String = String.Join("|", HT.Keys.Cast(Of String).ToArray)
        Dim allIp As MatchCollection = Regex.Matches(RichTextBox1.Text, Words_dont_come_easy)
        For Each ip As Match In allIp
            RichTextBox1.SelectionStart = ip.Index
            RichTextBox1.SelectionLength = ip.Length
            'RichTextBox1.SelectionBackColor = Color.Yellow
            RichTextBox1.SelectionColor = HT(ip.Value)
        Next
        RichTextBox1.SelectionLength = 0
Результат


Loner95

Это не баг, если Вы выделяете текст - то снимайте выделение.
нет я не выделяю сообщение я просто как обычно в ворде пишу текст и пользуюсь пробелами и enterom и все.. Программа сама его выделяет


Loner95

Программа сама его выделяет
Ну я про это и говорю, обратите внимание, какая строчка добавилась в код.Программа сама выделять ничего не может, все, что она делает - программируете Вы, поэтому к Вам и обращение, а не к программе


Loner95

Ну я про это и говорю, обратите внимание, какая строчка добавилась в код. Программа сама выделять ничего не может, все, что она делает - программируете Вы, поэтому к Вам и обращение, а не к программе
Вот смотрите о чем я в данный момент говорю. Я видео залил на яндекс диск. качество не очень вышло записывал с телефона одной рукой)) смотрите внимательно за курсором "он сам прыгает на начало строки" https://yadi.sk/i/RfNVDYh0mWRQS


Loner95

качество не очень вышло
Главное, что оно не вертикальное. Кто снимает вертикальные видео - попадают в топ ютуба по просмотрам, а так же в ад.По вопросу - ну а чего Вы хотели? Этот код не рассчитан под набор текста в реальном времени. Если Вы собрались писать редактор кода, то имхо, лучше поискать что-нибудь готовое.В таком случае можно сделать кое-что:
    Dim HT As New Hashtable
    Dim CurPos As Integer
    Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
 
 
        Dim Words_dont_come_easy As String = String.Join("|", HT.Keys.Cast(Of String).ToArray)
        Dim allIp As MatchCollection = Regex.Matches(RichTextBox1.Text, Words_dont_come_easy)
        CurPos = RichTextBox1.SelectionStart
        For Each ip As Match In allIp
            RichTextBox1.SelectionStart = ip.Index
            RichTextBox1.SelectionLength = ip.Length
            'RichTextBox1.SelectionBackColor = Color.Yellow
            RichTextBox1.SelectionColor = HT(ip.Value)
        Next
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionStart = curpos
        RichTextBox1.SelectionColor = Color.Black
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        HT.Add("Dim", Color.Red)
        HT.Add("String", Color.Blue)
        HT.Add("As", Color.Green)
        HT.Add("RichTextBox1", Color.Cyan)
    End Sub
Это все не стоит свеч


Loner95

Если Вы собрались писать редактор кода, то имхо, лучше поискать что-нибудь готовое.
Был, кстати, топик в готовых решениях "Подсветка синтаксиса как в редакторах.": Visual Basic .NET FAQ. Готовые решения, полезные коды Visual Basic .NET FAQ. Готовые решения, полезные коды


Loner95

RoyDenzel, у Вас взлетел данный код? У меня нет. Надо его выпилить из фака, если он нерабочий


Loner95

RoyDenzel, у Вас взлетел данный код?
Потребности не было, не проверял, но из дальнейших постов, как я понял, все работаетПамирыч,


Loner95

Если кто-то проверит - отпишитесь, пожалста. Будем посмотреть