Á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 |