| Visual Basic
.NET Intermedio
visita nuestros manuales de VB.net de los
niveles : basico
- medio
- avanzado
Try ... Catch
Sin duda una de las grandes novedades
de Visual Basic .NET es la instrucción Try
- Catch.
El mecanismo Try - Catch
sirve para atrapar errores, tal como lo
hace On
Error Goto, Resume y Resume Next pero
estructural y conceptualmente diferente.
Con el mecanismo Try - Catch
es posible escribir manejadores de errores
estructurados ofreciendo una manera eficaz
de resolver los errores en tiempo de ejecución.
Los mecanismos previos a Try - Catch
continuan vigentes, incluso existe un nuevo
método llamado Err.GetException,
que obtiene la excepción que ocurrio al
momento de generarse el error.
¿Qué es un error en tiempo de ejecución?,
no es más que un error inesperado del cual
un programa en Visual Basic .NET no se puede
recuperar, por no poderse completar una
instrucción entonces Visual Basic .NET no
tiene instrucciones precisas que ejecutar
en estos casos cuando se genera el error.
Para lidiar con los errores en tiempo
de ejecución Visual Basic tiene este nuevo
mecanismo Try - Catch para
controlar los errores, ya que este mecanismo
atrapa el error definiendo las acciones
a seguir cuando se identifica el error.
Algo importante a anazalir y diseñar es
cuando y como integrar un mecanismo Try
- Catch. Así que debera emplearse
en aquellas situaciones suceptibles a error.
La manera en que debe utilizar este mecanismo
es la siguiente:
Try
sentencia(s) que pueden generar un error en tiempo de ejecución
Catch
(el error se genero)
sentencia(s) que definen las acciones a seguir ya que se genero el error
Finally
sentencia(s) que reestablecen las condiciones antes de generarse el error.
End Try
La palabra reservada Finally
es opcional.
El código contenido dentro de un bloque
Try recibe el nombre de código
protegido, porque evita la interrupción
del programa o aplicación y ejecuta las
instrucciones contenidas en Catch.
Para probar más de una condición de error
en tiempo de ejecución utilice la sentencia
Catch When:
Try
'Evaluar expresión
Catch When Err.Number = 13
'Ocurrio un error de tipo de datos, no coinciden los tipos
Catch When Err.Number = 6
'Ocurrio un error en el control del índice, desbordamiento
Catch
'Controlar el error
End Try
Por último, este mecanismo al igual que
las sentencias de control tiene una manera
de salir del bloque ya sea este Try
o Catch a través del empleo
de la instrucción Exit try,
pero si contiene una sentencia Finally
el código contenido en esta si se ejecuta,
únicamente aplica para Try
y Catch pues el objetivo de
Finally es precisamente el
ejecutar pase lo que pase su contenido.
Try
'sentencia(s) que pueden generar un error en tiempo de ejecución
'Bajo determinada condición Exit try
Catch
'(el error se genero)
'sentencia(s) que definen las acciones a seguir ya que se genero el error
'Bajo determinada condición Exit try
Finally
'sentencia(s) que reestablecen las condiciones antes de generarse el error.
End Try
Err
Recordemos que el objeto Err
tiene propiedades utiles como Number
para obtener el número de error que se produjo,
Description para obtener una
descripción del error ocurrido, todo ello
referente al último error ocurrido.
Módulo
La novedad en Visual Basic .NET en lo
referente a módulos es que ahora el módulo
tiene instrucciones de inicio y fin que
lo delimitan:
Otra novedad en Visual Basic .NET es que
los argumentos de los procedimientos se
pasan ByVal, es decir, no se
modifica el valor original de la variable
sino que se manda una copia del valor, por
lo que quizá sea necesario la mayor parte
de las veces indicar que se pasan ByRef.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer = 5
multiplica(i)
MsgBox(i)
End Sub
Module miModulo
Sub multiplica(ByVal j As Integer)
j *= j
End Sub
End Module
Salida: 5
Si cambia ByVal por ByRef
la Salida es 25.
Al invocar un procedimiento Visual Basic
.NET de manera automática encierra entre
paréntesis los argumentos.
Sin duda la mayor novedad para las funciones
es que ahora es posible utilizar la sintaxis
Return para regresar el resultado
y seguira vigente hacerlo como se hacia
en Visual Basic 6, que era utilizar el nombre
de la función y asignarle el resultado.
Cuando la función encuentre la palabra
reservada Return de manera
inmediata se detiene su ejecución y regresará
si se establecio en su caso un valor.
Las funciones que son declaradas en los
módulos estándar por defecto son públicas.
Recuerde que la diferencia entre una función
y un procedimiento es que la función regresa
valores y el procedimiento no.
Matrices/Arrays/Arreglos/Vectores
Optaremos por referirnos a esta estrutura
como Arreglo.
La novedad para los arreglos en Visual
Basic .NET es que el índice comienza en
0 y no podrá utilizarse
la opción Option Base para
redefinirlo, es decir, darle cualquier otro
valor.
Efectos de las arreglos basados en 0:
Dim aColores(2) As String
aColores(0) = "Rojo"
aColores(1) = "Verde"
aColores(2) = "Azul"
- No es posible declarar arreglos con
la palabra reservada
To
LBound regresará siempre
el valor 0 porque el límite
inferior de un arreglo es 0
UBound regresará como valor
el número de elementos menos 1
Dim aNumeros() As Integer = {10, 20, 30, 40, 50}
Dim i As Integer
txtOut.Text += "Left Bound : " & LBound(aNumeros) & vbNewLine
txtOut.Text += "Upper Bound : " & UBound(aNumeros) & vbNewLine
For i = 0 To UBound(aNumeros)
txtOut.Text += i & " : " & aNumeros(i) & vbNewLine
Next
- No es posible utilizar
Redim
en la declaración inicial
- No es posible utilizar
Redim
para cambiar la dimensión a un arreglo
existente
- Arreglos Estáticos, el número
de sus elementos siempre será el mismo.
- Arreglos Dinámicos, el número
de sus elementos puede cambiar durante
la ejecución del programa.
Para los arreglos dinámicos debe tenerse
en mente que al declarar el arreglo
su tamaño será definido como el número
de elementos menos 1.
Una vez declarado un arreglo no es
posible cambiar el número de dimensiones
utilizando Redim, es decir
si se declaro un arreglo unidimensional
con Redim no podrá redefinirlo
como bidimensional.
Redim Preserve, si modifica
la dimensión de una matriz que ya contenga
datos, estos se perderán, ya que al ejecutar
la instrucción Redim el contenido
del arreglo dinámico se definirá a su valor
predeterminado 0 o null,
muy bueno para eliminar el contenido de
un arreglo, pero muy malo si se desea mantener
los valores, por lo que la solución para
no eliminar los valores al redefinir un
arreglo es utilizar la instrucción Preserve.
La única regla es respetar el número de
dimensiones original.
Existe una limitación, ya que sólo es
posible cambiar el tamaño de la última dimensión,
si es que el arreglo tiene más de una dimensión.
En el caso de arreglos unidimensionales
podría parecer no tener restricción.
Dim aMultidimensional(,,,) As Integer
ReDim aMultidimensional(10, 20, 30, 40)
ReDim Preserve aMultidimensional(10, 20, 30, 80)
Clase
Array
La Clase Array provee métodos
para crear, manipular, buscar y ordenar
arreglos, por lo que sirven como la clase
base para todos los arreglos en el runtime
del lenguaje común. Forma parte la biblioteca
.NET.
La Clase Array contiene el
método Sort el cual recibe
como argumento un arreglo y su objetivo
es ordenar el contenido del arreglo:
Dim i As Integer
Dim aNumeros(9) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
For i = 0 To 9
Randomize()
aNumeros(i) = Rnd() * 9
Next
ShowElements(aNumeros, ListBox1)
End Sub
Private Sub ShowElements(ByRef a As Array, ByVal list As ListBox)
For i = 0 To 9
list.Items.Add(a(i))
Next
End Sub
Private Sub BtnOrder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles BtnOrder.Click
Array.Sort(aNumeros)
ShowElements(aNumeros, ListBox2)
End Sub
Colecciones
Las colecciones se utilizan o sirven para
contener objetos, por ejemplo:
'Declarar una variable del tipo Control para representar controles de formulario
Dim ctrl As Control
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer = 1
For Each Me.ctrl In Controls
If ctrl.Name <> "x" Then
ctrl.Text = "boton " & i
i += 1
End If
Next
End Sub
Más
sobre colecciones
Manipulación
de Archivos de Texto
En Visual Basic .NET existen nuevas funciones
para el manejo de archivos de texto proporcionandas
por el objeto Filesystem:
FileOpen(numeroArchivo,directorioNombreArchivo,modoApertura),
abre un archivo de texto para entrada
y salida.
Donde el primer argumento es un número
entre 1 y 255 cuya función es controlar
los archivos abiertos que tiene un programa,
en el segundo argumento se especifica
la ruta y nombre del archivo que deseamos
abrir y por último es necesario especificar
en que modo se abrira el archivo, es
decir, si deseamos agregar datos nuevos
utilizamos el método Append,
si deseamos leer su contenido utilizamos
output, si deseamos escribir
input o también es posible
abrirlo en modo binario binary
o en modo aleatorio random.
ofd.Filter = "txt|*.txt|ini|*.ini|log|*.log|inf|*.inf"
ofd.ShowDialog()
FileOpen(1, ofd.FileName, OpenMode.Input)
Precaución, tenga cuidado con
el modo de apertura de archivos ya que
si abre un archivo con Output
se elimina el contenido del archivo
dejandolo vacio y en espera de nuevos
datos. Cuando requiera leer su contenido
utilice Input.
LineInput, lee una
línea de entrada desde el archivo de texto.
Dim sOutAux As String
If Not EOF(1) Then
sOutAux = txtOut.Text
txtOut.Text = vbNullString
txtOut.Text += sOutAux & nLine & " : " & LineInput(1) & vbNewLine
nLine += 1
Else
MsgBox("Fin de archivo, no hay más líneas que leer")
End If
EOF, comprueba el final
del archivo de texto.
If EOF(1) Then MsgBox("Fin de archivo")
FileClose, cierra
el archivo de texto.
FileClose(1)
Utilice TextBox.Select(1,0)
para eliminar la selección de texto.
Como nota aclaratoria los archivos de
texto son diferentes a los archivos de documentos,
los cuales tienen códigos de formato, cuando
nos referimos a archivos de texto entiendase
un archivo que contiene únicamente caracteres
reconocibles y quizá su formato sea txt,
ini, log o inf.
PrintLine(numeroArchivo, objeto),
esta función escribe datos con formato
a un archivo secuencial
El siguiente ejemplo ilustra el ejemplo
algunas de las funciones de manipulación
de archivos de texto:
Dim nLine As Integer = 1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
btnLine.Enabled = False
btnClose.Enabled = False
btnSave.Enabled = False
End Sub
Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnOpen.Click
ofd.Filter = "txt|*.txt|ini|*.ini|log|*.log|inf|*.inf"
ofd.ShowDialog()
FileOpen(1, ofd.FileName, OpenMode.Input)
btnOpen.Enabled = False
btnLine.Enabled = True
btnSave.Enabled = True
End Sub
Private Sub btnLine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnLine.Click
If Not EOF(1) Then
txtOut.Text += nLine & " : " & LineInput(1) & vbNewLine
nLine += 1
Else
MsgBox("Fin de archivo, no hay más líneas que leer")
btnLine.Enabled = False
btnClose.Enabled = True
txtOut.Select(1, 0)
End If
End Sub
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnClose.Click
FileClose(1)
btnSave.Enabled = False
btnClose.Enabled = False
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnSave.Click
sfd.Filter = "Archivos de texto txt|*.txt"
sfd.ShowDialog()
If sfd.FileName <> vbNullString Then
FileOpen(2, sfd.FileName, OpenMode.Output)
PrintLine(2, txtOut.Text)
FileClose(2)
MsgBox("Archivo almacenado")
End If
End Sub
Manipulación
de Cadenas
- El método
Concat hace
posible concatenar cadenas de texto.
- Utilice la función
UCase
o método ToUpper, para convertir
una cadena a mayúsculas.
- Utilice la función
LCase
o método ToLower, para convertir
una cadena a minúsculas.
- Utilice la función
Len
o método Length, para determinar
el número de caracteres que tiene una
cadena.
- Utilice la función
Mid
o método Substring, obtiene
un número fijo de caracteres a partir
de una posición dada de una cadena. (El
primer elemento de una cadena tiene el
índice 0).
- Utilice la función
InStr
o método IndexOf, si una
cadena se encuentra contenida en otra
regresa la posición a partir de la cual
encontro la cadena.
- Utilice la función
Trim
o método Trim, elimina los
caracteres en blanco iniciales y finales
de una cadena.
- Utilice el método
Remove,
para eliminar caracteres de la parte central
de una cadena.
- Utilice el método
Insert,
para agregar caracteres a la parte central
de una cadena.
- Utilice la función
StrCmp,
compara cadenas y detecta diferencias
en el uso de mayúsculas y minúsculas,
regresa los siguientes valores:
-1, sorts ahead
0, las cadenas son
iguales
1, sorts after
Ejemplo:
Dim s As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
lblTitulo.Text = s.Concat(" ", "www", ".", "informatique", ".", "com", ".", _
"mx", " ", "Tutoriales de Programación ")
End Sub
Private Sub btnLower_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnLower.Click
txtOut.Text = lblTitulo.Text.ToLower
End Sub
Private Sub btnUpper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnUpper.Click
txtOut.Text = lblTitulo.Text.ToUpper
End Sub
Private Sub btnLen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnLen.Click
txtOut.Text = lblTitulo.Text.Length
End Sub
Private Sub btnSubStr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnSubStr.Click
txtOut.Text = lblTitulo.Text.Substring(14)
End Sub
Private Sub btnIndexOf_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnIndexOf.Click
txtOut.Text = lblTitulo.Text.IndexOf("informatique")
End Sub
Private Sub btnTrim_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnTrim.Click
txtOut.Text = lblTitulo.Text.Trim
End Sub
Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnRemove.Click
txtOut.Text = lblTitulo.Text.Remove(lblTitulo.Text.IndexOf("informatique"), 12)
End Sub
Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnInsert.Click
txtOut.Text = lblTitulo.Text.Insert(0, "http://")
End Sub
Private Sub btnStrComp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnStrComp0.Click
txtOut.Text = StrComp(lblTitulo.Text, lblTitulo.Text, CompareMethod.Binary) & _
" is equal."
End Sub
Private Sub btnStrComp_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) -
Handles btnStrComp1.Click
txtOut.Text = StrComp(lblTitulo.Text, UCase(lblTitulo.Text), CompareMethod.Binary) & _
" sorts after."
End Sub
Private Sub btnStrCompL1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnStrCompL1.Click
txtOut.Text = StrComp(lblTitulo.Text, "abc" & lblTitulo.Text & "abc", CompareMethod.Binary) & _
" sorts ahead."
End Sub
Funciones
Chr Asc
Chr, regresa el caracter
asociado con el código ASCII especificado.
Asc, regresa un valor entero
el cual representa el código ASCII del
caracter correspondiente.
A través de estas funciones es posible
determinar el código ASCII de una letra
o su propio código ASCII, es decir, por
ejemplo si deseamos obtener el código ASCII
de la letra 'a' entonces empleados la función
Asc, si conocemos el código
ASCII y deseamos saber el caracter asociado
a este entonces empleamos la función Chr
Visual Basic .NET cuando hace una comparación
entre cadenas se basa en el código ASCII
de cada uno de los caracteres que compone
la cadena por lo que una comparación entre
las cadenas "A" = "a" da como
resultado False, pues en realidad
estaria comparando 65 y 97.
Dim bResultado As Boolean = ("A" = "a")
MsgBox(bResultado & " : (" & Asc("A") & " = " & Asc("a") & ")")
Automatización
La automatización (automation)
es una tecnología basada en el estándar
de interoperabilidad denominado Modelo de
Objetos Componentes (COM).
El objetivo de automatización es utilizar
las funciones de una aplicación en otra
aplicación.
Las aplicaciones basadas en Windows que
exponen sus objetos se denominan aplicaciones
objeto o servidoras y los
programas que utilizan estos objetos se
denominan aplicaciones controladoras
o clientes.
Por ejemplo si desea utilizar Excel desde
Visual Basic .NET :
- Agregue una referencia excel (Project/Add
Reference/Microsoft Excel versión Object
Library)
- Declare una variable de tipo objeto
Excel
Dim xlsApp As Excel.Application
xlsApp = CType(CreateObject("Excel.Application"), Excel.Application)
Nota: si no agrega la referencia
entonces no tendrá disponibles las referencias
del objeto Excel. En Visual Basic 6
era posible emplear la técnica enlace
en tiempo de ejecución en la cual se
declaraba una variable de tipo objeto
y en tiempo de ejecución se asignaba
un tipo de aplicación específico, esta
técnica ya no se recomienda.
Lo recomendable es emplear la técnica
de enlace en tiempo de compilación donde
se asigna en tiempo de diseño un tipo
a las variables que almacenan los objetos
Automatización, para ser enlazados a
los datos durante la compilación.
A través de la función CType
es el mecanismo que durante la compilación
devuelve el tipo de aplicación específica
a la variable de aplicación.
Ejemplo:
Dim xlsApp As Excel.Application
Dim xlsBook As Excel.Workbook
Dim xlsSheet As Excel.Worksheet
Dim sFile As String
xlsApp = CType(CreateObject("Excel.Application"), Excel.Application)
xlsBook = CType(xlsApp.Workbooks.Add, Excel.Workbook)
xlsSheet = CType(xlsBook.Worksheets(1), Excel.Worksheet)
xlsSheet.Cells(1, 1) = "www"
xlsSheet.Cells(1, 2) = "informatique"
xlsSheet.Cells(1, 3) = "com"
xlsSheet.Cells(1, 4) = "mx"
xlsSheet.Range("B1").Font.Bold = True
xlsSheet.Application.Visible = False
sFile = "c:\prueba" & Now.Day & Now.Month & Now.Year & Now.Hour & Now.Minute & Now.Second & ".xls"
xlsSheet.SaveAs(sFile)
xlsSheet = Nothing
xlsBook.Close()
xlsBook = Nothing
xlsApp.Quit()
xlsApp = Nothing
MsgBox("Se ha creado el archivo : " & sFile)
Al crear este tipo de aplicaciones deberá
tener un buen dominio de su funcionamiento,
ya que puede observar a través del administrador
de programas que al iniciar la aplicación
se crea un objeto excel.exe,
al emplear Excel.Application
desde Visual Basic .NET se crea otro objeto
EXCEL.EXE y solo se cierran
estos objetos hasta que se cierre la aplicación,
por lo que será necesario una buena administración
de las aplicaciones a fin de no dejarlas
abiertas o que originen conflictos con otras
aplicaciones que el usuario abra o cierre.
Componente
Process
Es posible utilizar el método Process.Start
para iniciar cualquier aplicación que se
encuentre registrada en el Sistema. Si la
extensión del archivo a ejecutar es reconocida
por el Sistema no será necesario especificar
su ubicación.
Por ejemplo para iniciar la calculadora
de Windows:
System.Diagnostics.Process.Start("calc.exe")
Una vez que inica una aplicación Visual
Basic .NET no puede detenerla. La solución
es utilizar una de las nuevas funciones
de Visual Studio referentes al control de
procesos en Windows.
De clic a la sección Components
agregue el componente Process,
de clic a su propiedad StartInfo
y asigne el valor calc.exe a su propiedad
FileName, es posible pasar
argumentos al abrir la aplicación para ello
asigne los valores correspondientes a las
propiedad Arguments.
De esta manera para abrir una aplicación
utilice el método Start() y
para cerrarla el método CloseMainWindow().
También es posible cerrar aplicaciones utilizando
el método Kill, pero tenga
cuidado ya que esta técnica no le permitira
almacenar los cambios realizados en su trabajo..
Será posible incluir clases como Threading
y Diagnostics para manipular
vía código, no serán necesarios si únicamente
emplea Start y CloseMainWindow
Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnCalc.Click
System.Diagnostics.Process.Start("calc.exe")
End Sub
Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnOpen.Click
Proc.Start()
End Sub
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnClose.Click
Proc.CloseMainWindow()
End Sub
Instalación
Distribuida
La distribución de aplicaciones en Visual
Studio .NET se hacen agregando un proyecto
de instalación distribuida a la solución
que se desea distribuir. Será necesario
configurar el proyecto de instalación distribuida
para el tipo de instalación que desee ejecutar.
Una aplicación se ensambla en cuatro elementos:
- Código de Lenguaje Intermedio de
Microsoft (MSIL), que es el código
del programa compilado en un lenguaje
comprensible por el runtime del lenguaje
común.
- Metadatos, información sobre
los tipos, métodos y demás elementos definidos
en el código.
- Manifiesto, información sobre
nombre, versión, lista de los archivos
contenidos en el ensamblado, información
de seguridad, información sobre el ensamblado.
- Archivos y recursos de soporte.
| MiAplicacion.exe |
| |
Metadatos
- Tipos definidos, métodos,
etc.
- Tipos a los que se hace
referencia, métodos, etc.
|
Manifiesto
- Nombre y versión
- Lista de archivos
- Ensamblados a los
que se hace referencia
- Recursos y tipos exportados
- Información de seguridad
|
|
|
Cuando la aplicación queda ensamblada,
el sistema operativo no tendrá que registrar
formalmente las aplicaciones para poder
ejecutarlas ya que estas son comprensibles
y autodescriptibles para el sistema.
Es posible instalar una aplicación Visual
Studio .NET copiando unicamente el ensamblado
generado en un equipo que tenga instalado
.NET Framework.
Para crear un proyecto de instalación
distribuida solo es necesario ejecutar el
asistente para proyectos de instalación.
Este proyecto puede ser personalizado unicamente
definiendo sus propiedades.
Para crear un programa de instalación
completo, los archivos de instalación distribuida
deberán incluir el .NET Framework redistribuible.
Pasos para la creación de un proyecto de
instalación distribuida:
- Abrir la aplicación
- File/New/Project
- Project Types/Setup and deployment Projects
(según la versión que tenga instalada,
es posible que existan 4 plantillas)
- Clic en plantilla setup project
- Escribir nombre y seleccionar ubicación
- Seleccionar Add to solution
- Clic en el botón [OK]
- (Se agrego un proyecto de instalación
con el nombre que le asigno)
- Seleccione el proyecto de instalación
- Project/Add/Project Output
- (Aparece un cuadro de dialogo, para
configurar su proyecto)
- Clic en el botón [OK]
- Seleccione el proyecto de instalación
- Project/Add/File
- Seleccionar archivos adicionales que
se deseen incluir en su proyecto de instalación
distribuida.
- La selección de archivos se ve reflejada
en el explorador de soluciones
- El proyecto queda en espera de una próxima
generación de solución y creará el programa
de instalación dentro de la ubicación
especificada.
- Se almacena un archivo
.msi
(windows installer) que podrá utilizar
para instalar su aplicación.
- Buil/Configuration Manager (configure
su proyecto para las plataformas a aplicar,
depende la instalación que tenga)
- En configuración seleccione release
- Seleccione el proyecto de instalación
- Abra la ventana de propiedades y defina
los valores para cada una de ellas, por
ejemplo Autor
- Seleccione el proyecto de instalación,
clic con el botón derecho, seleccione
propiedades
- La acción anterior abre una ventana
de Property pages
- Seleccione las opciones de su preferencia,
para definir la conficuración del proyecto
- Build/Build Solution, esto compilara
la solución, incluyendo la versión final
y del proyecto de instalación distribuida
- Busque en el directorio Release
el archivo
.exe y pruebelo
(aqui también se encuentra el archivo
.msi).
Plantillas:
- Cab, crea uno o más archivos
contenedores, recomendable para descargas
parciales remotas.
- Módulo, propósito general
- Instalación, utiliza Windows
Installer
- Instalación Web, utiliza Windows
Installer y un servidor web para realizar
instalaciones desde Internet.
Formularios
Un formulario en Visual Basic .NET hereda
sus propiedades de la Clase System.Windows.Forms.Form.
Para abrir un formulario especifico en
Visual Basic .NET digamos que más que novedad
es algo un poco más tedioso, pues antes
de poder abrir el formulario es necesario
crear una variable del tipo del formulario
que deseamos abrir y despues utilizar el
método Show (que abre el formulario
en modo no-modal) de esta variable objeto.
Dim frm2 As New Form2
frm2.Show()
La forma en que Visual Basic 6 abre formularios
recibe el nombre de generación implícita
de instancias, pero Visual Basic .NET exige
que se declare específicamente una variable
de tipo formulario antes de utilizarlo.
Ahora en Visual Basic .NET para abrir
un formulario de manera Modal es
necesario especificarlo a través del método
ShowDialog,
Dim frm2 As New Form2
frm2.ShowDialog()
Para definir las coordenadas a partir
de las cuales se desea ubicar el formulario
en la pantalla en Visual Basic .NET existe
una propiedad llamada DesktopBounds,
la cual únicamente puede ser leida o definida
en tiempo de ejecución y recibe como argumentos
las dimensiones de un rectángulo en pares
(esquina superior izquierda y esquina inferior
derecha). Estas coordenadas se expresan
en píxeles y toman como referencia la parte
superior izquierda de la pantalla.
Dim oRect As New Rectangle(0, 0, 300, 300)
frm2.DesktopBounds = oRect
Otra forma de establecer la posición de
un formulario durante el tiempo de diseño,
pero con menos opciones es la propiedad
StartPosition, cuyo valor de
argumento define la posición que tendrá
el formulario.
frm2.StartPosition = FormStartPosition.CenterScreen
Es posible manipular el estado minimizado,
maximizado y restaurado de las ventanas
a través de las propiedades correspondientes:
WindowState = FormWindowState.Minimized
WindowState = FormWindowState.Maximized
WindowState = FormWindowState.Normal
También es posible establecer el tamaño
máximo o mánimo de las ventanas:
Dim nMax As New Size(200, 200)
MaximumSize = nMax
WindowState = FormWindowState.Maximized
StreamReader
La Clase StreamReader es
una opción más del .NET Framework para la
manipulación de archivos de texto. Esta
clase entre otros contiene un método ReadToEnd
cuya objetivo es leer un archivo desde la
posición actual hasta el final.
Para hacer uso de la esta clase es necesario
incluir la biblioteca de Clase System.IO
al principio del código del formulario.
Imports System.IO
Public Class Form1
.
.
.
Dim sr As StreamReader
sr = New StreamReader("c:\Test.txt")
txtOut.Text = sr.ReadToEnd
sr.Close()
La Clase StreamReader está
diseñada para la entrada de caracteres,
el archivo a ser leido puede ser abierto
utilizando la función File.OpenText(path),
donde path especifica la ubicación del archivo,
así como el archivo de entrada.
Una vez que el reader (lector)
tiene asignado un archivo abierto una serie
de métodos stream reader (flujo de
lectura) pueden ser invocados para leer
la información del archivo:
Stream = Flujo
Buffer = espacio de memoria diseñada
para el almacenamiento temporal de datos
| Método |
Descripción |
Close |
Cierra el StreamReader y libera
cualquier recurso del sistema asociado
al reader |
Peek |
Regresa el próximo caracter disponible
pero no lo consume. |
Read |
Lee el próximo caracter o próximo
conjunto de caracteres de la entrada
stream |
ReadBlock |
Lee una cantidad máxima de caracteres
del stream actual y escribe los
datos al buffer |
ReadLine |
Lee una línea de caracteres del stream
actual y regresa los datos como string |
ReadToEnd |
Lee un stream desde la posición
actual hasta el final del stream |
StreamWriter
La Clase StreamWriter está diseñada
para la salida de caracteres, el archivo
de escritura puede ser asignado utilizando
la función File.CreateText(path),
donde path especifica la ubicación del archivo,
así como el archivo de salida:
- Si el archivo especificado no existe
- Si el archivo existe su contenido es
sobreescrito
Una vez que el writer tiene asignado
un archivo abierto, una serie de métodos
writer pueden ser invocados para
escribir información al archivo:
Stream = Flujo
Buffer = espacio de memoria diseñada
para el almacenamiento temporal de datos
| Método |
Descripción |
Close |
Cierra el actual StreamWriter
y el stream subyacente |
Flush |
Limpia el buffer para el actual
writer y provoca que cualquier
dato contenido en el buffer sea
escrito al stream subyacente |
Write |
Escribe al stream |
WriteLine/td>
| Escribe datos tal y como son especificados
por los parámetros sobrecargados, seguidos
de una línea de terminación. |
Creación
de controles en tiempo de ejecución
En Visual Basic .NET, es posible agregar
controles en tiempo de ejecución, siguiendo
una sintaxis similar a esta:
Dim btnOK As New Button
btnOK.Text = "OK"
btnOK.Location = New Point(312, 150)
Me.Controls.Add(btnOK)
Tenga cuidado de que sus controles al
momento de agregarlos no queden debajo de
otros controles ocultandolos ante la mirada
del usuario.
Existen nuevas propiedades para los controles
que hacen posible manejar automáticamente
su posición Dock y Anchor,
por ejemplo el valor de la propiedad Dock
puede ser Bottom con lo cual
el control se ajusta al tamaño del formulario
y queda posicionado en la parte inferior
de la pantalla:
btnDock.Dock = DockStyle.Bottom
Otros posibles valores son:
DockStyle.Top
DockStyle.Fill
DockStyle.Left
DockStyle.Right
DockStyle.None, para anular
el funcionamiento de los valores anteriores
Establecer
el objeto de inicio
También en Visual Basic .NET es posible
establecer el punto de inicio de la aplicación,
ya que puede contener múltiples formularios
es necesario especificar con cual iniciara
la aplicación o también puede contar con
múltiples procedimientos por lo que también
podrá definir uno de ellos como punto de
partida.
Para configurar el punto de inicio seleccione
Project/Properties y especique el objeto
de inicio (Startup object) que puede ser
un formulario o procedimiento.
Si requiere de una aplicación Visual Basic
.NET sin interfaz gráfica, es posible crear
una aplicación consola la cual procesa
datos de entrada y genera salidas mediante
una consola de línea de comandos.
Gráficos
En Visual Basic .NET no existen los controles
de dibujo pues la novedad será emplear los
servicios de gráficos GDI+ a través
del espacio de nombres System.Drawing
Instrucciones como Circle, Line y PSet,
son sustituidas por los métodos DrawEllipse,
DrawLine y la estructura Point
de la clase System.Drwaing.Graphics.
El sistemas de coordenas predeterminado
de Visual Basic .NET utiliza píxeles en
lugar de Twips
En Visual Basic .NET los controles no
tienen un método Move, pero es posible
desplazarlos rápidamente al actualizar las
propiedades Left, Top
o Location de los controles
o también utilizando el método SetBounds.
Las propiedades DragIcon y DragMode
ya no están disponibles en Visual Basic
.NET aunque el evento DragDrop
continua.
Visual Basic .NET soporta más tipos de
formato para imagenes, el espacio de nombres
System.Drawing.Imaging incluye
funciones que trabajan con los formatos
siguientes:
- BMP
- EMF
- EXIF
- GIF
- Icon
- JPEG
- MemoryBMP
- PNG
- TIFF
- WMF
A través de la utilización de funciones
GDI+ del espacio de nombres System.Drawing
que es una nueva API (Interfaz
de Programación de Aplicaiones) será posible
crear gráficos.
Sistema
de Coordenadas
El punto de origen del sistema de coordenas
es la esquina superior izquierda del formulario.
El sistema de coordenadas predeterminado
se conforma de renglones (Eje Horizontal
X) y columnas (Eje Vertical Y),
de elementos de imagen independientes del
dispositivo (píxeles) los cuales representan
los puntos más pequeños que un formulario
puede ubicar.
Las coordenas (x,y) de la esquina
superior izquierda de un formulario son
siempre (0,0).
Visual Basic .NET trabaja en conjunto
con el controlador de vídeo de la máquina
para calcular como se deben presentar los
píxeles del formulario y como deben aparecer
en la pantalla figuras como líneas, rectangulos,
curvas y círculos.
Clase
System.Drawing.Graphics
El espacio de nombres System.Drawing
contiene diversas clases con las que es
posible crear dibujos en un programa. Esta
clase dispone de métodos y propiedades para
dibujar figuras en un formulario.
A continuación se presenta una lista de
figuras geométricas básicas y el método
que emplea la clase System.Drawing.Graphics
para crearlas:
| Figura |
Método |
Descripción |
| Línea |
DrawLine |
Línea sencilla entre dos puntos |
| Rectángulo |
DrawRectangle |
Cuadrado o Rectángulo dado por cuatro
puntos |
| Arco |
DrawArc |
Línea curva entre dos puntos |
| Círculo/Elipse |
DrawEllipse |
Figura elíptica contenida en un ractángulo |
| Polígono |
DrawPolygon |
Figura compleja con un número de puntos
y lados variable |
| Curva |
Drawcurve |
Línea curva que pasa por un número
variable de puntos |
| Bézier splines |
DrawBezier |
Curva dibujada utilizando cuatro puntos
(puntos 2 y 3 son puntos de control) |
Los métodos mencionados en la tabla crean
figuras vacías, pero existen métodos con
el prefijo Fill que dibujan figuras
que rellenan automáticamente con un color.
Para hacer uso de la clase System.Drawing.Graphics
es necesario crear un objeto de tipo Graphics,
un objeto Pen o Brush
para indicar los atributos de la figura,
el objeto Pen se utiliza como
argumento de los métodos cuando no se rellena
con color. El objeto Brush
se utiliza como argumento cuando se requiere
un color de relleno.
También será necesario generar una instancia
de la variable Graphics mediante
el método CreateGraphics para
Windows Form.
El espacio de nombres System.Drawing.Graphics
se incluye en el proyecto de manera automática
por lo que no es necesario importarla.
Dim Grafico As System.Drawing.Graphics
Dim Lapiz As New System.Drawing.Pen(System.Drawing.Color.Blue)
Grafico = Me.CreateGraphics
Grafico.DrawLine(Lapiz, 20, 30, 100, 80)
Este código si lo incluye en el evento
Load del formulario dara la
sensación de no hacer nada, esto es por
un efecto que se produce con los gráficos,
la solución es agregar el código en el método
Paint del formulario.
Evento
Paint
Al dibujar una figura, esta será visible
mientras:
- Otro control o figura no se sobreponga
- Si se minimiza y maximiza la ventana
del formulario
Para evitar que la figura desaparezca
es necesario utilizar el evento Paint
del formulario, para que cada vez que se
refresque el formulario el gráfico también
se dibujo de nuevo.
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles MyBase.Paint
Dim Grafico As System.Drawing.Graphics
Dim Lapiz As New System.Drawing.Pen(System.Drawing.Color.Blue)
Grafico = Me.CreateGraphics
Grafico.DrawLine(Lapiz, 20, 30, 100, 80)
End Sub
Animación
: Top - Left - Location - SetBounds
La animación es la simulación de
movimiento generado por la visualización
rápida de series de imágenes correlativas
en la pantalla.
Visual Basic .NET no incluye el método
Move (el cual permitia mover objetos
en el sistema de coordenadas) pero es posible
utilizar:
Left, propiedad que mueve
un objeto horizontalmente
Top, propiedad que mueve
un objeto verticalmente
Location, propiedad que
mueve un objeto a una posición especifico
SetBounds, método que define
los límites de un objeto a una posición
y tamaño especificos
Private Sub btnIzq_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnIzq.Click
btn.Left -= 10
End Sub
Private Sub btnDer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnDer.Click
btn.Left += 10
End Sub
Private Sub btnUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnUp.Click
btn.Top -= 10
End Sub
Private Sub btnDw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnDw.Click
btn.Top += 10
End Sub
Private Sub btnMove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnMove.Click
Dim newPos As New Point(100, 100)
If btn.Top = 32 And btn.Left = 104 Then
btn.Location = newPos
Else
btn.Top = 32
btn.Left = 104
End If
End Sub
Private Sub btnSize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnSize.Click
If btn.Width = 75 And btn.Height = 23 Then
btn.SetBounds(btn.Left, btn.Top, btn.Width + 10, btn.Height + 10)
Else
btn.SetBounds(btn.Left, btn.Top, 75, 23)
End If
End Sub
Opacidad
en Formularios
La novedad gráfica en los formularios
para Visual Basic .NET es la propiedad Opacity
a través de la cual puede hacer un efecto
de transparencia en sus formularios.
Tenga en cuenta que el valor de la opacidad
está en el rango del 0 al 1.
Me.Opacity -= 0.1
Programación
Orientada a Objetos
Se considerada un lenguaje orientado
a objetos si soporta las siguientes
tres características Encapsulación,
Herencia y Polimorfismo.
La programación orientada a objetos es
un excelente ejemplo de un mejoramiento
creciente. Los objetos son piezas modulares
con interfaces bien definidas que explican
el uso apropiado de los objetos. Los objetos
emplean encapsulación para prevenir accesos
impropios a la estructura interna de un
objeto. Los objetos soportan herencia para
perfeccionar el código reutilizado y diseño
lógico.
Clases
y Objetos
Un Objeto es una combinación de
datos y acciones que pueden ser tratados
como unidad.
Una Clase es una estructura de
un objeto, un diseño que describe las propiedades
(datos) y métodos (acciones) de un objeto.
Encapsulación
Encapsulación, referente a un grupo
de propiedades y métodos que pueden ser
tratados como una unidad u objeto, además
de proteger el contenido interno de un objeto
a través de una averia o referencia incorrecta
por código externo. Con la apropiada encapsulación
un objeto es solamente referenciado a través
de una interfaz formal evitando efectos
laterales, es decir, referencias
inesperadas y cambios indeseables que ocurran
en adición a el comportamiento intencionado.
Una de las reglas básicas de la encapsulación
es que los datos de las clases deberían
ser modificados o recuperados sólo a través
de procedimientos apropiados, limitando
interactuar al objeto con código externo
y manteniendo las operaciones internas del
objeto invisibles hacia el mundo exterior,
de esta manera el contenido interno del
objeto es protegido de daños accidentales
o intencionados por código externo.
La encapsulación también permite controlar
como los datos y procedimientos son utilizados,
para ello se pueden utilizar los modificadores
Private o Protected
para evitar que un procedimiento externo
ejecute un método de clase o evitar la lectura
y modificación de datos en las propiedades
y campos.
Data hiding
es una técnica en la cual se declaran detalles
internos de una clase como Private
para prevenirlos de ser utilizados fuera
de la clase.
Herencia
La Herencia describe la habilidad
para crear una nueva clase basada en la
existencia de una clase existente, donde
esta clase existente recibe el nombre de
Clase Base y la nueva clase derivada
de la clase base es llamada Clase Derivada.
La clase derivada hereda las propiedades,
métodos y eventos de la clase base y puede
ser personalizada agregando nuevas propiedades
y métodos.
Visual Basic .NET agrega el mecanismo
de Herencia, que en versiones anteriores
del Lenguaje no la incluia, solo incorporaba
ciertas características de la programación
orientada a objetos.
La Herencia es un mecanismo por medio
del cual una Clase puede adquirir las características
de comportamiento e interfaz de otra Clase.
En Visual Basic .NET las clases se definen
utilizando la siguiente sintaxis:
Public Class
.
.
.
End Class
Las propiedades de las clases cambian
de sintaxis y ya no se utiliza Property
Get, Let y Set.
Para que una Clase herede la interfaz
y comportamiento de otra Clase existente
se utiliza la palabra clave reservada Inherits.
Polimorfismo
El Polimorfismo es la habilidad
de los objetos de diferentes clases para
responder apropiadamente a nombres u operadores
de métodos identicos, el polimorfismo permite
utilizar nombres compartidos y el sistema
podría aplicar el código apropiado para
un objeto particular.
Agregar
una Clase
La definición de una clase consiste de
campos, propiedades y métodos, un campo
es una variable en la clase y usualmente
es privada, una propiedad es una programación
constructora que tipicamente provee la interfaz
para un campo en una clase, una propiedad
contiene procedimientos especiales Get
y Set que permiten al código
externo hacer referencia al campo en un
sentido que mantiene la encapsulación de
datos, un método es una función o procedimiento
dentro de una clase. La definición de la
clase puede también contener métodos constructores
que son invocados cuando un nuevo objeto
es instanciado desde una clase. Es conveniente
listar primero los campos, después las propiedades
y los métodos constructores y por último
cualquier otro método adicional.
La definición de una clase consiste de
campos, propiedades y métodos, un campo
es una variable en la clase y usualmente
es privada, una propiedad es una programación
constructora que tipicamente provee la interfaz
para un campo en una clase, una propiedad
contiene procedimientos especiales Get
y Set que permiten al código
externo hacer referencia al campo en un
sentido que mantiene la encapsulación de
datos, un método es una función o procedimiento
dentro de una clase. La definición de la
clase puede también contener métodos constructores
que son invocados cuando |