June 2008 - Artículos

¿Quién dijo memos?

     Los memos en Access 2007 ya no parecen tan memos. Ahora vienen con un par de características que les hacen más interesantes: Soportan formato de texto enriquecido y la posibilidad de sólo permitir anexar, no modificar. Un año después del lanzamiento de la versión 2007, esto ya no es novedad, pero aún cabe jugar con ellos para explorar posibilidades que quizás se escapen a primera vista.

Este artículo fue publicado en el Rincón del experto del mes de abril.

Formato de texto enriquecido

TextFormat en controles de texto

Ésta, que es la novedad más vistosa, no supone ningún cambio en el tipo de datos, sino que el mérito se lo lleva el nuevo control de texto que es capaz de manejar el "Rich text format". Los campos memos siguen guardando texto plano, pero dependiendo de cómo esté establecida la propiedad "Formato de texto", Textformat, mostrará el formato enriquecido o las etiquetas HTML de éste.

Es decir, si en el cuadro de texto TexFormat = acTextFormatHTMLRichText, podríamos ver algo así:

Muestra

Pero, si en el cuadro de texto TexFormat = acTextFormatPlain, lo que veríamos sería:

<div align=center><font size=5 style="BACKGROUND-COLOR:#FFFF00"><strong><em><u>Muestra</u></em></strong></font></div>

Como la propiedad lo es del cuadro de texto, se aplica no sólo a los memos de 2007, sino también a los de versiones anteriores de Access. Si usamos el formato enriquecido con campos de un archivo en formato MDB desde Access 2007, se comportará igual que un ACCDB, pero, si lo vemos desde una versión anterior de Access, por ejemplo, 2003, se mostrarían las etiquetas HTML.

TextFormat en campos memo

Pero no sólo los controles de texto tienen la propiedad "Formato de texto" o TextFormat, también la tienen los campos memo. A simple vista, da la impresión de que esto afecta de alguna manera a los datos, pero no parece que sea así; sigue siendo texto plano, con o sin etiquetas HTML. Bueno, en cierto modo sí que afecta a los datos: si en un memo con texto enriquecido cambiamos la propiedad TexFormat a acTextFormatPlain, desaparecerán de manera irreversible todas las etiquetas HTML, lo cual puede ser útil para hacerlo legible en versiones anteriores de Access, pero un poco peligroso si andamos jugando con datos reales.

Si mostramos los datos de la tabla y el formato de texto es enriquecido, se muestra como tal, dando la apariencia de que se ha guardado de una forma especial, pero si en una consulta o en un formulario, creamos un campo calculado cuyo origen sea = MiMemo, veremos que el contenido sigue siendo un archivo de texto con etiquetas HTML.

Al añadir un campo memo a un formulario o informe en modo diseño, el cuadro de texto hereda la propiedad TextFormat del campo, pero podemos cambiarle la propiedad a la contraria y, si no hay datos, ésta prevalecerá. Si existen datos, también prevalecerá la propiedad pero el resultado inmediato sobre los datos existentes seguramente será chocante, pues hay que tener en cuenta que las etiquetas HTML no dejan de ser texto.

Resumiendo

  • La propiedad Formato de Texto en un campo memo en el diseño de la tabla sirve para determinar cómo se muestran los datos en la vista Hoja de Datos de la tabla y para ser heredada por los controles que tengan por origen ese campo.
  • La propiedad Formato de Texto en un cuadro de texto determina la forma en que se muestra éste.
  • No tiene por qué coincidir la propiedad TextFormat de un control con la de del campo memo del que dependa, aunque con datos existentes se pueden producir resultados chocantes.

Juguemos un poco

Busquemos usos distintos:

image

 

Una forma muy sencilla de mostrar "etiquetas" en texto enriquecido es crearnos una tabla con un memo con formato enriquecido que editamos a nuestro gusto. Para el equivalente de una etiqueta podemos usar un campo calculado con un dLookUp() que busque el registro que queramos. Para que se comporte como una etiqueta, basta con poner las propiedades Bloqueado a y Activado a No. Sustituir a un msgbox puede ser algo casi tan sencillo como eso o darle toda la complejidad que queramos.

