INICIO EN VISUAL BASIC
A WEB 100% MEXICANA
________________________________________________
________________________________________________
Argumentos por referencia y por valor
En las funciones (Function) y en los procedimientos Sub de Visual Basic, por defecto los argumentos se pasan por referencia2; de este modo, cualquier cambio de valor que sufra un parámetro dentro de lafunción o del procedimiento Sub también se produce en el argumento correspondiente de la llamada a la función o al procedimiento Sub. Cuando se llama a una función o a un procedimiento Sub, se podrá especificar que el valor de una argumento no sea cambiado por la función o por el procedimiento, poniendo dicho argumento entre paréntesis en la llamada. Un argumento entre paréntesis en la llamada es unargumento pasado por valor. Por ejemplo,
Raiz ((Num)) ' En el caso de la función
Raiz (Num), F ' En el caso del procedimiento
El argumento Num es pasado por valor. Significa que lo que se pasa es una copia de Num. Si el procedimiento cambia ese valor, el cambio afecta sólo a la copia y no a la propia variable Num.
Otra forma de especificar que un argumento será siempre pasadopor valor es anteponiendo la palabra ByVal a la declaración del parámetro en la cabecera del procedimiento (Sub o Function). Por ejemplo,
Function Raiz (ByVal N As Double)
Sub Raiz (ByVal N As Double, F As Double)
Pasar argumentos por valor evita modificaciones accidentales, pero tiene un coste en tiempo y memoria que puede ser significativo cuando se pasan grandes volúmenes de información, como sucede con vectores, matrices y estructuras
Procedimientos recursivos
Se dice que una función (Function) es recursiva o que un procedimiento Sub es recursivo si se llaman a sí mismos. A continuación se presenta una ejemplo de una función que calcula el factorial de un número programada de forma recursiva.
Function Factorial (N As Integer) As Long
If N = 0 Then
Factorial = 1 'Condición de final
Else
Factorial = N * Factorial (N - 1)
End If
End Function
En este ejemplo, si la variable N que se le pasa a la función vale 0, significará que se ha llegado al final del proceso, y por tanto se le asigna el valor 1 al valor del factorial (recordar que 0! = 1). Si es distinto de 0, la función se llama a ella misma, pero variando el argumento a (N-1), hasta llegar al punto en el que N-1=0, finalizándose el proceso. Pasar un argumento por referencia implica que en realidad se pasa a la función la variable original, de modo que la función puede modificar su valor. Pasar por valor implica crear una nueva variable dentro de la función y pasarle una copia del valor de la variable externa. Si se modifica el valor de la variable copia, la variable original queda inalterada. Cuando en la llamada a una función se ponen como argumentos constantes numéricas o expresiones los valores se pasan por valor.
Procedimientos con argumentos opcionales
Puede haber procedimientos en los que algunos de los argumentos incluidos en su definición sean opcionales, de forma que el programador pueda o no incluirlos en la llamada de dichos procedimientos. La forma de incluir un argumento opcional es incluir la palabra Optional antes de dicho argumento en la definición del procedimiento. Si un argumento es opcional, todos los argumentos que vienen a continuación deben también ser opcionales. Cuando un argumento es opcional y en la llamada es omitido, el valor que se le pasa es un Variant con valor Empty. A los argumentos opcionales se les puede dar en la definición del procedimiento un valor por defecto para el caso en que sean omitidos en la llamada, como por ejemplo:
Private Sub miProc(x as Double, Optional n=3 As Integer) sentencias
End Sub
Número indeterminado de argumentos
Este caso es similar pero diferente del anterior. En este caso no es que haya argumentos opcionales que puedan omitirse en la llamada, sino que realmente no se sabe con cuántos argumentos va a llamarse la función; unas veces se llamará con 2, otras con 3 y otras con 8. En este caso los argumentos se pasan al procedimiento por medio de un array, especificándolo con la palabra ParamArray en la definición del procedimiento, como por ejemplo:
Public Function maximo(ParamArray numeros()) For Each x in numeros
sentencias maximo = x
Next x End Function
Utilización de argumentos con nombre
Visual Basic 6.0 ofrece tambieén la posibilidad de llamar a las funciones y procedimientos Sub de una forma más libre y menos formal, pasando los argumentos en la llamada al procedimiento con un orden arbitrario. Esto se consigue incluyendo el nombre de los argumentos en la llamada y asignándoles un valor por medio de una construcción del tipo miArgumento:=unValor. Unos argumentos se separan de otros por medio de comas (,). Considérese el siguiente ejemplo:
Public Sub EnviarCarta(direccion As String, destinatario As String) sentencias
End Sub
que se puede llamar en la forma:
EnviarCarta destinatario:="Mike Tyson", direccion:="Las Vegas"
No todas las funciones que se pueden llamar en Visual Basic 6.0 admiten argumentos con nombre. Con AutoQuickInfo puede obtenerse más información al respecto.
3.9 ARRAYS
Un array permite referirse a una serie de elementos del mismo tipo con un mismo nombre, y hace referencia un único elemento de la serie utilizando uno o más índices, como un vector o una matriz en Álgebra.
Visual Basic 6.0 permite definir arrays de variables de una o más dimensiones (hasta 60) y de cualquier tipo de datos (tipos fundamentales y definidos por el usuario). Pero ademásVisual Basic introduce una nueva clase de arrays, los arrays de controles (esto es, arrays de botones, de etiquetas, de paneles, etc.) que permiten una programación más breve y clara. En este apartado sólo se tratarán los arrays de variables. Todos los elementos de un array deben ser del mismo tipo y están almacenados de forma contigua en la memoria. Por supuesto, si el array es de tipo Variant cada elemento puede contener un dato de tipo diferente, e incluso puede contener otro array. Entre los arrays de variables cabe distinguir dos tipos fundamentales, dependiendo de que número de elementos sea constante o pueda variar durante la ejecución del programa.
1. Arrays estáticos, cuya dimensión es siempre la misma.
2. Arrays dinámicos,cuya dimensión se puede modificar durante la ejecución del programa.
Arrays estáticos
La declaración de un array estático dependerá de su ámbito.
• La declaración de un array público se hace en la sección de declaraciones de un módulo utilizando la sentencia Public.
• La declaración de un array a nivel del módulo o del formulario se hace en la sección de declaraciones del módulo o del formulario utilizando la sentencia Dim o Private.
• Para declarar un array local a un procedimiento, se utiliza la sentencia Dim, Private o Static dentro del propio procedimiento.
A continuación se presentan algunos ejemplos:
Dim vector(19) As Double
Este ejemplo declara un array de una dimensión, llamado vector, con veinte elementos, vector(0), vector(1), ... , vector(19), cada uno de los cuales permite almacenar un Double. Salvo que se indique otra cosa, los índices se empiezan a contar en cero.
Dim matriz(3, 1 To 6) As Integer
Este ejemplo declara un array de dos dimensiones, llamado matriz, con 4x6 elementos, matriz(0,1), ... matriz(3,6), de tipo entero.
Public cadena(1 To 12) As String
El ejemplo anterior declara un array de una dimensión, cadena, con doce elementos, caract(1), ... , caract(12), cada uno de los cuáles permite almacenar una cadena de caracteres. La declaración de los arrays estáticos es bastante cómoda. Se declaran una vez. Sin embargo tienen el inconveniente que en la mayoría de los casos están sobredimensionados y utilizan más memoria de la que realmente necesitan. Esto implica que se está malgastando memoria. Para solucionar este problema se utilizan los arrays dinámicos
Arrays dinámicos
El espacio necesario para un array estático se asigna al iniciarse el programa y permanece fijo durante su ejecución. El espacio para un array dinámico se asigna durante la ejecución del
programa. Un array dinámico, puede ser redimensionado en cualquier momento de la ejecución. La forma mejor de redimensionar los arrays es mediante variables que contienen los valores adecuados. Para crear un array dinámico primero hay que declararlo como si fuera una array estático, pero sin darle dimensión. Es decir, se deja la lista -entre paréntesis- vacía sin ponerle ningún número. Esto se hace con la sentencia Public si se quiere que sea global, con Dim o Private si se quiere a nivel de módulo o con Static, Dim o Private si se quiere que sea local. Para asignar el número actual de elementos del array se utiliza la sentencia ReDim. La sentencia ReDim puede aparecer solamente en un procedimiento y permite cambiar el número de elementos del array y sus límites inferior y superior, pero no el número de dimensiones. Esto quiere decir que, por ejemplo, no se puede trasformar un vector en una matriz. A continuación se presenta un ejemplo de cómo se declaran arrays dinámicos en Visual Basic. Si se declara el array Matriz a nivel del formulario,
Dim Matriz( ) As Integer
y más tarde, un procedimiento Calculo puede asignar espacio para el array, como se indica a continuación:
Sub Calculo( )
...
ReDim Matriz(F, C)
...
End Sub
Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el array se pierden (si son Variant se ponen a Empty; si son numéricos a cero y si son cadenas de caracteres a la cadena vacía). Cuando interese cambiar el tamaño del array conservando los valores del array, hay que ejecutar ReDim con la palabra clave Preserve. Por ejemplo, supóngase un array A de dos dimensiones. La sentencia,
ReDim Preserve A(D1, UBound(A, 2) + 2)
incrementa el tamaño del array en dos columnas más. Cuando se utiliza la palabraPreserve no puede cambiarse el índice inferior del array (sí el superior). La función UBound utilizada en este ejemplo es una función que devuelve el valor más alto de la segunda dimensión de la matriz (ver el Help para más información).
ESTRUCTURAS: SENTENCIA TYPE
Una estructura (según la nomenclatura típica del lenguaje C) es un nuevo tipo de datos, un tipo definido por el usuario, que puede ser manipulado de la misma forma que los tipos predefinidos (Int, Double, String, ...). Una estructura puede definirse como una colección o agrupación de datos de diferentes tipos evidentemente relacionados entre sí. Para crear una estructura con Visual Basic 6.0 hay que utilizar la sentencia Type ... End Type. Esta sentencia solamente puede aparecer en la sección General o de declaraciones de un módulo. Pueden crearse como Public o como Private en un módulo estándar o de clase y sólo como Private en un formulario. Dim equivale a Public. Véase el siguiente ejemplo,
Public Type Alumno
Nombre As String
Direccion As String *40
Telefono As Long
DNI As Long
End Type
Este ejemplo declara un tipo de datos denominado Alumno que consta de cuatro miembros o campos, denominados Nombre, Direccion, Telefono y DNI.
Una vez definido un nuevo tipo de datos, en un módulo estándar o de clase se pueden declarar variables Public o Private de ese tipo (en un formulario sólo Private), como por ejemplo:
Public Mikel as Alumno
Para referirse a un determinado miembro de una estructura se utiliza la notación variable.miembro. Por ejemplo,
Mikel.DNI = 34103315
A su vez, un miembro de una estructura puede ser otra estructura, es decir un tipo definido por el usuario. Por ejemplo,
Type Fecha
Dia As Integer
Mes As Integer
Anio As Integer
End Type
Type Alumno
Alta As Fecha
Nombre As String
Direccion As String * 40
Telefono AS Long
DNI As Long
End Type
Dentro de una estructura puede haber arrays tanto estáticos como dinámicos. En Visual Basic 6.0 se pueden definir arrays de estructuras. La declaración de un array de estructuras se hará con la palabraPublic, Private o Static, dependiendo de su ámbito. La forma de hacerlo es la siguiente:
Public grupoA (1 To 100) As Alumno
Private grupoB (1 To 100) As Alumno
Static grupoC (1 To 100) As Alumno
En Visual Basic 6.0, a la hora de declarar arrays de estructuras, sucede lo mismo que al declarar arrays de cualquier tipo de variables. Con GrupoA(1 To 100), se crea un vector de estructuras de 100 elementos de tipo Alumno (grupoA(1), grupoA(2), ..., grupoA(100)). Con grupoB(100), se crearía un vector de estructuras de 101 elementos (grupoB(0), grupoB(1), ...
grupoB(100)).
Es posible asignar una estructura a otra del mismo tipo. En este caso se realiza una copia miembro a miembro. Véase el siguiente ejemplo:
GrupoA(1) = delegado
Las estructuras pueden ser tambiénargumentos en las llamadas a funciones y procedimientos Sub. Siempre son pasados por referencia, lo cual implica que pueden ser modificados dentro del procedimiento y esas modificaciones permenecen en el entorno de llamada al procedimiento. En el caso de las funciones, las estructuras pueden ser tambiénvalores de retorno.