Controladores de Eventos y Programación en Visual Basic .NET
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 46,11 KB
Controladores de Eventos
Un controlador de eventos es un método (normalmente, un procedimiento Sub) ligado a un evento. Cuando se produce el evento, se ejecuta el código del controlador de eventos. Podemos utilizar un mismo controlador de eventos para controlar más de un evento. Por ejemplo, podemos crear un solo controlador de eventos que controle los eventos de un botón y un elemento de menú que se utilicen para lo mismo. Igualmente, si tenemos un grupo de controles RadioButton en un formulario, podríamos crear un solo controlador de eventos y que el evento Click de cada control estuviese ligado al controlador de eventos.
El siguiente ejemplo de código es un controlador de eventos para el evento Click de un botón:
Private Sub Button1_Click(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Código del controlador de eventos
End Sub
El siguiente código de ejemplo muestra cómo podemos utilizar un solo controlador de eventos para controlar eventos para múltiples controles:
Private Sub MyHandler(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click
' Código del controlador de eventos
End Sub
Parámetros del controlador de eventos
Cada controlador de eventos proporciona dos parámetros que permiten controlar el evento correctamente:
- El primer parámetro (Sender en el ejemplo de código anterior) proporciona una referencia al objeto que ha producido el evento. Especifica la fuente que ha producido el evento.
- El segundo parámetro (e en el ejemplo de código anterior) pasa un objeto específico al evento que se está controlando. Este parámetro contiene todos los datos necesarios para controlar el evento.
La palabra clave Handles
La palabra clave Handles permite declarar controladores de eventos en tiempo de diseño. Se utiliza para declarar que un procedimiento controla un evento específico. Utilizar la palabra clave Handles al final de una declaración de procedimiento para conseguir que controle eventos producidos por una variable de objeto declarada utilizando la palabra clave WithEvents. La palabra clave Handles también puede utilizarse en una clase derivada para controlar eventos de una clase base.
Partes de la palabra clave Handles
La palabra clave Handles utiliza la siguiente declaración:
Proceduredeclaration Handles event
- Proceduredeclaration: Es la declaración del procedimiento Sub del procedimiento que controlará el evento.
- event: Es el nombre del evento que se está controlando. Este evento debe ser generado por la clase base de la clase actual o por un objeto declarado mediante la palabra clave WithEvents.
Para crear un procedimiento de eventos que utiliza la palabra clave Handles:
- En la sección de declaraciones del módulo que controlará el evento, utilizar la palabra clave WithEvents para declarar una variable de objeto para la fuente de sus eventos. Para un control añadido a un formulario, esto se realiza automáticamente, como en el siguiente código de ejemplo:
Friend WithEvents Button1 As System.Windows.Forms.Button
- En el Editor de código, en la lista Nombre de clase, hacer clic en la variable de objeto que acabamos de declarar. Éste es el objeto que se ha declarado utilizando la palabra clave WithEvents.
- En la lista Nombre de método, hacer clic en el evento que deseamos controlar. El Editor de código crea el procedimiento del controlador de eventos vacío con una cláusula Handles.
- Añadir código de control de eventos al procedimiento del controlador de eventos utilizando los argumentos que se proporcionan. El siguiente código proporciona un ejemplo:
Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("MyHandler received the event") End Sub
Delegados
Los delegados son objetos que podemos utilizar para invocar métodos de otros objetos. Podemos utilizar la palabra clave Delegate en una sentencia de declaración para crear nuestro propio delegado que derive de la clase MulticastDelegate.
La palabra clave Handles asocia un procedimiento a un evento que ha sido producido por un objeto declarado utilizando la palabra clave WithEvents.
Un controlador de eventos es un método (normalmente, un procedimiento Sub) ligado a un evento. Cuando se produce el evento, se ejecuta el código del controlador de eventos. Podemos utilizar un mismo controlador de eventos para controlar más de un evento.
El siguiente ejemplo de código es un controlador de eventos para el evento Click de un botón:
Private Sub Button1_Click(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
El siguiente código de ejemplo muestra cómo podemos utilizar un solo controlador de eventos para controlar eventos para múltiples controles:
Private Sub MyHandler(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.Click, RadioButton2.Click, RadioButton3.Click
Añadir controladores de eventos utilizando AddHandler
Para añadir controladores de eventos utilizando AddHandler:
- Declarar una variable de objeto de la clase que sea la fuente de los eventos que deseamos controlar. Por ejemplo:
Dim Button1 As System.Windows.Forms.Button
- Utilizar la instrucción AddHandler para especificar el nombre del emisor del evento, y la instrucción AddressOf para proporcionar el nombre de su controlador de eventos, como se muestra en el siguiente código de ejemplo:
AddHandler Button3.Click, AddressOf Process1
- Añadir código al controlador de eventos, como en el siguiente código de ejemplo:
Private Sub Process1(ByVal sender As System.Object, ByVal e As System.EventArgs) MessageBox.Show("Use Process 1 to Perform the Task") End Sub
Procedimiento: eliminar controladores de eventos utilizando RemoveHandler
Para eliminar controladores de eventos utilizando RemoveHandler:
Utilizar la instrucción RemoveHandler para especificar el nombre del emisor del evento, y la instrucción AddressOf para proporcionar el nombre de su controlador de eventos.
RemoveHandler Button3.Click, AddressOf Process1
Categorías de controles de comandos
- Button: Se utiliza para iniciar, detener o interrumpir un proceso.
- LinkLabel: Muestra texto en forma de vínculo en estilo Web y desencadena un evento cuando el usuario hace clic en el texto especial. Normalmente, el texto es un vínculo a otra ventana o a un sitio Web.
- NotifyIcon: Muestra un icono, en el área de notificación del estado en la barra de tareas, que representa una aplicación que se ejecuta en segundo plano.
- ToolBar: Contiene una colección de controles de botones.
Controles de texto
Para introducir y editar el texto que contienen estos controles en tiempo de ejecución:
- Textbox: Muestra texto escrito en tiempo de diseño que puede ser editado por los usuarios en tiempo de ejecución o modificado mediante programación.
- RichTextBox: Habilita la presentación del texto con formato de texto sencillo o de texto enriquecido (RTF).
Los siguientes controles de texto adicionales pueden utilizarse para mostrar texto pero no permiten a los usuarios de la aplicación editar directamente el contenido de texto que muestran:
- Label: Muestra texto que los usuarios no pueden editar directamente.
- StatusBar: Muestra información acerca del estado actual de la aplicación mediante una ventana con marco. Normalmente, la barra de estado se encuentra en la parte inferior de un formulario primario.
Windows Forms y Web Forms
Windows Forms
Windows Forms se utiliza para desarrollar aplicaciones en las que se espera que el cliente tenga una parte importante de la carga de proceso de una aplicación. Entre éstas se incluyen las aplicaciones clásicas de escritorio para el interfaz de programación de aplicaciones Microsoft Win32®. Algunos de los ejemplos incluyen aplicaciones de dibujo o gráficas, sistemas de introducción de datos, sistemas punto de venta, y juegos. Todas estas aplicaciones dependen de la potencia del equipo de sobremesa para procesar y mostrar contenido con alto rendimiento.
Web Forms
Web Forms de ASP.NET se utilizan para crear aplicaciones en las que el interfaz de usuario principal es un navegador. Incluyen aplicaciones pensadas para estar disponibles públicamente en la World Wide Web, como las aplicaciones de correo electrónico.
Añadir formularios a un proyecto
La mayoría de aplicaciones requieren más de una ventana. Debe agregar un formulario a su proyecto por cada ventana que requiera su aplicación.
Para añadir formularios adicionales a nuestro proyecto:
- Si el Explorador de soluciones no esta abierto, en el menú Ver, hacer clic en Explorador de soluciones.
- En el Explorador de soluciones, hacer clic con el botón derecho en el nombre del proyecto, seleccionar Agregar, y hacer clic en Windows Form.
- En el cuadro de diálogo Agregar nuevo elemento, en el cuadro Nombre, escribir un nombre adecuado para el formulario y, a continuación, hacer clic en Abrir.
Propiedades habituales de los formularios
La siguiente tabla describe algunas de las propiedades más habituales de los formularios que normalmente se establecen en el momento del diseño:
Propiedad | Descripción | Configuración predeterminada |
---|---|---|
(Name) | Establece el nombre del formulario en el proyecto (éste no es el nombre que se muestra al usuario en la barra de título, sino el nombre utilizado en el código para hacer referencia al formulario). Importante: Si se cambia la propiedad (Name) del formulario, debe establecer el objeto de inicio para su proyecto al nuevo nombre o el proyecto no se iniciará correctamente. | Form1 (Form2, Form3, etc.) |
AcceptButton | Establece en qué botón se hace clic cuando el usuario presiona la tecla ENTER. Nota: El formulario debe disponer de un botón como mínimo con esta propiedad. | Ninguna |
CancelButton | Establece en qué botón se hace clic cuando el usuario presiona la tecla ESC. Nota: El formulario debe disponer de un botón como mínimo con esta propiedad. | Ninguna |
ControlBox | Determina si un formulario muestra un cuadro de control en la barra de título. El cuadro de control puede contener los botones Minimizar, Maximizar, Ayuda y Cerrar. | True |
FormBorderStyle | Controla el aspecto del borde del formulario. También afecta a cómo aparece la barra de título y qué botones incluye. | Sizable |
Eventos de formulario
Initialize
El evento Initialize se utiliza normalmente para preparar una aplicación para su uso. Se asignan variables a sus valores iniciales, y puede cambiarse el tamaño o la posición de los controles para hospedar datos de inicialización.
En versiones anteriores de Visual Basic, el evento Initialize se utilizaba para ejecutar código antes de que un formulario se cargara. En .NET, el código de inicialización debe añadirse al constructor del formulario (Sub New()) después de la invocación de InitializeComponent() como se muestra en el siguiente ejemplo:
Public Sub New()
MyBase.New()
' This call is required by the Windows Forms Designer.
InitializeComponent()
' Add your initialization code here
End Sub
Show
El método Show incluye un Load implícito; esto significa que si el formulario especificado no se ha cargado todavía cuando se invoca el método Show, la aplicación carga automáticamente el formulario en memoria y lo muestra al usuario. El método Show puede mostrar formularios como modales o no modales.
FrmSplash.Show()
Podemos utilizar el método ShowDialog() para mostrar un formulario como un cuadro de diálogo.
Load
El evento Load se utiliza para realizar acciones que deben ocurrir antes de que se muestre el formulario. También se utiliza para asignar valores predeterminados al formulario y sus controles.
El evento Load tiene lugar cada vez que un formulario se carga en memoria. El evento Load de un formulario puede ejecutarse múltiples veces durante la vida de una aplicación. Se ejecuta cuando un formulario se inicia como resultado de la instrucción Load, la instrucción Show o cuando se genera una referencia a las propiedades, métodos o controles de un formulario no cargado.
Activated y Deactivate
El evento Activated se ejecuta antes del evento GotFocus.
Utilice el siguiente código para establecer el foco a un formulario:
FrmSplash.Focus()
Deactivate se ejecuta cuando el formulario pierde el foco a otro formulario. Este evento se ejecuta después del evento LostFocus.
Ambos eventos, Activated y Deactivate, se ejecutan únicamente cuando cambia el foco dentro de la misma aplicación. Si cambiamos a otra aplicación y regresamos al programa, ninguno de los dos eventos se ejecuta.
Importante: Si se necesita añadir código que se ejecute cuando el formulario se muestra o cuando el formulario está oculto, añadir el código a los controladores de eventos Activated y Deactivate en lugar de los controladores de eventos GotFocus y LostFocus.
Closing
El evento Closing resulta útil cuando se necesita saber cómo el usuario cierra el formulario. El evento Closing ocurre cuando el formulario recibe una solicitud de cierre. La validación de datos tiene lugar en ese momento. En caso de ser necesario mantener abierto el formulario (por ejemplo, si falla la validación de datos), el evento de cierre puede cancelarse.
Closed
El evento Closed ocurre cuando el formulario se cierra y antes del evento Dispose. El procedimiento del evento Closed se utiliza para verificar que el formulario debe cerrarse o para especificar acciones que deben tener lugar cuando se cierra el formulario. También se puede incluir código de validación a nivel de formulario para cerrarlo o para guardar datos en un archivo.
Dispose
El .NET Framework no soporta el evento Terminate. El código de terminación debe ejecutarse dentro del método Dispose, antes de invocar MyBase.Dispose().
Public Overrides Sub Dispose(ByVal Disposing As Boolean)
' Termination code goes here.
' The following code was automatically added by the Dispose method.
MyBase.Dispose(Disposing)
If Disposing Then
If Not components Is Nothing Then
Components.Dispose(Disposing)
End If
End If
End Sub
El método Dispose es invocado automáticamente para el formulario principal de una aplicación y debe invocarse explícitamente para cualquier otro formulario.
Hide
El método Hide elimina un formulario de pantalla pero no de la memoria. El usuario no puede acceder a los controles de un formulario oculto, pero sí están disponibles para la aplicación que se está ejecutando. Cuando un formulario está oculto, el usuario no puede interactuar con la aplicación hasta que finaliza la ejecución de todo el código del procedimiento de evento que ha ocultado el formulario.
Si el formulario no está cargado en memoria cuando se invoca el método Hide, el método Hide carga el formulario pero no lo muestra.
frmMyForm.Hide()
Operadores aritméticos
Los operadores aritméticos se utilizan para realizar muchas de las operaciones aritméticas familiares que implican el cálculo de valores numéricos representados por literales, variables, otras expresiones, llamadas de funciones y propiedades, y constantes.
Operadores aritméticos
La siguiente tabla presenta una lista de los operadores aritméticos que utilizaremos con mayor frecuencia en Visual Basic .NET.
Operador aritmético | Descripción |
---|---|
* | Multiplicación |
/ | División |
+ | Suma |
- | Resta |
^ | Exponenciación |
Operadores de comparación
Cuando Visual Basic .NET compara dos expresiones, devuelve uno de los dos valores siguientes: True o False. Estos valores se denominan valores Boolean. Cuando los valores Boolean se convierten en tipos numéricos, False pasa a ser 0 y True es -1. Los operadores de comparación devuelven uno de estos valores Boolean cuando prueban una expresión condicional.
Operadores de comparación
Los seis operadores de comparación que podemos utilizar en Visual Basic .NET son los siguientes:
Operador | Descripción |
---|---|
< | Menor que |
<= | Menor o igual que |
> | Mayor que |
>= | Mayor o igual que |
= | Igual que |
<> | Distinto de |
Sintaxis
La sintaxis general para los operadores de comparación es la siguiente:
expression1 comparison operator expression2
Ejemplo de utilización de operadores de comparación
Por ejemplo, su aplicación de procesamiento de órdenes de venta proporcionará un descuento a los pedidos en los cuales la cantidad del artículo solicitado sea superior a 1.000. El siguiente código muestra cómo podemos referenciar esta prueba más de una vez, por ello, decidimos guardar el resultado de la prueba en una variable Boolean denominada LargeOrder.
Dim Quantity As Integer
Dim LargeOrder As Boolean
LargeOrder = Quantity > 1000
Ejemplo de comparación de cadenas
Cuando Visual Basic .NET compara las dos cadenas, compara cada cadena carácter a carácter hasta que se encuentra la primera discordancia. Dos cadenas son iguales únicamente si ambas cadenas tienen la misma longitud y contienen exactamente la misma secuencia de caracteres. Cada carácter tiene un valor numérico para las comparaciones.
Expresiones de cadenas | Resultado |
---|---|
"DOG" = "DOG" | True. Ambas cadenas son idénticas. |
"DOG" = "dog" | False. Aunque ambas cadenas contienen dog, una cadena está en mayúsculas y la otra en minúsculas. |
Instrucciones If…Then
Las instrucciones If…Then evalúan si una condición es verdadera o falsa y dirigen el flujo del programa en consecuencia.
Sintaxis
Las instrucciones If…Then pueden utilizar sintaxis en una sola línea o en forma de bloque. Observe que la versión en una sola línea no requiere el uso de una instrucción End If. Normalmente, la instrucción If…Then en una sola línea se utiliza para ejecutar únicamente una instrucción condicionalmente. En instrucciones If…Then en forma de bloque, es habitual indentar el código entre las instrucciones If y End If. La mejor práctica es, sencillamente, facilitar la legibilidad.
Podemos utilizar la siguiente sintaxis en una línea:
If condition Then clause
También podemos utilizar la siguiente sintaxis en forma de bloque:
If condition Then
statements
End If
Ejemplo de una instrucción If…Then
Este ejemplo compara el valor de un entero denominado Sales con 10.000. Si Sales es superior a 10.000, se calcula un 10 por ciento de bonus. Si el valor de Sales no supera 10.000, se ignora la línea de código detrás del Then y no se calcula el bonus.
If Sales > 10000 Then
Bonus = .10 * Sales
End If
Instrucciones If…Then…Else
Sintaxis
Una instrucción If…Then…Else incluye los siguientes componentes:
- Una condición que evalúa si es True o False
- Una o más instrucciones que se ejecutan dependiendo del resultado de la prueba de la condición
- Una instrucción End If en el caso de un bloque
Para utilizar una instrucción If…Then…Else, utilizar la siguiente sintaxis:
If condition Then
statements
Else
statements
End If
Ejemplo de una instrucción If…Then…Else
El siguiente ejemplo compara el valor de un entero denominado Sales con 10.000. Si Sales es superior a 10.000, se calcula un 10 por ciento de bonus. Si el valor de Sales no supera 10.000, el bonus es igual a cero.
If Sales > 10000 Then
Bonus = .10 * Sales
Else
Bonus = 0
End If
Instrucciones If…Then anidadas
If…Then
Podemos utilizar tantas instrucciones If…Then como sean necesarias en una estructura If…Then. Añadir instrucciones If…Then en una estructura If…Then se denomina anidación.
Ejemplo de anidación
Por ejemplo, el siguiente código muestra cómo implementar un bonus de ventas otorgado a un empleado a tiempo parcial menor que el correspondiente a un empleado de jornada completa.
If Sales > 10000 Then
If EmployeeType = "Full-Time" Then
Bonus = .10 * Sales
Else
Bonus = .08 * Sales
End If
Else
Bonus = 0
End If
Instrucciones If…Then…ElseIf
Sintaxis
Para utilizar una instrucción If…Then…ElseIf, utilizar la siguiente sintaxis:
If condition Then
statements
ElseIf condition2 Then
statements
Else
statements
End If
Ejemplo de sentencia If…Then…ElseIf
El siguiente ejemplo compara en primer lugar el valor de un entero denominado Sales con 10.000, y a continuación lo compara con 5.000. Si Sales es superior a 10.000, se calcula un 10 por ciento de bonus. Si Sales es superior a 5.000, se calcula un 5 por ciento de bonus. Si el valor de Sales no es superior a 10.000 y tampoco a 5.000, se calcula un 2 por ciento de bonus.
If Sales > 10000 Then
Bonus = .10 * Sales
ElseIf Sales > 5000 Then
Bonus = .05 * Sales
Else
Bonus = .02 * Sales
End If
Instrucción Select Case
Sintaxis
La sintaxis para la instrucción Select Case es como sigue:
Select Case testexpression
[Case expressionlist-n]
[statements-n1] . . .
[Case Else]
[elsestatement]
End Select
Ejemplo de una instrucción Select Case
El siguiente ejemplo muestra cómo utilizar la instrucción Select Case para evaluar el valor de un bonus basado en seis condiciones distintas. Si ninguna de estas condiciones es verdadera, el bonus será del 15 por ciento.
Dim Rank As Integer
[Set Rank value]
...
Select Case Rank
Case 1
Bonus = 0
Case 2, 3
Bonus = .05 * Sales
Case 4 to 6
Bonus = .10 * Sales
Case Else
Bonus = .15 * Sales
End Select
Bucle For…Next
Sintaxis
Un bucle For…Next se ejecuta un determinado número de veces fijado por un contador de bucles. El valor del contador de un bucle For…Next puede incrementarse o disminuir dependiendo de si step es positivo o negativo.
La sintaxis de una instrucción For…Next es la siguiente:
For counter = start To end [Step step]
[statements]
[Exit For]
Next [counter]
Ejemplo
En el siguiente ejemplo, se utiliza una instrucción For…Next para recorrer el contenido de una pequeña matriz. Se utiliza un cuadro de mensaje para mostrar cada nombre en pantalla. Los nombres se muestran otra vez, pero en orden inverso.
Dim NamePos as Integer
Dim Names(4) As String
Names(0) = "Bob"
Names(1) = "Tina"
Names(2) = "Robert"
Names(3) = "George"
Names(4) = "Greg"
For NamePos = 0 to 4
MessageBox.Show(Names(NamePos))
Next
' In reverse order
For NamePos = 4 to 0 Step -1
MessageBox.Show(Names(NamePos))
Next
Anidar instrucciones For...Next
Podemos utilizar tantas instrucciones For…Next como sea necesario en una estructura For…Next. Añadir una o más instrucciones For…Next en otra instrucción For…Next se denomina anidar.
Pensemos en un escenario en el que deseemos crear múltiples puntos con coordenadas X e Y incrementales en un juego de ordenador. A continuación, utilizaremos esos puntos para asignar posiciones para gráficos.
Para crear estos puntos, podemos utilizar instrucciones For…Next anidadas. El código del ejemplo siguiente crea tres versiones de myPoint con valores X e Y incrementados, y nueve versiones de otherPoint con valores X e Y incrementados.
Private Sub CreatePoints( )
Dim x, y As Integer
Dim myPoint(7) As Point
Dim otherPoint(7) As Point
For x = 1 To 3
myPoint(x).X += 1
myPoint(x).Y += 1
MessageBox.Show(myPoint(x).ToString)
For y = 1 To 3
otherPoint(y).X += y + 1
otherPoint(y).Y += y + 2
MessageBox.Show(otherPoint(y).ToString)
Next
Next
End Sub
Colecciones
Definición de colecciones
Una colección es un conjunto de objetos agrupados conjuntamente y a los que se hace referencia como una unidad.
Las colecciones nos permiten fácilmente añadir, borrar y contar elementos. Utilizando un número de índice o valores clave, podemos añadir elementos antes o después de otros elementos. Las colecciones son similares a las matrices, pero proporcionan funcionalidades que las matrices no tienen, incluyendo la facilidad de añadir, eliminar y manipular elementos, y más funcionalidades con objetos.
Podemos crear nuestras propias colecciones y añadirles nuestros propios elementos o elementos existentes. Un elemento puede ser cualquier tipo de datos, incluyendo objetos o estructuras, e incluso otros objetos de la colección.
El .NET Framework también proporciona numerosas colecciones predefinidas. Algunos ejemplos de colecciones del .NET Framework predefinidas son:
- Cuando añadimos elementos a un ListBox, utilizamos la colección Items. Cada elemento que añadimos es un miembro de la colección.
- Cada formulario tiene una colección de controles Controls que representa todos los controles de ese formulario. Podemos obtener una referencia a un control de la colección utilizando su índice, y recorrer los miembros de la colección utilizando las instrucciones For Each…Next.
- Cada hoja de cálculo de Microsoft Excel forma parte de la colección Worksheet de Excel. Esto significa que podemos escribir código para recorrer hojas de cálculo de Excel y reunir datos en una nueva hoja de cálculo.
Sintaxis
La sintaxis para la instrucción For Each…Next es la siguiente:
For Each elementvariable In collection
' Statement block to be executed for each value
' of elementvariable
Next [elementvariable]
Ejemplo
En el siguiente ejemplo, la instrucción For Each…Next se utiliza para recorrer un conjunto de controles de un formulario y establecer el color de fondo de cada control como azul claro (light blue):
Sub LightBlueBackground (ByVal ThisForm As System.Windows.Forms.Form)
Dim ThisControl As System.Windows.Forms.Control
For Each ThisControl In ThisForm.Controls
ThisControl.BackColor = System.Drawing.Color.LightBlue
Next ThisControl
End Sub
Do…Loop con la palabra clave Until
Cuando añadimos la palabra clave Until a una instrucción Do…Loop, ordenamos a nuestro programa que haga algo hasta que una condición sea verdadera. En las instrucciones Do…Loop, una expresión puede ser evaluada al final o al principio del bucle. Las estructuras de bucle que evalúan expresiones al final de un bucle aseguran que el código del bucle se ejecuta al menos una vez. Las estructuras de bucle que evalúan expresiones al principio de un bucle pueden no ser ejecutadas, dependiendo del valor inicial de la expresión.
Si desea verificar la condición que está probando antes de ejecutar el código, y desea que el código se ejecute hasta que una condición sea verdadera, puede utilizar la instrucción Do Until…Loop. Esta instrucción ejecuta el código en el ciclo únicamente si la condición es False y se repite hasta que la expresión evaluada sea True.
Si desea verificar la condición que está probando después de ejecutar el código, y desea que el código se ejecute hasta que una condición sea verdadera, puede utilizar la instrucción Do…Loop Until. Esta instrucción ejecuta y repite la ejecución hasta que la expresión sea True.
Sintaxis
La sintaxis Do Until...Loop es como sigue:
Do [Until condition]
[statements]
[Exit Do]
Loop
La sintaxis Do…Loop Until es como sigue:
Do
[statements]
[Exit Do]
[statements]
Loop [While condition]
Ejemplos
En el siguiente ejemplo de uso de Do…Loop Until, se recorrerá el código hasta que el usuario haga clic en No en un cuadro de mensaje:
Dim LoopCount As Integer
Do
LoopCount = LoopCount + 1
Loop Until MessageBox.Show("Loop?", "Do... Loop Until", MessageBoxButtons.YesNo) = DialogResult.No
El siguiente ejemplo de utilización de Do Until…Loop encuentra todos los archivos de un directorio que concuerdan con una especificación de archivo. El ejemplo utiliza la función Dir para devolver el primer nombre de archivo que concuerde con la ruta especificada. La función Dir se invoca de nuevo para devolver los nombres de archivo adicionales que concuerdan con la ruta. Cuando no haya más nombres de archivo que concuerden, la condición Do Until…Loop se evaluará como True, y la longitud de la cadena devuelta por Dir será igual a cero:
Dim Message As String
Dim Filespec As String
Dim Match As String
Message = "Enter a file specification."
' Get file extension
Filespec = InputBox(Message)
' Find first match
Match = Dir(Filespec)
Do Until Len(Match) = 0
' Display matching files
MessageBox.Show(Match)
' Find next match
Match = Dir( )
Loop
MessageBox.Show ("There are no more matching files.")
Uso de While en lugar de Until
Podemos utilizar la palabra clave While en lugar de la palabra clave Until cuando la condición para que el bucle continúe sea True en lugar de False. Por ejemplo, los dos bloques de código siguientes son funcionalmente equivalentes:
Dim EndOfLoop As Boolean
EndOfLoop = False
Do
' . . .
Loop Until EndOfLoop
Dim EndOfLoop As Boolean
EndOfLoop = False
Do
' . . .
Loop While Not(EndOfLoop)
Instrucción Exit
La sintaxis para el uso de la instrucción Exit en una instrucción Do…Loop es la siguiente:
Exit Do
La sintaxis para el uso de la instrucción Exit en una instrucción For…Next es la siguiente:
Exit For
Ejemplo
El siguiente ejemplo muestra varias incidencias de la instrucción Exit dentro de una instrucción Do…Loop:
Do Until y = -1
If x < 0 Then Exit Do
x = Sqrt (x)
If y > 0 Then Exit Do
y = y + 3
If z = 0 Then Exit Do
z = x / y
Loop
Procedimientos
Los procedimientos son las sentencias de código ejecutable de un programa. Las instrucciones de un procedimiento están delimitadas por una instrucción de declaración y una instrucción End.
Nota
Es posible que encontremos los términos métodos, procedimientos y funciones de forma intercambiable en varias referencias. Este módulo sigue la terminología de la documentación de Microsoft® Visual Studio® .NET.
Tipos de procedimientos
Existen tres tipos de procedimientos en Microsoft Visual Basic® .NET: procedimientos Sub, procedimientos Function y procedimientos Property.
?? Los procedimientos Sub realizan acciones pero no devuelven un valor al procedimiento que origina la llamada. Los controladores de eventos son procedimientos Sub que se ejecutan en respuesta a un evento.
?? Los procedimientos Function pueden devolver un valor al procedimiento que origina la llamada. La instrucción MessageBox.Show es un ejemplo de función.
?? Los procedimientos Property devuelven y asignan valores de propiedades de clases, estructuras o módulos.
Uso de procedimientos
Un procedimiento puede ser invocado, o llamado, desde otro procedimiento. Cuando un procedimiento llama a otro procedimiento, se transfiere el control al segundo procedimiento. Cuando finaliza la ejecución del código del segundo procedimiento, éste devuelve el control al procedimiento que lo invocó.
Debido a esta funcionalidad, los procedimientos resultan útiles para realizar tareas repetidas o compartidas. En lugar de escribir el mismo código más de una vez, podemos escribir un procedimiento e invocarlo desde varios puntos de nuestra aplicación o desde otras aplicaciones.
Accesibilidad del procedimiento
Utilizamos un modificador de acceso para definir la accesibilidad de los procedimientos que escribimos (es decir, el permiso para que otro código invoque al procedimiento). Si no especificamos un modificador de acceso, los procedimientos son declarados public de forma predeterminada.
La siguiente tabla muestra las opciones de accesibilidad para declarar un procedimiento dentro de un módulo:
Modificador de acceso Descripción Public Ninguna restricción de acceso Friend Accesible desde el programa que contiene la declaración y desde cualquier otro lugar del mismo ensamblado Private Accesible únicamente en el módulo que contiene la declaración
Definición
Un procedimiento Sub es una serie de instrucciones de Visual Basic delimitadas por las instrucciones Sub y End Sub. Los procedimientos Sub realizan acciones pero no devuelven un valor al procedimiento que origina la llamada.
Sintaxis para crear un procedimiento Sub
Utilicemos la siguiente sintaxis para crear un procedimiento Sub:
[accessibility] Sub subname[(argumentlist)]
' Statements of the Sub procedure go here
End Sub
Ejemplo de procedimiento Sub
El siguiente código crea un procedimiento Sub (Sub AboutHelp) que utiliza un cuadro de mensaje para mostrar un nombre de producto y un número de versión:
Private Sub AboutHelp( )
MessageBox.Show("MyProgram V1.0", "MyProgram Help")
End Sub
Definición
Un procedimiento Function es una serie de instrucciones Visual Basic delimitadas por las instrucciones Function y End Function. Los procedimientos Function son similares a los procedimientos Sub, pero las funciones pueden devolver un valor al programa que origina la llamada.
Sintaxis para crear a Function procedimiento
Utilicemos la siguiente sintaxis para crear un procedimiento Function:
[accessibility] Function functionname[(argumentlist)] As _
datatype
' Statements of the function go here, including optional
' Return statement
End Function
Ejemplo de un procedimiento Function
El siguiente código crea una función denominada Square que devuelve el cuadrado de un número entero (integer):
Function Square(SquareValue As Integer) As Integer
Square = SquareValue * SquareValue
End Function
Valores de retorno
El valor que devuelve un procedimiento Function al programa que origina la llamada se denomina valor de retorno. La función devuelve el valor en una de las dos formas siguientes:
?? Asigna un valor al nombre de su propia función en una o más instrucciones dentro del procedimiento. El control no se devuelve al programa que origina la llamada hasta que se ejecuta una instrucción Exit Function o End Function.
La instrucción Exit Function provoca la salida inmediata de un procedimiento Function. Cualquier número de instrucciones Exit Function pueden aparecer en cualquier lugar del procedimiento.
?? Utiliza una instrucción Return para especificar el valor devuelto, y devuelve el control inmediatamente al programa que origina la llamada.
Funciones. Subrutinas y procedimientos 7
La ventaja de asignar el valor devuelto al nombre de función es que el control no se devuelve desde la función hasta que el programa encuentra una instrucción Exit Function o End Function. Esto permite asignar un valor preliminar y ajustarlo más tarde si es necesario.
Ejemplo de asignación del valor de retorno
El siguiente ejemplo asigna el valor de retorno al nombre de función DoubleTheValue y utiliza la instrucción Exit Function para volver al procedimiento de llamada:
Function DoubleTheValue(ByVal j As Integer) As Double
. . .
DoubleTheValue = j*2
' Control remains within the function
. . .
Exit Function
' Control returns to the calling function
. . .
End Function
Si salimos de la función sin asignar un valor devuelto, la función devuelve el valor predeterminado apropiado para el tipo de datos de la función. Por ejemplo, devuelve 0 para Byte, Char, Decimal, Double, Integer, Long, Short y Single.
Ejemplo de uso de la instrucción Return
La instrucción Return asigna simultáneamente el valor devuelto y sale de la función, como se muestra en el siguiente ejemplo:
Function DoubleTheValue(ByVal j As Integer) As Double
. . .
Return j*2
' Control is immediately returned to the calling function
. . .
End Function
Parámetros vs. argumentos
Cuando definimos un procedimiento en Visual Basic .NET, describimos los datos y los tipos de datos para los que el procedimiento está diseñado para aceptar desde un procedimiento de llamada. Los elementos definidos en el procedimiento se denominan parámetros.
Cuando invocamos el procedimiento, sustituimos un valor actual de cada parámetro. Los valores que asignamos en lugar de los parámetros se denominan argumentos.
Nota
A pesar de esta sutil diferencia, los términos argumento y parámetro a menudo se utilizan indistintamente. Este módulo utiliza la terminología utilizada en la documentación de Visual Studio .NET. Funciones. Subrutinas y procedimientos 9
Paso ByVal y ByRef
Cuando definimos un procedimiento, definimos el modo en el que otros procedimientos pueden pasar argumentos al procedimiento. Podemos escoger pasarle argumentos por referencia (ByRef) o por valor (ByVal). En Visual Basic .NET, el mecanismo predeterminado de paso de parámetros es por valor. Si no especificamos ByVal ni ByRef en nuestras definiciones de parámetros, ByVal se añade automáticamente a la definición del parámetro.
Mecanismo de paso Explicación Implicaciones Ventaja Por valor Palabra clave: ByVal El procedimiento invocado recibe una copia de los datos cuando es invocado. Si el procedimiento invocado modifica la copia, el valor original de la variable permanece intacto. Cuando la ejecución retorna al procedimiento de llamada, la variable contiene el mismo valor que tenía antes de que el valor se pasara. Protege la variable de ser cambiada por el procedimiento invocado. Por referencia Palabra clave: ByRef El procedimiento invocado recibe una referencia a los datos originales (la dirección de los datos en memoria) cuando es invocado. El procedimiento invocado puede modificar la variable directamente. Cuando la ejecución retorna al procedimiento de llamada, la variable contiene el valor modificado. El procedimiento invocado puede utilizar el argumento para devolver un nuevo valor al código de llamada.
Excepciones
El elemento de programación que subyace en un argumento puede ser un elemento variable, cuyo valor puede ser cambiado, o un elemento no variable. Los argumentos no variables nunca son modificados en el código de llamada, aunque se pasen por referencia. El procedimiento invocado podría modificar su copia de ese argumento, pero la modificación no afectaría al elemento subyacente en el código de llamada.
La siguiente tabla muestra elementos variables y no variables.
Elementos variables (pueden modificarse) Elementos no variables Variables declaradas, incluyendo variables de objetos Constantes Campos (de clases) Literales Elementos de matrices Enumeraciones Elementos de estructuras Expresiones
Si el argumento es opcional, debemos incluir también la palabra clave Opcional y proporcionar un valor predeterminado en la declaración, como sigue:
Opcional [ByVal|ByRef] nombreargumento As datatype = defaultvalue
Nota
Si deseamos más información sobre argumentos opcionales, leer Cómo utilizar argumentos opcionales en este módulo.
Ejemplo de declaración de un argumento
En el siguiente ejemplo, el procedimiento Sub Hello está diseñado para tomar un argumento Name de tipo String por valor desde un procedimiento de llamada.
Public Sub Hello(ByVal Name As String)
MessageBox.Show("Hello, " & Name & "!")
End Sub