Bitácora del desarrollo de mi clase de Visual Basic, en el que ´publicaré el material de la clase y recibiré comentarios y sugerencias de mis alumnos.

Tuesday, August 11, 2009

4.4. Procedimientos y funciones

Procedimientos

Existen dos tipos de procedimientos con los que se trabaja en Visual Basic: los procedimientos de evento y los procedimientos generales.

Procedimientos de Evento
Visual Basic invoca automáticamente procedimientos de evento en respuesta a acciones del teclado, del ratón o del sistema. Por ejemplo, los botones de comando tienen un procedimiento de evento Click. El código que se escriba en el procedimiento de evento Click es ejecutado cuando el usuario haga clic en un botón de comando.

Cada control tiene un conjunto fijo de procedimientos de evento. Los procedimientos de evento para cada control son mostrados en un cuadro de lista despegable en la ventana de código.

Procedimientos Generales

Los procedimientos generales son procedimientos Sub o Function que son creados para que lleven a cabo tareas específicas, estos deben ser invocados de manera explícita.

Para crear un procedimiento general, se debe abrir la ventana de código y hacer clic en la orden Agregar procedimiento del menú Herramientas. También se puede crear un nuevo procedimiento escribiendo el encabezado de procedimiento Sub, seguido por el nombre del procedimiento, en una línea en blanco dentro de la ventana de código.

Si se tiene código duplicado en varios procedimientos de evento, se puede colocar el código en un procedimiento general y luego invocar al procedimiento general desde los procedimiento de evento.

Procedimentos Sub

Los procedimientos Sub no retornan valores. Por ejemplo:

Public Sub Seleccionar(Cuadro As TextBox)

Cuadro.SelStart = 0

Cuadro.SelLength = Len(Cuadro.Text)

End Sub

Los procedimientos Sub son invocados especificando sólo el nombre del procedimiento, o empleando la instrucción Call con el nombre del procedimiento. Por ejemplo:

Call Seleccionar(Text1)

Si se emplea la instrucción Call, se debe encerrar la lista de argumentos entre paréntesis. Si se omite Call, también se deben omitir los paréntesis alrededor de la lista de argumentos.

Procedimientos Function

Los procedimientos Function devuelven valores. En el siguiente ejemplo, el procedimiento Function recibe un número y devuelve ese número al cuadrado.

Public Function Cuadrado(N As Integer) As Integer

Cuadrado = N * N

End Function

Si se desea guardar el valor devuelto, se debe usar paréntesis cuando se invoque a la función, como se muestra a continuación:

Resultado = Cuadrado (5)

Si se omiten los paréntesis, se puede ignorar el valor devuelto y no guardarlo en una variable. Esto puede ser útil si se quiere ejecutar una función y no se desea el valor devuelto. Por ejemplo:

Cuadrado 5

Sunday, August 02, 2009

4.3.3. For Each...Next

For Each...Next

El bucle For Each...Next es similar al bucle For...Next, pero repite un grupo de sentencia por cada elemento de una colección de objetos o de una matriz en vez de repetir las sentencias un número especificado de veces. Esto resulta especialmente útil si no se sabe cuántos elementos hay en la colección. He aquí la sintaxis del bucle For Each...Next:

For Each elemento In grupo

Sentencias

Next elemento

Por ejemplo, el siguiente procedimiento Sub abre la base de datos Biblio.mdb y agrega el nombre de cada tabla a un cuadro de lista.

Sub ListTableDefs ( )

Dim objDb As Database

Set objDb = OpenDatabase("c:/Archivos de programa/Devstudio/" & _

"vb/biblio.mdb", True, False)

For Each TableDef In objDb.TableDefs ( )

List1.AddItem TableDef.Name

Next TableDef

End Sub

Tenga en cuenta las restricciones siguientes cuando utilice For Each...Next:

§ Para las colecciones, elemento sólo puede ser una variable Variant, una variable Object genérica o un objeto mostrado en el Examinador de objetos.

§ Para las matrices, elemento sólo puede ser una variable Variant.

§ No puede utilizar For Each...Next con una matriz de tipos definidos por el usuario porque un Variant no puede contener un tipo definido por el usuario.

El siguiente ejemplo habilita todos los Cuadro de Texto del formulario:

Private Sub ModoEdición ( )

Dim control

For Each control In form1.Controls

