sábado, 29 de mayo de 2010

PROGRAMACIÓN ORIENTADA A OBJETOS parte 2


Presionamos F5 para ejecutar el proyecto y mostrar el formulario.


-En el primer cuadro de texto, escribimos nuestro nombre.-En el segundo cuadro de texto, escribimos nuestro segundo apellido.-En el tercer cuadro de texto, escribimos nuestro tercer apellido.-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983).-Activamos la casilla si está casado/a.


Hacemos clic en el botón Without.Se abrirá un cuadro de mensaje. Muestra nuestro nombre sin el punto tras la inicial del primer apellido.

En el menú Archivo, hacemos clic en Guardar todo.
Probar controladores de eventos
Si deseamos escribir código que responda a un evento (o que controle un evento), debemos asociar ese evento a un controlador de eventos. Podemos hacerlo mediante la instrucción Handles o Add Handler.
La instrucción Add Handler permite asociar los eventos a los controladores en tiempo de ejecución, mientras que la instrucción Handles sólo asocia los eventos a los controladores en tiempo de compilación. La instrucción Handles se puede agregar al final de cualquier subrutina que tenga la misma firma que el evento.
Por ejemplo, antes, agregamos un evento denominado "AgeCalculated" que toma un parámetro de tipo "Integer". La subrutina que crea para controlar el evento también debe tomar un parámetro Integer, como se observa en el código siguiente.
Private Sub person1_AgeCalculated(ByVal Age As Integer) _
Handles person1.AgeCalculated
El objeto person1 se debe crear con la instrucción WithEvents para que se pueda tener acceso al evento AgeCalculated. Al usar la instrucción Add Handler, puede asociar dinámicamente los eventos a controladores en tiempo de ejecución.
Probamos el controlador de eventos en la clase Person
En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Código.
Agregamos la instrucción WithEvents antes de la declaración person1, como se muestra en el código siguiente:
WithEvents person1 As New Persons.Persons


Agregamos el procedimiento siguiente a Form1. Este código comprueba la edad calculada y muestra un mensaje basado en el resultado.
· Private Sub person1_AgeCalculated(ByVal Age As Integer) _
· Handles person1.AgeCalculated
·
· If Age > 18 Then
· MsgBox("You have been over 18 for " & Age - 18 _
· & " years.")
· Else
· MsgBox("You will be 18 in " & 18 - Age & " years")
· End If
·
End Sub


Presionamos F5 para ejecutar el proyecto y mostrar el formulario.-En el primer cuadro de texto, escribimos nuestro nombre.-En el segundo cuadro de texto, escribimos nuestro segundo apellido.-En el tercer cuadro de texto, escribimos nuestro tercer apellido.-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983).-Activamos la casilla si está casado/a.
Hacemos clic en el botón Actualizar para establecer las propiedades de la clase y haga clic en el botón Full Name.Un cuadro de mensaje muestra su nombre completo. Si tiene más de 18 años, otro cuadro de mensaje muestra información sobre cuánto tiempo hace que cumplió los 18 años. Si tiene menos de 18 años, aparece un cuadro de mensaje que muestra información sobre cuánto tiempo queda hasta que cumpla los 18 años. A continuación, otro cuadro de mensaje muestra su edad.



En el menú Archivo, hacemos clic en Guardar todo.
Generar una clase a partir de una clase existente: Herencia de clases
Ahora veremos cómo utilizar la herencia de clases para crear una clase basada en una clase existente.
Muchos objetos de la vida real tienen atributos y comportamientos en común, por ejemplo, todos los coches tienen ruedas y motores, y pueden avanzar y detenerse. Sin embargo, algunos automóviles tienen atributos que no son comunes, por ejemplo, un descapotable tiene una parte superior que se puede subir/bajar electrónica o manualmente.
Si se creó un objeto para representar un automóvil, se pueden incluir propiedades y métodos para todos los atributos y comportamientos comunes, pero no se podrían agregar atributos como la cubierta de un descapotable, puesto que dicho atributo no es generalizable a todos los automóviles.
Mediante el uso de la herencia, se puede crear una clase "descapotable" que deriva de la clase "automóvil". Ésta hereda todos los atributos de la clase automóvil y puede agregar los atributos y comportamientos que son únicos de un auto descapotable.
Heredar a partir de una clase existente
La instrucción Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una clase existente conocida como clase base. Las clases derivadas heredan todas las propiedades, los métodos, los eventos, los campos y las constantes definidos en la clase base.
El siguiente código muestra la declaración de una clase derivada.
Class DerivedClass
Inherits BaseClass
End Class
Se pueden crear instancias de la nueva clase DerivedClass, se puede tener acceso a sus propiedades y métodos como BaseClass y se pueden agregar nuevas propiedades y métodos que son específicos de la nueva clase. Para ver un ejemplo, nos fijaremos en la clase Persons que tenemos creada.
Supongamos que deseamos tener una clase que represente jugadores de béisbol: los jugadores del béisbol tienen todos los atributos definidos en la clase Persons, pero también tienen atributos únicos, como su número y posición. En lugar de agregar esas propiedades a la clase Persons, se creará una nueva clase derivada que se hereda de Persons, a la que se agregaran las nuevas propiedades.
Para crear una clase derivada de la clase Persons:
Abrimos el proyecto Persons que llevamos todo el tutorial usando.
En el Explorador de soluciones, seleccionamos el nodo del proyecto Persons.
En el menú Proyecto, elegimos Agregar clase.



En el cuadro de diálogo Agregar nuevo elemento, escribimos Players en el cuadro Nombre, a continuación, hacemos clic en Agregar.



Se agregará un nuevo módulo de clase al proyecto.



En el Editor de código, agregamos lo siguiente justo debajo de la línea Public Class Players.
Inherits Persons
Agregamos también el siguiente código para definir las dos nuevas propiedades.
· Private numberValue As Integer
· Private positionValue As String
· Public Property Number() As Integer
· Get
· Number = numberValue
· End Get
· Set(ByVal value As Integer)
· numberValue = value
· End Set
· End Property
· Public Property Position() As String
· Get
· Position = positionValue
· End Get
· Set(ByVal value As String)
· positionValue = value
· End Set
End Property


En el menú Archivo, hacemos clic en Guardar todo.
Probar la clase Players
Hemos creado una clase Players, derivada de la clase Persons.Ahora haremos una nueva aplicación para probar la clase Players.
Para crear un proyecto de prueba para la clase:
En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo proyecto.
En el cuadro de diálogo Agregar nuevo proyecto, en el panel Plantillas, seleccionamos una Aplicación de Windows Forms.
En el cuadro Nombre, escribimos PlayerTest y hacemos clic en Aceptar.



Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecerá un nuevo formulario.



En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el menú Proyecto, hacemos clic en Establecer como proyecto de inicio.
En el Explorador de soluciones, seleccionamos el proyecto PlayerTest y, en el menú Proyecto, haga clic en Agregar referencia.
Se abrirá el cuadro de diálogo Agregar referencia.
Hacemos clic en la ficha Proyectos, elegimos Persons y hacemos clic en Aceptar.



Hacemos doble clic en el formulario para abrir el Editor de código y escribimos la siguiente declaración justo debajo de la línea Public Class Form1.
2. Dim player1 As New Persons.Players
Dim player2 As New Persons.Players

Esto declara dos nuevas instancias de la clase Players.

En el menú Archivo, hacemos clic en Guardar todo.
Para probar la clase derivada:
En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuación, en el menú Ver, hacemos clic en Código.


En el Editor de código, agregamos el siguiente código al procedimiento de evento Form1_Load.
2. With player1
3. .FirstName = "Wyrm"
4. .LastName = "Garcia"
5. .Number = 13
6. .Position = "Shortstop"
7. End With
8. With player2
9. .FirstName = "Joe"
10. .LastName = "Black"
11. .Number = 51
12. .Position = "Catcher"
End With



En el Explorador de soluciones, seleccionamos Form1 en el proyecto PlayerTest y, a continuación, en el menú Ver, hacemos clic en Diseñador.


En el Cuadro de herramientas, arrastramos dos controles Button al formulario.
Seleccionamos el primer control Button y en la ventana Propiedades establecemos su propiedad Text en At Bat.
Seleccionamos el segundo control Button y en la ventana Propiedades establecemos su propiedad Text en On Deck.
Hacemos doble clic en el primer botón (At Bat) para abrir el Editor de código y escribimos el siguiente código en el controlador de eventos Button1_Click.
5. MsgBox(player1.Position & " " & player1.FullName & ", #" & _
CStr(player1.Number) & " is now at bat.")


Observamos que estamos utilizando el método FullName que se heredó de la clase base Persons.

En el controlador de eventos Button2_Click, agregamos el siguiente código.
2. MsgBox(player2.Position & " " & player2.FullName & ", #" & _
CStr(player2.Number) & " is on deck.")



Presionamos F5 para ejecutar el programa. Hacemos clic en cada botón para ver los resultados.Clic al Boton1(At Bat):


Clic al Boton2(on Deck):



En el menú Archivo, elegimos Guardar todo.
Y aqui, finalizando probar una clase derivada, acabamos con el tutorial sobre la POO y sus clases en Visual Basic.NET.
Hemos visto, qué son y cómo crear clases, agregarle propiedades, métodos y eventos, las hemos heredado, etc. Espero que no se os haya hecho demasiado largo, ni muy tostonazo, pero la mejor forma de aprender y de que las cosas se entiendan, es haciéndolo uno mismo...

PROGRAMACIÓN ORIENTADA A OBJETOS parte1

La POO es una evolución de la programación por procedimientos llamada también estructurada. Se basaba en funciones y procedimientos y el código que controlaba el flujo de las llamadas a estos. En Visual Basic, sobre todo en versiones anteriores se sigue programando mucho así. A veces por desconocimiento y otras por "miedo" no se da el salto a la POO, aunque un programador con experiencia en VB puede hacer magníficas aplicaciones sin utilizar la POO (y sin aprovecharse de sus ventajas) , y sobre todo, en un tiempo relativamente reducido.
Los tres pilares de la Programación Orientada a Objetos
Todos los lenguajes basados en objetos, deben cumplir estos tres requisitos:
Herencia
Encapsulación
Polimorfismo

