Logo Desarrollo


Array y variables integradas:

A medida que vamos avanzando con el aprendizaje del lenguaje, es conveniente tratar de evitar las repeticiones de código. Esto va a ahorrarnos bastante escritura, así como facilitarnos la corrección de fallos. Una herramienta fundamental para este menester es el uso de las funciones, tratadas en un artículo anterior. Asimismo podemos compactar más aún el código si utilizamos arrays con datos, y variables integradas.


Arrays:

Hasta el momento solo hemos trabajado con variables simples que contenían tan solo un tipo de dato específico, los strings o cadenas de texto. Sin embargo, al igual que en todos los lenguajes de programación, existen otros tipos de datos que pueden ser contenidos en una variable. Uno de ellos son las arrays. Las arrays son un conjunto de valores contenidos en un mismo espacio en memoria, los cuales serán identificados por su índice. En AutoHotkey podremos trabajar con arrays simples, o asociativos.

arrays simples:

Se crean añadiendo a una variable un conjunto de elementos separados por coma y entre corchetes, de esta forma;

Nombres := ["Mateo", "Milena", "Tomás", "Pedro"]

En este ejemplo guardamos en la variable Nombres un conjunto de datos separados por comas, que al ser cadenas de texto deben ir entre comillas. Como dije anteriormente estos datos van a tener asignado un número de índice el cual los va a diferenciar entre si. por lo que Mateo va a tener el número de índice 1, Milena el 2, y así sucesivamente. Para recuperar el dato de un array debemos llamar a la variable, seguida del número de índice entre corchetes:

MsgBox, 0, Resultado,% Nombres[1] ;Muestra el nombre Mateo
MsgBox, 0, Resultado,% Nombres[2] ;Muestra el nombre milena.

Si llamamos al contenido de un array en un comando debemos utilizar el tipo expresión. El cual se realiza colocando un signo de porciento (%), un espacio en blanco y la expresión.
Si lo hacemos de la siguiente forma, no funciona;

MsgBox, 0, Resultado, %Nombres[2]%

De esta misma manera podríamos guardar no solo cadenas de texto sino también números, coordenadas, otras variables, etc. Vámos con un ejemplo sencillo, el cual pueden pegar en un archivo ahk vacío:

Frutas := ["Manzana", "Pera", "Banana", "Durazno", "Naranja"]


^+f::
MsgBox % Frutas[2]
Return


Esc::ExitApp

En este ejemplo, al pulsar el atajo control, shift f, nos va a devolver el contenido de la variable Frutas en la posición 2. podemos cambiar ese número entre corchetes y volver a ejecutar para comprobar el resto de datos del array.

Arrays asociativas:

es un objeto que contiene una colección de claves únicas y una colección de valores, donde cada clave está asociada con un valor. Las claves pueden ser cadenas, enteros u objetos, mientras que los valores pueden ser de cualquier tipo. Una matriz asociativa se puede crear de la siguiente manera:

mascota := {nombre: "Gilber", edad: 3, color: "Blanco con manchas negras",sexo: "macho"}

Para llamar al contenido de un array asociativo se puede utilizar el nombre de la clave entre corchetes:

MsgBox, 0, Nombre,% mascota["nombre"]

Al ser un objeto, también podemos utilizar la notación de punto:

MsgBox, 0, Sexo,% mascota.sexo

Para profundizar en el tema Arrays, en la página de AHK encontrarán la información necesaria.

Arrays in AHK

Built-in variables:

Una cuantiosa variedad de variables útiles están integradas en el programa y cualquier script puede hacer referencia a ellas.
Con la excepción de Clipboard , ErrorLevel y los parámetros de la línea de comandos , estas variables son de solo lectura; es decir, su contenido no puede ser alterado directamente por el script. Por convención, la mayoría de estas variables comienzan con el prefijo A_, por lo que es mejor evitar usar este prefijo para sus propias variables.
Algunas de ellas son:

A_DD  Devuelve el día actual
A_mm  Devuelve el mes actual.
A_YYYY Devuelve el año actual.


Si colocamos lo siguiente en un script;

MsgBox % A_Hour ":" A_Min

Va a devolvernos la hora y los minutos actuales. Al ser un llamado a la variable por expresión, es decir que hay un espacio o más entre el signo de porciento y las variables, los strings deben ir entre comillas. Y entre los strings y las variables debe de haber al menos un espacio para que se produzca la concatenación.
De esta misma manera tenemos un montón de otras variables integradas, sin embargo las que nos interesa en este caso son las referidas a los menús, que son las siguientes:

A_ThisMenu  Devuelve el nombre del menú desde donde fué llamado.
A_ThisMenuItem  Devuelve el nombre del ítem del menú que fué ejecutado.
A_ThisMenuItemPos  Devuelve el número de posición de ese ítem del menú que fué ejecutado.


Un ejemplo sencillo para copiar y pegar:

Menu, Roy, Add, Alfa, Etiqueta
Menu, Roy, Add, Beta, Etiqueta
Menu, Roy, Add, Gama, Etiqueta
Menu, Roy, Add, Delta, Etiqueta
Return


^+t::
    Menu, Roy, Show
Return


Etiqueta:
MsgBox % "Has seleccionado la opción " A_ThisMenuItem ", del menú " A_ThisMenu ". En la posición " A_ThisMenuItemPos

ExitApp


Todo esto metido en una función:

Ahora veamos como podemos utilizar las herramientas anteriores para compactar un script. Vamos a crear un menú que contenga los nombres de los programas, y una función que contenga un array con los nombres claves de los programas y la ejecución de los mismo según su número de índice.
Primero creamos los ítems del menú;

Menu, App, Add, Block de notas, Programas
Menu, App, Add, Google Chrome, Programas
Menu, App, Add, Microsoft Edge, Programas
Menu, App, Add, Mezclador de volúmen, Programas
Menu, App, Add, Sonido de Windows, Programas

Ahora creamos la llamada al menú:

^+p::Menu, App, Show

Ahora lo interesante, vamos a construir la función con el array. En primer lugar colocamos el nombre, y entre paréntesis los parámetros con los que va a trabajar esta función, que van a ser las variables integradas del menú. Al estar como parámetros de función, no es necesario llamarlas con el prefijo A_. Quedaría así:

Programas(ItemName,ItemPos,MenuName) {
                algunas instrucciones
                }


En el menú ejecutar de windows que se abre con windows r, podemos abrir todos estos programas escribiendo su nombre clave. Para el block de notas por ejemplo se escribe "notepad", y al pulsar intro se va a abrir el programa. Estos nombres son los que guardaremos dentro del array.

Programs := ["notepad","chrome","msedge","sndvol","mmsys.cpl"]

Ahora meteremos en una variable el nombre de la aplicación que pulsamos en el menú. Para ello llamaremos al array Programs y entre corchetes le pasaremos la variable integrada ItemPos, la cual contendrá el número de posición del ítem del menú que equivaldrá al índice del array que buscamos.

App := Programs[ItemPos]

Y por último, si no se han desmayado antes, añadiremos la función Run a la que le pasaremos como parámetro esta variable que contiene el nombre del programa asignado.

Run %App%

Es un tema bastante mas avanzado de lo que veníamos trabajando, así que no desesperéis si han quedado más dudas que certezas. De a poco se irán comprendiendo los entresijos de este lenguaje. Aquí un rar con los ejemplos trabajados.

Descargar el archivo con los ejemplos

Y aquí la publicación del manual en línea donde encontrarán la lista de variables integradas. Builtin variables