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.
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
end subrem ----------------------------------------------------------------------
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())
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