Herencia
esta es la característica más importante de la POO. Según la propia documentación de Visual Studio .NET:"La herencia permite crear nuevas clases a partir de clases existentes. La herencia puede simplificar el diseño de la aplicación proporcionando una estructura de relaciones entre las distintas clases. También admite la reutilización de código porque sólo se debe codificar el comportamiento de clases nuevas o distintas.".
Una relación de herencia es una relación en la que un tipo (el tipo derivado) se deriva de otro (el tipo base), de tal forma que el espacio de declaración del tipo derivado contiene implícitamente todos los miembros de tipo no constructor del tipo base.
"La herencia es la capacidad de una clase de obtener la interfaz y comportamiento de una clase existente."

Encapsulación
Según Visual Studio.NET:"La encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes de encapsular elementos."
Cuando usamos las clases, éstas tienen una serie de características (los datos que manipula) así como una serie de comportamientos (las acciones a realizar con esos datos). La encapsulación es esa capacidad de la clase de ocultarnos sus interioridades para que sólo veamos lo que tenemos que ver, sin tener que preocuparnos de cómo está codificada para que haga lo que hace... simplemente nos debe importar que lo hace.
Resumiendo: Establece la separación entre la interfaz del objeto y su implementación.
Polimorfismo
Según la documentación de Visual Studio.NET:"El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable mediante código cliente en tiempo de ejecución."
Dicho de otra manera, puede tener múltiples clases que se pueden utilizar de forma intercambiable, si bien cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes. El polimorfismo es importante en la programación orientada a objetos puesto que permite usar elementos que tienen el mismo nombre, independientemente del tipo de objeto que se esté utilizando en ese momento.
Resumiendo: Determina que el mismo nombre de método realizará diferentes acciones según el objeto sobre el que se ha aplicado.
¿Qué es una clase?
Los programas de Visual Basic se generan con objetos como formularios y controles. Los objetos también se pueden utilizar para representar cosas reales como personas, equipos informáticos o incluso algo más abstracto, como una cuenta bancaria.
Una clase es simplemente una representación de un tipo de objeto. Pensad en ella como un plano que describe el objeto. Así como un plano puede utilizarse para construir varios edificios, una clase podemos usarla para crear varias copias de un objeto.
Aunque puede que no os hayáis dado cuenta, ya hemos utilizado las clases en otros tutoriales de VB que hay por Cristalab, como por ejemplo,en el tutorial básico de Visual Basic .NET o al crear aplicaciones con .NET y las seguiremos viendo en los próximos Tips o Tutoriales que vengan.
Por ejemplo, el control TextBox lo define una clase TextBox, que define su aspecto y sus funciones. Cada vez que arrastramos un control TextBox a un formulario, realmente está creando una nueva instancia de la clase TextBox.
Cada control TextBox es una copia exacta, aunque distinta, de la clase que lo define, la clase TextBox. Puesto que cada objeto es una "instancia" independiente de una clase, la acción de crear una clase se denomina creación de instancias.
Hasta ahora hemos agregado los controles TextBox a su formulario arrastrándolos desde el Cuadro de herramientas, pero también puede crear instancias de un objeto TextBox en su código si utiliza la palabra clave New.
Dim Textbox1 As New TextBox
¿Qué hay dentro de una clase?
Todos los objetos tienen propiedades que describen sus atributos, métodos que definen sus acciones y eventos que definen sus respuestas. Igualmente, la clase que define un objeto tiene sus propias propiedades, métodos y eventos ( a veces llamados miembros) que se pasan a todas las instancias de esa clase.
Por ejemplo, una clase que representa una cuenta bancaria podría tener propiedades como AccountNumber o AccountBalance, métodos como CalculateInterest y eventos como BalanceChanged. Una vez creada la instancia de un objeto de cuenta bancaria, puede tener acceso a sus propiedades, métodos y eventos de igual manera que si se tratara de un objeto TextBox.
Algunos miembros de una clase son privados; sólo se tiene acceso a ellos mediante código dentro de la clase. Por ejemplo, una clase de cuenta bancaria puede tener un método para calcular un saldo. Lo lógico es permitir que un programa lea ese balance pero no que pueda cambiarlo directamente.
Puede ocultar los miembros de una clase si los declara como Private o exponerlos si los declara como Public. También puede permitir el acceso a una propiedad y a la vez impedir que el programa cambie su valor declarándolo como ReadOnly.
El código siguiente muestra cómo podría ser una clase BankAccount, por ejemplo:
'Declaramos la clase BlankAccount
Class BankAccount
'La hacemos privada
Private AccountNumber As String
Private AccountBalance As Decimal
'Y la ponemos publica para que calcule el balance
Public Sub UpdateBalance()
End Sub
ReadOnly Property Balance() As Decimal
Get
Return AccountBalance
End Get
End Property
End Class
Crear la primera clase
Una de las mejores razones para utilizar clases es que una vez que ha creado una clase para cierto tipo de objeto, se puede reutilizar esa clase en cualquier proyecto.
Por ejemplo, muchos de los programas que escribimos pueden involucrar personas: Un programa de administrador de contactos para los contactos comerciales o un programa para realizar un seguimiento de empleados. Aunque los programas pueden ser considerablemente diferentes, los atributos que se aplican a cada persona serían los mismos. Todas tienen nombre, edad, dirección, número de teléfono, etc.
Para empezar a ver mejor crear clases,y usarlas crearemos una clase que represente a una persona;Podemos guardar esta clase y utilizarla en otros programas que escribamos en el futuro.
Las clases se pueden crear de tres maneras: como parte del código en un módulo de formulario en un proyecto de aplicación para Windows, como un módulo de clase separado agregado a un proyecto de aplicación para Windows o como un proyecto de bibliotecas de clase independiente.
Crear clases
Si habéis seguido los tutos de Visual Basic de Cristalab, o sabéis de ello, sabréis que al hacer doble clic en un formulario y abrir el Editor de código se veía algo parecido a lo siguiente:
Public Class Form1
Private Sub Form1_Load...

End Sub
End Class
Pues mirad, el formulario realmente es una clase, marcada por instrucciones Class y End Class y cualquier código que se haya escrito entre las dos instrucciones es parte de la clase. Aunque de manera predeterminada un módulo de formulario contiene sólo una clase única, puede crear módulos adicionales agregando código debajo de la instrucción End Class, tal como se ilustra a continuación:
Public Class Form1
' El código de vuestro Form AQUI
End Class
Public Class MyFirstClass
' El código de vuestra clase AQUI
End Class
La desventaja de crear clases de esta manera es que sólo están disponibles dentro del proyecto donde se crearon. Si deseamos compartir una clase con otros proyectos, puede colocarla en un módulo de clase.
Módulos de clase
Un módulo de clase es un archivo de código, separado del resto, que contiene una o más clases. Como es un archivo independiente, se puede reutilizar en otros proyectos.
Los módulos de clase se pueden crear de dos maneras:
Como un módulo agregado a un proyecto de aplicación para Windows.
Como un proyecto de bibliotecas de clase independient
Puede agregar un nuevo módulo de clase a un proyecto existente seleccionando Clase en el cuadro de diálogo Agregar nuevo elemento, disponible en el menú Proyecto. Para trabajar en durante el tutorial, crearemos un proyecto de bibliotecas de clases independientes.
Vamos a ver cómo crear un proyecto de de biblioteca de clases:

En el menú Archivo, seleccionamos Nuevo proyecto.
En el panel Plantillas, del cuadro de diálogo Nuevo proyecto, hacemos clic en Biblioteca de clases.



En el cuadro Nombre, escribimos Persons y hacemos clic en Aceptar.



Se abrirá un nuevo proyecto de bibliotecas de clase y el Editor de código mostrará el módulo de clase Class1.vb.




En el Explorador de soluciones, hacemos clic con el botón secundario del ratón en Class1.vb y seleccionamos Cambiar nombre y, a continuación, cambiamos el nombre a "Persons.vb".




Observamos que el nombre en el Editor de código también cambia a Persons.vb.
En el menú Archivo, elegimos Guardar todo.
En el cuadro de diálogo Guardar proyecto, hacemos clic en Guardar.
Nota: En lugar de guardar el proyecto en la ubicación predeterminada, podríamos crear un directorio en el cual podemos almacenar todas las clases para reutilizarlas mas tarde. se puede especificar esa carpeta en el campo Location del cuadro de diálogo Guardar proyecto antes de guardar.
De momento, mantendremos el proyecto abierto, porque lo utilizaremos durante todo el tutorial, e iremos ampliando la información.
Agregar propiedades a una clase
Ahora, aprenderemos a agregar propiedades a la clase que creamos en la sección anterior.
Todos los objetos tienen atributos y las propiedades representan atributos. Antes, hicimos la clase "Persons", que representa a una persona; las personas tienen atributos como el nombre y la edad, por lo que la clase Persons necesita propiedades que representen dichos atributos.
Se pueden agregar propiedades a una clase de dos maneras:
Como campo.
Como procedimiento de propiedad.
También podemos determinar cómo funciona una propiedad utilizando los modificadores Public, ReadOnly o WriteOnly.
Campos y procedimientos de propiedad
Los campos son variables públicas dentro de una clase que se pueden establecer o leer desde fuera de la clase. Resultan de utilidad para propiedades que no se tienen que validar, por ejemplo, un valor "Boolean" (True o False).
En el caso de la clase Persons, se puede tener una propiedad Boolean denominada Married, que especifica si una persona está soltera o casada, puesto que hay sólo dos valores posibles.
Para agregar un campo a una clase, el código podría ser como el que sigue.
Public Married As Boolean
La mayoría de las propiedades, sin embargo, son más complejas; en la mayor parte de los casos utilizaremos procedimientos de propiedad para agregar una propiedad a una clase.
Los procedimientos de propiedad tienen tres partes:
Una declaración de una variable privada para almacenar el valor de la propiedad.
Un procedimiento Get que expone el valor.
Un procedimiento Set que, como indica su nombre, establece el valor.
Por ejemplo, un procedimiento de propiedad para una propiedad Name, de la clase Persons, podría ser como el que sigue:
Private nameValue As String
Public Property Name() As String
Get
Name = nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
La primera línea de código declara una variable String privada, nameValue que almacenará el valor de la propiedad. El procedimiento de propiedad en sí comienza con Public Property y termina con End Property.
El procedimiento Get contiene el código que se ejecutará cuando desee leer su valor; por ejemplo, si lee la propiedad Persons.Name, el código devolverá el valor almacenado en la variable nameValue.
El procedimiento Set contiene código que se utiliza para asignar un nuevo valor a la variable nameValue usando un valor pasado como argumento value. Por ejemplo, si escribimos el código Persons.Name = "Wyrm", el valor String Wyrm se pasará como argumento value; el código del procedimiento Set lo asignará a la variable NameValue para su almacenamiento.
¿Por qué complicarnos tanto, en lugar de utilizar un campo que represente la propiedad Name? En el mundo real, hay ciertas reglas para los nombres: por ejemplo, los nombres normalmente no contienen números. Puede agregar código al procedimiento Set para comprobar el argumento value y devolver un error si contiene números.
Siguiendo con la Clase Persons, ahora agregaremos un campo y tres propiedades:
Abrimos el proyecto Persons que hicimos en la sección anterior. Si no lo guardaste, primero deberás regresar a la sección anterior, crear la primera clase, y realizar hasta el final los procedimientos de esa sección.
En el Explorador de soluciones, seleccionamos Persons.vb y en el menú Ver elegimos Código.



