Ayuda con colores RichTextBox

Iniciado por Braayhaan, 3 Septiembre 2009, 02:12 AM

0 Miembros y 1 Visitante están viendo este tema.

Keyen Night

Si tambien me fije de eso habra que buscarle otra solución a eso tambien...
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Atrum

Pues yo intente hacer un ejemplo, espero sirva, aunque tiene problemas cuando escribes entre texto, podria servir de referencia


Private Reservadas As String() = _
    {"if", "then", "else", "echo", "@"} 'En este arreglo pones todas las palabras que quieras que aparezcan en color


    Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
        Dim i As Integer = RichTextBox1.SelectionStart
        Dim ActualCursor As Integer = RichTextBox1.SelectionStart 'recordar el punto de donde se estaba escribiendo
        Dim j As Integer = 0
        If i <> 0 Then 'evitar que el indice se salga del rango
            Do
                i = i - 1 'recorre en reversa hasta encontrar un espacio
                j = j + 1 'cuenta los caracteres de la palabra
            Loop While RichTextBox1.Text(i) <> CChar(" ") And i <> 0 'termina cuando encuentra un espacio
        End If
        Dim substring As String = RichTextBox1.Text.Substring(i, j).Trim() 'obtiene la ultima palabra escrita, quitandole los espacios

        If Reservadas.Contains(substring) Then 'comprobar que la palabra este en la lista
            RichTextBox1.Find(substring, RichTextBoxFinds.Reverse)
            RichTextBox1.SelectionColor = Color.Blue 'Colorea el texto
            RichTextBox1.SelectionStart = ActualCursor
        End If

        RichTextBox1.SelectionColor = Color.Black 'Vuelve al color primario
        RichTextBox1.SelectionStart = ActualCursor
    End Sub


Este codigo esta hecho en Visual studio 2008, espero que no este muy enrredado, espero sirva de algo amigo

Braayhaan

Esta exelente Xtriker me funciono perfectamente, algun tip para ponerle mas colores? no solo el azul.

Gracias de antemano  :xD

raul338

#13
Jó!! Xtriker me gano de mano xD xD

logre hacer esto, que solo falla cuando borras todo el texto (por eso el try xD), no titilea cuando tienes un texto muuuy largo ya que solo trabaja en la linea actual. Y tiene para los colores que tu quieras!!!!  ;D


Código (vbnet) [Seleccionar]
Dim lastPos As Integer ' Donde se estaba escribiendo
   Dim nLine As Integer   ' Linea donde se trabaja
   Dim start As Integer   ' Indice del principio de la linea dentro del texto
   Dim final As Integer   ' Fin de la linea (largo de la linea)

   Private Sub rtf_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtf.TextChanged
       ' "@" se colorea                         (NOTA: Funciona a medias, con el tema
       ' "@asfdasd" : @ se colorea        ( de que si se borra queda el color que estaba)
       colorear("@", Color.Red, False, False)
       ' "echo" se colorea
       ' "malechor" : echo no se colorea
       colorear("echo", Color.Blue, False)
   End Sub

   Sub colorear(ByVal clave As String, ByVal color As Color, Optional ByVal spaceAntes As Boolean = True, Optional ByVal spaceDespues As Boolean = True)
       Try
           ' Para recordar en que posicion estaba y no provocar problemas
           lastPos = rtf.SelectionStart
           ' Obtenemos la linea a trabajar
           nLine = rtf.GetLineFromCharIndex(lastPos)
           ' Obtenemos el indice de la linea (indice dentro de todo el texto, no conviene separar la linea en otra variable)
           start = rtf.GetFirstCharIndexOfCurrentLine()
           ' establecemos el limite para buscar la palabra clave
           final = rtf.Lines(nLine).Length

           ' Para saber si se tiene que escribir la palabra clave por separado
           If spaceAntes Then clave = " " & clave
           If spaceDespues Then clave = clave & " "

           ' Buscamos la palabra clave, si no esta, no hacemos nada
           If Not rtf.Text.IndexOf(clave, start, final) = -1 Then
               rtf.SelectionStart = rtf.Text.IndexOf(clave, start, final)
               rtf.SelectionLength = clave.Length ' Para no colorear demas....
               rtf.SelectionColor = color
           End If

           ' Volvemos a donde se estaba escribiendo, y al color normal
           rtf.SelectionStart = lastPos
           rtf.SelectionLength = 0
           rtf.SelectionColor = rtf.ForeColor
       Catch ex As Exception

       End Try
   End Sub


Tuve cierto problemita con los espacion, ya que si pones "Mecho" coloreaba "echo" en azul ¬¬ asi que bueno, tuve que ponerle esos parametros opcionales. aunque igual se entiende.....espero que te sirva!!!

Eso si, mi RichTextBox se llama rtf por las dudas  :P

Eso si, quiero estar en los creditos!!!!  ;D ;D ;D

EDIT: agregado comentarios
EDIT 2: probe la solucion de striker pero me tiro error en "Reservadas.Contains" por que no era array o algo asi me dio el error, igual lo suplante por un ForEach y solo me colorea si la palabra esta en la primera linea, no en cualquier otra... u.u

Braayhaan

Si me fije en eso del que puso Xtriker solo marca la primera linea, raul el tuyo esta perfecto pero hay alguna forma para ponerlo Asi como el de Xtriker? que se ponian todos los Comandos de Batch en una linea? porque son bastantes y tener que escribir colorear...."del".... es como mucho no xDD.

