Bueno acá esto pidiendoles ayuda de nuevo xD
Necesito que en un Richtextbox se muestre el texto de distintos colores por ejemplo.
Como el GeSHi de este foro que muestra distintos colores segun el texto.
hay alguna manera de hacerlo?
Todo esto en el VB.NET Claro
Saludos!
RichTextBox1.SelectionStart = RichTextBox1.Find("Palabra")
RichTextBox1.SelectionColor = Color.Yellow ' El color que quieras
Me imagino que eso va en el Rich, o quizás en un timer pero me dice error.
Me dice algo de error valuetype-1 is no correct, o algo del value-1, alguna idea?
echame una mano seba! :xD
Bueno aca les dejo el source haber si me echan una mano ya que no entendi muy bien lo que puso el seba :-[ me da error
Public Class Form1
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If RichTextBox1.Text = "" Then
MessageBox.Show("No se puede compilar un texto vacio")
Return
End If
If SaveFileDialog1.ShowDialog = DialogResult.OK Then
RichTextBox1.SaveFile(SaveFileDialog1.FileName, RichTextBoxStreamType.PlainText)
ProgressBar1.Visible = True
Timer1.Start()
End If
Form1.ActiveForm().Text() = "Batch Creator" + SaveFileDialog1.FileName
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
RichTextBox1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText)
End If
Form1.ActiveForm().Text() = "Batch Creator" + OpenFileDialog1.FileName
End Sub
Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
ProgressBar1.Increment(10)
If ProgressBar1.Value = ProgressBar1.Maximum Then
Timer1.Stop()
MessageBox.Show("Se ha creado satisfactoriamente el archivo .bat en la direccion especificada")
ProgressBar1.Value = ProgressBar1.Minimum
ProgressBar1.Visible = False
Return
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If RichTextBox1.Text = "" Then
MessageBox.Show("Ya hay un nuevo documento abierto")
Return
End If
Form2.Show()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Form3.SHOW()
End Sub
Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
End Sub
End Class
vos preguntaste como se colorea el texto, yo te respondi eso, pero despues no se que hiciste :xD, el codigo que puse busca "Palabra" en el Richtextbox y lo colorea de amarillo. tambien podes hacerlo con SelectionStart y con SelectionLenght diciendole que desde la posicion 10 hasta la 15 sea de color rojo, de la 16 a la 20 sea azul y asi...ahi en ese codigo que pusiste no veo nada de eso. y no se donde te tira el error. igualmente yo le cambiaria varias cosas a ese codigo.
saludos.
Ese codigo para colorear lo puse en el richtextbox y me da error
Hay les dejo el error que me tira.
(http://i86.servimg.com/u/f86/11/66/25/27/error10.png)
No se que es y al darle a detalles aparecen como 100 lineas con cosas raras :xD
Help me Please ;D
mmm bueno hasta ahora lo resolvi Asi
RichTextBox1.Find("@")
RichTextBox1.SelectionColor = System.Drawing.Color.Yellow
Pero a cada rato que escribo algo se me devuelve a la primera linea me imagino que por eso del .Find
Alguna forma de que lo chequee pero que me deje escribir normal?
Thanks
lo otro que podrias hacer es que cuando el richtextbox pierda el foco que se pinte el arroba "@" de color rojo
Private Sub RichTextBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.LostFocus
RichTextBox1.Find("@")
RichTextBox1.SelectionColor = Color.Red
End Sub
Mira yo tengo la solución a ese problema xD yo tambien lo tube pero luego me dio flojera continuar un bat maker que estaba haciendo tambien; suponiendo que tu RichTextBox se llamará r así como el mio mira el evento TextChanged
Private Sub r_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles r.TextChanged
If r.Find("@echo") <> -1 Then
r.SelectionStart = r.Find("@echo")
r.SelectionColor = Color.Red
r.SelectionStart = r.TextLength
End If
End Sub
Keyen Night me funciono perfecto el ejemplo pero el detalle es este:
si escribo en la primera linea @ o ECHO o Off solo me marca el primer texto escrito por ejemplo si escribi @ me marca en rojo y si despues de @ escribo ECHO me sigue marcando en rojo,Cuando el codigo de ECHO Es azul y deberia marcar el @ en rojo y el ECHO en Azul.
Pero si doy enter y paso a la siguiente linea me pone el color del Richtextbox original.
Entonces haber si me ayudan :xD
Si tambien me fije de eso habra que buscarle otra solución a eso tambien...
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
Esta exelente Xtriker me funciono perfectamente, algun tip para ponerle mas colores? no solo el azul.
Gracias de antemano :xD
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
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
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
jajajaj no seas vago y usa un for each o algo para recorrer un bucle xD
mira, te escribo el codigo a la volada
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
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
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
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.
LISTOO sin mas problemas Xtriker ya funciona correctamente, gracias a todos por sus respuestas!!!
Saludos, a ambos los pondre en los Creditos ;)
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... ;)
Cita de: raul338 en 4 Septiembre 2009, 17:42 PM
jajajaj no seas vago y usa un for each o algo para recorrer un bucle xD
mira, te escribo el codigo a la volada
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
Ahora (que no me acuerdo porque no lo escribi :huh:) estaria bueno hacer una especie de IDE simple para varios lenguajes, ej, cuantas veces hemos abierto el tremendo pero algo lento visual studio para probar unas simples lineas. Con "nuestro" pequeño IDE se podria hacer simple jejeje....x eso implemente la opcion de cualquier color. Es buena idea, alguien se prende??? (se une?)
Yo me apunto! al diseño y parte del codigo :P
Cita de: raul338 en 4 Septiembre 2009, 22:34 PM
Cita de: raul338 en 4 Septiembre 2009, 17:42 PM
jajajaj no seas vago y usa un for each o algo para recorrer un bucle xD
mira, te escribo el codigo a la volada
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
Ahora (que no me acuerdo porque no lo escribi :huh:) estaria bueno hacer una especie de IDE simple para varios lenguajes, ej, cuantas veces hemos abierto el tremendo pero algo lento visual studio para probar unas simples lineas. Con "nuestro" pequeño IDE se podria hacer simple jejeje....x eso implemente la opcion de cualquier color. Es buena idea, alguien se prende??? (se une?)
queres hacer un parser de los colores de cada lenguaje, hay un monton de ejemplos en internet de ese tipo de proyecto.
Cita de: seba123neo en 5 Septiembre 2009, 02:41 AM
Cita de: raul338 en 4 Septiembre 2009, 22:34 PM
Cita de: raul338 en 4 Septiembre 2009, 17:42 PM
jajajaj no seas vago y usa un for each o algo para recorrer un bucle xD
mira, te escribo el codigo a la volada
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
Ahora (que no me acuerdo porque no lo escribi :huh:) estaria bueno hacer una especie de IDE simple para varios lenguajes, ej, cuantas veces hemos abierto el tremendo pero algo lento visual studio para probar unas simples lineas. Con "nuestro" pequeño IDE se podria hacer simple jejeje....x eso implemente la opcion de cualquier color. Es buena idea, alguien se prende??? (se une?)
queres hacer un parser de los colores de cada lenguaje, hay un monton de ejemplos en internet de ese tipo de proyecto.
puede ser, pero un coloreador de lenguajes no puede ser considerado IDE, aparte de colorear se podria hacer una "simulacion" (copia xD) de Intellisense y compilar el codigo (solo en .net, ya que en otros lenguajes necesitamos un compilador jejej)
hola vieras que estoy con un problema muy similar pero resulta que si le doy un enter la palabra que quiero que cambie de color no cambia alguien me podria decir como se puede resolver esto
(http://C:%5CUsers%5CJosu%C3%A9%5CPictures%5CDibujo.JPEG)