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.
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
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.
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.
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 :)
creo que ya tienes la solución
Citar... de manera que todo el bloque de texto (Texto existente + Nueva Linea) ...
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ó...
Hola otra vez...
Nadie puede ayudarme con esto por favor, lo necesito.
Gracias.
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 .
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
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 :)
pues ya me ropi cabeza y no encuentro forma de hacerlo, creo que la unica solución es la que comentabas
CitarNo 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
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
CeLaYa..... TE ADORO :D:D:D:D
Muchas gracias :D