Disculpen tanto fastidio  :-[ :xD

raul338

jajajaj no seas vago y usa un for each o algo para recorrer un bucle xD
mira, te escribo el codigo a la volada

Código (vbnet) [Seleccionar]

    Dim palabras as New HashTable()
Public Sub Form_Load(....)....
    palabras.add("@", Color.Red)
    palabras.add("echo", Color.Blue)
End Sub

'.....

Private Sub rtf_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rtf.TextChanged
    For each s As String In palabras.Keys
        colorear(s, palabras(s))
    Next
End sub


no estoy seguro si funciona (dudo dentro del for each), pero bueno, lo acabo de inventar recien, fijate si te sirve

Braayhaan

mmm no me funka Raul, bueno de todas formas voy a seguir chequeando por mi cuenta creo que ya los moleste bastante :xD.


Posdata: Felicitaciones es tu mensaje 100!  :xD

Atrum

Es curioso como se comporta el RichTextBox con el codigo que utilizé, por que al editar una parte intermedia del texto me selecciona hacia adelante algunos espacios, jeje, y a mi si me funciona en todas las lineas  :huh:  , realmente al leer el post por primera vez crei que seria mas simple, unas 4 lineas y ya, pero resulto interesante intentar, en fin, bueno aqui hay otra idea, aunque tambien tiene varios fallos

Código (vbnet) [Seleccionar]

Private ReservadasBlue As String() = _
    {"if", "then", "else"} 'En este arreglo pones todas las palabras que quieras que aparezcan en color Azul

    Private ReservadasRed As String() = _
    {"echo", "@"} 'En este arreglo pones todas las palabras que quieras que aparezcan en color Rojo

    Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged

        ' aqui obtiene un arreglo de palabras desde el inicio
        ' hasta donde esta la posicion del cursor
        Dim Palabras As String() = RichTextBox1.Text.Substring(0, RichTextBox1.SelectionStart).Split()

        'Aqui obtenemos el ultimo elemento del arreglo de palabras
        Dim UltimaEscrita As String = Palabras(Palabras.Length - 1)

        'Guardamos la posicion del cursor
        Dim PosCursor As Integer = RichTextBox1.SelectionStart

        'Verificamos si la palabra escrita esta en el el arreglo
        'en este caso declare un arreglo para cada color
        If ReservadasBlue.Contains(UltimaEscrita) Then
            RichTextBox1.Find(UltimaEscrita, RichTextBoxFinds.Reverse)
            RichTextBox1.SelectionColor = Color.Blue
            RichTextBox1.SelectionStart = PosCursor
        End If

        'aqui para el color rojo, en caso de añadir mas pues solo seria
        'cosa de agregar mas arreglos y mas condicionales
        If ReservadasRed.Contains(UltimaEscrita) Then
            RichTextBox1.Find(UltimaEscrita, RichTextBoxFinds.Reverse)
            RichTextBox1.SelectionColor = Color.Red
            RichTextBox1.SelectionStart = PosCursor
        End If

        'regresamos al color original
        RichTextBox1.SelectionColor = Color.Black
    End Sub


El codigo de Raul funciona muy bien, note que parpadea la linea al escribir, y al escribir entre texto no colorea, pero al parecer no nos da los mismos resultados el codigo, sera por aquello de los framework? bueno quien sabe.

Braayhaan

LISTOO sin mas problemas Xtriker ya funciona correctamente, gracias a todos por sus respuestas!!!

Saludos, a ambos los pondre en los Creditos  ;)

raul338

#19
CitarPosdata: Felicitaciones es tu mensaje 100!

jajaja xD...sigamos x los mil!!! xD


Cita de: Xtriker en  4 Septiembre 2009, 18:25 PM
Es curioso como se comporta el RichTextBox con el codigo que utilizé, por que al editar una parte intermedia del texto me selecciona hacia adelante algunos espacios, jeje, y a mi si me funciona en todas las lineas  :huh:  , realmente al leer el post por primera vez crei que seria mas simple, unas 4 lineas y ya, pero resulto interesante intentar, en fin, bueno aqui hay otra idea, aunque tambien tiene varios fallos

-------------------------------

El codigo de Raul funciona muy bien, note que parpadea la linea al escribir, y al escribir entre texto no colorea, pero al parecer no nos da los mismos resultados el codigo, sera por aquello de los framework? bueno quien sabe.


no he probado el codigo todavia, aunque ahora no tengo tiempo ,a al tarde volvere  ;D

es verdad, parpadea, pero es por la forma que estamos utilzando (jamas pense q habia que seleccionar para colorear). Aunque la mejor forma (y mas dificil  ;D) de hacerlo es haciendo un control nuevo (tal vez que herede de richtextbox) y dibujar linea por linea con colores y todo ( sobrecargando el metodo OnPaint ). Pero como dije, es la forma mas dificil de hacer: dibujar lineas, dibujar el cursor, las barras de desplazamiento, un lio... xD




Edit: Funciona, aunque no he probado romperlo todavia :laugh: :xD

igual de todas formas, si dices que tiene errores, habra que perfeccionarlos y tal vez hacer una mezcla de codigo entre los 2 jejeje ...


bueno.....suerte entonces...  ;)