Agregamos el siguiente código de declaración debajo de la línea Public Class Persons.
2. Private firstNameValue As String
3. Private middleNameValue As String
4. Private lastNameValue As String
Public Married As Boolean

Agregamos los siguientes procedimientos de propiedad debajo del código de declaración anterior.
2. Public Property FirstName() As String
3. Get
4. FirstName = firstNameValue
5. End Get
6. Set(ByVal value As String)
7. firstNameValue = value
8. End Set
9. End Property
10.
11. Public Property MiddleName() As String
12. Get
13. MiddleName = middleNameValue
14. End Get
15. Set(ByVal value As String)
16. middleNameValue = value
17. End Set
18. End Property
19.
20. Public Property LastName() As String
21. Get
22. LastName = lastNameValue
23. End Get
24. Set(ByVal value As String)
25. lastNameValue = value
26. End Set
End Property
Quedará así:



33. En el menú Archivo, elegimos Guardar todo para guardar el trabajo.



Propiedades de sólo lectura y escritura
A veces una propiedad se establece una vez y no cambia nunca mas durante la ejecución del programa. Por ejemplo, una propiedad que representa un número de empleado nunca debe cambiar, de modo que otro programa si lo pueda leer, pero no se permitirá que ese programa cambie su valor.
La palabra clave ReadOnly se utiliza para especificar que un valor de propiedad se pueda leer pero no modificar.
Nota: Si intentamos asignar un valor a una propiedad ReadOnly, aparecerá un error en el Editor de código.
Para crear una propiedad de sólo lectura, deberemos crear un procedimiento de propiedad con un procedimiento Get, pero sin procedimiento Set, como se muestra a continuación.
Private IDValue As Integer
ReadOnly Property ID() As Integer
Get
ID = IDValue
End Get
End Property
De igual forma, la palabra clave WriteOnly permite establecer un valor de propiedad pero no permite que se lea; por ejemplo, no permite que otros programas lean una propiedad de contraseña. Podemos utilizar ese valor para realizar acciones dentro de la clase, pero deseará que sigan siendo privadas.
Para crear una propiedad de sólo escritura, se creará una propiedad con un procedimiento Set pero sin procedimiento Get, como a continuación:
Private passwordValue As String
WriteOnly Property Password() As String
Set(ByVal value As String)
passwordValue = value
End Set
End Property
Los procedimientos de propiedad ReadOnly y WriteOnly también son útiles cuando deseamos tomar un valor de propiedad y convertirlo en un valor diferente. Por ejemplo, pensemos en la edad de una persona. A diferencia del nombre, la edad cambia con el tiempo, si ha asignado la edad a una clase y la lee de nuevo un año después, sería incorrecta.
En la clase Persons, podemos evitarlo agregando dos propiedades: una propiedad "WriteOnly BirthYear" que representa el año de nacimiento, que nunca cambia, y una propiedad "ReadOnly Age" que devuelve un valor calculando la diferencia entre el año en curso y el año de nacimiento.
Siguiendo con la Clase Persons, ahora agregaremos propiedades ReadOnly y WriteOnly a la clase:
Agregamos el siguiente código de declaración debajo de las otras declaraciones en la parte superior del módulo de clase.
Private birthYearValue As Integer


Introducimos los siguientes procedimientos de propiedad debajo del código de declaración.
2. WriteOnly Property BirthYear() As Integer
3. Set(ByVal value As Integer)
4. birthYearValue = value
5. End Set
6. End Property
7.
8. ReadOnly Property Age() As String
9. Get
10. Age = My.Computer.Clock.LocalTime.Year - birthYearValue
11. End Get
End Property


1. En el menú Archivo, elegimos Guardar todo para guardar el trabajo.
Agregar métodos a una clase
Agregaremos métodos a una clase, para que puedan realizar acciones. Vimos que la mayoría de los objetos tienen acciones que pueden realizar; estas acciones se conocen como métodos.
La clase Persons que creamos en la sección anterior,tiene muchas acciones que pueden realizar las personas y, estas acciones se pueden expresar como métodos de clase.
Métodos de una clase
Los métodos de una clase son simplemente procedimientos Sub o Function, declarados en la clase.
Por ejemplo, una clase Account puede tener un procedimiento Sub denominado Recaculate, que actualizará el balance o un procedimiento Function denominado CurrentBalance para devolver el último balance.
El código para declarar esos métodos puede ser similar al siguiente:
Public Sub Recalculate()
'Aqui el codigo para recalcular Account.
End Sub
Public Function CurrentBalance(ByVal AccountNumber As Integer) As Double
'Codigo para volver a Balance
End Function
Si bien la mayoría de los métodos de clase son públicos, también se pueden agregar métodos que sólo la clase en sí puede utilizar. Por ejemplo, la clase Persons puede tener su propia función para calcular la edad de una persona. Si declara la función como Private, no se puede ver o llamar desde fuera de la clase.
El código para una función privada puede ser similar a éste otro:
Private Function CalcAge(ByVal year As Integer) As Integer
CalcAge = My.Computer.Clock.LocalTime.Year - year
End Function
Más tarde podremos cambiar el código que calcula el valor CalcAge y el método seguirá funcionando bien sin cambiar ningún código que utilice el método. Ocultar el código que realiza el método, se conoce como la "encapsulación", ya explicada al comienzo.
Ahora, para agregar un método a la clase Persons, hacemos lo siguiente:
Abrimos el proyecto Persons(si no lo tenemos abierto ya de antes) que hicimos en las secciones anteriores. Si no lo guardaste, o no lo creaste, primero deberás volver a las secciónes anteriores, agregar propiedades a la clase, y completar los procedimientos.
En el Explorador de soluciones, seleccionamos Persons.vb y, en el menú Ver, hacemos clic en Código.
Agregamos el siguiente código bajo los procedimientos de propiedad.
· Public Function FullName() As String
· If middleNameValue <> "" Then
· FullName = firstNameValue & " " & middleNameValue & " " _
· & lastNameValue
· Else
· FullName = firstNameValue & " " & lastNameValue
· End If
End Function
end class

Private Function CalcAge(ByVal year As Integer) As Integer
CalcAge = My.Computer.Clock.LocalTime.Year - year
End Function



Modificamos el código en el procedimiento de la propiedad Age para utilizar la función privada:
· ReadOnly Property Age() As String
· Get
· ' Age = My.Computer.Clock.LocalTime.Year - birthDateValue
· Age = CalcAge(birthYearValue)
· End Get
End Property
Antes, el código era así:
ReadOnly Property Age() As String
Get
Age = My.Computer.Clock.LocalTime.Year - birthYearValue
End Get
End Property




En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo.
Agregar eventos a una clase
Un programa puede responder a eventos externos, como por ejemplo, un usuario que hace clic en un botón. En esta sección, obtendremos información sobre cómo agregar eventos a una clase.
Primero, debemos declarar el evento.
A continuación, debemos provocarlo.
Provocar un evento significa que estamos señalizando la aparición del evento. Para agregar un evento a una clase, lo declaramos con la instrucción Event. Ésto indica que el objeto puede provocar el evento que especificamos.
Por ejemplo, quizás deseemos agregar un evento AgeCalculated a la clase Persons que hicimos. Podemos provocar a continuación el evento en el método CalcAge. Después de hacer esto, cuando se llama al método, podemos ejecutar algún código adicional en cuanto se haya calculado la edad de la persona.
Para agregar un evento a la clase Persons
Abrimos el proyecto Persons.
En el Explorador de soluciones, seleccione Persons.vb y, en el menú Ver, hacemos clic en Código.
Agregamos el siguiente código encima de los procedimientos de propiedad.
Public Event AgeCalculated(ByVal Age As Single)





En el método CalcAge, reemplazamos el código existente por el siguiente código para provocar el evento.
· Private Function CalcAge(ByVal year As Integer) As Integer
· Dim Age = My.Computer.Clock.LocalTime.Year - year
· RaiseEvent AgeCalculated(Age)
· CalcAge = My.Computer.Clock.LocalTime.Year - year
End Function


En el menú Archivo, hacemos clic en Guardar todo para guardar el trabajo.
Probar una clase
Creamos una clase llamada "Persons" y le proporcionamos propiedades, métodos y eventos. Lo que hemos hecho hasta ahora es agregar código, ahora es el momento de utilizar la clase Persons y asegurarse de que funciona según lo esperado.
Crear una instancia de una clase
Los formularios y controles son en realidad clases; cuando arrastramos un control Button a un formulario, estamos creando realmente una instancia de la clase Button.
También podemos crear instancias de cualquier clase en el código utilizando una declaración con la palabra clave New. Por ejemplo, para crear una nueva instancia de la clase Button, agregaremos el código siguiente.
Dim aButton As New Button
Para utilizar y probar la clase Persons, debemos crear primero un proyecto de prueba y agregar una referencia al módulo de clase.
Para crear un proyecto de prueba para la clase Persons
Abrimos el proyecto Persons que creamos en las secciones anteriores.
En el menú Archivo, elegimos Agregar y, a continuación, hacemos clic en Nuevo proyecto.


En el panel Plantillas, en el cuadro de diálogo Nuevo proyecto, hacemos clic en Aplicación de Windows Forms.
En el cuadro Nombre, escribimos PersonsTest y hacemos clic en Aceptar.



Se agregará un nuevo proyecto de Windows Forms al Explorador de soluciones y aparecerá un nuevo formulario.


En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el menú Proyecto, hacemos clic en Establecer como proyecto de inicio.

En el Explorador de soluciones, seleccionamos el proyecto PersonsTest y, en el menú Proyecto, hacemos clic en Agregar referencia.
Aparecerá el cuadro de diálogo Agregar referencia.

Hacemos clic en la ficha Proyectos, seleccionamos Personas y hacemos clic en Aceptar.

