Ámbito de variables

From Apache OpenOffice Wiki
< ES‎ | Manuales‎ | GuiaAOO‎ | TemasAvanzados‎ | Macros‎ | StarBasic‎ | ElLenguajeOOoBasic
Revision as of 12:00, 14 July 2018 by Sancho (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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.

Documentation caution.png 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.


ES.Plantillas.Logo foro es.png
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

Personal tools