If TypeOf control Is TextBox Then

Control.Enabled = True

End If

Next control

End Sub

Salida de una Estructura de Control

La instrucción Exit le permite salir directamente de un bucle For o de un bucle Do. La sintaxis de la sentencia Exit es sencilla: Exit For puede aparecer tantas veces como sea necesario dentro de un bucle For y Exit Do puede aparecer tantas veces como sea necesario dentro de un bucle Do:

For contador = iniciar To finalizar [Step incremento]

[bloque sentencias]

[Exit For]

[bloque sentencias]

Next [contador]

Do [{While / Until} condición]

[bloque de sentencias]

[Exit Do]

[bloque de sentencias]

Loop

Do

[bloque de sentencias]

[Exit Do]

[bloque de sentencias]

Loop [{While / Until} condición]

Exit For y Exit Do son muy útiles ya que, algunas veces, resulta apropiado salir inmediatamente de un bucle sin realizar más iteraciones o sentencias dentro del bucle.

Cuando utilice la instrucción Exit para salir de un bucle, el valor de la variable contador difiere, dependiendo de cómo haya salido del bucle:

§ Cuando termina un bucle, la variable contador contiene el valor del límite superior más el paso.

§ Cuando sale de un bucle prematuramente, la variable contador conserva su valor según las reglas usuales del alcance.

§ Cuando sale antes del final de una colección, la variable contador contiene Nothing si se trata de un tipo de dato Object y Empty si es un tipo de dato Variant.


4.3.2. Sentencia For... Next

For...Next

Los bucles Do funcionan bien cuando no se sabe cuántas veces se necesitará ejecutar las sentencias del bucle. Sin embargo, cuando se sabe que se va a ejecutar las sentencias un número determinado de veces, es mejor elegir el bucle For...Next. A diferencia del bucle Do, el bucle For utiliza una variable llamada contador que incrementa o reduce su valor en cada repetición del bucle. La sintaxis es la siguiente:

For contador = iniciar To finalizar [Step incremento]

Sentencias

Next [contador]

Los argumentos contador, iniciar, finalizar e incremento son todos numéricos.

Nota: El argumento incremento puede ser positivo o negativo. Si incremento es positivo, iniciar debe ser menor o igual que finalizar o no se ejecutarán las sentencias del bucle. Si incremento es negativo, iniciar debe ser mayor o igual que finalizar para que se ejecute el cuerpo del bucle. Si no se establece Step, el valor predeterminado de incremento es 1. Al ejecutar el bucle For, Visual Basic:

1. Establece contador al mismo valor que iniciar.

2. Comprueba si contador es mayor que finalizar. Si lo es, Visual Basic sale del bucle. (Si incremento es negativo, Visual Basic comprueba si contador es menor que finalizar.)

3. Ejecuta las sentencias.

4. Incrementa contador en 1 o en incremento, si se especificó.

5. Repite los pasos 2 a 4.

Este código imprime los nombres de todas las fuentes de pantalla disponibles:

Private Sub Form-Click ( )

Dim I As Integer

For i = 0 To Screen.FontCount

Print Screen.Fonts (i)

Next

End Sub


4.3.1. Sentencia Do... Loop

Do...Loop

Utilice el bucle Do para ejecutar un bloque de sentencias un número indefinido de veces. Hay algunas variantes en la sentencia Do...Loop, pero cada una evalúa una condición numérica para determinar si continúa la ejecución. Como ocurre con If...Then, la condición debe ser un valor o una expresión que dé como resultado False (cero) o True (distinto de cero).

En el siguiente ejemplo de Do...Loop, las sentencias se ejecutan siempre y cuando condición sea True:

Do While condición

Sentencias

Loop

Cuando Visual Basic ejecuta este bucle Do, primero evalúa condición. Si condición es False (cero), se salta todas las sentencias. Si es True (distinto de cero) Visual Basic ejecuta las sentencias, vuelve a la instrucción Do While y prueba la condición de nuevo.

Por tanto, el bucle se puede ejecutar cualquier número de veces, siempre y cuando condición sea distinta de cero o True. Nunca se ejecutan las sentencias si condición es False inicialmente. Por ejemplo, este procedimiento cuenta las veces que se repite una cadena destino dentro de otra cadena repitiendo el bucle tantas veces como se encuentre la cadena de destino:

Function ContarCadenas (cadenalarga, destino)

Dim posición, contador

posición = 1

Do While InStr (posición, cadenalarga, destino)

posición = InStr (posición, cadenalarga, destino)+1

contador = contador + 1

Loop

ContarCadenas = contador

End Function

Si la cadena destino no está en la otra cadena, InStr devuelve 0 y no se ejecuta el bucle.

Otra variante de la instrucción Do...Loop ejecuta las sentencias primero y prueba la condición después de cada ejecución. Esta variación garantiza al menos una ejecución de sentencias:

Do

Sentencias

Loop While condición

Hay otras dos variantes análogas a las dos anteriores, excepto en que repiten el bucle siempre y cuando condición sea False en vez de True.

Hace el bucle cero o más veces

Do Until condición

Sentencias

Loop


Hace el bucle al menos una vez

Do

Sentencias

Loop Until condición

4.3. Sentencias de repetición (ciclos)

Estrucuras de Repeticion

Las estructuras de repetición o bucle le permiten ejecutar una o más líneas de código repetidamente. Las estructuras de repetición que acepta Visual Basic son:

§ Do...Loop

§ For...Next

§ For Each...Next

4.2.2. Sentencia Select Case

Select Case

Visual Basic proporciona la estructura Select Case como alternativa a If...Then...Else para ejecutar selectivamente un bloque de sentencias entre varios bloques. La sentencia Select Case ofrece posibilidades similares a la instrucción If...Then...Else, pero hace que el código sea más legible cuando hay varias opciones.

La estructura Select Case funciona con una única expresión de prueba que se evalúa una vez solamente, al principio de la estructura. Visual Basic compara el resultado de esta expresión con los valores de cada Case de la estructura. Si hay una coincidencia, ejecuta el bloque de sentencias asociado a ese Case:

Selec Case expresión_prueba

[Case lista_expresiones1

[bloque de sentencias 1]]

[Case lista_expresiones2

[bloque de sentencias 2]]

.

.

.

[Case Else

[bloque de sentencias n]]

End Select

Cada lista_expresiones es una lista de uno a más valores. Si hay más de un valor en una lista, se separan los valores con comas. Cada bloque de sentencias contiene cero o más instrucciones. Si más de un Case coincide con la expresión de prueba, sólo se ejecutará el bloque de instrucciones asociado con la primera coincidencia. Visual Basic ejecuta las instrucciones de la cláusula (opcional) Case Else si ningún valor de la lista de expresiones coincide con la expresión de prueba.

Por ejemplo, suponga que agrega otro comando al menú Edición en el ejemplo If...Then...Else. Podría agregar otra cláusula ElseIf o podría escribir la función con Select Case:

Private Sub mnuCut_Click (Index As Integer)

Select Case Index

Case 0 ‘ Comando Cortar

CopyActiveControl ‘ Llama a procedimientos generales

ClearActiveControl

Case 1 ‘ Comando copiar.

CopyActiveControl

Case 2 ‘ Comando borrar.

ClearActiveControl

Case 3 ‘ Comando Pegar.

PasteActiveControl

Case Else

frmFind.Show ‘ Muestra el cuadro de

‘ diálogo Buscar.

End Select

End Sub

Select Case TipoUsuario

Case “Supervisor”

‘ Proporciona al usuario privilegios de Supervisor

...

...

Case “Usuario”

‘ Proporciona al usuario privilegios de Usuario

...

...

Case Else

‘ Proporciona al usuario privilegio de invitado

...

...

End Select

Observe que la estructura Select Case evalúa una expresión cada vez que al principio de la estructura. Por el contrario, la estructura If...Then...Else puede evaluar una expresión diferente en cada sentencia ElseIf. Sólo puede sustituir una esructura If...Then...Else con una estructura Select Case si la intrucción If y cada instrucción ElseIf evalúa la misma expresión.

Otros Ejemplos:

If Ventas > 100000 Then

strDscto = Format (0.10, “Fixed”)

ElseIf Ventas > 50000 Then

strDscto = Format (0.05, “Fixed”)

Else

strDscto = Format (0.02, “Fixed”)

End If

Select Case Cantidad

Case 1

sngDscto = 0.0

Case 2, 3

sngDscto = 0.05

Case 4 To 6

sngDscto = 0.10

Case Else

sngDscto = 0.20

