Buenas, estoy haciendo una aplicación en la que quiero que después de un nombre, tenga una parte coloreada tal que así:
Pepe dice: Hola
Pepa dice: Hola
Lo separo en dos vectores, uno para el nombre y uno para el mensaje. El que quiero ver coloreado es el del mensaje.
Hago ésto pero solo se colorea la primera vez, y segun recibe mensajes los colores se cambian de sitio:
Pepe dice: Hola
Pepa dice: Hola
If Mid(datos, 1, 3) = "MSG" Then 'Cuando recibo es MSGmensaje
mensaje = Split(Mid(datos, 4, Len(datos)), ":")
Text1.Text = Text1.Text & mensaje(0) & ":" & mensaje(1) & vbNewLine 'nombre dice: mensaje
lennombre = Len(mensaje(0)) 'tamano del nombre
lenmensaje = Len(mensaje(1)) 'tamano del mensaje
With Text1 'creo que falla aqui
.SelStart = lennombre 'selecciono desde donde acaba el nombre
.SelLength = lenmensaje 'hasta que acaba el mensaje
.SelColor = vbBlue 'se supone que tiene que colorearlo todas las veces que quiera
.SelBold = True
End With
End If
¿Sugerencias?
Saludos.
SelStart lo estas asignando mal, debes poner el lugar donde empieza, esto es:
Tamaño del texto Actual en el ritchtextbox + Variable nombre + "dice: "
Por lo demas, esta bien :P
Gracias por la respuesta.
El "dice: " viene en el vector(0).
El servidor envia Nombre dice: Hola, cuando el cliente lo recibe hace un split separado por ":", entonces, para que se vea hago mensaje(0) & ":" & mensaje(1), de forma que sale Nombre dice: Hola. He probado como me has dicho y no sale ningún color.
Porque no me explique del todo :xD, en instrucciones seria
Agrega el texto principal "X dice:"
Despues tienes que guardar en una variable el Len(Text1.Text)
Despues agregas el mensaje en si
Y por ultimo, coloreas, en SelStart pones la variable anterior (el len) y listo :P
Vale, creo que he hecho lo que me has dicho, y ahora sale coloreado siempre el ultimo mensaje, es decir, digo Hola y se ve azul, pero vuelvo a decir Hola, el anterior se pone negro y el nuevo azul.
mensaje = Split(Mid(datos, 4, Len(datos)), ":")
Text1.Text = Text1.Text & mensaje(0) & ":" 'Agrego el texto principal X dice:"
lentext = Len(Text1.Text) 'Guardo en una variable el len(text1)
Text1.Text = Text1.Text & mensaje(1) & vbNewLine 'Agrego el mensaje en si
Text1.SelStart = lentext 'Pongo en el SelStart la variable anterior
Text1.SelLength = Len(Text1.Text) ' mal aqui?
Text1.SelColor = vbBlue
Text1.SelBold = True
Es raro eso que dices :-\
aunque yo cambiaria esta linea que dices
Text1.SelLength = Len(Text1.Text) ' mal aqui?
por
Text1.SelLength = Len(mesnaje(1))
También he probado y nada :(
Sale así:
(http://img198.imageshack.us/img198/7812/chatpb.png)
Siempre se colorea el ultimo mensaje.
Cierto! me habia olvidado, cada vez que seteas la propiedad "Text" todo lo formateado se borra :xD
Fijate si tiene una funcion llamada "AppendText" o similar :P sino, no hay ocacion, vas a tener que colorear siempre :(
Qué va, no hay nada de eso. ¿Cómo coloreo todo?
Y... Fijate si tenes alguna otra propiedad relacionada con Text, tipo RichtText o algo asi u.u
No, sólo tiene la propiedad text, pero estoy seguro de que se puede, ví hace poco una aplicación similar a la que quiero desarrollar hecha en VB6, la pena es que no era de código abierto :(
adecualo a tu codigo :D
Private Sub Form_Load()
Dim pos As Long
RichTextBox1.Text = "Sergio dice: Hola" & vbCrLf & _
"Sergio dice: Hola" & vbCrLf & _
"Sergio dice: Hola" & vbCrLf & _
"Sergio dice: Hola"
pos = 1
Do While InStr(pos, RichTextBox1.Text, ":") <> 0
RichTextBox1.SelStart = InStr(pos, RichTextBox1.Text, ":") + 1
RichTextBox1.SelLength = 4
RichTextBox1.SelBold = True
RichTextBox1.SelColor = vbBlue
RichTextBox1.SelStart = Len(RichTextBox1.Text)
pos = InStr(pos, RichTextBox1.Text, ":") + 1
Loop
End Sub
y si el mensaje contiene ":" descuadra todo :D
:S jaja bueno pero hasta ahi hice codigo creo que ahora le toca a el seguir :D
Puedes explicar de nuevo o dejar todo todo tu codigo? no entiendo q quieres hacer
Public Function ChangeColor(RT As RichTextBox, StrStart As String, StrEnd As String, Color As Long)
Dim Text As String
Dim N As Long
Text = RT.Text
N = InStr(Text, StrStart)
Do While CBool(N)
Mid(Text, N, Len(StrStart)) = String(Len(StrStart), "?")
RT.SelStart = N + Len(StrStart)
N = InStr(Text, StrEnd)
If CBool(N) Then
Mid(Text, N, Len(StrEnd)) = String(Len(StrEnd), "?")
RT.SelLength = N - RT.SelStart - 1
RT.SelColor = Color
RT.SelStart = 0
End If
N = InStr(Text, StrStart)
DoEvents
Loop
If CBool(RT.SelStart) Then
RT.SelLength = Len(RT.Text) - RT.SelStart
RT.SelColor = color
End If
End Function
ChangeColor RT, ":", vbNewLine, vbBlue
:P, lo hize a prisas XD
Yo lo hago asi
En un Modulo:
Option Explicit
Enum eTextColor
Black = 0
Blue = 1
Green = 2
Cyan = 3
Red = 4
Magenta = 5
Brown = 6
Grey = 7
DarkGrey = 8
BrightBlue = 9
BrightGreen = 10
BrightCyan = 11
BrightRed = 12
Pink = 13
Yellow = 14
white = 15
End Enum
Public Sub AddText(oRichTextBox As Object, ByVal Msg As String, ByVal Color As eTextColor, Optional NewLine As Boolean = True, Optional CustomColor As Long = -1)
Dim s As String
Dim c As Long
If NewLine = True Then
s = Msg & vbNewLine
Else
s = Msg
End If
c = oRichTextBox.SelStart
oRichTextBox.SelStart = Len(oRichTextBox.Text)
If CustomColor <> -1 Then
oRichTextBox.SelColor = CustomColor
Else
oRichTextBox.SelColor = QBColor(Color)
End If
oRichTextBox.SelText = s
oRichTextBox.SelStart = Len(oRichTextBox.Text) - 1
End Sub
En Tu Codigo lo llamarias asi
If Mid(Datos, 1, 3) = "MSG" Then 'Cuando recibo es MSGmensaje
Mensaje = Split(Mid(Datos, 4, Len(Datos)), ":")
Call AddText(Text1.Text, Mensaje(0) & ": ", vbBlack, False)
Call AddText(Text1.Text, Mensaje(1), vbBlue, True)
End If
Usé y modifiqué a mi gusto el módulo de DarkMatrix y funciona perfecto.
Solucionado, muchas gracias.