Hacemos doble clic en el formulario para abrir el editor de código y escribimos la siguiente declaración justo debajo de la línea Public Class Form1.
Dim person1 As New Persons.Persons
public class forms1
dim person1 as new persons.persons
private sub form1_load(byval sender as string)
Esto declara una nueva instancia de la clase Persons.
Quizás os preguntéis por qué tuvimos que escribir dos veces Persons, pues porque la primera instancia es el módulo de clase Persons.vb y la segunda instancia es la clase Persons de ese módulo.

En el menú Archivo, hacemos clic en Guardar todo.
El siguiente paso es agregar una interfaz de usuario y un código que utilice la clase Persons.
Agregaremos cuadros de texto donde el usuario especificará los valores para cada una de las propiedades (excepto la propiedad de sólo lectura "Age"), una casilla para el campo "Married" y botones para probar cada uno de los métodos públicos.
Para probar la clase Persons:
En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Diseñador.
En el Cuadro de herramientas, arrastramos cuatro controles TextBox, un control CheckBox y dos controles Button al formulario.
Seleccionamos el primer control Button y, a continuación, en la ventana Propiedades establecemos la propiedad Text en Update.
Seleccionamos el segundo control Button y en la ventana Propiedades establecemos la propiedad Text en Full Name.
Hacemos doble clic en el primer botón (Update) para abrir el Editor de código y en el controlador de eventos Button1_Click, agregamos el siguiente código:
· With person1
· .FirstName = Textbox1.Text
· .MiddleName = Textbox2.Text
· .LastName = Textbox3.Text
· .BirthYear = Textbox4.Text
· .Married = CheckBox1.Checked
End With

En el controlador de eventos Button2_Click, agregamos lo siguiente:
· MsgBox(person1.FullName)
·
· MsgBox(CStr(person1.Age) & " years old")
·
· If person1.Married = True Then
· MsgBox(person1.FirstName & " is married")
· Else
· MsgBox(person1.FirstName & " is single")
End If



Presionamos F5 para ejecutar el proyecto y mostrar el formulario:


En el primer cuadro de texto, escribimos nuestro nombre.-En el segundo cuadro de texto, escribimos nuestro segundo nombre.-En el tercer cuadro de texto, escribimos nuestro apellido.-En el cuarto cuadro de texto, escribimos el año de nuestro nacimiento con cuatro dígitos (por ejemplo, 1983).-Activamos la casilla de si estamos casados/as.

Hacemos clic en el botón "Update" para establecer las propiedades de la clase y clic en el botón "Full Name".Se muestran tres cuadros de mensaje. Estos cuadros de mensaje muestran su nombre completo, edad y estado civil.


En el menú Archivo, hacemos clic en Guardar todo.
Métodos sobrecargados
Para crear un método sobrecargado, agregamos dos o más procedimientos Sub o Function a la clase, cada uno con el mismo nombre.
En las declaraciones de procedimiento, el conjunto de argumentos para cada procedimiento debe ser distinto o se producirá un error.
El siguiente ejemplo muestra un método con dos sobrecargas, una que acepta una String y la otra que acepta un Integer como argumentos.
Public Sub TestFunction(ByVal input As String)
MsgBox(input)
End Sub
Public Sub TestFunction(ByVal input As Integer)
MsgBox(CStr(input))
End Sub
Si se debe llamar a este método desde el código y pesarle una cadena, se ejecutaría la primera sobrecarga y un cuadro de mensaje mostraría la cadena; si se le pasó un número, se ejecutaría la segunda sobrecarga y el número se convertiría en una cadena y aparecería en el cuadro de mensaje.
Podemos crear tantas sobrecargas como sean necesarias y cada una de ellas puede contener un número diferente de argumentos.
En la clase Persons, agregaremos un método con dos sobrecargas para devolver la inicial del segundo nombre de una persona; una sólo con la inicial y la otra con la inicial seguida por un punto.
Probar los métodos sobrecargados en la clase Persons
Abrimos el proyecto Persons que creamos en la secciones anteriores.
En el Explorador de soluciones, seleccionamos Persons.vb y, en el menú Ver, elegimos Código.
Agregamos el siguiente código debajo de los métodos existentes.
· Public Function MiddleInitial() As String
· MiddleInitial = Left$(middleNameValue, 1)
· End Function
·
· Public Function MiddleInitial(ByVal period As Boolean) As String
· MiddleInitial = Left$(middleNameValue, 1) & "."
End Function

.Public Function MiddleInitial()As String

MiddleInitial = left$(middlenamevalue, 1)

end function

lic Function MiddleInitial()As String
MiddleInitial = left$(middlenamevalue, 1) & "."
end function

En el Explorador de soluciones, seleccionamos Form1 y, en el menú Ver, hacemos clic en Diseñador.
En el Cuadro de herramientas, arrastramos dos controles más de Button al formulario.
Seleccionamos el tercer control Button y en la ventana Propiedades establecemos su propiedad Text en With.
Seleccionamos el cuarto control Button y en la ventana Propiedades establecemos su propiedad Text en Without.
Hacemos doble clic en el primer botón (With) para abrir el Editor de código y escribimos el siguiente código en el controlador de eventos Button3_Click.
· MsgBox(person1.FirstName & " " & person1.MiddleInitial(True) & _
" " & person1.LastName)







Funciones. Subrutinas y procedimientos

Descripción


Introducción
El desarrollo de una aplicación, especialmente si se trata de un proyecto de gran tamaño, es más fácil si se divide en piezas más pequeñas. El uso de procedimientos puede ayudarnos a agrupar nuestro código en secciones lógicas y condensar tareas repetidas o compartidas, como cálculos utilizados frecuentemente. En este módulo, aprenderemos a crear y utilizar procedimientos.
Objetivos
En este módulo, aprenderemos a:
􀂄 Diferenciar entre un procedimiento Sub y un procedimiento Function.
􀂄 Crear e invocar procedimientos Sub y Function.
􀂄 Escribir procedimientos en módulos para permitir la reutilización del código.
􀂄 Pasar argumentos por valor y por referencia.
􀂄 Utilizar funciones predefinidas en el código de nuestra aplicación.

Crear procedimientos


Introducción
Esta lección explica cómo crear procedimientos Sub y Function, cómo declarar argumentos en un procedimiento y cómo crear procedimientos en un módulo.
Estructura de la lección
Esta lección incluye los siguientes temas y actividades:
􀂄 ¿Qué son los procedimientos?
􀂄 Cómo crear procedimientos Sub
􀂄 Cómo crear procedimientos Function
􀂄 Cómo declarar argumentos en procedimientos
􀂄 Multimedia: pasar argumentos
􀂄 Cómo utilizar argumentos opcionales
􀂄 Multimedia: escribir código reutilizable
􀂄 Reutilización de código
􀂄 Práctica: crear una Función en un Módulo
Objetivos de la lección
En esta lección, aprenderá a:
􀂄 Describir y crear un procedimiento Sub.
􀂄 Describir y crear un procedimiento Function.
􀂄 Explicar la diferencia entre pasar argumentos por valor y pasar argumentos por referencia a un procedimiento.
􀂄 Declarar argumentos, incluyendo los opcionales, en un procedimiento.
􀂄 Crear procedimientos en un módulo.

¿Qué son los procedimientos?


Definición
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.
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.
Nota
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

Cómo crear procedimientos Sub


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

Cómo crear procedimientos Function


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.

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

Cómo declarar argumentos en procedimientos


Introducción
Un procedimiento que realiza tareas repetidas o compartidas utiliza distinta información en cada llamada. Esta información puede estar formada por variables, constantes y expresiones que se pasan al procedimiento por el procedimiento que origina la llamada. Cada valor que se pasa a un procedimiento se denomina argumento.
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.

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:
Por valor
Palabra clave: ByVal

Por referencia
Palabra clave: ByRef

Explicación:
El procedimiento invocado recibe una copia de los datos cuando es invocado.

El procedimiento invocado recibe una referencia a los datos originales (la dirección de los datos en memoria) cuando es invocado.

Implicaciones:
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.

El procedimiento invocado puede modificar la variable directamente. Cuando la ejecución retorna al procedimiento de llamada, la variable contiene el valor modificado.

Ventaja:
Protege la variable de ser cambiada por el procedimiento invocado.

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 Constantes
variables de objetos
Campos (de clases) Literales
Elementos de matrices Enumeraciones
Elementos de estructuras Expresiones

Declarar argumentos
Utilizamos la misma sintaxis para declarar los argumentos para procedimientos Sub y procedimientos Function. Declaramos cada argumento de un procedimiento del mismo modo en que declaramos una variable, especificando el nombre del argumento y el tipo de datos. También podemos especificar el mecanismo de paso y si el argumento es opcional.
La sintaxis para cada argumento en la lista de argumentos de un procedimiento es como sigue:
([ByVal|ByRef] [ParamArray] nombreargumento As datatype)

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

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

Cómo utilizar argumentos opcionales


Introducción
Podemos especificar que el argumento de un procedimiento es opcional y no es necesario proporcionarlo cuando el procedimiento es invocado. Esto ofrece flexibilidad cuando nuestro procedimiento es invocado por otro procedimiento. El usuario puede decidir proporcionar o no un argumento.
Declarar un argumento opcional
Los argumentos opcionales están indicados por la palabra clave Optional en la definición del procedimiento. Además, cuando declaramos un argumento opcional, se aplican las siguientes reglas:
􀂄 Debe especificarse un valor predeterminado para todos los argumentos opcionales.
􀂄 El valor predeterminado de un argumento opcional debe ser una expresión constante.
􀂄 Todos los argumentos que sigan a un argumento opcional en la definición del procedimiento también deben ser opcionales.
El siguiente código muestra la sintaxis para declarar un argumento opcional:
Optional [ByVal|ByRef] nombreargumento As datatype = defaultvalue
Ejemplo de argumento opcional
El siguiente ejemplo muestra una declaración de procedimiento con un argumento opcional:
Function Add(ByVal value1 As Integer, ByVal value2 As _
Integer, Optional ByVal value3 As Integer = 0) As Integer
' The default valor for the optional argument is 0

Ejemplo de argumento opcional incorrecto
El siguiente ejemplo contiene un error; recordemos que los argumentos que siguen a un argumento opcional también deben ser opcionales.
Function Add(ByVal value1 As Integer, Optional ByVal _
value2 As Integer = 0, ByVal value3 As Integer) As Integer
' Causes an error
Procedimientos de llamada con argumentos opcionales
Cuando invocamos un procedimiento con un argumento opcional, podemos escoger entre proporcionar o no el argumento. Si no proporcionamos el argumento, el procedimiento utiliza el valor predeterminado declarado para ese argumento.
Cuando omitimos uno o más argumentos opcionales en la lista de argumentos, utilizamos comas sucesivas para separar los espacios marcando sus posiciones. La siguiente invocación proporciona los argumentos primero y cuarto, pero no proporciona el segundo ni el tercero:
SubCount(arg1, , , arg4)
' Leaves out arg2 and arg3

