viernes, 12 de septiembre de 2008

Pasar parámetros por valor (ByVal) y por referencia (ByRef ) en Visual Basic 6.0



los parámetros en las funciones y procedimientos, se pueden enviar de dos maneras: por Valor y por Referencia.

Si están declarados como ByVal, los mismos serán por valor, si se declaran como ByRef serán por referencia.

La diferencia entre uno y otro método de paso de parámetros, es que en ByVal se envía una copia de la variable, y de esta manera si se efectúa un cambio en el procedimiento, solo tendrá efecto dentro del procedimiento o función, una ves que termine y finalice el mismo, la variable original pasará a valer el dato que tenía, es decir no se modifica

En los parámetros enviados por Referencia, lo que se hace es enviar un puntero de la variable original. Entonces, si en la función o procedimiento se cambia el valor de la variable, el cambio seguirá manteniéndose una ves que finalice la ejecución del procedimiento o función.

Ejemplo de envío de parámetros por Valor ( ByVal )


Código de ejemplo

Private Sub Command1_Click()

Dim Un_Valor As Long

Un_Valor = 100


'Se envía la variable por Valor ( ByVal )

Call Sumar(Un_Valor)

'Muestra el valor que es 100, ( no se modificó en la función Sumar )
MsgBox Un_Valor


End Sub

Sub Sumar(ByVal Valor As Long)
'Modifica la variable
Valor = Valor + 100

End Sub


En el ejemplo anterior hay una Sub llamada Sumar que recibe como parámetro una variable enviada por valor con ByVal ( es decir es una copia de la variable original ). al presionar el Commmand1.

Al entrar en la Sub Sumar, el dato se modifica ( Valor = Valor + 100). Cuando finaliza el procedimiento Sumar y retorna a la línea siguiente de la llamada a la Sub sumar, muestra mediante un MsgBox el valor de la misma, en este caso es 100, y NO 200 que es el cambio que tuvo dentro del procedimiento Sumar ( Valor = Valor + 100 ).

Con esto queda visto que en realidad al enviarla como ByVal, se envía una copia de la variable original y cualquier cambio que se produzca, será solo en el ámbito del procedimiento o función


Ejemplo de envío de parámetros por Referencia ( ByRef )

Este ejemplo es igual que el anterior, pero en la Sub sumar , la variable Valor se declara con ByRef ( por Referencia )

Código

Private Sub Command1_Click()

Dim Un_Valor As Long

Un_Valor = 100


'Se envía la variable por Referencia ( ByRef ) con el valor 100

Call Sumar(Un_Valor)

'Muestra el valor que ahora es 200, ( ya que se modificó en la Sub Sumar)
MsgBox Un_Valor


End Sub

Sub Sumar(ByRef Valor As Long)
'Modifica la variable
Valor = Valor + 100

End Sub


Al probar el código, ahora el Msgox al mostrar el valor de la variable, es de 200, y NO de 100 como en el ejemplo de ByVal.

Esto demuestra que al enviar la variable como referencia, si la misma se modifica dentro del procedimiento o función, se está modificando la variable REAL, es decir cualquier cambio que se le haga a la misma, se mantendrá, ya que se está modificando la variable Real ( no es una copia )

Nota Importante: cuando no se indica a un parámetro de una función o Rutina ni ByVal, ni ByRef, se asume que la misma se está enviando como referencia (ByRef).

Es decir lo siguiente recibe el parámetro como Referencia

Sub Sumar(Valor As Long)
.. que es lo mismo a esto:

Sub Sumar(ByRef Valor As Long)