Ámbito de variables
Como todo en esta vida, las variables también se crean y mueren; la buena noticia es que nosotros decidimos cuando.
El lugar donde se declara una variable y cómo se declara determina su visibilidad, lo que se conoce como ámbito de la variable.
Ámbito Local
Las variables que se declararan con la instrucción Dim dentro del cuerpo de una función sólo son visibles dentro de ésta. Se crean al invocar a la función, y se destruyen al finalizar la misma:
Option Explicit Sub Variables_Locales1 Dim iEdad As Integer 'Mostramos el valor de la variable MsgBox iEdad 'Cambiamos su valor iEdad <nowiki>=</nowiki> 34 'Mostramos de nuevo el valor de la variable MsgBox iEdad End Sub
Al ejecutar varias veces la macro anterior podemos observar como siempre el valor inicial de la variable es cero.
Para comprobar que efectivamente la variable sólo es visible dentro de la función creamos una segunda macro desde donde intentaremos usar esta variable.
Sub Variables_Locales2 'Intentamos mostrar el valor de la variable iEdad MsgBox iEdad End Sub
Al ejecutar esta segunda función, el IDE mostrará un error siempre que se haya utilizado la palabra clave Option Explicit, lo cual recomendamos.
Si no está definida Option Explicit la macro anterior no dará un error visible, pero siempre mostrará un cero como resultado de mostrar la variable, pues la variable será creada cada vez que se ejecute la macro con su valor por defecto.
Si se definió Option Explicit, al ejecutar la macro y producirse el error se mostrará una flecha en el margen izquierdo que indica la línea donde se produjo el error y se mostrará un mensaje de error indicando que no hemos definido la variable para esa macro.
Veamos otro ejemplo:
Option Explicit Sub Variables_Locales3 Dim sTmp As String sTmp <nowiki>=</nowiki> "Aquí no soy nadie" Call Soy_Filosofo Call Soy_Divertido MsgBox sTmp End Sub Sub Soy_Filosofo Dim sTmp As String sTmp <nowiki>=</nowiki> "Ahora soy un filosofo" MsgBox sTmp End Sub Sub Soy_Divertido Dim sTmp As String sTmp <nowiki>=</nowiki> "Ahora soy divertido" MsgBox sTmp End Sub
Se han declarado distintas variables aunque tengan el mismo nombre. Cada una es diferente y se inicializa y termina en la macro donde se declara.
Veamos otro ejemplo:
Option Explicit Sub Variables_Locales4 Call Contar() End Sub Sub Contar Dim iContador As Integer iContador <nowiki>=</nowiki> iContador + 1 MsgBox iContador End Sub
Por muchas veces que ejecutemos la macro Variables_Locales4 siempre obtendremos el mismo resultado: siempre muestra el valor 1.
Veamos una variante de este código:
Option Explicit Sub Variables_Locales4 Call Contar() Call Contar() Call Contar() End Sub
Sigue igual, ¿verdad? Hagamos un pequeño cambio en la macro Contar, como vemos a continuación:
Option Explicit Sub Variables_Locales4 Call Contar() Call Contar() Call Contar() End Sub Sub Contar Static iContador As Integer iContador <nowiki>=</nowiki> iContador + 1 MsgBox iContador End Sub
La variable iContador en la macro Contar ha sido declarada utilizando la palabra clave Static en vez de Dim, con lo que le estamos indicando que conserve el valor entre las llamadas a la macro. Este valor lo conservará mientras se ejecute la macro que llama a la macro donde está declarada la variable Static, como podrás comprobar ejecutando varias veces la macro Variables_Locales4: el valor máximo siempre será tres.
Aunque estemos declarando la variable iContador como Static, dentro de la macro Contar, no por ello deja de ser una variable de ámbito local, como puedes comprobarlo fácilmente tratando de mostrar su valor desde la macro Variables_Locales4; el siguiente cambio en la macro te debería dar un error de variable no definida.
Option Explicit Sub Variables_Locales4 Call Contar() Call Contar() Call Contar() 'La siguiente linea “debería” darte un error MsgBox iContador End Sub
Hagamos de nuevo un pequeño cambio a la macro Variables_Locales4, para que cuente hasta que le digamos que “No”.
Option Explicit Sub Variables_Locales5 Dim iRespuesta As Integer Do Call Contar() iRespuesta <nowiki>=</nowiki> MsgBox( "¿Continuar contando?", 4 + 32, "Continuar") 'Recuerda que si el usuario presiona Si, el valor que devuelve MsgBox es 6 Loop While iRespuesta <nowiki>=</nowiki> 6 End Sub
Ámbito Privado
Este segundo nivel corresponde a las variables declaradas en la cabecera de un modulo usando la palabra clave Private; la cabecera es el inicio de un modulo, donde “siempre” recomendamos agregar la importante palabra clave Option Explicit.
Veamos el ejemplo siguiente:
Option Explicit 'En lugar de Dim estamos usando Private Private intContador As Integer Sub Sumar_y_Restar 'Llamamos a la macro Sumar Call Sumar() 'Mostramos el valor de la variable MsgBox intContador 'Llamamos a la macro Restar Call Restar() 'Mostramos de nuevo el valor de la variable MsgBox intContador End Sub Sub Sumar 'Aquí aumentamos la variable en dos unidades intContador <nowiki>=</nowiki> intContador + 2 End Sub Sub Restar 'y aquí restamos a la variable una unidad intContador <nowiki>=</nowiki> intContador - 1 End Sub
Ahora la variable intContador es visible por cualquier macro o función declarada en el modulo.
La teoría dice que estas variables solo son visibles para el modulo donde se declaran, pero en StarBasic TAMBIEN son visibles en otros módulos |
Antes de comprobar esto, veamos una variante de la macro anterior para seguir sumando y restando.
Option Explicit Private intContador As Integer Sub Sumar_y_Restar2 Dim iRes As Integer Do iRes <nowiki>=</nowiki> MsgBox( "Para sumar presiona SI" & Chr(13) & "Para restar presiona NO" & _ Chr(13) & "Para salir presiona CANCELAR", 3, "Sumar y Restar") Select Case iRes Case 6 Call Sumar() Case 7 Call Restar() End Select MsgBox intContador Loop Until iRes <nowiki>=</nowiki> 2 End Sub
Adelantándonos un poco en los temas, veamos como agregar un segundo modulo a nuestra biblioteca para demostrar como las variables declaradas a nivel modulo con Private son visibles por cualquier otro modulo.
Para ello haz un clic con el botón secundario de tu ratón sobre la etiqueta del modulo actual donde estés trabajando, y desde el menú contextual selecciona Insertar y después Modulo BASIC.
Al insertar un modulo, y de forma predeterminada, se agrega la declaración de una nueva macro Main; vamos a renombrarla y trataremos de acceder a la variable intContador declarada y usada en el modulo uno:
Option Explicit Sub MostrarValor() MsgBox intContador End Sub
La macro anterior esta en el modulo 2 y al ejecutarla nos muestra el valor de la variable, que es cero, pues el valor inicial de toda variable numérica es cero. Pero no nos da error pues toma la declaración de la variable del modulo 1.
Volvamos al modulo 1, donde copiamos y ejecutamos la siguiente macro.
Option Explicit Private intContador As Integer Sub ValorVariable intContador <nowiki>=</nowiki> 100 'Llamamos a la macro del modulo 2 Call MostrarValor() End Sub
Creo que es bastante claro que la variable se puede manipular y es visible desde cualquier otro modulo, aún y cuando se declare con Private. Por lo tanto, usar Private y Dim es indistinto hasta que no se modifique el comportamiento de las variables en StarBasic.
Ámbito de Dominio Publico
En la versión actual de StarBasic se supone que las variables declaradas a nivel cabecera de modulo usando la palabra clave Dim sólo son visibles para cualquier modulo de la biblioteca, pero según las pruebas efectuadas son visibles hasta por los módulos de otras bibliotecas, y se comportan exactamente del mismo modo que las variables de ámbito privado vistas en el punto anterior.
Option Explicit Dim intContador As Integer
Ámbito Global
Este ámbito es igual al de dominio publico en cuanto a su visibilidad, pero difiere en cuanto a su función, pues las variables mantienen su último valor, aún y cuando se termina la macro. Para que una variable sea de ámbito global debe ser declarada en la cabecera de un módulo con la palabra clave Global de la siguiente manera.
Option Explicit Global intgContador As Integer Sub Variable_Global() intgContador <nowiki>=</nowiki> intgContador + 100 MsgBox intgContador End Sub
Al ejecutar varias veces la macro anterior, podremos comprobar como guarda el valor, aún y cuando ya terminó la ejecución de la macro.
Si tienes dudas acerca de lo aquí explicado, tienes algún problema con AOO, o quieres ampliar la información, no dudes en dirigirte al Foro Oficial en español de Apache OpenOffice para Macros y API UNO |