Reutilización de código


Introducción
Uno de los procesos más importantes en la creación de una aplicación basada en Visual Basic es diseñar código para su reutilización. El modo como escribimos el código afecta a su reutilización.
Escribir código para reutilizar
Podemos escribir código para ser reutilizado, incluyendo procedimientos, en estructuras, módulos o clases. La siguiente tabla proporciona una descripción de las situaciones en las que deberíamos escoger cada una de estas opciones:

Estructura
Crear objetos que no necesitan ser extendidos y que tienen un tamaño de instancia pequeño
Size y Point son estructuras disponibles en la biblioteca de clases del Microsoft .NET Framework

Módulo
Proporcionar funciones de utilidad y datos globales para su uso por múltiples módulos o clases
Funciones de utilidad como conversión de temperatura, cálculo de área, acceso a datos, etc.,

Clase
Extender objetos, o para objetos que necesitan liberar recursos
Clase Forms, clase Button, etc.

Escribir procedimientos en una estructura
El siguiente código muestra cómo podemos escribir un procedimiento en una estructura. Asumimos que las variables x, y y z del ejemplo ya han sido declaradas.
Structure TableDimensions
Private legHeight, topWidth, topDepth As Integer
Public Sub New(ByVal legHeight As Integer, _
ByVal topWidth As Integer, ByVal topDepth as Integer)
Me.legHeight = x
Me.topWidth = y
Me.topDepth = z
End Sub
End Structure
Crear un módulo
Para crear un módulo, añadimos primero un módulo a nuestro proyecto. A continuación, escribimos las instrucciones del código que definen los datos y procedimientos de nuestro módulo.

Añadir un módulo a un proyecto
1. Si el Explorador de soluciones no está abierto, en el menú Ver, hacer clic en Explorador de soluciones.
2. En el Explorador de soluciones, hacer clic con en botón derecho en nuestro proyecto, seleccionar Agregar y, a continuación, hacer clic en Agregar nuevo elemento.
3. En el cuadro de diálogo Agregar nuevo elemento, en el cuadro Nombre, escribir un nombre para su módulo, seleccione Módulo en las Plantillas y, a continuación, hacer clic en Abrir.
Sintaxis
La siguiente sintaxis declara un bloque de módulo:
[Public|Friend] Module nombremódulo
' Add classes, properties, methods, fields, and events for
' the module
End Module
Accesibilidad de un módulo
Al igual que con los procedimientos y las variables, utilizamos los modificadores de acceso para definir la accesibilidad de un módulo. Si no utilizamos un modificador de acceso, los módulos se declaran Friend de modo predeterminado.
La siguiente tabla define los modificadores de acceso disponibles para un módulo:

Modificador de acceso Definición
Public Ninguna restricción de acceso
Friend Accesible desde dentro del programa que contiene la declaración y desde cualquier lugar del mismo ensamblado

crear una función en un módulo


En esta práctica, añadirá un módulo a un proyecto y creará una función en el módulo. La función tomará height y width como argumentos y devolverá Area.

Crear una función en un módulo
1. Abra un nuevo proyecto en Visual Basic .NET. Utilice la plantilla Aplicación para Windows. Asigne al proyecto el nombre CalculateArea y seleccione la carpeta donde quiera crearlo. Hacer clic en OK.
2. Añadir un nuevo módulo al proyecto. Para ello, en el menú Proyecto, hacer clic en Agregar nuevo elemento. En el panel Plantillas, hacer clic en Módulo, mantener el nombre predeterminado, y hacer clic en Abrir.
3. En el módulo, cree una nueva función denominada Area que devuelva un tipo de datos Single.
a. La función debería tomar dos argumentos denominados height y width por valor. Declare cada argumento como Single.
b. En el cuerpo de la función, escriba el código para multiplicar height y width y para asignar el valor devuelto a Area, como se muestra en el siguiente código:
Area = height * width

4. Guarde su proyecto. Nuestro código completo debería ser como el siguiente:
Module Module1
Function Area(ByVal height As Single, _
ByVal width As Single) As Single
Area = height * width
End Function
End Module

uso de procedimientos


Introducción
Uno de los principales beneficios del uso eficaz de procedimientos es la reutilización de código. Los procedimientos que creamos en un programa pueden utilizarse en ese programa y en otros proyectos, frecuentemente con poca o nula modificación. Los procedimientos son útiles para tareas repetidas o compartidas, como cálculos utilizados frecuentemente.
Esta lección describe cómo utilizar procedimientos Sub y Function, cómo utilizar la sintaxis ParamArray para pasar argumentos, y cómo modificar el inicio de la aplicación para crear un procedimiento Sub Main.
Estructura de la lección
Esta lección incluye los siguientes temas y actividades:
􀂄 Cómo utilizar procedimientos Sub
􀂄 Cómo utilizar procedimientos Function
􀂄 Práctica: utilización del valor devuelto de una función
􀂄 Cómo pasar matrices a procedimientos
􀂄 Cómo crear un Sub Main
􀂄 Práctica: crear un Sub Main
Objetivos de la lección
En esta lección, aprenderá a:
􀂄 Invocar y pasar argumentos a un procedimiento Sub.
􀂄 Pasar argumentos a una función y utilizar un valor devuelto.
􀂄 Utilizar ParamArray para declarar una matriz en el argumento de un procedimiento.
􀂄 Modificar el inicio de la aplicación creando un procedimiento Sub Main.

Cómo utilizar los procedimientos Sub


Introducción
Para utilizar un procedimiento Sub, lo invocamos desde otro procedimiento.
Flujo de código
Cada vez que se invoca un procedimiento Sub, se ejecutan sus instrucciones, empezando por la primera instrucción ejecutable después de la instrucción Sub y finalizando con la primera instrucción End Sub, Exit Sub o Return encontrada. Después de que el procedimiento Sub ejecute nuestro código, devuelve la ejecución del programa a la línea de código que sigue a la línea que invocó el procedimiento Sub.
Invocar un procedimiento Sub
La sintaxis para invocar un procedimiento Sub es la siguiente:
[Call] Subname [(Argumentlist)]
􀂄 Debemos invocar el procedimiento Sub en una línea por sí mismo en nuestro código (no puede invocarlo utilizando su nombre dentro de una expresión).
􀂄 La instrucción de llamada debe proporcionar valores para todos los argumentos que no son opcionales.
􀂄 Opcionalmente, podemos utilizar la instrucción Call para invocar un procedimiento Sub. El uso de la instrucción Call puede mejorar la legibilidad de nuestro programa.
Los procedimientos Sub no devuelven un valor a la instrucción de llamada. Sin embargo, un procedimiento Sub pasar información de retorno al código de llamada modificando argumentos pasados por referencia.
Nota
Ejemplo de una invocación simple
El siguiente código muestra un procedimiento de evento que invoca un procedimiento Sub denominado SetData:
Sub DataButton_Click(...)
SetData( )
End Sub

Ejemplo de uso de la instrucción Call
También puede utilizar el siguiente código para realiza la misma tarea:
Sub DataButton_Click(...)
Call SetData( )
End Sub
Ejemplo de invocación simple incorrecta
La siguiente invocación contiene un error:
Sub DataButton_Click(...)
MessageBox.Show(SetData( ))
End Sub
' Causes an error, because the Show method expects a String
' data type, not un procedure
Ejemplo de invocación con argumentos
Observe la siguiente definición para el procedimiento Sub SetData:
Public Sub SetData(ByVal cars As Integer, ByVal trucks As _ Integer, ByVal vans As Integer)
' Code for SetData Procedure
End Sub
La sintaxis para invocar este procedimiento incluye el nombre del procedimiento y la lista de argumentos en paréntesis, como se muestra en el siguiente código:
Sub DataButton_Click(...)
SetData(10, 20, 30)
End Sub
Ejemplo incorrecto de una llamada con argumentos
La siguiente llamada al procedimiento SetData definido en el ejemplo a continuación contiene un error.
Sub DataButton_Click( )
SetData(10, 20)
End Sub
' Causes an error, because there is no valor for the third
' parametre of the SetData procedure. The calling statement
' must provide values for all arguments that are not optional.

Práctica (opcional) Pasar argumentos por referencia
En esta práctica, crearemos dos procedimientos. El primer procedimiento tomará un argumento por referencia. El segundo procedimiento invocará al primer procedimiento y pasará un valor por referencia. Observaremos el efecto de invocar un procedimiento y pasar un valor por referencia.
Crear el interfaz de usuario
1. Abra un nuevo proyecto en Visual Basic .NET. Utilice la plantilla Aplicación para Windows. Asigne al proyecto el nombre ByRefTest y seleccione la carpeta donde quiera crearlo. Hacer clic en Aceptar.
2. Abra la vista de diseño de Form1.
3. Abra el Cuadro de herramientas. Añada un control TextBox y un control Button a su formulario. Organice los controles para que su formulario tenga un aspecto similar al de la siguiente figura:


Crear un procedimiento que toma un argumento por referencia
1. Abra el Editor de código de Form1.
2. Cree un procedimiento denominado Hello que toma un argumento String, Name, por referencia. Nuestro código debería ser como el siguiente:
Public Sub Hello(ByRef Name As String)
End Sub
3. Para visualizar el efecto de pasar una variable por referencia cuando invoca un segundo procedimiento, añada las tres líneas de código siguientes al procedimiento Hello:
a. Mostrar el valor actual de Name en un cuadro de texto.
b. Establecer el valor de la variable Name a Samantha.
c. Mostrar el nuevo valor de Name en un cuadro de texto.
Nuestro código debería tener un aspecto similar al siguiente:
Public Sub Hello(ByRef Name As String)
MessageBox.Show("Hello, " & Name & "!")
Name = "Samantha"
MessageBox.Show("Hello, " & Name & "!")
End Sub

