Uso de cookies

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continúa navegando, consideramos que acepta su uso. Para obtener más información o bien conocer cómo cambiar la configuración lea nuestra Política de cookies

Modos de pasar variables como argumentos

Cuando pasamos variables a una función o subrutina en OpenOffice Basic se pueden utilizar las siguientes modalidades:


Pasar la variable por referencia

Es el modo por defecto de pasar una variable a una función o subrutina. Al pasar la variable por referencia, no se pasa una copia de la variable a la función o subrutina, sino que se pasa como un enlace directo a la variable.


En este caso, cualquier cambio que se realice sobre la variable dentro de la función o subrutina se verá reflejado en la función o subrutina que la llamó, pues en realidad, se están aplicando los cambios a la propia variable.


Como hemos dicho, es el modo de por defecto, pero se puede especificar agregando la instrucción ByRef en la declaración de los argumentos.


Sub Cuenta()
Dim n As Integer
  Incrementa n
  Msgbox n      ' Obtendremos 1, pues la variable se pasó por referencia
End Sub
 
Sub Incrementa( ByRef nValor as Integer )
  nValor = nValor + 1
End Sub


Este código es equivalente a este otro, pues como hemos dicho, el modo ByRef es el modo por defecto.


Sub Cuenta()
Dim n As Integer
  Incrementa n
  Msgbox n      ' Obtendremos 1, pues la variable se pasó por referencia
End Sub
 
Sub Incrementa( nValor as Integer )
  nValor = nValor + 1
End Sub


Pasar la variable por valor

Al pasar la variable por valor, se pasa una copia de la variable a la función o subrutina, por lo que en éstas se creará una copia independiente de la variable.


Por lo tanto, cualquier cambio que se realice sobre la variable dentro de la función o subrutina no se verá reflejado en la función o subrutina que la llamó, pues en realidad, son variables distintas.


Para especificar el modo por valor se agregará la instrucción ByVal en la declaración de los argumentos.


Sub Cuenta()
Dim n As Integer
  Incrementa n
  Msgbox n      ' Obtendremos 0, pues la variable se pasó por valor
End Sub
 
Sub Incrementa( ByVal nValor as Integer )
  nValor = nValor + 1
End Sub


Definir un argumento como opcional

Se pueden definir los argumentos de una función o subrutina como opcionales. Si los argumentos son opcionales, no es obligatorio pasar esos argumentos a la función o subrutina.


Para especificar que un argumento es opcional se agregará la instrucción Optional en la declaración de los argumentos. Todos los argumentos que sigan al primero declarado como opcional deberán ser declarados como opcionales también.


Para detectar si un argumento opcional ha sido o no pasado a la función o subrutina se utiliza la función IsMissing, que devuelve True si el argumento no ha sido pasado, o False si el argumento si ha sido pasado.


El uso de IsMissing nos permite definir un argumento por defecto para el caso de que ese argumento opcional no sea pasado a la función o subrutina.


Sub PintaFecha()
Dim d As Date
  d = Date()-5  ' cinco días antes de la fecha actual
  Msgbox FormateaFecha(d)
End Sub
 
Function FormateaFecha( dFecha as Date, optional cFormato as string)
  If IsMissing( cFormato ) then cFormato = "dddd, dd \d\e mmmm \d\e yyyy"
  FormateaFecha = Format( dFecha, cFormato )
End Function



Pasar argumentos como una matriz de parámetros

En otros dialectos de Basic se pueden pasar a una función o subrutina un número indeterminado de argumentos que son capturados por ésta en una matriz mediante la instrucción ParamArray.


La instrucción ParamArray no se puede utilizar en OpenOffice Basic salvo que se active la directiva del compilador Option Compatible, como se muestra en el siguiente ejemplo:


REM  *****  BASIC  *****
Option Explicit
Option Compatible
 
Sub Pinta()
  msgbox MatrizDeParametros( 1,2,3,4,5)
End Sub
 
Function MatrizDeParametros( ParamArray x()) as integer
  Dim n as integer, r as integer
  For n=0 to uBound(x)
    r = r + x(n)
  next
  MatrizDeParametros = r
End Function


La matriz de parámetros debe ser obligatoriamente el último argumento declarado en la función o subrutina.


Modificada el 28 jul 2013 21:54.   Visitas: 4970