views:

52

answers:

2

Hi, I started to learn VB.NET and I'm trying to do a syntax highlight. The problem occurs when i set the color of selected text. It changes the whole richtextbox's content.

Private Sub txtText_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtbText.TextChanged
    Dim keywords As ArrayList
    Dim index As Integer
    Dim keyboardCursorPosition As Integer

    keywords = New ArrayList()

    keywords.Add(New Keyword("<?php", Color.Red))
    keywords.Add(New Keyword("echo", Color.Blue))
    keywords.Add(New Keyword("?>", Color.Red))

    keyboardCursorPosition = rtbText.SelectionStart

    For Each keyword As Keyword In keywords
        index = rtbText.Text.IndexOf(keyword.getKey())

        If index <> -1 Then
            rtbText.Select(index, keyword.getKey().Length)
            rtbText.SelectionColor = keyword.getColor()

            rtbText.DeselectAll()
            rtbText.SelectionStart = keyboardCursorPosition
        End If

    Next
End Sub
+2  A: 

You are pretty close. Don't forget to restore the SelectionColor:

    Dim prevColor As Color = rtbText.SelectionColor
    For Each keyword As KeyWord In keywords
        '' etc...
    Next
    rtbText.SelectionColor = prevColor

Btw: keep your code clean. A message handler for an rtb should not be named txtXxxx. These little details will screw you up sooner or later (it did for me, looking for the wrong reason). Also move the keyword initialization out of the method.

Hans Passant
Ah, I thought that was it was but I decided to try it before posting an answer and I couldn't understand why it didn't work (for some reason I put the `rtbText.SelectionColor = prevColor` right after the `DeselectAll`...), thanks for making me feel less confused :)
ho1
A: 

Well, try rename the variable and see if it helps

For Each key As KeyWord In keywords
Cauly