Invocar un procedimiento y pasar un argumento
• Añada un controlador de eventos para el evento Button1_Click. En el controlador de eventos, invoque el procedimiento Hello, pasando la propiedad Text de TextBox1 como un argumento.
Nuestro código debería tener un aspecto similar al siguiente:
Private Sub Button1_Click(...) Handles Button1.Click
Hello(TextBox1.Text)
End Sub
Ejecutar la aplicación y probar los resultados
1. Ejecutar la aplicación.
2. Escribir nuestro nombre en TextBox1.
3. Hacer clic en Button1, comprobar si aparece el nombre y hacer clic en OK.
El segundo cuadro de mensaje que contiene el nombre “Samantha” se abrirá inmediatamente.
4. Antes de hacer clic en OK, observar el cuadro de texto. Mientras hacemos clic en OK, observar el cambio en el cuadro de texto.
El nombre “Samantha” aparecerá en el cuadro de texto después de que se cierre el cuadro de mensaje, aunque no se haya escrito ningún código que asigne específicamente un nuevo valor a la propiedad TextBox1.Text.
Archivos de solución
Los archivos de solución para esta práctica se encuentran en la carpeta ByRefTest\Solution dentro del archivo practs04.zip.

Cómo utilizar los procedimientos Function


Introducción
Un procedimiento Function se diferencia de un procedimiento Sub en que el primero puede devolver un valor al procedimiento de llamada.
Invocar una función
Invocamos un procedimiento Function incluyendo su nombre y sus argumentos en el lado derecho de una instrucción de asignación o en una expresión. Piense en la siguiente función, que convierte una temperatura en Fahrenheit a una temperatura en Celsius.
Function FtoC(ByVal temperature As Single) As Single
' Convert Fahrenheit to Celsius
FtoC = (temperature - 32.0) * (5 / 9)
End Function
Las siguientes llamadas de ejemplo muestran cómo podríamos invocar esta función:
Dim celsiusTemperature As Single
celsiusTemperature = FtoC(80)
' Call the procedure by including its name and arguments on
' the right side of an assignment statement. In this call,
' the value 80 is passed to the FtoC function, and the
' value returned is assigned to celsiusTemperature.
If FtoC(userValue) < 0 Then . . .
' Call the procedure by using it in an expression. In this
' call, the FtoC function is used as part of an expression.
End If
Flujo de código
Cada vez que se invoca la función se ejecutan sus instrucciones, empezando por la primera instrucción ejecutable tras la instrucción Function y finalizando con la primera instrucción End Function, Exit Function o Return encontrada.

Práctica: utilización del valor devuelto de una función


En este ejercicio, crearemos una aplicación sencilla que calcula el área de un rectángulo, dada su altura (height) y anchura (width).
En primer lugar, crearemos el interfaz de usuario para la aplicación. El usuario escribirá valores para la altura y la anchura en dos cuadros de texto de un formulario y hará clic en un botón para calcular el área del rectángulo en función de las dimensiones introducidas. El resultado se mostrará como una etiqueta en el formulario.
A continuación, escribiremos el código para la aplicación. Invocaremos a la función Area que creamos en la primera práctica de este módulo (Crear una función en un módulo), pasaremos argumentos a la función y devolveremos un valor.
Crear el interfaz de usuario
1. Abrir el proyecto CalculateArea que creamos en la práctica Crear una función en un módulo. Si no finalizamos esa práctica, abrir la solución CalculateArea.sln desde FunctionReturnValue\Starter dentro del archivo practs04.zip y familiaricémonos con el formulario y con el módulo del proyecto.
2. Abrir Form1 en la vista de Diseño.

3. Abrir el Cuadro de herramientas. Añadir a nuestro formulario cuatro controles Label, dos controles TextBox y un control Button. Organizar los controles para que nuestro formulario tenga un aspecto similar al de la siguiente figura:


Control Propiedad Nuevo valor
Label1 Text Height
Label2 Text Width
Label3 Text Area
Label4 Text en blanco
TextBox1 Text en blanco
TextBox2 Text en blanco

Escribir código para la aplicación
1. Añadir un controlador de eventos para el evento Button1_Click. En el controlador de eventos:
a. Invocar la función Area.
b. Pasar las propiedades Text de TextBox1 y TextBox2 como argumentos.
c. Asignar el valor devuelto a la propiedad Text de Label4.
Nuestro código debería ser similar al siguiente:
Private Sub Button1_Click(...)
Label4.Text = Area(TextBox1.Text, TextBox2.Text)
End Sub
2. Ejecutar la aplicación.
3. Escribir valores numéricos en los cuadros de texto Height y Width.
4. Hacer clic en Button1 y verificar que aparece la respuesta esperada.
5. Cerrar la aplicación.
Archivos de solución
Los archivos de solución para esta práctica están ubicados en la carpeta FunctionReturnValue\Solution dentro del archivo practs04.zip.

Cómo pasar matrices a procedimientos


Introducción
Podemos pasar matrices como argumentos a un procedimiento igual que otros argumentos. Visual Basic .NET también proporciona la palabra clave ParamArray para declarar una matriz de parámetros en la definición de parámetros de un procedimiento.
Pasar matrices
Podemos pasar matrices unidimensionales o multidimensionales a procedimientos del mismo modo que pasamos otros argumentos.
El siguiente ejemplo muestra cómo pasar una matriz unidimensional a un procedimiento:
Sub PassArray(ByVal testScores As Integer( ))
...
End Sub
Dim scores( ) As Integer = {80, 92, 73}
PassArray(scores)
El siguiente ejemplo muestra cómo pasar una matriz bidimensional a un procedimiento:
Sub Pass2DArray(ByVal rectangle As Integer(,))
...
End Sub
Dim rectangle(,) As Integer = {{12, 1}, {0, 12}}
Pass2DArray(rectangle)

Uso de ParamArray
Normalmente, no podemos invocar un procedimiento con más argumentos de los especificados en su declaración. Cuando necesitamos un número indefinido de argumentos, podemos declarar una matriz de parámetros, que permite que un procedimiento acepte una matriz de valores para un argumento. No es necesario conocer el número de elementos de la matriz de parámetros cuando definimos el procedimiento. El tamaño de la matriz está determinado de forma individual por cada invocación al procedimiento.
Utilizamos la palabra clave ParamArray para denotar una matriz de parámetros. Esta palabra clave indica que el argumento de un procedimiento es una matriz opcional de elementos de un tipo especificado. Se aplican las siguientes reglas:
􀂄 Un procedimiento sólo puede tener una matriz de parámetros, y debe ser el último argumento de la definición del procedimiento.
􀂄 La matriz de parámetros debe pasarse por valor. Es una buena práctica de programación incluir explícitamente la palabra clave ByVal en la definición del procedimiento.
􀂄 El código dentro del procedimiento debe tratar la matriz de parámetros como una matriz unidimensional, siendo cada elemento de la misma el mismo tipo de datos que el tipo de datos ParamArray.
􀂄 La matriz de parámetros es automáticamente opcional. Su valor predeterminado es una matriz unidimensional vacía del tipo de elemento del parámetro de la matriz.
􀂄 Todos los argumentos que preceden a la matriz de parámetros deben ser obligatorios. La matriz de parámetros debe ser el único argumento opcional.
Invocar un procedimiento con un argumento de matriz de parámetros
Cuando invocamos un procedimiento con un argumento de matriz de parámetros, podemos pasar alguna de las opciones siguientes para la matriz de parámetros:
􀂄 Nada. Es decir, podemos omitir el argumento ParamArray. En este caso, se pasa al procedimiento una matriz vacía. También podemos pasar la palabra clave Nothing, produciendo el mismo efecto.
􀂄 Una lista de un número indefinido de argumentos, separados por comas. El tipo de datos de cada argumento debe ser implícitamente convertible al tipo de elemento ParamArray.
􀂄 Una matriz con el mismo tipo de elemento que la matriz de parámetros.
Ejemplo de declaración ParamArray
El siguiente código muestra cómo podemos definir un procedimiento con una matriz de parámetros:
Sub StudentScores(ByVal name As String, ByVal ParamArray _
scores( ) As String)
' Statements for Sub procedure
End Sub
Ejemplos de invocaciones a un procedimiento con una matriz de parámetros
Los siguientes ejemplos muestran invocaciones posibles a StudentScores.

StudentScores("Anne", "10", "26", "32", "15", "22", "16")
StudentScores("Mary", "High", "Low", "Average", "High")
Dim JohnScores( ) As String = {"35", "Absent", "21", "30"}
StudentScores("John", JohnScores)

Cómo crear un Sub Main


Introducción
Para abrir y cerrar una aplicación, la biblioteca de clases del .NET Framework proporciona la clase Application. La clase Application proporciona métodos (procedimientos) y propiedades para gestionar una aplicación, incluyendo métodos para abrir y cerrar una aplicación, métodos para procesar mensajes de Microsoft Windows®, y propiedades para obtener información sobre una aplicación.
El procedimiento Sub Main
Cuando creamos aplicaciones con la plantilla Aplicación para Windows en Visual Basic .NET, Visual Basic crea automáticamente un procedimiento Sub oculto denominado Sub Main para la clase Form. Este procedimiento se utiliza como punto de inicio para nuestra aplicación.
Crear un nuevo Sub Main
En el procedimiento Sub Main, Visual Basic .NET invoca el método Application.Run para iniciar la aplicación. Podemos cambiar este comportamiento creando nuestro propio Sub Main y convirtiéndolo en el objeto de inicio. Podemos crear Sub Main en un módulo o en otra clase. Después de crear un Sub Main, necesitamos hacer de este nuevo procedimiento el objeto de inicio utilizando la ventana Propiedades.
Cambiar el objeto de inicio a Sub Main
1. Si el Explorador de soluciones no está abierto, en el menú Ver, hacer clic en Explorador de soluciones.
2. En el Explorador de soluciones, hacer clic con el botón derecho en el nombre del proyecto y, a continuación, en Propiedades.
3. En el panel izquierdo, debajo de Propiedades comunes, verificar que está seleccionado General.
4. En la lista Objeto inicial, hacer clic en Sub Main para convertir este procedimiento el nuevo objeto de inicio de nuestro proyecto.

Utilización de Application.Exit
Para cerrar una aplicación, invocamos el método Application.Exit utilizando la siguiente sintaxis:
Application.Exit( )
Por ejemplo, podemos insertar este código en el controlador de eventos Click de un botón. Cuando el usuario haga clic en el botón, la aplicación se cerrará.

Práctica: Crear un Sub Main


En esta práctica, generaremos código para una aplicación formada por tres formularios, y crearemos un Sub Main como objeto de inicio para el proyecto.
Abrir el proyecto
• Abrir el proyecto MultipleForms.sln, ubicado en la carpeta Forms\Starter dentro del archivo practs04.zip y familiaricémonos con los formularios y los módulos del proyecto.
Declarar variables
• Declarar las siguientes variables en el archivo de módulo Starter.

