Introducción Este míni-manual esta pensado y orientado para los asistentes al taller de Gambas. Dado que, a priori, esperamos la asistencia de gente sin conocimientos previos de programación este texto va a ser escueto y muy elemental. Además de dar una formación teórica básica tiene el propósito de servir como chuleta para poder consultar las sintaxis más elementales como por ejemplo de las condicionales, bucles, etc. Nuestra herramienta: GAMBAS Vamos a usar Gambas, un lenguaje de programación visual similar al Visual Basic de Microsoft. Gambas dispone de su propio IDE. Un IDE, por sus siglas en inglés, es un entorno de desarrollo integrado. Gambas es lo que se conoce como un lenguaje de programación interpretado y como ocurre con GNU que es un acrónimo recurrente (Gnu No es Unix) Gambas significa Gambas Almost Means BASic, que traducido al castellano es Gambas Casi es BASic. Los IDE's son unos programas que aglutinan todo lo que necesitamos para programar. Tenemos un editor para picar (vamos a ir introduciéndonos en la jerga del programador) código, con resaltado por colores, autocompletado para ayudarnos en la edición, señalización de errores, etc. Un depurador para poder controlar la ejecución del programa y evaluar su comportamiento con sus inspectores de variables, objetos, etc. Un compilador para generar los binarios, bytecodes, ejecutables, etc. Un empaquetador para crear los instaladores. Además disponen de otras herramientas como gestores de servicios SVC para el control de versiones como GIT o similares. Editores de conexión a bases de datos, etc. Lo primero que vemos al ejecutar Gambas la ventana de bienvenida y nos da varias opciones, abrir un proyecto existente, crear uno nuevo o abrir recientes. Seleccionamos la que necesitemos. Si elegimos crear uno nuevo debemos completar algunos datos. Lo primero el tipo de proyecto, en nuestro caso “Aplicación gráfica”. Después nos pide donde queremos guardar el proyecto, elegimos la ubicación que más nos guste. Y por último un nombre para el proyecto y un título, el primero debe ser una palabra sin espacios, el segundo podemos poner lo consideremos. Pues ya está, ya tenemos nuestro proyecto. Pero y ¿que es todo esto? Pues vamos a poner una foto con el nombre de cada cosa. Empecemos a diseñar nuestra ventana, y esto es tan fácil como arrastrar los controles desde la ventana de herramientas hasta el área de trabajo. ¿Fácil no? Consideraciones, hay muchos controles, ordenados por categorías, pero para empezar solo algunos: Los señalados en rojo son los más elementales. La “A”, es el control “Label” o etiqueta y con ellos se hacen las típicas descripciones que encontramos al lado, por ejemplo de un cuadro de texto o “TextBox” que es el cuadrado con la “abc”. Las etiquetas no son editables por el usuario, se pueden cambiar sus propiedades únicamente en tiempo de edición o en tiempo de ejecución mediante código. En cambio en los Textbox podemos escribir durante la ejecución, y se usan para la introducción de datos al programa. El botón, el del “OK” se usa típicamente confirmar o iniciar la ejecución de código. En azul encontramos otros controles muy útiles pero en menos medida. El circulo se conoce como “RadioButton” y se usa en casos donde necesitamos que el usuario elija entre varias opciones excluyentes entre ellas, por ejemplo subir o bajar, no podemos hacer las dos a la vez. El cuadrado es conocido como “CheckBox” y sirve para que el usuario elija opciones, podemos seleccionar más de una, por ejemplo comer arroz y beber agua, podemos elegir las 2. Bien, una vez tenemos los controles en nuestro formulario podemos cambiarles las propiedades, incluido el propio formulario, desde la ventana de propiedades. Esto lo hacemos, primero para que al iniciar tengamos una serie de cosas ya hechas, por ejemplo, muchos controles disponen de la propiedad “text” donde podemos definir el texto que se mostrara de inicio en pantalla. Y segundo, hay una propiedad que los primerizos no suelen tener en cuenta, la propiedad “name” nos permite identificar los controles. Cuando los añadimos se numeran, con lo que al final si no cambias los nombres seguirle la pista a “Label1”, “Label2”, “Label3”, ….., “Label50” es complicado saber cual es cual. Podemos darle el nombre que queramos, pero es bueno tener un sistema, por ejemplo yo uso 3 consonantes del control en minúsculas y un nombre descriptivo empezando en mayúscula, para un “Textbox” donde queremos que el usuario introduzca un nombre usaría “txtNombreUsuario”, y la etiqueta correspondiente sería “lblNombreUsuario” A nivel de edición esto es lo más básico para empezar a usar el IDE, ahora vamos a empezar con la chuleta de código. Empezando con el código Aquí está la madre del cordero, la parte de diseño es necesaria, pero sin el código no hacemos nada. Así que vamos a ponernos al lío. Lo primero que tenemos que saber es que hay una serie de palabras reservadas que no podemos usar como identificadores. La ventaja es que los lenguajes de programación se orientan al inglés, con lo que las palabras reservadas no nos afectarán mucho. Esencialmente se trata de las expresiones reservadas para las instrucciones, como por ejemplo if, then, do, while, etc... o tipos de dato como string, integer, long, etc. Lo primero debemos saber que cada control tiene una serie de eventos. Los eventos son una especie de “disparadores” de código. Los eventos se enmarcan en un bloque definido por las instrucciones Public Sub y End. Estos bloques se conocen como métodos o subrutinas, de ahí lo de sub. Cada control tiene un evento principal, para los botones es click o para las cajas de texto es keypress (pulsación de tecla). Si en la ventana de edición hacemos doble click sobre un control nos moverá automáticamente al código asociado al evento principal de ese control. Si queremos cambiar el evento, solo tenemos que borrar hasta el “_”, el autocompletar desplegará una lista con todos los eventos disponibles para ese control. En la imagen anterior ya se puede apreciar otra característica, si queremos cambiar una propiedad determinada de un control podemos acceder a ella mediante el “.”, con Label1.Text podemos cambiar el texto que se mostrará en pantalla. Para manejar datos necesitamos conocerlos. Los principales son Integer, para los enteros sin decimales. Float, números con decimales. String para las cadenas de texto. Boolean para verdadero o falso. Hay más, como por ejemplo Short para enteros cortos (hasta +/- 32.767) o Date para almacenar fechas. En la documentación de Gambas podemos encontrar todos lo tipos disponibles. Para usar los tipos de datos hemos de definir lo que se conoce como variables. Se usa un identificador, de forma similar a los controles. Y se definen con las palabras reservadas Dim y as de la siguiente manera Dim nombreVariable As Integer. Aunque no es obligatorio, ya que por defecto se les asigna un valor, podemos inicializarla, esto es útil si el valor de base es diferente del que viene por defecto y además lo conocemos. Esto nos ahorra una linea de código y se hace así Dim nombreVariable As Integer = 23. Siempre tenemos que definirlas al principio del método donde queramos usarlas. Podemos cambiar el valor de las variables tantas veces como sea necesario, pero no podemos cambiar el tipo de dato, esto es muy importante. Si asignamos un tipo de dato entero es entero y no podemos cambiarlo. La división de 5 / 2 nos daría 2'5, pero la variable solo guardará el 2, la parte entera de la división. Podemos usarlas de forma circular, es decir podemos realizar la siguiente suma de un entero “variable=variable + 3” y esto se puede hacer por que no realizamos la operación sobre la variable sino que se asigna el valor tras la operación. Lo que realmente le estamos diciendo al programa es coge el valor de variable y súmale 3, cuando acabes lo guardas en variable. Existe otra figura, los arrays o matrices, y son colecciones de datos bajo un mismo identificador. Los arrays pueden tener varias dimensiones y se definen casi igual que las variables, Dim variable as Integer[] o Dim variable as Integer[3]. La diferencia entre ambas es que la primera tiene un tamaño dinámico y la otra esta limitado a 3. Esto significa que bajo el identificador “variable” podemos guardar hasta 3 valores enteros. Las dimensiones se definen con el número de []. Las constantes son variables fijas. Sirven para definir datos fijos que conocemos de antemano, que estamos seguros no van a cambiar y que vamos a usar de forma recurrente. Por ejemplo, el número pi. Normalmente se declaran al principio del módulo o clase y con las palabras reservadas “Private” o “Public” dependiendo del ámbito. Los programas pueden ser realmente extensos y complejos. Los métodos pueden contener cientos de líneas de código que llaman a a otros métodos y funciones, operaciones matemáticas, muchas variables, etc. Por eso es importante comentar el código. Esto permite añadir líneas en código que serán ignoradas por el compilador/interprete y ayudarán a leer el código posteriormente para futuras actualizaciones o ediciones, por nosotros o por otras personas. En gambas, igual que en visual basic, se utiliza el apostrofe sencillo “ ' ” para indicar un comentario. Los número se ponen tal cual, no hay problemas. Pero para el uso de texto siempre tenemos que entrecomillarlo. Igual que en la imagen anterior. Manejando el flujo El código se ejecuta de arriba hacia abajo, siguiendo escrupulosamente el orden de la lineas. Pero eso no significa que no podamos manejarlo. Para eso tenemos varias herramientas, la primera es el tipo de programación, bien modular o bien la programación orientada a objetos. Tienen diferencias sustanciales entre una y otra, pero esencialmente las dos dividen los fragmentos de código en bloques independientes y que se ejecutan bajo demanda. Después tenemos las estructuras de control de flujo que sirven esencialmente para dirigir la ejecución hacia unos determinados fragmentos de código. Respecto a la programación modular, solo decir que va implícita en gambas. Al hacer doble click en un botón accedemos a la porción de código que se ejecutara única y exclusivamente si hacemos click sobre ese botón en tiempo de ejecución. También podemos crearnos bibliotecas de métodos y funciones para ser llamadas por el programa. La diferencia fundamental entre un método y una función es que la segunda devuelve un resultado y la primera no. La sentencia if then else, para mi es la instrucción más elemental. Conocida como instrucción condicional evalúa una expresión, por ejemplo el resultado de una suma y si la condición se cumple ejecuta el código, si no lo ignora. If (2+2=4) then ejecuta código end if Podemos, si queremos, asignarle un valor por defecto, por si la condición no se cumple. If (2+2=4) then ejecuta código 1 else ejecuta código 2 end if Podemos anidar diferentes instrucciones, unas dentro de otras. If (2+2=5) then ejecuta código 1 else If (2+2=4) then ejecuta código 2 else ejecuta código 3 end if También podemos hacer evaluaciones complejas donde se evalúan varias condiciones como por ejemplo. If (2+2=4 AND 3-1=2 OR 10-10=0) then ejecuta código 1 else ejecuta código 2 end if Incluso hacer que funcione con el resultado inverso. If ( NOT 2+2=4 AND 3-1=2 OR 10-10=0) then ejecuta código 1 else ejecuta código 2 end if Con esta simple instrucción podremos dominar el flujo del programa. Pero podemos encontrarnos con algunos problemas de uso, o de eficiencia de uso. A veces una variable pueda adoptar muchos valores. Por ejemplo los meses del año. Programar 12 condicionales anidadas puede ser dramático. Para eso existen los selectores con la instrucción Select Case. Es una especie de lista de valores para una expresión. Dim mes as Integer mes = obtiene el número del mes actual Select mes Case 1 Enero Case 2 Febrero Case 3 Marzo ….. Case 12 Diciembre End Select En este caso también podemos asignarle un valor por defecto, igual que con el if. Select mes Case 1 Enero Case 2 Febrero Case 3 Marzo ….. Case 12 Diciembre Case else No se el mes End Select En estos casos conocemos los posibles valores de las variables, pero puede que no sepamos el valor que pueden tomar, por ejemplo las horas del día y si es mañana, tarde o noche. Para eso se pueden usar los intervalos. Case 7 to 12 Mañana Podemos evaluar texto, no tiene por que ser un número. Se hace entrecomillando el “texto”. Case “texto” Es un texto Con estas herramientas controlamos el flujo dentro del programa, método o función para que ejecute un determinado código, pero podemos necesitar ejecutar un código varias veces por la razón que sea. Por ejemplo para un contador o para que el programa compruebe que se cumple una determinada condición sin la cual no se puede seguir. O por que necesitamos recorrer un texto buscando algo. Existen varios hay que destacar for de entre los otros, ya que este se ejecuta para un determinado número de repeticiones conocido de antemano. FOR contador = 1 TO 20 STEP 3 ejecuta código NEXT En este caso el bucle contara de 1 a 20 a intervalos de 3, cuando contador pase de 20 dejara de repetirse. Después tenemos los bucles infinitos, estos se ejecutan mientras una determinada condición es cierta. Ojo con estos bucles, nos metemos en infinito por menos de nada. Básicamente todos hacen lo mismo, la diferencia entre ellos es el momento de evaluar la condición. While y Do While evalúan la condición al inicio del bucle, lo que significa que si la condición es falsa no se ejecutara nunca. La sintaxis de ambos es similar. [Do While / While] contador <=10 ' La condición se evalúa aquí ejecuta código INC contador 'esto es igual que poner contador = contador +1 [Loop / Wend] En este caso el bucle se repite mientras el contador es menor o igual que 10. Podemos usar el bucle Do Until, en este caso la evaluación se realiza al final, lo que significa que el código se ejecutara por lo menos una vez. Eso significa que debemos tener en cuenta las iteraciones ya que para el mismo resultado que con la estructura anterior la condición a evaluar es distinta. Do ejecuta código INC contador 'esto es igual que poner contador = contador +1 Loop Until contador= 11 ' La condición se evalúa aquí En este caso el bucle se repite mientras el contador no sea igual 11, mientras sea menor se repetirá por eso si ponemos <=10 como en el anterior solo se repetiría 1 vez, la condición se cumple en la primera iteración (1 es menor que 10) y si ponemos = 10 solo lo haría 9 veces. Glosario En está última página tenéis un pequeño glosario para algunos conceptos que hay aquí. Picar código: escribir código, programar. Tiempo de desarrollo: Es el momento en el cual picamos código y podemos editar sus propiedades de forma manual. Los errores en esta fase suelen ser de tipo sintáctico o tipográficos y generalmente fáciles de corregir y localizar. Tiempo de ejecución: Es cuando el programa se ejecuta de forma autónoma. Los errores en esta fase suelen venir asociados a errores de programación, por ejemplo un uso incorrecto de datos y generalmente difíciles de resolver, ya que no se ven fácilmente. Por ejemplo intentamos hacer una división entre 0. Depurador: Es una de las herramientas más útiles de IDE. Nos permite parar o reanudar la ejecución del código. Evaluar las variables y los valores que contiene. Ejecutar paso a paso, etc. Módulo: Es un archivo de código fuente, sin interfaz gráfica, donde programamos métodos y funciones que vamos a usar de forma recurrente a lo largo de todo el programa. Tiene varias ventajas, la primera es que de esta forma si hay que cambiar algo solo tendremos que modificar en un sitio y no andar buscando por todo el código. Y la segunda es que como suelen ser funciones genéricas podremos reciclarlas para otros proyectos. Expresión: Son operaciones matemáticas, de concatenación, asignación de valores, etc. Instrucción: Orden que se le da al programa para que haga algo. Sentencia: El conjunto de una instrucción más una expresión. Servicio SVC: Los servicios de control de versiones sirven para ayudar a los desarrolladores a mantener un código limpio y estable. Estos servicios guardan los cambios producidos en el código a lo largo del tiempo de forma que podemos recuperar cualquier estado previo. Son especialmente útiles en grandes proyectos donde hay varios desarrolladores implicados. Controles: Funcionalidades que el IDE nos facilita para poder hacer nuestro programa. Son controles los botones, cajas de texto, la propia ventana, las etiquetas, etc.