Manejo de Texto con Estilo en Xojo

El término texto con estilo se refiere al texto que puede tener más de una fuente, tamaño de fuento y/o estilo de fuente. El control TextArea de escritorio soporta el texto con estilo. Para utilizar estilos en un control TextArea en Xojo has de asegurarte de que su propiedad MultiLine esté en ONasí como la propiedad Styled. Ambas lo están por omisión. Para imprimir texto con estilo, has de utilizar la clase StyledTextPrinter. A continuación, encontrarás traducido en castellano el artículo publicado originalmente en inglés en el área de desarrolladores del sitio web de Xojo, y que puedes consultar en este enlace.

Determinar la Fuente, Tamaño y Estilo del texto

Los controles TextArea tienen propiedades que facilitan determinar la fuente, el tamaño de fuente y el estilo de fuente utilizados para el texto seleccionado. Se puede utilizar la propiedad SelTextFont para determinar la fuente del texto seleccionado. Si el texto seleccionado tiene solo una fuente, entonces la propiedad SelTextFont contiene el nombre de dicha fuente. Si el texto seleccionado utiliza más de una fuente, entonces esta propiedad estará vacía.

Por ejemplo, la siguiente función devuelve los nombres de las fuentes para el texto seleccionado en el TextArea recibido:

Function Fonts(item As TextArea) As String
Dim fonts, theFont As String
Dim i, Start, Length As Integer
If item.SelTextFont = "" Then
Start = item.SelStart
Length = item.SelLength
For i = Start To Start + Length
Field.SelStart = i
Field.SelLength = 1
If InStr(fonts, Field.SelTextFont) = 0 Then
If fonts = "" Then
fonts = Field.SelTextFont
Else
fonts = fonts + ", " + Field.SelTextFont
End If
End If
Next
Return fonts
Else
Return Field.SelTextFont
End If
End Function

La propiedad SelTextSize se utiliza para determinar el tamaño de fuente del texto seleccionado y funciona del mismo modo que la propiedad SelTextFont. Si todos los caracteres del texto seleccionado tienen el mismo tamaño de fuente, entonces la propiedad SelTextSize contendrá dicho tamaño. Si se utilizan diferentes tamaños, entonces la propiedad SelTextSize tendrá el valor 0.

También existen propiedades booleanas para determinar si todos los caracteres en el texto seleccionado tienen el mismo estilo de fuente. Dado que el texto puede tener aplicados múltiples estilos, dichas propiedades determinan si todos los caracteres en el texto seleccionado tienen aplicado un estilo de fuente en particular. Por ejemplo, si todos los caracteres en el texto seleccionado están en negrita pero algunos también están en cursiva, la comprobación de negrita devolverá True. Si por otra parte, una prueba de cursiva devolverá False dado que parte del texto seleccionado no tiene dicho estilo de fuente. Si devuelve False el texto seleccionado contiene más de un estilo. Si quieres determinar qué estilos están en uso, entonces puedes seleccionar mediante código cada uno de los caracteres en el texto seleccionado y comprobar sus propiedades de estilo. Esta es una operación similar a la función anterior.

En este ejemplo se seleccionará el item de menú Negrita en el caso de que el texto seleccionado en el TextArea esté en negrita:

Stylebold.Checked = TextArea1.SelBold

Si todos los caracteres del texto seleccionado no están en negrita, entonces TextArea1.SelBold devolverá False y que será el valor asignado a la propiedad Checked del ítem de menú StyleBold.

Ajustar la Fuente, Tamaño y Estilo del Texto

Las propiedades usadas para comprobar la fuente, tamaño de fuente y estilos de fuente del texto seleccionado también son las que se pueden utilizar para ajustar estos valores. Un TextArea puede soportar múltiples fuentes, tamaños de fuente y estilos. Un TextField puede soportar una fuente, un tamaño de fuent y el estilo de texto plano. Un TextField también puede utilizar los estilos Negrita, Subrayado y Cursiva para todo el texto del control.

Por ejemplo, para ajustar la fuente del texto seleccionado a Helvetica, puedes hacer lo siguiente:

TextArea1.SelTextFont = "Helvetica"

Ten en cuenta que la fuente asignada ha de estar instalada en el ordenador del usuario o de lo contrario no tendrá efecto. También puedes utilizar la función FontAvailable para determinar si está instalada en el equipo una fuente determinada.

Puedes ajustar a cero la propiedad TextSize de un control para dejar que tu aplicación utilice el tamaño de fuente con mejor aspecto en la plataforma sobre la cual se esté ejecutando. Puedes definir el tamaño de fuente del texto seleccionado utilizando la propiedad SelTextSize. Por ejemplo, el siguiente código define el tamaño de fuente de TextArea1 a 12 puntos:

TextArea1.SelTextSize = 12

Para aplicar un estilo de fuente en particular al texto seleccionado, ajusta la propiedad de estilo adecuada a True. Por ejemplo, el siguiente código aplica el estilo Negrita al texto seleccionado de TextArea1:

TextArea1.SelBold = True

Los controles TextArea también disponen de métodos para conmutar la aplicación de estilos de fuentes. En este caso “conmutar” significa que se aplica el estilo si parte del texto seleccionado no tiene aplicado ya el estilo o bien eliminar el estilo de aquellas partes del texto que ya lo tengan aplicado. El siguiente código conmuta el estilo del texto seleccionado en TextArea1:

TextArea1.ToggleSelectionBold

Estos son los métodos que se utilizan para conmutar el estilo de la selección:

Nombre de MétodoEstilo
ToggleSelectionBoldBold
ToggleSelectionItalicItalic
ToggleSelectionUnderlineUnderline

Objetos de Texto con Estilo

Cuando trabajas con texto con estilo mostrado por un TextArea puees utilizar las propiedades de los TextArea que obtienen y ajustan los atributos de estilo tal y como se ha descrito en la anterior sección. Sin embargo, también hay clases para abrir, guardar y gestionar el texto con estilo de forma independiente al TextArea o cualquier otro control. De hecho, el texto con estilo no tiene por qué mostrarse. Este conjunto de técnicas utilizan las propiedades y métodos de la clase StyledText. Su propiedad Text contiene el texto con estilo que está gestionado por el objeto StyledText.

La clase StyledText no está soportada para las apps web. Puedes usar el objeto WebStyle para crear estilos personalizados para aplicar estilo a los controles, incluido el texto. Si bien estos conceptos son similares, no son idénticos. Por ejemplo, un WebStyle no puede aplicar estilo de forma arbitraria a diferentes segmentos tal y como sí es posible mediante el uso de la clase StuledText, tal y como se describe en esta sección.

Cada método recibe una serie de parámetros que indican la posición inicial y la cantidad de texto sobre la que se debe de aplicar el atributo. Dichos valores comienzan por el índice cero. Por ejemplo, una llamada para ajustar el estilo Negrita tendría el siguiente aspecto:

Dim st As New StyledText
st.Text = "How now Brown Cow."
st.Bold(0, 3) = True

Con el anterior fragmento de código se pondría en Negrita el texto “How,”.

Todos los caracteres contiguos con un conjunto idéntico de atributos forman un objeto StyleRun. En el anterior ejemplo, los primeros tres caracteres forman un StyleRun. El texto restante sería un segundo StyleRun. En el lenguaje de una aplicación de tratamiento de textos, cada StyleRun es una instancia de un estilo de caracter. La propiedad Text est compuesta por una secuencia de StyleRuns. La clase StyledText tiene estos métodos para la gestión de objetos StyleRun:

Nombre de MétodoDescripción
BoldObtiene o define el estilo Negrita para el texto seleccionado en Text.
TextFontObtiene o define la fuente del texto seleccionado en Text.
ItalicObtiene o define el estilo Cursiva para el texto seleccionado en Text.
TextSizeObtiene o define el tamaño de fuente para el texto seleccionado en Text.
TextColorObtiene o define el color para el texto seleccionado en Text.
UnderlineObtiene o define el estilo Subrayado para el texto seleccionado en Text.

Cada método recibe parámetros para la posición inicial y la longitud del texto sobre el que se ha de aplicar el atributo. Estos valores empiezan desde cero. Por ejemplo, una llamada a la propiedad Bold tendría el siguiente aspecto:

Dim st As New StyledText
st.Text = "How now Brown Cow."
st.Bold(0, 3) = True

Esto define la primera palabra del texto, “How,” a negrita. Todos los caracteres contiguos que tienen aplicados el mismo conjunto de atributos de estilo conforman un objeto StyleRun. En este ejemplo, los primeros tres caracteres conforman un StyleRun. El texto restante es el segundo StyleRun. En el lenguaje de una aplicación de tratamiento de textos, cada StyleRun es una instancia de un estilo de caracter. La propiedad Text está compuesta de una secuencia de objetos StyleRun. La clase StyledText tiene estos métodos para la gestión de objetos StyleRun:

Nombre de MétodoDescripción
AppendStyleRunAñade un StyleRun al final de Text.
InsertStyleRunInserta un StyleRun en la posición indicada.
RemoveStyleRunEliina el StyleRun indicado de Text.
StyleRunProporciona acceso a un StyleRun en concreto de Text. La clase StyleRun tiene sus propias propiedades que describen el estilo aplicado a todos los caracteres en el StyleRun.
StyleRunCountDevuelve la cantidad de objetos StyleRun incluidos en Text.
StyleRunRangeAccede a la posición inicial, longitud y posición final del StyleRun.
TextEl texto gestionado por el objeto StyledText. Técnicamente, Text es un método pero puedes obtener y definir su valor como si fuese una propiedad.