Nombre de la variable Modificador de acceso Tipo de datos
carLoanForm Friend CarLoan
homeLoanForm Friend HomeLoan
selectionForm Private Selection

Nuestro código debería ser similar al siguiente:
Friend carLoanForm As CarLoan
Friend homeLoanForm As HomeLoan
Private selectionForm As Selection

Crear un procedimiento Sub Main
1. Declarar un procedimiento Sub Main público en el módulo Starter. Nuestro código debería ser similar al siguiente:
Public Sub Main( )
End Sub
2. Completar el cuerpo del procedimiento Sub Main.
a. Crear una nueva instancia del formulario Selection y asignarlo a selectionForm.
b. Invocar el método selectionForm.Show para visualizar el formulario.
c. Iniciar la aplicación invocando el método Application.Run.
Nuestro código debería ser similar al siguiente:
Public Sub Main( )
selectionForm = New Selection( )
selectionForm.Show( )
Application.Run( )
End Sub
3. Establecer Sub Main como objeto de inicio de la aplicación.
Escribir código para el formulario Selection
1. Abrir el Editor de código para el formulario Selection.
2. Añadir un controlador de eventos Click para el botón Next.
3. Escribir código para el controlador de eventos.
a. Si está seleccionado CarLoanRadioButton, crear una nueva instancia del formulario CarLoan. Nuestro código debería ser similar al siguiente:
If CarLoanRadioButton.Checked Then
carLoanForm = New CarLoan( )

b. Utilizar el método Show para visualizar el formulario CarLoan.
c. Utilizar el método Close para cerrar el formulario Selection, como sigue:
carLoanForm.Show( )
Me.Close( )
d. Si está seleccionado HomeLoanRadioButton, crear una nueva instancia del formulario HomeLoan. Nuestro código debería ser similar al siguiente:
ElseIf HomeLoanRadioButton.Checked Then
homeLoanForm = New HomeLoan( )
e. Utilizar el método Show para visualizar el formulario HomeLoan.

