Script de escritura como alternativa a macro (1)
Además de utilizar un script para manejar una macro de escritura (o de otro tipo), disponemos en OOo Basic de instrucciones específicas que cumplen la misma función de escritura de textos. Esto nos permite utilizar la opción que mejor se adecúe a nuestras necesidades o preferencias. Los expertos prefieren prescindir absolutamente de las macros; yo, que no lo soy, opino que siempre es preferible (por claridad y coherencia del código) utilizar OOo Basic a macros, pero que, en ocasiones, una macro simple, empleada con habilidad desde OOo Basic, puede ser una buena solución, o al menos la mejor disponible. Sobre todo cuando el código alternativo OOo Basic es incluso más complicado que el propio código de la macro. Y situaciones de este tipo las hay.
Pero no es el caso de la escritura de contenido del texto, base para su automatización. En este caso disponemos de código alternativo basado exclusivamente en OOo Basic. Este código es más simple que el que genera Grabar macro y, claro está, cumple el mismo cometido. Veámoslo en su formulación como subrutina:
Sub ScriptEscribir (sTexto As String)
Dim oText As Object
oText = ThisComponent.Text
oText.insertString(oText.getStart(),sTexto & Chr(13), False)
End Sub
Las dos primeras líneas son similares (aunque más sencillas) que con las que invariablemente se inicia una macro, como recordarás, pero donde se aprecia la mejora (por sencillez) es en la tercera, que sustituye a la matriz bidimensional (dos argumentos) y a la instrucción de ejecución de que se compone la macro. Esto hace de este script (2)
Debemos fijarnos en la posición que ocupan los elementos en la expresión compleja oText.insertString(oText.getStart(),sTexto & Chr(13), False) (3), ya que es necesario respetar el orden de sus componentes. La primera parte es invariable y viene determinada por el nombre que hayamos dado a la variable objeto con que se inicia (en este caso, y por nuestra decisión se llama oText) y que se repite en el primer parámetro (la llamada a la función oText.getStart()) (4). También deberemos mantener como False el tercer parámetro, pero es en el segundo donde cabe introducir un strings, una variable simple o resultante de una concatenación string+variable(s) o directamente una concatenación (string+variable(s)). En este caso ese segundo parámetro está compuesto de una variable con función de parámetro de la subrutina (sTexto) concatenado con una función interna del lenguaje OOo Basic que ejecuta un salto de línea (Chr(13)).
Esta simple formulación del segundo parámetro nos abre todo un mundo de posibilidades en cuanto a nuestro objetivo: es posible automatizar la escritura de textos complejos, incluyendo la formulación de párrafos recurriendo a dos formas básicas de uso:
- La más simple y, por ello, recomendable para composiciones no excesivamente largas o complejas: dar externamente a sTexto todo el contenido textual (incluyendo el o los saltos de línea que precisemos), con lo que sTexto es en realidad un string creado mediante la concatenación de otras variables.
- La segunda opción consiste en reiterar el uso de la subrutina dando (desde el script principal) diferentes contenidos a la argumento sTexto. Para ello podemos hacer uso de un bucle. Esta estructura puede ser todo lo simple (mera sucesión) o compleja que necesitemos, incluyendo el uso de condicionales que alteran el contenido de las variables que alimentan la propia variable parámetro sTexto, lo que nos permite automatizar la composición de textos de gran complejidad. (5)
Comparando entre una forma y otra, destaca la simplicidad de la segunda subrutina por comparación con la creada a partir de la macro. Si la analizamos detenidamente, podremos apreciar que contiene incluso el posicionamiento del texto, en este caso al inicio del documento; pero también es posible escribirlo al final del mismo, para ello deberíamos cambiar getStart() por getEnd(). Frente a este comportamiento, la subrutina basada en macro carece de instrucciones de ubicación, por lo que su contenido se escribirá allá donde se encuentre posicionado el puntero visible del documento.
Existe una segunda versión alternativa al anterior script, que te dejo a continuación para que uses el que consideres mejor.
Sub Escribir (sTexto As String)
Dim oDoc As Object
oDoc = ThisComponent.CurrentSelection.getByIndex(0).End
oDoc.String = sTexto & Chr(13)
End Sub
Y para finalizar muestro un ejemplo de uso que desarrolla una propuesta de informe escolar que consta de tres párrafos: en el primero se presenta al alumno o alumna y sus datos escolares actuales; en el segundo se analiza su historial de escolarizaciones (y cambios de centro) y en el tercero se valora su nivel de rendimiento académico, en función del porcentaje de éxito en la consecución de los objetivos de aprendizaje.
Para su desarrollo he creado un scritp principal (Main) y he empleado la segunda formulación del script OOo Basic de escritura. También se hace uso de macros-subrutinas que se llaman desde Main.
El resultado es un algoritmo de cierta complejidad y algo laborioso por el elevado número de variables a considerar. Es interactivos y suficientemente funcional, de modo que se puede emplear como base para desarrollar un modelo de informe escolar (de rendimiento académico), aunque, en mi opinión, para ello sería necesario añadir (en su caso) los objetivos de aprendizaje (criterios de evaluación o indicadores competenciales) en los el alumno presenta dificultades.
NOTAS
(1) Basada en la entrada publicada con fecha 30/07/2023, titulada Writer. Subrutinas basadas en macro y script.
(2) En este caso se trata, en realidad de una subrutina, por lo que no funciona de forma independiente, siendo, por tanto, necesario llamarla y darle contenido desde un script. No obstante también podemos utilizar la estructura directamente, siendo necesario, para ello, incluir dentro del script la variable sTexto y asignarle el contenido que deseemos.
(3) Sin ánimo de complicar innecesariamente la explicación, pero para ser más preciso, esta expresión está formada por una función que asociamos al la variable objeto oText (insertString()), que, a su vez consta de tres parámetros o componentes (que situamos dentro del paréntesis de la función). El primero de ellos es otra función (getStart()), también asociada a la variable objeto oText. El segundo se explica en la entrada y el tercero no será objeto de explicación, siendo suficiente para nuestros objetivos actuales con saber que debemos mantener con valor False.
(4) La función getStart() posiciona el cursor interno (no el visible) al inicio del documento, por lo que es la adecuada cuando queremos escribir al inicio de un documento. La alternativa getEnd() nos posiciona al final del documento. Ambas funciones hacen innecesario el uso de las macros de posicionamiento equivalentes y deberemos elegir una u otra según el modo en que deseemos trabajar con el documento.
(5) Evidentemente podemos dar capacidad interactiva a nuestro script, incrementando así su flexibilidad y funcionalidad. Para ello emplearemos la ya sabida asociación de las variables a cumplimentar por el usuario a cualquier sistema de interface. El resultado final es el desarrollo de un algoritmo complejo y altamente funcional de automatización de la escritura o composición de un texto. De hecho podemos considerar este nivel de desarrollo como equivalente a la base procedimental de creación de un docap.
No hay comentarios:
Publicar un comentario
Comenta esta entrada