El método Text de un objeto StyledText puede tener múltiples párrafos. Un párrafo es el texto entre dos caracteres de final de línea. Un párrafo puede estar definido tanto por la función EndOfLine o el caracter de final de línea para la plataforma sobre la cual esté corriendo la aplicación.

Un párrafo puede estar compuesto por múltiples objetos StyleRun. Sólo tiene una propiedad de estilo propia, la alineación de párrafo (Left, Centered o Right).

Si bien puedes trabajar con un objeto StyledText enteramente desde código, sin llegar a mostrarlo en absoluto, el control TextArea está “conectado” a la clase StyledText en el sentido de que puedes acceder a todos los métodos y propiedades de la clase StyledText a través de la propiedad StyledText del TextArea. Pueden usarse estos métodos para trabajar con Párrafos:

Nombre de MétodoDescripción
ParagraphProporciona acceso a un Párrafo conreto del texto. La clase Paragraph tiene sus propias propiedades que devuelven la posición inicial, longitud, posición final y alineación del párrafo.
ParagraphCountDevuelve el número de Párrafos que componen el texto.
ParagraphAilgnmentDefine la alineación del párrafo indicado (Default, Left, Centered, o Right). El método ParagraphAlignment recibe un parámetro, la cantidad de párrafos a alinear (empezando desde cero). Para ello asignas una constante de alineación de Paragraph: AlignDefault (0): Alineación por defecto. AlignLeft (1): Alineado a la izquierda. AlignCenter (2): Alineamiento centrado. Right (3): Alineado a la derecha. Por ejemplo, para alinear a la derecha el primer párrafo, puedes utilizar una instrucción como StyledText1.ParagraphAlignment(0) = Paragraph.AlignRight

Para trabajar con un objeto StyledText en un TextArea, has de activar las propiedades MultiLine y Styled del TextArea. Puedes hacerlo usando el Inspector. Imagina que el TextArea con estilo ya tiene el texto que quieres manipular usando la clase StyledText. El siguiente código carga el texto en un objeto StyledText:

Dim st As New StyledText
st = TextArea1.StyledText
TextArea1.AppendText("This is the appended text.")
st.Bold(0, 4) = True

El objeto StyledText es en realidad un alias del texto del TextArea y no una copia estática. Esto significa que la tercera línea de código cambia los contenidos del TextArea y que la última línea define los primeros cuatro caracters del TextArea a negrita.

En el siguiente ejemplo el código configura la propiedad Text del objeto StyledText y lo muestra en el TextArea:

TextArea1.StyledText.Text = "Here is my styled text." + EndOfLine _
+ "Impressive. Most impressive."

A partir de aquí puedes asignar propiedades de estilo al texto. Estos cambios reformatean los contenidos del TextArea. Este es un ejemplo simple que funciona con estos dos párrafos:

Dim st, ln As Integer
Dim Text As String
Text = "Here is my styled text." + EndOfLine + "Aren’t you really impressed?"
TextArea1.StyledText.Text = Text
' Asigna la Fuente y Tamaño a todo el texto
TextArea1.StyledText.Font(0, Len(Text)) = "Arial"
TextArea1.StyledText.Size(0, Len(Text)) = 14
' Aplica un color de resalte a los caracteres 'my' del primer párrafo
TextArea1.StyledText.Bold(8, 2) = True
TextArea1.StyledText.TextColor(8, 2) = &cff0000
' Obtiene posiciones del segundo párrafo (basado en índice 0)
st = TextArea1.StyledText.Paragraph(1).StartPos-1
ln = TextArea1.StyledText.Paragraph(1).Length
' Segundo párrafo en Negrita
TextArea1.StyledText.Bold(st, ln) = True
' Segundo párrafo Centrado
TextArea1.StyledText.ParagraphAlignment(1) = Paragraph.AlignCenter

Este ejemplo funciona con el objeto StyledText “conectado” al TextArea, pero también puede funcionar con texto con estilo offline. Puedes declarar un objeto StyledText mediante una instrucción Dim y trabajar sobre él sin mantener referencias sobre ningún control. Cuando estés listo para mostrarlo puedes asignarlo a la propiedad StyledText de un TextArea.

Podrías hacerlo con una línea como:

Dim st As New StyledText
' do whatever you want right here; when you’re done, just write...
TextArea1.StyledText = st

También puedes exportar el texto con estilo como una serie de objetos StyleRun y leerlos posteriormente para reconstruirlos como un objeto StyledText usando el método AppendStyleRun.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *