Publicado el 26/Jun/2002
Actualizado el 14/Nov/2002
15/Nov/2002: Sigue este link para ver las últimas actualizaciones
Si quieres ver el código publicado anteriormente:
Versión original del 04/Abr/2001
Revisión del 11/Abr/2001
El fichero con las palabras clave:
26/Oct/2002: Revisión de las palabras claves, (para C#, C/C++, VB clásico y VB .NET):
14/Nov/2002: Revisión de las palabras claves de C#
Pulsa aquí para bajarte el zip (lenguajes.zip 2.31 KB).
En esta nueva versión he corregido algunos bugs y he añadido nuevo código, así como un control RichTextBox para poder aceptar ficheros más grandes.
Estas son algunos de los cambios:
Revisión del 11/Jun/2001: Corregido los bugs para los comentarios c#/C/C++
Revisión del 08/Oct/2001: Uso RichText para manejar ficheros más grandes
Revisiones del 15/Ene/2002:
-Mejoras en el tratamiento de cadenas y comentarios
-Comprueba correctamente los comentarios /* ... */
-Las cadenas y tokens no se convierten en los comentarios
-Se usa un fichero INI en vez del registro
-Permite usar el signo _ en los comentarios de VB
-Permite usar el signo \ en las cadenas de C
-Se autoajustan los controles al tamaño del formulario
-Permite cambiar entre el código normal y el convertido
-Se asigna el fichero de palabras según la extensión
-Se muestra una barra de progreso.
-Compilado como código nativo.
-Añado menús al formulario
Revisión del 27/Jun/2002:
-Si después de un punto o un corchete de apertura
va una palabra clave, no se colorea,
ya que puede ser un miembro de objeto.
Corrección hecha gracias a una sugerencia de Erik.
Una captura de la pantalla de la utilidad en ejecución:
La utilidad en tiempo de ejecución
Revisión del 27/Jun/2002
La corrección añadida el 27 de junio de 2002 ha sido gracias a un comentario de Erik (el del curso de C#), para que las palabras clave que formen parte de un objeto no se coloreen, por ejemplo Open es una palabra clave, pero si forma parte de un objeto, no debería colorearse.
Lo mismo ocurre si creamos una propiedad o variable que se llame igual que un objeto (en VB.NET esto es posible), en estos casos se declaran dentro de corchetes, por tanto, si después de un corchete se incluye una palabra clave, no se colorea.Este es el código modificado del procedimiento ComprobarTokens:
Private Function ComprobarTokens(ByVal s As String) As String ' Comprobar si en la cadena pasada hay palabras clave (15/Ene/02) Dim s2 As String, sID As String Dim k As Long Dim ComprobarPalabras As Boolean Static HayComillas As Boolean Static HayRem As Boolean Static HayMultipleRem As Boolean Static MultiLineaVB As Boolean Static MultiLineaC As Boolean ' Por si el ID hallado es un punto o un corchete (27/Jun/02) Static sIDAnt As String ' Cuando una palabra clave siga a uno de estos separadores, no se coloreará Const sTokens2 As String = ".[" ' ComprobarPalabras = True ' ' Si se está procesando un fichero de C (c#, C/C++) ' Para que no se analicen los comentarios de C (15/Ene/02) ' El problema de los comentarios de múltiples líneas ' es que pueden estar en una sola línea y por tanto, ' habría que analizar esa línea, por si hay palabras clave, ' como por ejemplo: ' public class /* comentario */ Form1 : System.Windows.Forms.Form If rbFP(esCS).Value = True Then ' Comprobar si hay comentarios de C# o C/C++ ' ' En C# / C / C++ no se tendrá en cuenta este signo MultiLineaVB = False ' ' Comprobar si hay un comentario múltiple k = InStr(s, "/*") If k > 0 Then ' Comprobar las palabras que haya antes del comentario 's = ComprobarTokens(Left$(s, k - 1), HayMultipleRem) & sTagFontGreen & Mid$(s, k) s = ComprobarTokens(Left$(s, k - 1)) & sTagFontGreen & Mid$(s, k) ' Hay que comprobar antes de asignar HayMultipleRem HayMultipleRem = True ComprobarPalabras = False End If ' Comprobar si hay un final de comentario mútiple k = InStr(s, "*/") If k > 0 Then HayMultipleRem = False ComprobarPalabras = False ' Para los comentarios múltiples (11/Jun/01) ' Comprobar las palabras que haya después del comentario 's = Left$(s, k + 1) & sEndFontTag & ComprobarTokens(Mid$(s, k + 2), HayMultipleRem) s = Left$(s, k + 1) & sEndFontTag & ComprobarTokens(Mid$(s, k + 2)) End If If ComprobarPalabras Then ' Comprobar si hay un comentario de línea completa k = InStr(s, "//") If k > 0 Then ' Para que maneje bien los comentarios (11/Jun/01) ComprobarPalabras = False ' Comprobar las palabras que haya antes del comentario 's = ComprobarTokens(Left$(s, k - 1), HayMultipleRem) & sTagFontGreen & Mid$(s, k) & sEndFontTag s = ComprobarTokens(Left$(s, k - 1)) & sTagFontGreen & Mid$(s, k) & sEndFontTag End If End If ' ' En C se permite usar el \ para continuar las cadenas de texto en distintas líneas If Right$(RTrim$(s), 2) = " \" Then MultiLineaC = True Else MultiLineaC = False End If ' ElseIf rbFP(esVB).Value = True Then MultiLineaC = False ' si es VB, comprobar si tiene un _ al final If Right$(RTrim$(s), 2) = " _" Then MultiLineaVB = True Else MultiLineaVB = False End If End If ' If ComprobarPalabras Then ' ' Tomar la primera palabra s2 = s sID = CadaPalabra(s2) s = "" ' Mientras no sea una cadena vacía Do While sID <> "" If HayRem = True Or HayMultipleRem = True Then ' No interpretar lo que esté comentado (03/Abr/01) ' Ni si es un comentario múltiple (11/Jun/01) s = s & sID ElseIf sID = Chr$(34) Then ' Convertirlo en el tag de comillas (31/Mar/01) sID = "&" & sTagQuote If HayComillas Then If chkTextColor.Value = vbChecked Then s = s & sID & sEndFontTag Else s = s & sID End If HayComillas = False Else HayComillas = True If chkTextColor.Value = vbChecked Then s = s & sTagFontText & sID Else s = s & sID End If End If 'ElseIf HayComillas = True Or HayRem = True Or HayMultipleRem = True Then ElseIf HayComillas = True Then ' No interpretar lo que haya entre comillas (31/Mar/01) ' Ni lo que esté en un comentario (03/Abr/01) ' Ni si es un comentario múltiple (11/Jun/01) s = s & sID ElseIf rbFP(esVB).Value = True And (sID = "'" And HayRem = False) Then s = s & sTagFontGreen & sID HayRem = True ElseIf rbFP(esCS).Value = True And (sID = "//" And HayRem = False) Then ' Aquí nunca llega, ya que se comprueba más arriba (15/Ene/02) s = s & sTagFontGreen & sID HayRem = True ElseIf mPalabras.Exists(sID) And HayComillas = False Then ' Si está en la colección de palabras clave ' Pero si se usaba el punto como separador, (27/Jun/02) ' no colorearla If sIDAnt <> "" Then s = s & sID sIDAnt = "" Else s = s & sTagFontBlue & sID & sEndFontTag End If Else sIDAnt = "" ' Si es un punto o un corchete de apertura (27/Jun/02) ' la palabra que siga, no se coloreará If InStr(sTokens2, sID) And HayComillas = False Then sIDAnt = sID End If s = s & sID End If sID = CadaPalabra() Loop ' If MultiLineaC = False Then If HayComillas Then If chkTextColor.Value = vbChecked Then s = s & Chr$(34) & sEndFontTag Else s = s & Chr$(34) End If HayComillas = False End If End If ' ' Sólo cerrar los REMs cuando no sea multilínea (15/Ene/02) If MultiLineaVB = False Then If HayRem Then s = s & sEndFontTag HayRem = False End If End If End If ' ComprobarTokens = s End Function
Este es el link para el código y el ejecutable compilado con VB6 SP5: gsHTMCodeColor2.zip (95.2 KB)
Incluye revisiones de los ficheros de palabras, así como un fichero para C++En este ZIP se incluyen las correcciones del 27/Jun/2002
Nos vemos.
Guillermo
Volver al índice de Mis Utilidades