Procedimientos

Un procedimiento es una parte del programa que realiza una acción específica que hemos definido con anterioridad y a la que podemos llamar tantas veces como queramos usando un identificador (su nombre) como hacemos cuando usamos variables.
En programación a los procedimientos también se les conoce como rutinas, subrutinas o subprogramas.
En este capítulo vamos a aprender a usarlos.

 Introducción

Un procedimiento es una parte del programa que realiza una acción específica que hemos definido con anterioridad y a la que podemos llamar tantas veces como queramos usando un identificador (su nombre) como hacemos cuando usamos variables. En programación a los procedimientos también se les conoce como rutinas, subrutinas o subprogramas.
Utilizar procedimientos en nuestros programas nos ahorra tiempo, hace los programas más sencillos de entender y nos permite reutilizar los procedimientos que ya hemos hecho en otros programas.
En AppInventor los bloques que llaman a procedimientos se identifican porque llevan delante la palabra "call" (llamar, de llamar a procedimiento)
Por ejemplo, recuerda que para hacer sonar un sonido en nuestro programa usamos el bloque "call Sound.Play." sin tener que hacer nada más. Este procedimiento al que llamamos se encarga de todo lo necesario para hacer que el sonido se escuche en nuestro dispositivo: Se encarga de buscar el archivo que queremos hacer sonar, abrirlo, leerlo, descodificar el sonido en función del tipo de archivo de sonido que sea, reproducirlo hasta llegar al final de mismo y por último, cerrarlo. Todo esto sin que tengamos que hacer nada en nuestro programa excepto llamar a este procedimiento.
En ocasiones podemos llamar a los procedimientos usando parámetros que es un mecanismo que nos permite pasar datos del programa principal al procedimiento y viceversa. Por ejemplo, dentro de la categoría de bloques text (texto) encontrarás muchos procedimiento para manipular cadenas de texto y verás que necesitas pasarle a estos procedimientos la cadena de texto que quieres manipular así como otros parámetros dependiendo del procedimiento que quieras usar.
Lo más importante a recordar es que usando procedimientos ahorramos mucho tiempo porque una vez que hemos definido el procedimiento que queremos usar en detalle luego sólo tenemos que llamar a este procedimiento cada vez que lo necesitemos. Además, si cometes un error en un procedimiento sólo tiene que corregirlo una vez y en un lugar.

 Sumando números con un procedimiento

Vamos a hacer una pequeña aplicación para demostrar la utilidad de los procedimientos en nuestros programas. En este ejemplo vamos a sumar dos números llamando a un procedimiento al que vamos a llamar suma_numeros usando dos parámetros con los números que queremos sumar. El procedimiento nos devolverá la suma de ambos.
Crea un proyecto nuevo, llámale "suma_numeros" y añade desde el Diseñador los siguientes componentes: Dos componentes textbox, un “Button” y una “Label”
Ahora vamos al Editor de bloques.
Crear y usar procedimientos es muy similar a crear y usar variables. Dentro de Built-in/Procedures coge el bloque “to procedure result”
Este bloque nos permite crear procedimientos que nos devuelven un valor al terminar. Cambia el nombre del procedimiento y llámalo suma_numeros.
Para nuestro procedimiento vamos a usar dos argumentos. Cada uno corresponde a los números que queremos sumar. Para definir los dos argumentos hacemos click en la rueda que aparece en la esquina superior izquierda del bloque. En el cuadro que nos aparece arrastramos dos bloques “input” dentro del bloque “inputs”. Y observaremos que nos han aparecido dos argumentos al lado del nombre con el que hemos definido la función, en este caso “suma_numeros”.
Cambia el nombre del primer argumento y llámalo numero1, al segundo llámalo numero2.
Ahora vamos con la suma. Fíjate que el procedimiento suma_numeros tiene un campo llamado return. En este campo pondremos el resultado de las operaciones que queremos devolver cuando llamemos a este procedimiento. En este caso, el resultado de la suma. Como lo que queremos hacer es muy sencillo podemos hacer la operación directamente dentro de return. Vamos a ver cómo.
Crea un bloque math + para sumar dos números.
En el primer espacio pon el bloque get numero1 y en el segundo el get numero2, Recuerda que los encontrarás en Built-in/Variables
Finalmente junta la suma al argumento result del procedimiento. Como este procedimiento es muy sencillo no hemos necesitado hacer nada dentro del espacio del procedimiento y ha sido suficiente con hacer la suma directamente en el campo return.
10 Ahora coge el evento .Click de nuestro botón.
11 Vamos a mostrar el resultado en la etiqueta así que coge el bloque "set label1.Text to" y ponlo dentro del evento .Click.
12 Como lo que queremos mostrar es el resultado de sumar los dos números y ese resultado es el que nos devuelve nuestro procedimiento, podemos unirlos directamente. Coge el bloque "call suma_numeros" dentro de Built-in/Procedures y pégalo al bloque "set label1.Text".
13 Ahora únicamente necesitamos pasarle los datos que queremos sumar a nuestro procedimiento que están en "textBox1.Text" y "TextBox2.Text" respectivamente. Te tiene que quedar así:

A partir de este momento si quisieses sumar otros números dentro de tu programa sólo tienes que llamar a tu procedimiento desde donde quieras. Como el procedimiento nos devuelve un número (en este caso la suma) podemos pegarlo en cualquier sitio tal y como si fuese un bloque numérico cualquiera. En este caso lo estamos pegando a una etiqueta para que nos muestre el valor en pantalla.

 Mensajes de alerta