End Select


intRpta = MsgBox (“Guarda cambios antes de salir” , vbYesNo)

Select Case intRpta

Case vbYes

GuardarCambios

Unload Me

Case vbNo

Unload Me

End Select

Friday, July 31, 2009

4.2.1. Sentencia If... Then... Else

Estructuras de Decisión

Los procedimientos de Visual Basic pueden probar condiciones y, dependiendo de los resultados, realizar diferentes operaciones. Entre las estructuras de decisión que acepta Visual Basic se incluyen las siguientes:

§ If...Then

§ If...Then...Else

§ Select Case

If...Then

Use la estructura If...Then para ejecutar una o más instrucciones basadas en una condición. Puede utilizar la sintaxis de una línea o un bloque de varias líneas:

§ If condición Then Sentencias

§ If condición Then

Sentencias

End If

Condición normalmente es una comparación, pero puede ser cualquier expresión que dé como resultado un valor numérico. Visual Basic interpreta este valor como True o False; un valor numérico cero es False y se considera True cualquier valor numérico distinto de cero. Si condición es True, Visual Basic ejecuta todas las sentencias que siguen a la palabra clave Then. Puede utilizar sintaxis de una línea o de varias líneas para ejecutar una sentencia basada en una condición, los siguientes dos ejemplos son equivalentes:

If cualquierFecha < Now Then CualquierFecha = Now


If cualquierFecha < Now Then

CualquierFecha = Now

End If

Observe que el formato de una única línea de If...Then no utiliza la instrucción End If. Si se desea ejecutar más de una línea de código cuando condición sea True, debe utilizar la sintaxis de bloque de varias líneas If...Then...End If.

If cualquierFecha < Now Then

CualquierFecha = Now

Timer1.Enabled = False ‘ Desactiva el control Timer.

End If


If chkAlumnoUNI.Value=1 Then

txtCosto = Format (txtCosto*0.70,”Fixed”)

txtCódigo.Enabled = True

End If

If...Then...Else

Utilice un bloque If...The...Else para definir varios bloques de sentencias, uno de los cuales se ejecutará:

If condición1 Then

[bloque de sentencias 1]

[ElseIf condición2 Then

[bloque de sentencias 2]] ...

[Else

[bloque de sentencias n]]

End If

Visual Basic evalúa primero condición1. Si es False, Visual Basic procede a evaluar condición2 y así sucesivamente, hasta que encuentre una condición True. Cuando encuentra una condición True, Visual Basic ejecuta el bloque de instrucciones correspondientes y después ejecuta el código que sigue a End If. Opcionalmente, puede incluir un bloque de instrucciones Else, que Visual Basic ejecutará sin ninguna de las condiciones es True.

If...Then...ElseIf es un caso especial de If...Then...Else. Observe que puede tener cualquier número de cláusula ElseIf o ninguna. Puede incluir una cláusula Else sin tener en cuenta si tiene o no cláusula ElseIf.

Por ejemplo, la aplicación podría realizar distintas acciones dependiendo del control en que se haya hecho clic de una matriz de controles de menú:

Ejemplo1

Private Sub mnuCut_Click (Index As Integer)

If Index = 0 Then ‘ Comando Cortar

CopyActiveControl ‘ Llama a procedimientos generales

ClearActiveControl

ElseIf Index = 1 Then ‘ Comando Copiar

CopyActiveControl

ElseIf Index = 2 Then ‘ Comando Borrar

ClearActiveControl

Else ‘ Comando Pegar

PasteActiveControl

End If

End Sub

Ejemplo2:

If ClaveUsuario=”DSI” Then

‘ Permite al usuario entrar al sistema

...

...

Else

‘ Mostrar un mensaje advirtiendo error en la clave

...

...

End If

Ejemplo3:

Private Sub DeterminaCondición ( )

If Val (txtPromedio) >=13 Then

txtCondición = “Aprobado”

ElseIf Val (txtPromedio) >= 10 Then

txtCondición = “Asistente”

Else

txtCondición = “Desaprobado”

End If

End Sub

Observe que siempre puede agregar más cláusulas ElseIf a la estructura If...Then. Sin embargo, esta sintaxis puede resultar tediosa de escribir cuando cada ElseIf compara la misma expresión con un valor distinto. Para estas situaciones, puede utilizar la estructura de decisión Select Case.