f. Utilizar el método Close para cerrar el formulario Selection, como sigue:
homeLoanForm.Show( )
Me.Close( )
g. Si no se selecciona ninguna opción, utilizar un cuadro de mensaje para indicar al usuario que realice una selección. Nuestro código debería ser similar al siguiente:
Else
MessageBox.Show("Please select a loan type", _
"Loan Type", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
End If
Escribir código para cerrar la aplicación
1. Crear un controlador de eventos Click para el botón Exit del formulario Selection. Invocar Application.Exit para cerrar la aplicación.
2. Crear un controlador de eventos Click para el botón Done del formulario HomeLoan. Invocar Application.Exit para cerrar la aplicación.
3. Crear un controlador de eventos Closing para el formulario HomeLoan. Invocar Application.Exit para cerrar la aplicación.
4. Crear un controlador de eventos Click para el botón Done del formulario CarLoan. Invocar Application.Exit para cerrar la aplicación.
5. Crear un controlador de eventos Closing para el formulario CarLoan. Invocar Application.Exit para cerrar la aplicación.

Probar la aplicación
1. Ejecutar la aplicación. Hacer clic en Car Loan y en el botón Next. Comprobar que se abre el formulario Car Loan.
2. Salir de la aplicación haciendo clic en el botón Close de la esquina superior derecha del formulario.
3. Ejecutar de nuevo la aplicación. Hacer clic en Home Loan y en el botón Next. Comprobar que se abre el formulario Home Loan.
4. Salir de la aplicación haciendo clic en el botón Done.
5. Ejecutar de nuevo la aplicación. Hacer clic en el botón Next sin pulsar en un tipo de crédito (loan). Comprobar si aparece un cuadro de mensaje indicando al usuario que seleccione un tipo de crédito (loan).
6. Salir de la aplicación utilizando el botón Exit del formulario Selection.
Archivos de solución
Los archivos de solución para esta práctica están ubicados en Forms\Solution dentro del archivo practs04.zip.

Lección: uso de funciones predefinidas


Introducción
La biblioteca del entorno de ejecución de Visual Basic proporciona numerosas funciones predefinidas que podemos utilizar en nuestro código. Estas funciones se invocan del mismo modo en que invocamos a nuestras propias funciones.
En este módulo, estudiaremos la función InputBox, las funciones de fecha y hora, las funciones de cadena, las funciones de formato y las funciones financieras. En “Miembros de la biblioteca del entorno de ejecución de Visual Basic”, en la documentación de Visual Studio .NET, encontraremos una lista completa de las funciones predefinidas.

Estructura de la lección
Esta lección incluye los siguientes temas y actividades:
􀂄 Cómo utilizar la función InputBox
􀂄 Cómo utilizar las funciones Date y Time
􀂄 Cómo utilizar las funciones String
􀂄 Cómo utilizar las funciones Format
􀂄 Cómo utilizar las funciones Financial
􀂄 Práctica: Examen de funciones predefinidas

Objetivo de la lección
En esta lección, aprenderemos a utilizar funciones predefinidas en el código de nuestra aplicación, incluyendo la función InputBox, funciones de fecha y hora, funciones de cadena, funciones de formato y funciones financieras.

Cómo utilizar la función InputBox


Introducción
La función InputBox es una función predefinida que proporciona una forma sencilla de interactuar con los usuarios. La función InputBox muestra un cuadro de diálogo con un mensaje, espera a que el usuario introduzca texto o haga clic en un botón y devuelve una cadena con el contenido del cuadro de texto.

Parámetros
La siguiente declaración de función muestra los parámetros de la función InputBox:
Public Function InputBox(ByVal Prompt As String, _
Optional ByVal Title As String = "", _
Optional ByVal DefaultResponse As String = "", _
Optional ByVal XPos As Integer = -1, _
Optional ByVal YPos As Integer = -1 ) As String
Como podemos ver, los argumentos Title, DefaultResponse, XPos e YPos son opcionales. La siguiente tabla explica los valores predeterminados que se aplicarían en caso de escoger no pasar uno de estos argumentos opcionales a la función InputBox.

Parametro:

Title
Texto que aparece en la barra de título
El nombre de la aplicación

DefaultResponse
El valor que se muestra en el cuadro de texto como valor predeterminado si el usuario no proporciona una entrada
El cuadro de texto se mostrará vacío

XPos
Especifica la distancia entre el borde izquierdo del cuadro de diálogo y el extremo izquierdo de la pantalla
El cuadro de diálogo se centrará horizontalmente

YPos
Especifica la distancia entre el borde superior del cuadro de diálogo y la parte superior de la pantalla
El cuadro de diálogo se posicionará verticalmente aproximadamente a un tercio del alto del total de la pantalla

Ejemplo de utilización de la función InputBox
El siguiente código crea un cuadro de entrada con el título Search, que solicita al usuario que introduzca un nombre de archivo y almacena la respuesta del usuario en una variable denominada FileName.

Dim FileName As String
FileName = InputBox("Please enter file name", "Search")

Resultado
La siguiente ilustración de pantalla muestra el cuadro de entrada creada por el código anterior.


Cómo utilizar las funciones de fecha y hora


Introducción
Visual Basic proporciona numerosas funciones de fecha y hora que podemos utilizar en nuestras aplicaciones. En esta sección, estudiaremos cómo utilizar dos funciones predefinidas para realizar cálculos y operaciones que implican fechas y horas.
Uso de la función DateAdd
Podemos utilizar la función DateAdd para añadir o sustraer un intervalo de tiempo específico a una fecha. Pasamos a la función la fecha y la información sobre el intervalo, y la función DateAdd devuelve un valor Date que contiene el valor de fecha y hora, al que se ha añadido o sustraído un intervalo de tiempo especificado.
Parámetros
La función DateAdd tiene tres parámetros, ninguno de ellos opcional, que se muestran en la siguiente tabla:

Parametro:

Interval
Valor de enumeración DateInterval o expresión String que representa el intervalo de tiempo que se desea añadir
El apartado “La función DateAdd” de la documentación de Visual Studio .NET contiene información sobre posibles configuraciones del argumento Interval.

Number
Expresión en punto flotante que representa el número de intervalos que se desea agregar. Number puede ser positivo (para obtener valores de fechas u horas futuras) o negativo (para obtener valores de fechas u horas pasadas).

DateValue
Expresión que representa la fecha y la hora a la que debe agregarse el intervalo.

Ejemplo de utilización de la función DateAdd
El siguiente código utiliza la función DateAdd para calcular la fecha de vencimiento de una factura a partir de la fecha de facturación. En este escenario, la fecha de vencimiento de la factura es 20 días después de la fecha de factura. Por tanto, Interval es DateInterval.Day y Number es 20.

fechaFactura = #12/31/2000#
DateAdd(DateInterval.Day, 20, fechaFactura)

Utilización de la función DateDiff
Podemos utilizar la función DateDiff para determinar cuántos intervalos de tiempo especificados existen entre dos valores de fecha/hora. Por ejemplo, podría utilizarse DateDiff para calcular el número de días entre dos fechas o el número de semanas ente hoy y final del año.

Parámetros
La función DateDiff tiene cinco parámetros, dos de los cuales son opcionales. Estos parámetros se muestran en la tabla siguiente:

Interval
Valor de enumeración DateInterval o expresión String que representa el intervalo de tiempo que se desea utilizar como unidad de diferencia entre Date1 y Date2.
El apartado “Función DateDiff” en la documentación de Visual Studio .NET contiene información sobre posibles configuraciones del argumento Interval.

Date1, Date2
Los dos valores de fecha/hora que se desea utilizar en el cálculo. El valor de Date1 se sustrae del valor de Date2 para obtener la diferencia. Ninguno de los valores se cambia en el programa de llamada.

DayOfWeek (Opcional)
Valor escogido de la enumeración FirstDayOfWeek que especifica el primer día de la semana.
FirstDayOfWeek.Sunday es el valor predeterminado.

WeekOfYear (Opcional)
Valor escogido de la enumeración FirstWeekOfYear que especifica la primera semana del año.
FirstWeekOfYear.Jan1 es el valor predeterminado.

Ejemplo de utilización de la función DateDiff
Este ejemplo utiliza la función DateDiff para mostrar el número de días entre una fecha determinada y la fecha actual.
Dim firstDate, msg As String
Dim secondDate As Date
' Declare variables
firstDate = InputBox("Enter a date")
' Get a given date from the user
secondDate = CDate(firstDate)
msg = "Days from today: " & DateDiff(DateInterval.Day, Now, _
secondDate)
MessageBox.Show(msg)
' Create a message box which uses the DateDiff function and
' displays the number of days between a given date and the
' current date

Cómo utilizar las funciones String


Introducción
En muchos casos, las cadenas (strings) requieren algún tipo de manipulación, formateo o evaluación. Por ejemplo, el nombre de una persona puede escribirse con el apellido delante del nombre de pila, o un archivo puede contener campos separados por comas. Las funciones String de Visual Basic pueden analizar y manipular cadenas en las aplicaciones. Estas funciones se utilizan para devolver información sobre una cadena, extraer únicamente una parte de la cadena, o mostrar información en un determinado formato.
Uso de la función Trim
Podemos utilizar la función Trim para eliminar los espacios iniciales y finales de una cadena específica.
Ejemplo de utilización de Trim
El siguiente ejemplo muestra cómo utilizar la función Trim para devolver una cadena que contenga una copia de una cadena específica sin espacios iniciales ni finales:
Dim MyString, NewString As String
' Initialize string
MyString = " 1234 Street "
' NewString = "1234 Street"
NewString = Trim(MyString)
Uso de la función Len
La función Len puede utilizarse para encontrar el número de caracteres de una cadena o el número de bytes necesarios para almacenar una variable.
El siguiente código muestra la declaración para la función Len. El parámetro Expression de esta declaración es cualquier expresión de cadena o nombre de variable válidos.
Public Shared Function Len(ByVal Expression As datatype) As _
Integer

Ejemplo de utilización de Len
En el siguiente código, la función Len devuelve el número de caracteres de una cadena:
Dim customerName As string
Dim length As Integer
customerName = InputBox("What is your name?")
length = Len(customerName)
Uso de la función Left
Podemos utilizar la función Left para devolver un número especificado de caracteres desde el lado izquierdo de una cadena.
El siguiente código muestra la declaración de función para la función Left. El parámetro Str de esta declaración es la expresión de cadena de la que la función devolverá los caracteres más a la izquierda. El parámetro Length es un entero que indica cuántos caracteres devolver.
Public Shared Function Left(ByVal Str As String, _
ByVal Length As Integer) As String
Si el valor de Length es 0, se devuelve una cadena de longitud cero (" ").
Si el valor de Length es mayor o igual al número de caracteres de Str, se devuelve toda la cadena.
Si utilizamos esta función en un formulario Windows Form o en cualquier clase que tenga una propiedad Left, debemos invocar a la función utilizando su nombre completamente cualificado: Microsoft.VisualBasic.Left.
Ejemplo de utilización de Left
En el siguiente código, la función Left devuelve cinco caracteres del lado izquierdo de una cadena:
Microsoft.VisualBasic.Left(customerName, 5)
Ejemplo de utilización de Len y Left
En el siguiente código, las funciones Len y Left se utilizan juntos para eliminar la extensión del nombre del archivo (los cuatro últimos caracteres) de un nombre de archivo:
fileName = Left(fileName, Len(fileName) - 4)

Cómo utilizar funciones Format


Introducción
Existen varios formatos aceptados universalmente para números, fechas y horas. Visual Basic ofrece una gran flexibilidad en visualizar formatos de números además de formatos de fecha y hora. Un beneficio añadido es que los formatos regionales para números, fechas y horas se presentan fácilmente sin codificar nuevamente para cada nacionalidad o región.
En esta sección, estudiaremos cómo utilizar dos funciones predefinidas para formatear.
Uso de la función FormatCurrency
La función FormatCurrency puede utilizarse para devolver una expresión con formato de moneda que utiliza el símbolo de moneda definido en el panel de control del sistema. Por ejemplo, se puede utilizar FormatCurrency para formatear el importe debido en una factura.
Parámetros
La función FormatCurrency tiene cinco parámetros, cuatro de los cuales son opcionales. Cuando se omite uno o más argumentos opcionales, se utilizan valores que se ajustan a la configuración regional predeterminada del equipo. La siguiente tabla describe los parámetros de la función FormatCurrency:

Parametro:
Expression
Expresión que debe formatearse.
NumDigitsAfterDecimal
(Opcional)
Valor numérico que indica cuántos lugares se muestran a la derecha del decimal.
El valor predeterminado es –1, que indica que se utiliza la configuración regional del equipo.
IncludeLeadingDigit
(Opcional)
Indica si se muestra un cero al principio para valores fraccionados.
La configuración utiliza la enumeración Tristate para configurar el parámetro como true, false, o use default, por ejemplo, TriState.True, TriState.False o TriState.UseDefault.
UseParensForNegativeNumbers
(Opcional)
Indica si los valores negativos han de mostrarse entre paréntesis o no.
La configuración utiliza la enumeración Tristate para configurar el parámetro como true, false o use default, por ejemplo, TriState.True, TriState.False o TriState.UseDefault.
GroupDigits
(Opcional)
Indica si los números se agrupan utilizando el delimitador de grupos especificado en la configuración regional del equipo; por ejemplo, utilizar una coma cada tres dígitos a la izquierda de una coma decimal.
La configuración utiliza la enumeración Tristate para configurar el parámetro como true, false o use default, por ejemplo, TriState.True, TriState.False o TriState.UseDefault.
Ejemplo de utilización de la función FormatCurrency
El siguiente ejemplo utiliza la función FormatCurrency para formatear una cadena que representa importeDebido:
Dim importeDebido As Double = 4456.43
Dim myString As String
myString = FormatCurrency(importeDebido, , , TriState.True, _
TriState.True)
' Returns "$4,456.43" when regional settings are set to
' English (United States)
Uso de la función FormatDateTime
La función FormatDateTime puede utilizarse para formatear una expresión como fecha u hora. Por ejemplo, podemos utilizar FormatDateTime para cambiar la expresión 5/21/01 por la expresión Monday, May 21, 2001.
Parámetros
La función FormatDateTime tiene dos parámetros, como se muestra en la siguiente tabla:

Parámetro

Expression Expresión que debe formatearse.
NamedFormat Indica qué formato utilizar. Si se omite, se utilizará GeneralDate.
(Opcional)

La siguiente tabla muestra una posible configuración del parámetro NamedFormat:

Constante

DateFormat.GeneralDate
Muestra una fecha y/u hora. Si hay una fecha, la presenta como fecha corta. Si hay una hora, la presenta en formato largo. Si las dos partes están presentes, se muestran ambas.
DateFormat.LongDate
Muestra una fecha en el formato largo especificado en la configuración regional del equipo.
DateFormat.ShortDate
Muestra una fecha en el formato corto especificado en la configuración regional del equipo.
DateFormat.LongTime
Muestra una hora en el formato de hora especificado en la configuración regional del equipo.
DateFormat.ShortTime
Muestra una hora en el formato de 24 horas (hh:mm).
Ejemplo de utilización de la función FormatDateTime
El siguiente ejemplo utiliza la función FormatDateTime para formatear la expresión 5/21/01.
Dim myDate As DateTime = #5/21/01#
Dim myString As String
myString = FormatDateTime(myDate, DateFormat.LongDate)
' Returns "Monday, May 21, 2001" when regional settings are
' set to English (United States)

Cómo utilizar las funciones Financial


Introducción
Visual Basic ofrece varias funciones financieras que podemos utilizar en nuestras aplicaciones. En esta sección, estudiaremos cómo utilizar dos funciones predefinidas para realizar cálculos y operaciones que implican dinero.
Uso de la función Pmt
Podemos utilizar la función Pmt para calcular el pago de una anualidad basado en pagos fijos periódicos y un tipo de interés fijo. Una anualidad es una serie de pagos fijos que se realizan durante un periodo de tiempo, como una hipoteca sobre una casa o el pago de un crédito para la compra de un coche.
Parámetros
La función Pmt tiene cinco parámetros, dos de los cuales son opcionales. Para todos los argumentos, el efectivo abonado (como depósitos de ahorro) se representa con números negativos. El efectivo recibido (como cheques de dividendos) se representa con números positivos. La siguiente tabla describe los cinco parámetros de la función Pmt.

Parámetro

Rate
Tipo de interés por periodo, expresado como Double.
Por ejemplo, si obtiene un crédito para comprar un automóvil a una tasa porcentual anual (TAE) del 10 por ciento, y realiza pagos mensuales, el tipo por periodo será 0,1/12 ó 0,0083.
NPer
Número total de periodos de pago de la anualidad, expresado como Double.
Por ejemplo, si realiza pagos mensuales correspondientes a un crédito para adquirir un automóvil a dos años, el crédito tendrá un total de 2 * 12 (ó 24) periodos de pago.
NPer debe calcularse utilizando periodos de pago expresados en las mismas unidades que los periodos utilizados en Rate. Por ejemplo, si Rate es por mes, NPer debe ser por mes.
PV
Valor actual de una serie de pagos que se realizarán en el futuro, expresado como Double.
Por ejemplo, cuando compramos un coche, la cantidad del crédito es el valor actual de los pagos mensuales que realizaremos.
FV
(Opcional)
Valor futuro, o saldo, que se desea tener una vez realizado el pago final, expresado como Double.
El valor predeterminado, si no se expresa ningún otro, es 0.
Due
(Opcional)
Indica cuándo vencen los pagos. Puede ser al final del periodo (especificado comos DueDate.EndOfPeriod) o al principio del periodo (especificado como DueDate.BegOfPeriod).
El valor predeterminado, si no se expresa ningún otro, es DueDate.EndOfPeriod.
Ejemplo de utilización de la función Pmt
El siguiente código utiliza la función Pmt para calcular el pago mensual de un crédito de 24 meses de 5000 dólares al 10% TAE.
payment = Pmt(0.0083, 24, -5000, 0, DueDate.BegOfPeriod)
Uso de la función Rate
La función Rate puede utilizarse para calcular el tipo de interés por periodo de una anualidad.
Parámetros
La función Rate tiene los mismos parámetros que la función Pmt, con las siguientes excepciones:
􀂄 Toma un argumento Pmt en lugar de un argumento Rate. Pmt es un argumento obligatorio que representa el pago que debe realizarse cada periodo y se expresa como Double.
􀂄 Toma un argumento Guess opcional. Es el valor estimado que será devuelto por Rate, expresado como Double. El valor predeterminado, si no se expresa ningún otro, es 0.1 (10 por ciento).
Ejemplo de utilización de la función Rate
El siguiente código utiliza la función Rate para calcular el tipo de interés por periodo de un crédito de 24 meses de 5000 dólares con pagos mensuales de 228 dólares.
ratePerPeriod = Rate(24, 228, -5000, 0, DueDate.BegOfPeriod, _
0.8)*100