Vamos con otro ejemplo. En este caso cogeremos una cadena de texto y la mostraremos en pantalla de tres maneras distintas jugando con el tamaño del texto y el color según cada caso. Vamos a inventarnos tres tipos de mensajes (normal, alerta y error) y usaremos un parámetro para identificar el tipo de mensaje que queremos mostrar. En este caso nuestro procedimiento no nos devolverá ningún valor.
Crea un proyecto nuevo y llámalo "mostrar_aviso".
Añade a tu programa desde el Diseñador los siguientes componentes: Un componente textbox y un componente HorizontalArragement.
Pon dentro de él tres botones.
Por último añade un componente etiqueta (label) al final de todo. Como siempre puedes borrar el texto del componente textbox y label.
Cambia los nombres de los botones por "boton_normal", "boton_alerta" y "boton_error" respectivamente.
Cambia también el texto de los botones por: "normal", "alerta" y "error" respectivamente.
Ahora vamos al Editor de bloques.
Dentro de Built-in/Procedures coge el bloque "to procedure do”
Cambia el nombre del procedimiento y llámalo mostrar_aviso.
10 Para definir los dos argumentos hacemos click en la rueda que aparece en la esquina superior izquierda del bloque. En el cuadro que nos aparece arrastramos dos bloques “input” dentro del bloque “inputs”. Y observaremos que nos han aparecido los dos argumentos junto al nombre de la función.
11 Cambia el nombre del primer argumento y llámalo tipo, al segundo llámalo texto.
Ya tenemos nuestro procedimiento definido y sabemos que recibiremos dos argumentos. Vamos a empezar por el caso de que queramos mostrar un mensaje normal. Es decir, el argumento tipo = "normal".
12 Coge un bloque if desde Built-in/Control y ponlo dentro del procedimiento mostrar_aviso. 
13 Crea un nuevo bloque (Math/ =) y pégalo al bloque if
14 Ahora tenemos que crear la expresión lógica que vamos a evaluar. Para el primer valor necesitamos usar el argumento que nos dirá el tipo de mensaje a mostrar. Dentro de Built-in/Variables encontrarás el bloque "get". Cógelo y ponlo en primer lugar eligiendo el argumento “tipo”
15 Ahora crea un bloque de texto, cambia el texto por "normal" y ponlo en segundo lugar. Así:

16 La expresión lógica sería: ¿Es el argumento tipo="normal"? Si es así vamos a cambiar el tamaño del texto de la etiqueta a 10 y el color a negro usando los bloques "set label1.FontSize" y "set Label1.TextColor" respectivamente. Ponlos dentro del bloque "if then-do". Así:

17 Ahora hay que repetir lo mismo para los otros dos tipos de mensajes que queremos mostrar. Duplica el bloque if completo dos veces más y ponlos debajo.
18 Cambia las expresiones lógicas para los dos nuevos tipos simplemente cambiando los bloques de texto. Para el segundo cambia el texto por "alerta" y para el último pon "error".
19 Ahora cambia en cada caso el tamaño y el color del texto. Por ejemplo, al tipo error ponle un color rojo, etc.
20 Finalmente vamos a mostrar el mensaje en la etiqueta. Coge un bloque "set label1.Text to" y ponlo al final pero dentro del procedimiento.
21 Como el mensaje lo tenemos en el argumento "texto", coge el bloque "get" dentro de Built-in/Variables y pégalo a la etiqueta.
Nuestro procedimiento queda así:

Vamos a hacer un repaso. Hemos creado un procedimiento para mostrar un mensaje en la pantalla que va a recibir dos parámetros (argumentos) Uno es el texto que queremos mostrar (texto) y otro es el tipo de mensaje (tipo). Dependiendo del texto que recibamos como argumento tipo (normal, alerta, error) el texto tendrá un tamaño y color distintos. Dentro del procedimiento hacemos una comprobación para saber cuál es el tipo de mensaje y en función de ello hacemos los cambios oportunos. Finalmente mostramos el mensaje en la pantalla.
22 Ahora vamos a ver cómo llamar a este procedimiento desde nuestro programa. Como tenemos tres botones de prueba vamos a empezar por coger los eventos .Click de cada uno de ellos. Cógelos y ponlos en tu programa.
23 Ahora en Built-in/Procedures  encontrarás el procedimiento que acabamos de crear "call mostrar_alerta". Coge este bloque tres veces y ponlo dentro de cada uno de los eventos .Click.
24 Verás que para llamar a nuestro procedimiento necesitamos pasarle los argumentos que antes hemos definido. En primer lugar el texto que queremos mostrar y que tenemos en el bloque "TextBox1.Text". Cógelo tres veces y añádelo a cada procedimiento de cada evento .Click. en el espacio texto.
25 Por último, el tipo de mensaje que queremos mostrar. Para ello crea tres bloques de texto y cambia el texto de cada uno por "normal", "alerta" y "error" respectivamente.
26 Pega cada uno a cada argumento tipo de cada procedimiento. Así:

27 ¿Funciona?
El argumento tipo que hemos creado espera recibir alguno de los siguientes textos: "normal", "alerta" y "error" pero podríamos haber usado cualquier otro tipo de texto como parámetro, p. ej.: "resaltado", "grande", o lo que quieras definir, recordando siempre que tendrás también que cambiar el procedimiento para que nuestro programa entienda qué tiene que hacer si recibe el nuevo parámetro.