Pregunta: Sobre RichTextBox, como colorearlo.

Iniciado por NemeSys, 16 Octubre 2006, 12:20 PM

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

NemeSys

Hola a tod@s!

Estoy haciendo una aplicacion que debe sacar un report a medida que van saliedo resultados de unos procesos en segundo plano.

Pa ello uso un richtextbox donde voy incluyendo a medida que se crean las lineas del informe.

Mi idea era ir escribiendo las diferentes notificaciones en diversos colores. Es decir El error que aparezca la linea en  rojo, las notificaciones en azul, etc.

Pues bien para ello usé el siguiente algoritmo:

do while not RsRecordset.EOF
     RichTextBox1.Text = Richtextbox1.text & RsRecordset!Link
     RichTextBox1.SelStart = Richtextbox1.text - len(RsRecordset!Link)
     RichTextBox1.SelLength = len(RsRecordset!Link)
     if RsRecordset!Status = "Error" then
          RichTextBox1.SelColor = vbred
     elseif RsRecordset!Status = "Info" then
          RichTextBox1.SelColor = vbBlue
     else
          RichTextBox1.SelColor = vbBlack
     end if
     RichTextBox1.SelStart = 0
loop


El problema (lo vi por debugger) que al insertar texto nuevo en la RTB, se pone del ultimo color seleccionado. Es decir lo que antes estaba de color rojo, si la linea siguiente debe ser verde, al insertar el texto se pone todo lo anterior de color rojo.

He buscado por google y lo que encuentro son rutinas que buscan el texto deseado y lo colorean una vez todo el texto a sido escrito. Mi idea era ir coloreando el texto deseado a medida que se escribe.

La solucion que aplico ahora es filtrar el texto una vez escrito y coloreo aquellas palabras clave con su color correspondiente pero el efecto cuando hay mucho texto en la RTB es bastante feo.

Alguien podria ayudarme?

Gracias.



CeLaYa

y porque no le pones el color antes de escribir


RichTextBox1.selstar = len( RichTextBox1.text)
RichTextBox1.selcolor = color que quieres


prueba esto a ver si te respeta el color que acabas de poner, otra idea que se me ocurre es agregar un espacio en blanco y colorearlo, posteriormente agregas el texto
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

NemeSys

Gracias por la respuesta,

Pero ya lo probé y no funciona. En teoria deberia escribir el texto nuevo del color elegido desde el punto de insercion (Len(Richtextbox1.text) pero lo que hace es en el paso de insertar el texto colorea todo el texto del ultimo color seleccionado. Asi pierdo el formato anterior.

Es curioso porque si me funciona cuando formateo el tipo de letra manteniendo los formatos (negrita y cursiva) allá donde los inserté. Pero el texto en cambio no. Cuando se inserta texto nuevo cambia todo el contenido de la RTB al color ultimo usado.

Probé muchas combinaciones y algoritmos que busqué por internet y ninguno me funciona. No sé si es algun bug de la RTB o algo que hago mal.

Si alguien tiene mas sugerencias...bienvenidas son.

Saludos.

CeLaYa

ya probe el código y si funciona, de hecho en un form puse un RichTextBox y 3 CommandButton, estoy escribiendo y le doy click a algun boton y sigo escribiendo en otro color:

Option Explicit

Private Sub cmdAzul_Click()
    RichTextBox1.SelStart = Len(RichTextBox1.Text)
    RichTextBox1.SelColor = vbBlue
    RichTextBox1.SetFocus
End Sub

Private Sub cmdRojo_Click()
    RichTextBox1.SelStart = Len(RichTextBox1.Text)
    RichTextBox1.SelColor = vbRed
    RichTextBox1.SetFocus
End Sub

Private Sub cmdverde_Click()
    RichTextBox1.SelStart = Len(RichTextBox1.Text)
    RichTextBox1.SelColor = vbGreen
    RichTextBox1.SetFocus
End Sub




ahora no se si eso es lo que quieres hacer.
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

NemeSys

Gracias por la respuesta tan completa.

Leyendola he visto mi error. Verás, Al introducir texto lo hago de forma automatica (es decir desde un bucle) donde voy metiendo texto nuevo a medida que se generan unos eventos. Si el evento acabó ok la linea nueva debe ir en verde si acabó nook debe ir en rojo).

Para ello uso algo asi:
haz mientras Registros.existe = true
      RTB.SelStart = Len(RTB.text)
      if proceso = ok then
         RTB.SelColor = vbGreen
         RTB.Text = RTB.Text & "Accion OK"
     else
         RTB.SelColor = VbRed
         RTB.Text = RTB.Text & "Accion NOOK"
     end if

Per Debug observaba que al insertar el nuevo texto este se introducia todo del mismo color y es porque cada linea que inserto nueva, para conservar el contenido anterior vuelvo a insertarlo todo, de manera que todo el bloque de texto (Texto existente + Nueva Linea) se meten del color seleccionado.

Para solucionar esto debo encontrar la forma de conservar el texto de la RTB y formatear solo el texto introducido. Asi que a seguir estrujandose la cabeza...

Si alguien tiene mas sugerencias... se aceptan... y gracias por las ya dadas  :)

CeLaYa

creo que ya tienes la solución
Citar... de manera que todo el bloque de texto (Texto existente + Nueva Linea) ...
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

NemeSys

Hola...va a ser que no era esa la respuesta....

He probado de alojar el texto el el Clipboard para ver si mantenia su aspecto y luego insertarlo junto la linea a añadir... pero ni asi... me sale todo el texto en un color...
If Not (RsPeliculas.EOF = True And RsPeliculas.BOF = True) Then
    RsPeliculas.MoveFirst
    RichTextBox1.SelStart = 0
    Do While Not RsPeliculas.EOF
        If TestPath(RsPeliculas!Link) = False Then
            RsPeliculas!Actualizado = False
            Clipboard.Clear 'empty Clipboard
            Clipboard.SetText RichTextBox1.Text
            RichTextBox1.Text = Clipboard.GetText & "Link Roto: " & RsPeliculas!Link & vbCrLf
            RichTextBox1.SelStart = Len(RichTextBox1.Text) - Len("Link Roto: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelLength = Len("Link Roto: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelColor = RGB(150, 0, 20)
            NumeroLinksRotos = NumeroLinksRotos + 1
            RsPeliculas.Update
           
        Else
            RsPeliculas!Actualizado = True
            Clipboard.Clear 'empty Clipboard
            Clipboard.SetText RichTextBox1.Text
            RichTextBox1.Text = Clipboard.GetText & "Link Actualizado: " & RsPeliculas!Link & vbCrLf
            RichTextBox1.SelStart = Len(RichTextBox1.Text) - Len("Link Actualizado: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelLength = Len("Link Actualizado: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelColor = RGB(150, 0, 20)
            NumeroLinksActualizados = NumeroLinksActualizados + 1
            RsPeliculas.Update
        End If
        NumeroTotalPeliculas = NumeroTotalPeliculas + 1
        RsPeliculas.MoveNext
        ProgressBar1.Value = ProgressBar1.Value + 1
    Loop
End If


Con esto sale todo el texto de un color...

Y con esto tambien...

If Not (RsPeliculas.EOF = True And RsPeliculas.BOF = True) Then
    RsPeliculas.MoveFirst
    RichTextBox1.SelStart = 0
    Do While Not RsPeliculas.EOF
        If TestPath(RsPeliculas!Link) = False Then
            RsPeliculas!Actualizado = False
            RichTextBox1.Text = RichTextBox1.Text & "Link Roto: " & RsPeliculas!Link & vbCrLf
            RichTextBox1.SelStart = Len(RichTextBox1.Text) - Len("Link Roto: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelLength = Len("Link Roto: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelColor = RGB(150, 0, 20)
            NumeroLinksRotos = NumeroLinksRotos + 1
            RsPeliculas.Update
           
        Else
            RsPeliculas!Actualizado = True
            RichTextBox1.Text = RichTextBox1.Text & "Link Actualizado: " & RsPeliculas!Link & vbCrLf
            RichTextBox1.SelStart = Len(RichTextBox1.Text) - Len("Link Actualizado: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelLength = Len("Link Actualizado: " & RsPeliculas!Link & vbCrLf)
            RichTextBox1.SelColor = RGB(150, 0, 20)
            NumeroLinksActualizados = NumeroLinksActualizados + 1
            RsPeliculas.Update
        End If
        NumeroTotalPeliculas = NumeroTotalPeliculas + 1
        RsPeliculas.MoveNext
        ProgressBar1.Value = ProgressBar1.Value + 1
    Loop
End If


No se que hacer ya... lo maximo que he conseguido es que una vez escrito el texto del report en la RTB, pasar un filto buscando las palabras a colorear...pero el efecto es un poco cutre...

Asi queno se que hacer mas...estoy desesperao... Alguien sabe con que control hacen un chat que contiene muchos colorines y no se pierde el formato de color?
:(

Ayuda po favó...

NemeSys

Hola otra vez...

Nadie puede ayudarme con esto por favor, lo necesito.

Gracias.

CeLaYa

hice la prueba de meter texto con un for algo similar a lo que haces y me pasa lo mismo, la verdad no se porque .

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

NemeSys

Aleluya!!!!

Alguien que me entiende :D:D

Yo tampoco entendia porque pero es algo que parece no tener solucion.

Para actualizar el texto de una RTB se debe igualar la propiedad texto a si mismo mas el texto nuevo. Si debugas veras como es en el momento en el que se asigna la nueva cantidad de texto cuando se inserta todo del mismo color.

Creo que es porque o no se mantiene el formato de color del texto (porque el formato negrita si se mantiene) cuando se asigna a memoria para reasignarlo a la propiedad de texto.

o es porque al asignar la propiedad SelStart al final del texto, en el impas que hay cuando se ejecuta RichTextBox.Text = RichtextBox.text & "Texto_Nuevo" de: "borra texto existente del control *-> guardalo en memoria -> carga texto guardado + texto nuevo" la propiedad SelStart al ver que no hay texto en la textbox se asigna a cero*, cosa que hace que al asignar el texto nuevo la propiedad Color que esta a rojo, por ejemplo, se asigne a todo el texto insertad ?

No se porque pero es bastante fustrante esta situacion y mas cuando se que debe haber algun ActiveX donde esto se pueda hacer sin problemas. Nadie sabe de algun control que sirva como RTB?

Gracias CeLaYa por la ayuda :)