Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: NemeSys en 16 Octubre 2006, 12:20 pm



Título: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 16 Octubre 2006, 12:20 pm
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:
Código:
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
Código:

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.

 


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 16 Octubre 2006, 19:23 pm
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


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 23 Octubre 2006, 18:06 pm
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.


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 23 Octubre 2006, 18:54 pm
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


(http://www.geocities.com/cero780814/rtb.JPG)

ahora no se si eso es lo que quieres hacer.


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 23 Octubre 2006, 19:12 pm
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:
Código:
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
Código:

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  :)


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 23 Octubre 2006, 19:43 pm
creo que ya tienes la solución
Citar
... de manera que todo el bloque de texto (Texto existente + Nueva Linea) ...


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 23 Octubre 2006, 21:51 pm
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...
Código:
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
Código:

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

Y con esto tambien...
Código:
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
Código:

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ó...


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 26 Octubre 2006, 17:45 pm
Hola otra vez...

Nadie puede ayudarme con esto por favor, lo necesito.

Gracias.


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 26 Octubre 2006, 18:58 pm
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 .

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 26 Octubre 2006, 21:33 pm
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 :)


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 26 Octubre 2006, 22:54 pm
pues ya me ropi cabeza y no encuentro forma de hacerlo, creo que la unica solución es la que comentabas

Citar
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...

porque otra forma no se me ocurre, solo que le pongas Visible = False luego coloreas y otra vez Visible = True


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: CeLaYa en 26 Octubre 2006, 23:11 pm
Despues de haberme partido la cabeza con eso del RichTextBox se me prendio el "foco" y que crees eso que quieres hacer se puede hacer con un PictureBox, ahora solo hay que agregarle sus scrolBars


Private Sub Form_Load()
    Dim i As Integer
    Show
    For i = 1 To 10
        If Picture1.ForeColor = vbRed Then
            Picture1.ForeColor = vbBlue
            Picture1.Font = "Courier New"
            Picture1.FontBold = True
            Picture1.FontSize = i + 8
        Else
            Picture1.ForeColor = vbRed
            Picture1.Font = "Arial Black"
            Picture1.FontBold = False
            Picture1.FontSize = i + 8
        End If
        Picture1.Print "hola"
       
    Next i

End Sub


Título: Re: Pregunta: Sobre RichTextBox, como colorearlo.
Publicado por: NemeSys en 28 Octubre 2006, 01:08 am
CeLaYa..... TE ADORO :D:D:D:D

Muchas gracias :D