Concantenando variables

Es muy frecuente concatenar campos o variables con cadenas de texto para mostrar los resultados en un informe o formulario. Podemos usar, por ejemplo:

= "Estimado Sr. " & [PrimerApellido] & ":"

Para obtener el resultado:

Estimado Sr. Fernández:

Pero nos faltaba una posibilidad sencilla de poder formatear ese campo calculado, por ejemplo, poner en negrilla el apellido. Cómo hemos visto que se trata de etiquetas HTML, basta con añadir éstas a la cadena para conseguir el resultado:

="Estimado Sr. <strong>" & [PrimerApellido] & "</strong>"

Y el resultado que obtendríamos sería:

Estimado Sr. Fernández
No hace falta saber HTML para hacer esto. Podemos crearnos un formulario auxiliar con dos cuadros de texto, uno con formato enriquecido y otro sin él cuyo origen sea el primero. Cualquier formato que demos en el primer cuadro, se reflejará en código en el segundo. Sólo hay que copiar y pegar, teniendo en cuenta que <div> y </div> son las marcas de inicio y fin de párrafo y que puede que no necesitemos.

 image  image

 

Aún así sigue siendo pesado, de manera que tendremos que ingeniarnos una herramienta distinta. Son sólo tres pasos:

 

  1. Nos creamos una tabla con un campo de Formato, de texto, y otro Muestra, memo, y un formulario para editarla en el que al campo Muestra le ponemos como valor predeterminado, "Muestra" y como Formato de texto,"Texto enriquecido".

image

  1. Le damos a Muestra los formatos que queramos y en Formato ponemos un texto descriptivo para después localizar el formato.
  2. Nos creamos una función que busque Formato, lea el contenido de Muestra y en él sustituya la palabra "Muestra" por el contenido que queremos formatear

Public Function FormatoHtml(Cadena As String, Formato As String) As String
Dim vTmp As Variant, sTmp As String
vTmp = DLookup("Muestra", "LocalFormatos", "Formato = '" & Formato & "'")
If Not IsNull(vTmp) Then
    sTmp = vTmp
    sTmp = Replace(sTmp, "<div>", "")
    sTmp = Replace(sTmp, "</div>", "") 'Quitamos las marcas de párrafo que nos sobran
    sTmp = Replace(sTmp, "Muestra", Cadena) 'Cambiamos el texto Muestra por nuestra cadena
Else
    sTmp = Cadena 'Si no encontramos el formato, devolvemos la cadena sin formato
End If
   
FormatoHtml = sTmp
End Function

Probando en la ventana de inmediato, tendríamos:

?  FormatoHtml ("Hola mundo","negrita")
<strong>Hola mundo</strong>

? FormatoHtml(FormatoHtml("Hola mundo","negrita"),"Cursiva")
<em><strong>Hola mundo</strong></em>

De la misma manera, en el primer ejemplo, podríamos poner algo así:

="Estimado Sr. " & FormatoHtml([PrimerApellido];"negrita") & ":"

y el resultado sería:

Estimado Sr. Fernández:
Ahora le toca jugar a cada uno.

Evidentemente, la función es un apaño que tendríamos que mejorar. Un DLookUp () en cada registro de una consulta, bajaría notablemente el rendimiento; en su lugar podríamos cargar la tabla de formatos en una matriz o en un objeto Dictionary y buscar ahí.

También nos podría interesar una composición más compleja abriendo y cerrando formatos. Nos seguiría valiendo la misma tabla y la misma búsqueda; haciendo un Split() del resultado usando como separador la palabra "Muestra", tendríamos en el primer elemento de la matriz resultante las etiquetas de apertura, y en el segundo, las de cierre.



 

Publicado por Chea con 2 comment(s)
Archivado en: ,