jueves, 14 de marzo de 2024

Procedimientos. Macros.

Llamada a macros simples desde un script (1)

Partiendo de unas macros (esto es: generadas desde Grabar macro), y después de haber hecho la limpieza correspondiente (1) podemos realizar varias combinaciones de esas macros simples para generar un script o varios, que cumplan diferentes cometidos. En este caso estaremos aplicando principios de programación estructurada, aunque con las mismas limitaciones que tienen las macros: no permiten ningún tipo de estructura condicional o de ciclo, aunque podemos repetir las llamadas a una determinada macro las veces que necesitemos. Tampoco es posible utilizar variables creadas por nosotros ni establecer ningún tipo de sistema de entrada de datos. Todo esto forma parte de las limitaciones de una macro ya que, como dije, crear macros no es programar.



Aunque esta forma de trabajo resulta muy limitada, en cuanto al uso de los recursos de programación, se puede considerar una primera forma de trabajo; por este motivo hablo de ello aquí, aunque pronto nos veremos impelidos a mejorar sustancialmente nuestro procedimiento de trabajo.

Ejemplifico esta forma básica de trabajar con macros con un desarrollo práctico (únicamente a modo de práctica) concreto, basado en el trabajo con textos, ya que son éstos y los procesadores de textos los documentos y herramientas de uso más frecuente.

Además este ejemplo puede ser de utilidad cuando desarrollemos procedimientos más complejos, pero queramos formatear el texto de una forma concreta. Aunque es posible trabajar directamente con OOo Basic, recurrir a macros simples de formateo puede no ser tan mala idea. Y será suficiente con establecer el orden específico en el que queremos activar una determinada "función".

Para concretar lo que quiero decir, te sugiero releer esta entrada y repetir la secuencia de acciones que se listan en ella, pero activando Grabar macro para cada una de las acciones y desactivándola al finalizar la acción (2). No es necesario que realices todas las instrucciones; es suficiente con que llegues hasta la séptima (bajar el cursor a la línea siguiente), incluso saltándote la sexta (escritura de una frase)

El resultado que obtendrás será una pequeña colección de macros que ahora vamos a utilizar para ejemplificar su llamada desde un script o desde varios diferentes. En ellos podrás activar (o no) esas macros simples, en el orden que desees y las veces que quieras. Como no se trata de hacer nada de utilidad inmediata, sólo estamos jugando, no necesitas hacer nada complejo, así que no te preocupes por limpiar las macros ni uses (por ejemplo) un bucle para reiterar una macro.

Esta es nuestra colección de macros. He cambiado el color (azul) y sangrado el contenido de las macros para que se visualicen y distingan mejor:

sub Inicio

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array())

end sub


sub Negrita

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(0) as new com.sun.star.beans.PropertyValue

args1(0).Name = "Bold"

args1(0).Value = true

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args1())

end sub


sub LetraTipo

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(4) as new com.sun.star.beans.PropertyValue

args1(0).Name = "CharFontName.StyleName"

args1(0).Value = ""

args1(1).Name = "CharFontName.Pitch"

args1(1).Value = 2

args1(2).Name = "CharFontName.CharSet"

args1(2).Value = -1

args1(3).Name = "CharFontName.Family"

args1(3).Value = 5

args1(4).Name = "CharFontName.FamilyName"

args1(4).Value = "Arial"

dispatcher.executeDispatch(document, ".uno:CharFontName", "", 0, args1())

end sub


sub LetraTamano

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(2) as new com.sun.star.beans.PropertyValue

args1(0).Name = "FontHeight.Height"

args1(0).Value = 14

args1(1).Name = "FontHeight.Prop"

args1(1).Value = 100

args1(2).Name = "FontHeight.Diff"

args1(2).Value = 0

dispatcher.executeDispatch(document, ".uno:FontHeight", "", 0, args1())

end sub


sub LetraColor

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(1) as new com.sun.star.beans.PropertyValue

args1(0).Name = "Color.Color"

args1(0).Value = 16711680

args1(1).Name = "Color.ComplexColorJSON"

args1(1).Value = "{"+CHR$(10)+"    "+CHR$(34)+"ThemeIndex"+CHR$(34)+": "+CHR$(34)+"-1"+CHR$(34)+","+CHR$(10)+"    "+CHR$(34)+"Transformations"+CHR$(34)+": "+CHR$(34)+CHR$(34)+CHR$(10)+"}"+CHR$(10)

dispatcher.executeDispatch(document, ".uno:Color", "", 0, args1())

end sub


sub Centrar

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(0) as new com.sun.star.beans.PropertyValue

args1(0).Name = "CenterPara"

args1(0).Value = true

dispatcher.executeDispatch(document, ".uno:CenterPara", "", 0, args1())

end sub


sub BajarLineaIntro

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())

end sub


sub BajarLineaFlecha

rem ----------------------------------------------------------------------

rem define variables

dim document   as object

dim dispatcher as object

rem ----------------------------------------------------------------------

rem get access to the document

document   = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

dim args1(1) as new com.sun.star.beans.PropertyValue

args1(0).Name = "Count"

args1(0).Value = 1

args1(1).Name = "Select"

args1(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())

rem ----------------------------------------------------------------------

dim args2(1) as new com.sun.star.beans.PropertyValue

args2(0).Name = "Count"

args2(0).Value = 1

args2(1).Name = "Select"

args2(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())

end sub

Ahora lo que vamos a hacer es crear varios script haciendo uso de algunas de ellas y en un orden determinado. Por ejemplo...

Sub Uso_1_de_Macros_Simples

Call Inicio

Call Centrar

End Sub


Sub Uso_2_de_Macros_Simples

Call Inicio

Call LetraTipo

Call LetraTamano

End Sub


Sub Uso_3_de_Macros_Simples

Call Inicio

Call Centrar

Call LetraTipo

Call LetraTamano

Call LetraColor

End Sub

Cada uno de ellos realiza funciones diferentes, empleando las macros llamadas (Call) en el orden que se expresa en cada script. No hemos necesitado crear una macro diferente para generar cada una de la secuencias de acciones que asumen los script. Y los ejemplos se pueden incrementar las veces que desees, combinando las macros en número y orden, o repitiendo la llamada a algunas de ellas las veces que desees.

Con estos sencillos ejemplos puedes comprobar las ventajas y las limitaciones de esta forma de usar las macros. Que tiene ventajas respecto al modelo básico (Grabar macro), pero que se puede mejorar sustancialmente escribiendo script de mayor complejidad.

Eso para la entrada siguiente.

NOTAS

(1) Como ya comenté en otro momento, al crear una macro es casi inevitable que comentamos algún tipo de error o que realicemos alguna rectificación. Dado que la grabadora de macros copia (y traduce) cada una de nuestras acciones, ese código "basura" queda también grabado. Por eso es necesario eliminarlo de la macro. Cierto que para eso tenemos que entender el código de la macro, así que, en realidad, esta limpieza puede se posponer hasta que tengamos seguridad de saber qué hacemos. Mientras tanto, a nuestros ojos la macro, aunque "sucia", seguirá funcionando aparentemente igual de bien.

(2) Aunque se recomienda no hacer uso del ratón cuando se graba una macro, lo cierto es que determinadas acciones, como seleccionar el tipo de letra, o el tamaño, sí son admitidas si se usa el ratón. En todo caso no hay garantía que todas las acciones disponibles para el ratón sean grabadas desde Grabar macro.

No hay comentarios:

Publicar un comentario

Comenta esta entrada