Professional Documents
Culture Documents
INDICE
Introduccion
Microsoft .Net
Consideraciones
Componentes
Características
La Biblioteca de Clases Base (BCL por sus siglas en inglés) maneja la mayoría
de las operaciones básicas que se encuentran involucradas en el desarrollo de
aplicaciones, incluyendo entre otras:
Ensamblados
Diagrama interno de un
Ensamble .NET.
Un ensamblado es un compilado
EXE o DLL que contiene código
CIL que se genera desde los
diferentes lenguajes .NET, y que
es ejecutado por el CLR. Puede
contener una o varias clases al
igual que uno o varios namespaces.
Semana 1 : Introducción a
programación con ventanas.
Interfaces de ventana. Formularios y controles
Es un hecho palpable el que la programación para Internet, ha ganado en los
últimos tiempos una importante cuota de desarrollo, en detrimento de las
aplicaciones basadas en Windows. Sin embargo, todavía existe un importante
conjunto de programas que deberán seguir funcionando en Windows y que
tendrán que migrarse a la plataforma .NET.
System.Windows.Forms
Este espacio de nombres contiene todos los tipos del entorno, a través de los
cuales podremos desarrollar aplicaciones compuestas por formularios
Windows, junto a los correspondientes controles que permiten al usuario la
interacción con el programa.
La clase Form
Visual Basic es un sistema que está diseñado para crear programas ya sea tan
sencillos como los que vamos a ver y tan difíciles (aunque es solo una
expresión) como lo es con base de datos.
Mostrara la ventana
3 10
11
4 7
Entre las partes del nuevo IDE de Visual Studio .NET tenemos:
1. Menu Bar
2. ToolBars
3. Server Explorer Window (Ctrl + Alt + S)
4. ToolBox (Ctrl + Alt + X)
5. Output Window (Ctrl + Alt + O)
6. Status Bar
7. Windows Form Designer
8. Solution Explorer Window (Ctrl + R)
9. Properties Window (F4)
10. Search Window (Ctrl + Alt + F3)
11. Dynamic Help Window (Ctrl + F1)
Existen nuevas ventanas en Visual Studio .NET entre las cuales tenemos:
separación. Verás que se muestran dos valores separados por punto y coma,
pero también hay una cruz a la izquierda de la palabra GridSize, si pulsas en
esa cruz, se mostrarán los separados por punto y coma.
Handles Button1.Click
End Sub
Pero esto sólo es una sugerencia que Visual Basic nos hace, en las versiones
anteriores no era una sugerencia, era una imposición. Podemos dejar el
nombre que Visual Basic nos sugiere o podemos poner la línea de declaración
y End Sub
Ejecutar el proyecto
Nota: Para que tengas más fácil buscar las propiedades en la ventana de
propiedades, puedes hacer que se muestren por orden alfabético,
Tipos de datos
Int16 nativo)
Short Entero con signo de 16 bit
TIPO DE CONVERSION
-
Nota:
Todos los objetos de vb.NET tienen unos
métodos para realizar conversiones a otros
tipos, al menos de número a cadena, ya que
tienen la propiedad .ToString que devuelve una
representación en formato cadena del número
en cuestión (igual que CStr).
-
1. Se declara la variable.
Ejemplo
Dim va As Integer
También se pueden declarar varias variables en una misma línea por ejemplo:
Dim a As Short
Dim b As Short
Dim c As Short
O bien
Igualmente
Tipo de conversión
Las variables pueden convertirse de un tipo de dato a otro, por ejemplo: una
expresión cadena, convertirla a número. Veamos un resumen de las distintas
funciones de conversión de tipos y algunos ejemplos:
Integer Cint
Long Clng
Double Cdbl
Decimal Cdec
Char Cchar
String Cstr
INSTRUCCIONES CONDICIONALES
Estructura Condicional: If
Dim i As Short=5
If i > 0 then
End if
If i > 0 then
else
End if
If i =1 0 then
Muestre el valor
Muestre el valor
else
End if
if B=5 then
A=1
A=-1
Else
A=0
End if
A=iif(B=5,1,iif(B<=0,-1,iif(B>5,1,0)))
La función Switch
A=Switch(B=5,1,B<=0,-1,B>5,1)
If A>0 then
Número par
Else
Número impar
End if
Else
Nùmero negativo
End if
Select case B
Case 5
Si fuera igual a 5
Caso Is < 10
Si fuera menor a 10
Case Is> 20
Si fuera mayor a 20
Case 23 to 25
Case 1 to 2
Si fuera 1 o 2
Case 26 to 28,31
Case else
End select
ESTRUCTURAS REPETITIVAS
FOR.(Para Hasta)
Sintaxis:
(programacion)
Next var
Ejemplos:
Print i
Next I Ejemplo:
Next
el & concatena
Sintaxis:
Do while condicion
(programacion)
Loop
Do
(programacion)
Do while
Dim i as integer,suma as integer
Suma=0
i=10
Do while i <= 90
Loop
Do Loop until
Dim i as integer,suma as integer
Suma=0
i=10
Do
Print I
Suma= Suma + I
i= i +1
WHILE..WEND(Hacer Cuando)
Sintaxis:
While condicion
(Programacion)
wend
Suma=0 : i=10
while i <= 90
wend
FOR EACH
Sintaxis:
(Instrucciones)
NEXT
'Este for dara vueltas segun la cantidad de objetos que hay en le formulario
obj.BackColor = vbRed
End If
Next
End Sub
Sentencia EXIT
Visualizar un resultado.
Ejemplo 01
Esta aplicación es fácil de hacer, el formulario que vas a crear deberá tener el
siguiente diseño.
El control Textbox._
Ejemplo 02
Esta aplicación es fácil de hacer, el formulario que vas a crear deberá calcular
el promedio de dos notas ingresadas, el formulario se llamará frmpromedios.
If Asc(e.KeyChar) = 13 Then
txtn2.Focus()
End If
End Sub
KeyPressEventArgs)
Handles txtn2.KeyPress
If Asc(e.KeyChar) = 13 Then
txtpromedio.Text =
(Val(Txtn1.Text) + Val(txtn2.Text)) / 2
End If
End Sub
Ejemplo 03
Esta aplicación es fácil de hacer, el formulario que vas a crear deberá visualizar
el número invertido del número ingresado, Formulario se llamará frminvertir.
El control Button._
Permite:
Ejemplo 04
Duración: 20 minutos
Observe el IDE de Visual Studio .NET cuando se trata de una aplicación para
Windows. ¿Qué ventanas son nuevas en esta versión?. Luego, pruebe la
característica de Auto Ocultar de las ventanas y la ayuda dinámica.
Module Modulo
Public Function
Calcular_Promedio(ByVal Par As Byte, _
End Function
As String
Else
End If
End Function
End Module
Convert.ToByte(txtParcial.Text)
End Sub
Dim X As Control
Next : txtNombre.Focus()
End Sub
End Sub
Me.Close
End Sub
txtTotal.Text = NTotal.ToString :
txtAprobados.Text = NAprobados.ToString
txtDesaprobados.Text = NDesaprobados.ToString
End Sub
Me.Close()
End Sub
End
End Sub
Grabar y ejecutar la aplicación; para probar ingresar como mínimo los datos de
dos alumnos, mostrar el informe y finalizar.
Ejemplo 05
Duración: 15 minutos
Ingrese a Visual Studio .NET y del menú File elegir New y luego Project o
simplemente pulsar [Ctrl] + [N], luego elegir un tipo de proyecto Visual Basic y
una plantilla de Aplicación Windows , seleccionar como ubicación la carpeta
C:\VBNET\Labs y como nombre ingresar Lab03_2 .
Sub LeerArchivo()
Dim Flujo As
System.IO.StreamReader : Dim Linea As
String = " "
Try
Flujo = System.IO.File.OpenText(txtNombre.Text)
Do Until IsNothing(Linea)
Linea = Flujo.ReadLine
Loop
Catch X As IO.IOException
End Try
btnCancelar.Enabled = False
End Sub
End Sub
End Sub
btnCancelar.Enabled = False
End Sub
End Sub
btnCancelar.Enabled = False
End Sub
Hilo.Resume()
End Sub
Me.Close()
End Sub
Ejemplo 05
Opacity 90%
StartPosition CenterScreen
FormBorderStyle Fixed3D
Cursor Hand
Componente:
GroupBox
Objeto: GroupBox
Name gbxcuadros
Forecolor 1 Color
Cursor PanNorth
Name Label1
BorderStyle Fixed3D
ImageAlign MiddleRight
TextAlign MiddleLeft
Forecolor Un color
Autosize False
BackColor 1 Color
16. Modificar los Text de los labels, tal como se visualiza en la siguiente
imagen:
Insertar el cuadro de
texto: Textbox, dentro
Text Vacio
Name: txtdos
Name: txttres
Name: txtcuatro
Name: txtcinco
Name gbxopciones
Forecolor 1 Color
Cursor PanWest
Text &Nuevo
Image Un icono
ImageAlign BottomCenter
TextAlign MiddleCenter
Forecolor 1 Color
Cursor Hand
27. En el formulario:
TextAlign: MiddleCenter
Me.tmrHora.Enabled = True
Me.lblFecha.Text = Format(Now, "dd - MMMM - yyyy")
Me.lblHora.Text = Format(Now, "hh:mm:ss tt")
Me.Text = Space(40) + "Ventas"
tmrHora (Evento Tick)
Me.txtCant.Text = ""
Me.txtNombProd.Text = ""
Me.txtPrecUnit.Text = ""
Me.lblIgv.Text = ""
Me.lblSubTotal.Text = ""
Me.lblTotal.Text = ""
Me.txtNombProd.Focus()
Lo único que deben de saber del control Timer es que cuando uno
lo crea, se crea desactivado, asà que se tiene que activar el control
para poder usarlo, esto se hace mediante la propiedad Enabled, en
la cual tiene que estar en True, y el intervalo en que el control
se actualizara, por ejemplo, el intervalo de 100 es equivalente a
un segundo.
Ejemplo propuesto
1. Realizar el siguiente diseño del Formulario
Indicaciones:
Ejercicios propuestos
Un combo tiene muchas cosas en común con una lista (listbox). La diferencia
principal es que en un combo tiene una propiedad llamada DropDowStyle
distintas formas de presentar una lista:
En una caja combinada, al igual que en una caja de texto sencilla, está
Propiedades
Ejemplo 06
Else
End If
Me.lstNumeros.Items.Add(Me.txtNumIng.Text)
Me.txtNumIng.Text = ""
Me.txtNumIng.Focus()
Me.btnOrdenar.Enabled = True
Else
Me.btnOrdenar.Enabled = False
End If
Me.btnOrdenar.Enabled = True
Else
Me.btnOrdenar.Enabled = False
End If
NumItems = Me.lstNumeros.Items.Count - 1
For J = 0 To NumItems
Temp(J) = CInt(Me.lstNumeros.Items(J))
Next
For J = 0 To NumItems
For K = 0 To NumItems
End If
End If
Next
Next
Me.lstNumeros.Items.Clear()
For J = 0 To NumItems
Me.lstNumeros.Items.Add(CStr(Temp(J)))
Next
Ordenado = True
Me.lstNumeros.Items.Clear()
For J = 0 To NumItems
Me.lstNumeros.Items.Add(CStr(Temp(NumItems - J)))
Next
Ordenado = False
End If
Me.btnEliminar.Enabled = True
With Me.lstNumeros
.Items.Remove(.SelectedItems.Item(i))
Next
End With
NumItems = Me.lstNumeros.Items.Count
Exit Sub
End If
If Index = 0 Then
Index = CInt(Me.lstNumeros.Items.Count) \ 2
Media = (CSng(CInt(Me.lstNumeros.Items(Index)) +
CInt(Me.lstNumeros.Items(Index - 1)))) / 2
Else
Index = CInt(Me.lstNumeros.Items.Count) \ 2
Media = CSng(CInt(Me.lstNumeros.Items(Index)))
End If
Me.lblCalculo.Text = CStr(Media)
Me.Close()
Empleo de listas
Codificacion
With ListBox1
.Items.Add("Naranja") : .Items.Add("Pera")
.Items.Add("Melocotón") : .Items.Add("Albaricoque")
.Items.Add("Manzana") : .Items.Add("Plátano")
.Items.Add("Melón") : .Items.Add("Mango")
.Items.Add("Fresquilla")
End With
End Sub
'Añadir ListBox1
ListBox1.Items.Add(TextBox1.Text)
TextBox1.Text = ""
End If
End Sub
'Eliminar ListBox1
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Else
MessageBox.Show(msgbox_Eliminar, msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
ListBox1.SelectedIndex = ListBox1.Items.Count - 1
ListBox2.Items.Add(ListBox1.SelectedItem)
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
End While
End Sub
End Sub
ListBox2.SelectedIndex = ListBox2.Items.Count - 1
ListBox1.Items.Add(ListBox2.SelectedItem)
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
End While
End Sub
Dim a As Integer = 0
ListBox2.Items.Add(ListBox1.Items.Item(a))
ListBox1.SetSelected(a, False) :
ListBox1.Items.RemoveAt(a)
End If
a += 1
End While
Else
MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
End Sub
ListBox1.Items.Add(ListBox2.SelectedItem)
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
Else
MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End If
End Sub
End Class
Ejemplo 07
With cboProcesador.Items
End With
With lstMemoria.Items
.Add("128 Mb")
End With
With lstDisco.Items
.Add("30 Gb")
End With
With lstImpresora.Items
End With
With lstScanner.Items
End With
End Sub
Llenar_Listas()
End Sub
End Select
End Sub
End Select
End Sub
End Select
End Sub
txtPrecioMonitor.Text = "150"
End Sub
txtPrecioMonitor.Text = "200"
End Sub
txtPrecioTeclado.Text = "15"
End Sub
txtPrecioTeclado.Text = "30"
End Sub
gbxLectoraDisco.Enabled = chkLectoraDisco.Checked
End Sub
txtPrecioLectoraDisco.Text = "20"
End Sub
txtPrecioLectoraDisco.Text = "40"
End Sub
txtPrecioLectoraDisco.Text = "50"
End Sub
gbxLectoraCD.Enabled = chkLectoraCD.Checked
End Sub
txtPrecioLectoraCD.Text = "40"
End Sub
txtPrecioLectoraCD.Text = "50"
End Sub
txtPrecioLectoraCD.Text = "70"
End Sub
lstImpresora.Enabled = chkImpresora.Checked
End Sub
lstImpresora.SelectedIndexChanged
Select Case lstImpresora.SelectedIndex
End Select
End Sub
lstScanner.Enabled = chkScanner.Checked
End Sub
End Select
End Sub
PrePro = txtPrecioProcesador.Text.ToInt16
PreMem = txtPrecioMemoria.Text.ToInt16
PreDis = txtPrecioDisco.Text.ToInt16
PreMon = txtPrecioMonitor.Text.ToInt16
PreTec = txtPrecioTeclado.Text.ToInt16
PreLDi = txtPrecioLectoraDisco.Text.ToInt16
PreLCD = txtPrecioLectoraCD.Text.ToInt16
PreImp = txtPrecioImpresora.Text.ToInt16
PreSca = txtPrecioScanner.Text.ToInt16
txtTotalBasico.Text = TotBas.ToString
txtTotalAccesorios.Text = TotAcc.ToString
txtTotalVenta.Text = TotVen.ToString
txtTotalIGV.Text = TotIGV.ToString
txtTotalPagar.Text = TotPag.ToString
End Sub
Dim X As Control
X.Text = ""
End If
Next
End Sub
End
End Sub
Ejercicio Propuesto
Esta aplicación nos permitir realizar una pro forma de venta de una tienda
comercial de computo, consta de dos formularios, uno que es el principal
llamado frmAplicacion90 y otro llamado frmInfo, esta aplicación está basada en
arreglos y datos almacenados en el programa, con el fin de darnos cuenta que
tan importante es tener un diseñador de base de datos, ya que la aplicación sin
frmInfo
Me.Close()
frmAplicacion90
Para este caso se pide que esta aplicación se pueda escoger un articulo y nos
muestre su imagen referencial, la marca y el modelo del artículo, y a su vez nos
muestre el precio unitario y el precio total, existe un caso en que
cuando
subtotal y el IGV. Y para los que les guste hacerlo ms perfecto, también le
pueden
Una vez ya tenido el diseños del formulario listo y sus descripciones que debe
tener, procederemos a codificación.
Seleccionar el
producto,
ingresar la
cantidad y
almacenar en
una lista
según como
se muestra en
la imagen Ud.
Debe tener en
cuenta que
cuando
seleccione un
ítem de la
lista se deben
seleccionar
todos y pulsa
el botón
eliminar o
suprimir ese
ítem se eliminara en todas las listas.
Almacenar en una lista solo a los números primos que existen entre el 1 y el 20
Practica N° 1
1.- Ingrese por teclado en una caja de texto la hora en formato de 24 horas y
en otra caja de texto la cantidad de minutos al hacer clic en un boton debera
salir la hora en formato de 12 horas por ejemplo si se ingresa 23 en una caja y
en la otra 12 el resultado seria 11:12:PM
2.- Ingrese la cantidad de minutos hablados por una persona y escoja el tipo de
llamada (Local, Nacional, Internacional).Se visualizara el importe de la llamada
sabiendo que por los 3 primeros minutos se paga S/ 1.00 y por cada minuto
adicional se paga 0.50 en caso sea local si es nacional se incrementa el 25% y
si es internacional se incrementa el 60% a los precios por minuto.
Ejemplo: 203 = Tiene 3 cifras , 45678 = Tiene 5 cifras tome en cuenta que el
numero máximo a ingresar es un millon..
7.- Ingrese por teclado el nombre, año de nacimiento y sexo de una persona (M
o F),se deberá mostrar uno de los siguientes mensajes.
CI = 320.00
Enfermeria = 280.00
Administración = 270.00
Ademas que dependiendo del ciclo en el que estan se pagara un recargo del
precio de 10,20,30,40,50,60 y 70% (para sidet). Asi como tambien si es del
turno se debera recargar 10% mas solo si esta en I, II, o III ciclo, si es del
turno se recarga el 15 % mas solo si esta en I, o II y por utlimo si es del
turno se se la hara un descuento del 15 % solo si esta en SIDET
Practica N° 1
1.- Ingrese un numero y Genere las siguientes series: (el resultado se mostrara
en un label o en un text)
• 1,3,5,7,.....
• -1,+3,-5,+7...
• 1,3,2,5,3,7,4,9,5,11....
• 0,1,1,2,3,5,8,13...(Serie Fibonacci)
2.- Genere 100 numeros aleatorios y diga cuantos primos mayores a 50
hay,perfectos menores a 10 hay, pares e impares.
9.- Ingrese Una fecha y diga cuantos dias faltan para acabar el año, cuantos
dias han pasado desde esa fecha hasta la fecha actual, que dia cae esa fecha
(Lunes,martes), y muestre la misma fecha en el siguiente formato: Lunes 15
de Abril de 2003 (Por ejemplo)
10.- Ingrese en una caja de texto una cadena y al finalizar diga cuantas
palabras tiene dicha cadena y cual es la cantidad de caracteres que tiene la
palabra con mayor longitud
de la aplicación
13.-
Realic
e el
siguiente formulario:
El control RadioButton
Ejemplo 8
Diseño de controles.
Me.Close()
lblestado.Text = Nº de Hermanos
:lblsueldo.Text = 200.00
lbltiempoest.Text = Edad
:txttiempest.Focus()
Iniciar()
Iniciar()
Función Iniciar
Sub Iniciar()
txtnombre.Focus()
End Sub
El control CheckBox
Es el control de selección de opciones, el cual permite seleccionar una opción en el
control: marcado o desmarcado.
Este control se utiliza en forma individual, a diferencia del RadioButton. Las propiedades de
este control:
Ejemplo 9
Seleccione:
El monto es la
suma de sus
ingresos.
El control PictureBox
Este control nos permite mostrar una imagen de una ruta específica.
Comentarios
Nota:
Si desea utilizar la misma imagen en varios controles PictureBox, cree un
clon de la imagen para cada control PictureBox. Obtener acceso a la misma
imagen desde varios controles hace que se produzca una excepción.
Ejemplo 10
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Case 0
optRotarIzq.Checked = False
optRotarDer.Checked = True
optRotarLibre.Checked = False
Case Else
optRotarIzq.Checked = False
optRotarDer.Checked = False
optRotarLibre.Checked = True
End Select
inicializando = False
End Sub
End Sub
End With
End Sub
El control DateTimePicker
Este control permite la selección e introducción de fechas en una caja de texto
con capacidades extendidas, o bien mediante un calendario desplegable que
se mostrará al pulsar el botón de expansión que
contiene.
Ejemplo 11
Private Sub frmDatosPersonal_Load() Handles
MyBase.Load
' modificar fecha del DateTimePicker
Me.dtpFNacim.Text = "15/06/2002"
End Sub
Me.dtpFNacim.MinDate = "1/4/2002"
Me.dtpFNacim.MaxDate = "1/10/2002"
Me.dtpFNacim.CustomFormat = "d-MMM-yy"
Me.dtpFNacim.Format = DateTimePickerFormat.Custom
End Sub
Ejemplo 12
Function PrimerDiaDelMes( ) As
Date
PrimerDiaDelMes =
DateSerial(Year(dtmFecha),
Month(dtmFecha), 1)
End Function
Function UltimoDiaDelMes(ByVal
dtmFecha As Date) As Date
UltimoDiaDelMes =
DateSerial(Year(dtmFecha),
Month(dtmFecha) + 1, 0)
End Function
MsgBox(PrimerDiaDelMes((DateTimePicker1.Value)))
End Sub
Funciones de cadenas
Se denomina CADENA a una sucesión de caracteres. Una cadena puede
tener uno o varios caracteres alfanuméricos. Una cadena es también una
sucesión de números.
Ejemplo de cadenas:
STR._ Cuando los números se conviertan a cadenas, siempre se reservará un
espacio inicial para el signo de Number. Si Number es positivo, la cadena
devuelta contiene un espacio inicial; y el signo más se da por supuesto. Un
Para utilizar las dos funciones anteriores que son propias de visual basic
emplear
Microsoft.VisualBasic.Funcion
Dim myString As String = "Curso de Visual Net"
Dim subString As String
subString = Microsoft.VisualBasic.Right(myString, 3) ' Retorna "Net"
LTrim._ Elimina los posibles espacios que tenga una cadena por su izquierda.
Rtrim._ Elimina los posibles espacios que tenga una cadena por su derecha.
Trim._ Elimina los espacios que tenga una cadena, tanto por su izquierda como
STRING._ Tipo de dato ,Para obtener una lista de todos los miembros de este
tipo,
Obj.Metodo
El objeto Math.funciones
Math.round(n,d) .- Redondea , con ciertos numeros de decimals
Math.Round(3.45, 1) 'Returns 3.4.
Math.Round(3.46, 1) 'Returns 3.5.
Math.PI .- El valor de este campo es 3,14159265358979323846
Math.acos.- Devuelve el ángulo cuyo coseno es el número especificado
Math.ceiling.- Devuelve el número entero más pequeño mayor o igual que el
número especificado.
Math.ceiling(3.1) à 4
Math.Floor.- Devuelve el número entero más grande menor o igual que el
número especificado
Math.Floor(3.1) à3
Math.sqrt(n).- Devuelve la raíz cuadrada de un número especificado.
Math.pow(n).- Devuelve un número especificado elevado a la potencia
especificada
Aplicación 1.- Empleando funciones de cadena
º
Codificación:
Dim I As Integer
CAD = TXTCAD.Text.Trim
ListBox1.Items.Clear()
For I = 0 To UBound(VEC)
ListBox1.Items.Add(VEC(I))
Next
End Sub
End Sub
End Sub
DisplayText(CType(sender, RadioButton))
End Sub
texto = TXTCAD.Text.Trim
cadr = texto.Substring(0, 3)
cadr = texto.Remove(3, 5)
cadr = texto.Substring(texto.Length - 3, 3)
cadr = texto.Substring(4, 5)
End If
lblres.Text = cadr
End Sub
End Class
184 TxtInput
TxtSeparator
Facultad de Ingenieria Industrial y de Sistemas
Codificación;
x.ShowDialog()
End Sub
x.ShowDialog()
End Sub
End Class
lstOutput.Items.Clear()
TempArray = txtInput.Text.Split(txtSeparator.Text)
lstOutput.Items.Add(TempArray(CurIndex))
Next
End If
End Sub
End Class
ReDim TempArray(NumElements)
TempArray(CurIndex) = RandomInteger.Next(1000).ToString
Next
End If
End Sub
End Class
Dim N, r as String
n = Val(TxtNum.text)
Dim n% r = n Mod 2
r = n Mod 16 :n = n \ 16
If r > 9 Then
Else
End If
Loop
Lbr2 = StrReverse(cad)
End Sub
Aplicación 4.-Ingresando una frase por teclado
invertir las palabras en su misma posición , luego visualizar la misma frase como una
pirámide cuyo vértice es el centro de la frase.
Eventos Desarrollados
e as Eventargs)
For M = 1 To Len(cad)
Se pregunta si el caracter es un espacio blanco o M es la ultima posicion
If Mid(cad, M, 1) = " " Then
If M = Len(cad) Then P =M Else P = M - 1
PALABRA = "" para formar la palabra invertida
For k = PA To P
End Sub
List1.Items.Clear
cad = Trim(Text1.text) Almacena el valor de la Frase
cad3 = Space(P) & Mid(cad, P, 1) Coloca en el Vertice la Primera letra con espacios
List1.AddItem cad3
For I = 1 To P
If P - CI < 1 Then Exit For si es un valor menor a uno sale del for
cad1 = Space(P - CI) & Mid(cad, P - CI, CI) Cadena de la Izquierda
cad2 = Mid(cad, P + 1, cr) Cadena de La derecha
cad4 = cad1 & Trim(cad3) & cad2 Unimos las tres Cadenas
List1.AddItem cad4 Lo Colocamos en la lista
CI = CI + 1
cr = cr + 1
Next
End Sub
Ejercicios
Cris
Crist....
2) Colocar las palabras de derecha a Izquierda
3) Colocar cada palabra en una linea ,por ejemplo
Cristo Es Nuestra Vida
4) Contabilizar la cantidad de palabras
5) que palabra tiene menor longitud
6) Mostrar la palabra que tenga mayor longitud
7.-
E l numero de Carnet es de 15
caracteres y se forma de la
siguiente manera:
Ejm:
Nombre Claudia
Sexo : F
Nro: generado
8011260MELEC001
8 y 9 Corresponde al Primer y
cuarto carac. Del Paterno
3.-Verificación de Códigos
Residuo
residuo 0 1 2 3 4 5 6
Letra A B C D E F G
Si la letra es igual que el ultimo carácter del código entonces mostrar código
correcto de lo contrario código incorrecto, pintarlo con azul y rojo
respectivamente.
Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la
información relativa a la fecha y la hora. Dispone para ello de una declaración
de variable: Date. Una variable declarada como date puede contener una
fecha, una fecha y una hora o una hora solamente.
Dim MyDate As Date
Dim MyMonth As Integer
MyDate = #2/12/1969# ' Assign a date.
MyMonth = Month(MyDate) ' MyMonth contains 2.
Now._Devuelve la fecha y hora actual.
WeekDay._ Devuelve el día de la semana (En número, 1=Domingo,
2=Lunes,...)
Dim MyDate As Date
Dim MyWeekDay As Integer
MyDate = #2/12/1969# ' asigna una fecha
MyWeekDay = Weekday(MyDate) ' MyWeekDay contains 4
Interval
Number
DateValue
Valores
El argumento Interval puede tener uno de los siguientes valores:
Valor de enumeración Cadena Unidad de intervalo de tiempo agregada
Intervalo Descripción
yyyy Año
Q Trimestre
M Mes
D Día
W Día de la
semana
Ww Semana
H Hora
N Minuto
S Segundo
Este ejemplo utiliza la función DateDiff para mostrar el número de días entre
una fecha dada y hoy.
MsgBox(dias) à devuelve 5
Msgbox(meses) à devuelve 0
Ejemplo 2.-
Dim FirstDate, Msg As String ' Declare variables.
Dim SecondDate As Date
FirstDate = InputBox("Ingrese fecha")
SecondDate = CDate(FirstDate)
Msg = "Dias desde la fecha: " & DateDiff(DateInterval.Day, Now, SecondDate)
MsgBox (Msg)
DateInterval.Hour H Hora
DateInterval.Minute N Minuto
DateInterval.Month M Mes
DateInterval.Quarter Q Trimestre
DateInterval.Second S Segundo
Función FORMAT
vbThursday 5 Jueves
vbFriday 6 Viernes
vbSaturday 7 Sábado
Observe que usamos la expresión Variable =Format (1234567, Formato ) para
todos los ejemplos de números.
FA = Today : FE = CDate(TXTFE.Text)
AA = Year(FA) - Year(FE)
DA = FA.DayOfYear : DN = FN.DayOfYear
If DN > DA Then AA = AA 1
FE = FE.AddMonths(MES)
If DN > DA Then
Else
End If
End Sub
End Class
1.- Realizar un programa que permita generar los códigos de los empleados
que serán
vencimiento y fecha de pago , calcular los días de mora , pago por mora y el
pago total Los pago por Mora es de acuerdo a:
3.- Ingrese por teclado cierta cantidad de Bolas de billar , con el cual se desea
formar una pirámide de base cuadrada, cada superficie esta formado por un
numero cuadrado perfecto, calcular el numero de superficies que se forman y
el numero de bolas que sobran.
Codificación
Timer1.Enabled = True
txtvueltas.Text = ""
End Sub
Randomize()
d1 = CInt(Rnd() * 5) + 1 : d2 = CInt(Rnd() * 5) + 1
txtvueltas.Text = (5 - n).ToString : n = n + 1
If n > 5 Then
Timer1.Enabled = False
If d1 + d2 = 12 Or d1 + d2 = 7 Then
MsgBox("gano")
Else
MsgBox("intente de nuevo")
End If
n=0
End If
End Sub
End Class
Module Module1
End Function
suma += prom
ntotal += 1
naprobados += 1
Return ("aprobado")
Else
ndesaprobados += 1
Return ("desaprobado")
End If
End Function
End Module
Dim x As Control
Next
End Sub
ep = Convert.ToByte(txteparcial.Text) : ef =
Convert.ToByte(txtefinal.Text)
txtcondicion.Text = calcularCondicion(pro)
txtcondicion.ForeColor = System.Drawing.Color.Blue
Else
txtcondicion.ForeColor = System.Drawing.Color.Red
End If
End Sub
If Asc(e.KeyChar) = 13 Then
txteparcial.Focus()
End If
End Sub
SoloNumeros = 0
Else
SoloNumeros = Keyascii
End If
End Select
End Function
miform.ShowDialog()
End Sub
Me.Close()
End Sub
End Sub
Dim n As Byte
KeyAscii = CShort(SoloNumeros(KeyAscii))
If KeyAscii = 0 Then
e.Handled = True
n = Convert.ToByte(txteparcial.Text)
End If
End If
End Sub
End Class
txtNdes.Text = ndesaprobados.ToString
End Sub
End Class
Ejemplo 13
End Sub
Private Sub rbtGaramond_CheckedChanged(ByVal sender As System.Object,
ByVal e As
System.EventArgs) Handles rbtGaramond.CheckedChanged
End Sub
Private Sub rbtComic_CheckedChanged( ) Handles
rbtComic.CheckedChanged
Me.txtNombre.Font = New Font("Comic Sans MS", 15)
End Sub
Me.txtNombre.BackColor = Color.Green
End Sub
Private Sub rbtAzul_CheckedChanged( Handles rbtAzul.CheckedChanged
Me.txtNombre.BackColor = Color.Blue
End Sub
Private Sub rbtAmarillo_CheckedChanged( Handles
rbtAmarillo.CheckedChanged
Me.txtNombre.BackColor = Color.Yellow
End Sub
Cada vez que hacemos clic en alguno de los valores, se produce el evento
SelectedIndexChanged, que utilizamos para mostrar en este caso, el nombre
del elemento en el título del formulario, la clase frmListas, correspondiente al
formulario
' declaramos esta constante a nivel de clase, para poner como título
' del formulario junto al elemento seleccionado de la lista
End Sub
Private Sub rbtUno_CheckedChanged(..) Handles rbtUno.CheckedChanged
' establecer tipo de selección en el ListBox a un elemento
Me.lstValores.SelectionMode = SelectionMode.One
End Sub
Private Sub rbtMultiple_CheckedChanged(..) Handles
rbtMultiple.CheckedChanged
' establecer tipo de selección en el ListBox a un múltiples
' elementos
Me.lstValores.SelectionMode = SelectionMode.MultiSimple
End Sub
Private Sub rbtExtendida_CheckedChanged( ) Handles
rbtExtendida.CheckedChanged
' establecer tipo de selección en el ListBox a múltiples
' elementos de modo extendido
Me.lstValores.SelectionMode = SelectionMode.MultiExtended
End Sub
Me.lstValores.Sorted = Me.chkOrdenar.Checked
End Sub
Me.lstValores.MultiColumn = Me.chkColumnas.Checked
End Sub
Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnAgregar.Click
' añadimos el contenido del TextBox como
' un elemento a la lista
Me.lstValores.Items.Add(Me.txtValor.Text)
End Sub
End Sub
Private Sub btnSelecCod_Click(..) Handles btnSelecCod.Click
' para seleccionar elementos de un ListBox por código
' podemos utilizar el método SetSelected()
Me.rbtMultiple.Checked = True
Me.lstValores.SetSelected(1, True)
Me.lstValores.SetSelected(3, True)
Me.lstValores.SetSelected(5, True)
End Sub
Private Sub btnTrapasarSelec_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnTrapasarSelec.Click
Dim oSeleccion As ListBox.SelectedObjectCollection
' obtenemos con SelectedItems los elementos seleccionados
' de un ListBox
oSeleccion = Me.lstValores.SelectedItems
' si existen elementos seleccionados,
' los traspasamos a otro ListBox del formulario
If oSeleccion.Count > 0 Then
Dim oEnumerador As IEnumerator
oEnumerador = oSeleccion.GetEnumerator()
While oEnumerador.MoveNext()
Me.lstTraspaso.Items.Add(oEnumerador.Current)
End While
End If
End Sub
Private Sub
Ing. Alberto Moreno Cueva btnLimpiar_Clic
Página
1109
k(..) Handles btnLimpiar.Click
' con el método Clear() de la colección de elementos
' de un ListBox, borramos los elementos del controls
Me.lstTraspaso.Items.Clear()
End Sub
Control Panel
Ejemplo 14
Comentarios
Panel es un control que contiene otros controles. Se puede utilizar Panel para agrupar
colecciones de controles, como un grupo de controles RadioButton. Al igual que sucede con otros
controles contenedores, como el control GroupBox, si la propiedad Enabled del control Panel está
establecida en false, los controles contenidos dentro de Panel también se deshabilitarán.
El control Panel se muestra de forma predeterminada sin bordes. Para proporcionar un borde
estándar o tridimensional, se utiliza la propiedad BorderStyle para distinguir el área del panel de
otras áreas del formulario. Debido a que el control Panel deriva de la clase ScrollableControl, se
puede utilizar la propiedad AutoScroll para habilitar barras de desplazamiento en el control Panel.
Cuando la propiedad AutoScroll está establecida en true, es posible desplazarse a cualquier
control situado dentro de Panel, aunque fuera de su región visible, con las barras de
desplazamiento proporcionadas.
El control Panel no muestra ningún título. Si necesita un control similar a Panel que puede mostrar
un título, vea el control GroupBox. En el ejemplo de código siguiente se crea un control Panel, y
se agrega Label y TextBox a Panel. El control Panel se muestra con un borde tridimensional para
distinguir dónde está situado el control Panel en relación con otros objetos del formulario. En este
ejemplo se requiere que se llame al método definido en este ejemplo desde dentro de un
formulario existente y que se haya agregado el espacio de nombres System.Drawing al código
Visual Basic
panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
' Inicializar la etiqueta y controles TextBox.
Me.Controls.Add(panel1)
' Añadir la etiqueta y controles TextBox al Grupo.
panel1.Controls.Add(label1) : panel1.Controls.Add(textBox1)
End Sub
TabControl contiene páginas de fichas, representadas por objetos TabPage, que se agregan
mediante la propiedad TabPages. El orden de las páginas de fichas de esta colección refleja el
orden en que las fichas aparecen en el control.
El usuario puede cambiar el objeto TabPage actual haciendo clic en una de las fichas del control.
También se puede cambiar mediante programación el objeto TabPage actual utilizando una de las
• SelectedIndex
• SelectedTab
En Microsoft .NET Framework versión 2.0, también puede utilizar uno de los métodos siguientes:
• SelectTab
• DeselectTab
En .NET Framework 2.0, puede responder cuando la ficha actual cambie controlando uno de los
eventos siguientes:
• Deselecting
• Deselected
• Selecting
• Selected
Las fichas incluidas en TabControl forman parte de TabControl, pero no forman parte de los
controles TabPage individuales. Los miembros de la clase TabPage, como la propiedad
ForeColor, sólo afectan al rectángulo cliente de la página de fichas, pero no a las fichas. Además,
el método Hide de TabPage no ocultará la ficha. Para ocultar la ficha, debe quitar el control
TabPage de la colección de TabControl.TabPages.
En .NET Framework 2.0, la ficha se considera parte de la página de fichas para determinar cuándo
se producen los eventos Enter y Leave de TabPage. En las versiones anteriores de .NET
Framework, los eventos Enter y Leave de TabPage no se producen cuando una ficha tiene el
foco o lo pierde, únicamente se producen cuando el rectángulo cliente de la página de fichas tiene
el foco o lo pierde.
Los siguientes eventos no se producen para la clase TabControl salvo que haya al menos un
objeto TabPage en la colección de TabControl.TabPages: Control.Click, Control.DoubleClick,
Control.MouseDown, Control.MouseUp, Control.MouseHover, Control.MouseEnter,
Control.MouseLeave y Control.MouseMove. Si en la colección hay un objeto TabPage, como
mínimo, y el
Ing. Alberto Moreno Cueva
Página
1112
usuario interactúa con el encabezado del control de ficha (donde aparecen los nombres de
TabPage), TabControl provoca el evento apropiado. Sin embargo, si la interacción del usuario se
produce dentro de la propiedad ClientRectangle de la página de fichas, TabPage provoca el
evento adecuado.
Los controles incluidos en TabPage no se crean hasta que se muestra la página de fichas;
tampoco se activan los enlaces de datos de estos controles hasta que dicha página de fichas se
muestra.
Cuando los estilos visuales están habilitados y la propiedad Alignment se establece en un valor
distinto de Top, es posible que el contenido de las fichas no se represente correctamente. Para
evitar este problema, puede dibujar el contenido de las fichas utilizando el dibujo del propietario.
Cuando la propiedad Alignment se establece en un valor distinto de Top y la propiedad
Appearance se establece en un valor distinto de Normal, puede que el contenido de la página de
fichas no se represente correctamente.
Ejemplo
Visual Basic
Ejemplo 15
InitializeComponent()
End Sub
' Este metodo es Requerido para el diseño.
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.tabPage1 = New System.Windows.Forms.TabPage()
Me.tab2CheckBox3 = New System.Windows.Forms.CheckBox()
Me.tab3RadioButton2 = New System.Windows.Forms.RadioButton()
Me.tabControl1 = New System.Windows.Forms.TabControl()
Me.tab2CheckBox2 = New System.Windows.Forms.CheckBox()
Me.tab2CheckBox1 = New System.Windows.Forms.CheckBox()
Me.tab3RadioButton1 = New System.Windows.Forms.RadioButton()
Me.tab1Label1 = New System.Windows.Forms.Label()
Me.tabPage3 = New System.Windows.Forms.TabPage()
Me.tabPage2 = New System.Windows.Forms.TabPage()
Me.tab1Button1 = New System.Windows.Forms.Button()
tabPage1.Text = "tabPage1"
tabPage1.Size = New System.Drawing.Size(256, 214)
tabPage1.TabIndex = 0
tab2CheckBox3.Location = New System.Drawing.Point(32, 136)
tab2CheckBox3.Text = "checkBox3"
tab2CheckBox3.Size = New System.Drawing.Size(176, 32)
tab2CheckBox3.TabIndex = 2 : tab2CheckBox3.Visible = True
tab3RadioButton2.Location = New System.Drawing.Point(40, 72)
tab3RadioButton2.Text = "radioButton2"
Ing. Alberto Moreno Cueva
Página
1114
tab3RadioButton2.Size = New System.Drawing.Size(152, 24)
tab3RadioButton2.TabIndex = 1 : tab3RadioButton2.Visible = True
tabControl1.Location = New System.Drawing.Point(16, 16)
tabControl1.Size = New System.Drawing.Size(264, 240)
tabControl1.SelectedIndex = 0 : tabControl1.TabIndex = 0
tab2CheckBox2.Location = New System.Drawing.Point(32, 80)
tab2CheckBox2.Text = "checkBox2"
tab2CheckBox2.Size = New System.Drawing.Size(176, 32)
tab2CheckBox2.TabIndex = 1 : tab2CheckBox2.Visible = True
tab2CheckBox1.Location = New System.Drawing.Point(32, 24)
tab2CheckBox1.Text = "checkBox1"
tab2CheckBox1.Size = New System.Drawing.Size(176, 32)
tab2CheckBox1.TabIndex = 0
tab3RadioButton1.Location = New System.Drawing.Point(40, 32)
tab3RadioButton1.Text = "radioButton1"
tab3RadioButton1.Size = New System.Drawing.Size(152, 24)
tab3RadioButton1.TabIndex = 0
tab1Label1.Location = New System.Drawing.Point(16, 24)
tab1Label1.Text = "label1"
tab1Label1.Size = New System.Drawing.Size(224, 96)
tab1Label1.TabIndex = 1 : tabPage3.Text = "tabPage3"
tabPage3.Size = New System.Drawing.Size(256, 214)
tabPage3.TabIndex = 2 : tabPage2.Text = "tabPage2"
tabPage2.Size = New System.Drawing.Size(256, 214)
tabPage2.TabIndex = 1
tab1Button1.Location = New System.Drawing.Point(88, 144)
tab1Button1.Size = New System.Drawing.Size(80, 40)
tab1Button1.TabIndex = 0 : tab1Button1.Text = "button1"
Me.Text = "Form1"
'Agrega los controles a la segunda pestaña
tabPage2.Controls.Add(Me.tab2CheckBox3) tabPage2.Controls.Add(Me.tab2CheckBox2)
tabPage2.Controls.Add(Me.tab2CheckBox1)
' Adds controls to the third tab page.
tabPage3.Controls.Add(Me.tab3RadioButton2)
End Sub
-------------------------------------------------------------------------------------------------------------------
Public Shared Sub Main()
Application.Run(New Form1())
End Sub
End Class
Los elementos siguientes están diseñados específicamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están
disponibles de forma predeterminada en tiempo de diseño para el control MenuStrip:
• ToolStripTextBox
• ToolStripComboBox
Ejemplo 16
Visual Basic
ColoDialog
OpenFileDailog
FontDialog
Codificación:
Modulo1
Module Module2
Public n As Byte
End Module
x.MdiParent = Me
x.Show()
n += 1
End Sub
StatusBarPanel4.Text = Date.Now.ToLongTimeString
StatusBarPanel4.ToolTipText = Date.Now.Today.ToLongDateString
End Sub
With OdgEditor
y.MdiParent = Me
x.Text = nom
End If
Ing. Alberto Moreno Cueva
Página
1121
End With
End Sub
With CdgEditor
x.BackColor = .Color
End If
End With
End Sub
With FdgEditor
x.ForeColor = .Color
x.Font = .Font
End If
End With
End Sub
Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
Ing. Alberto Moreno Cueva
Página
1122
Private Sub MnuVentana_vertical_Click( ) Handles MnuVentana_vertical.Click
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
Case 0 : MnuArchivo_nuevo.PerformClick()
Case 1 : MnuArchivo_abrir.PerformClick()
Case 2 : 'MnuArchivo_nuevo.PerformClick()
End Select
End Sub
End Class
Los elementos siguientes están diseñados específicamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están
disponibles de forma predeterminada en tiempo de diseño para el control StatusStrip:
• ToolStripStatusLabel
• ToolStripDropDownButton
• ToolStripSplitButton
• ToolStripProgressBar
Un control StatusStrip muestra información acerca del objeto que se está mostrando en un Form,
Ejemplo 17
Imports System
Imports System.Text
Imports System.Windows.Forms
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Los Arrays
Las variables que hemos estado usando hasta ahora, eran de tipo escalar: sólo pueden
Una de las formas en las que podemos agrupar varios datos es mediante los arrays (o
matrices).
Usando un array, podemos acceder a cualquiera de los valores que tenemos almacenado
discografía(3).
Sabiendo esto, podemos comprobar que sería fácil recorrer el contenido de los arrays
Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo,
nombres de los discos que tenemos, podemos usar un array del tipo String, que lo que
nos interesa es saber el porcentaje de goles por partido de nuestro equipo de fútbol
favorito, el tipo de datos del array podía ser Decimal. Incluso si queremos, también
podemos crear un array de un tipo que nosotros hayamos definido o de cualquier clase
Vale, muy bien, pero ¿cómo narices le digo al Visual Basic que una variable es un array?
Para poder
Ing. Alberto Moreno Cueva indicarle al VB
Página
1126
que nuestra intención es crear un array podemos hacerlo de
dos formas distintas, para este ejemplo crearemos un array de tipo Integer:
Dim a As Integer()
De cualquiera de estas dos formas estaríamos creando un array de tipo Integer llamada
Cuando declaramos una variable de esta forma, sólo le estamos indicando al VB que
nuestra intención es que la variable a sea un array de tipo Integer, pero ese array no
ReDim a(5)
Y son seis y no cinco, (como por lógica habría que esperar), porque en .NET Framework
indicado entre paréntesis. Por tanto el array a tendrá reservada memoria para 6 valores
array, es decir, para volver a dimensionarlo o cambiarlo por un nuevo valor. Si sabemos
con antelación el tamaño que contendrá el array, podemos hacerlo de esta forma:
Con este código estaríamos declarando la variable a como un array de 6 elementos (de 0
segunda forma
Ing. Alberto Moreno Cueva de declaración
Página
1127
que te mostré anteriormente: Dim a As Integer(5) ya que
Nota: Aunque este curso es de Visual Basic .NET te diré que en C#, cuando
declaramos un array con el equivalente a Dim a(5) As Integer, que sería algo
como:
int[] a = new int[5], lo que estamos creando es un array de tipo int (el Integer de
Para asignar un valor a un elemento de un array, se hace de la misma forma que con las
siguiente:
invariable, todos los arrays de .NET Framework empiezan a contar por cero.
Pero el índice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la
Realmente el índice superior de un array es 2^64 -1 (el valor máximo de un tipo Long)
For i = 0 To a.Length - 1
Console.WriteLine(a(i))
Next
Para inicializar un array debemos declarar ese array sin indicar el número de elementos
Usando cualquiera de estas dos formas mostradas, el número de elementos será 5, por
En todos estos ejemplos estamos usando valores de tipo Integer, pero podríamos hacer
En el caso de que sean datos de tipo String, los valores a asignar deberán estar entre
s(3) = "saludamos"
Dim i As Integer
For i = 0 To s.Length - 1
Console.WriteLine(s(i))
Next
El tipo de bucle For Each es muy útil para recorrer los elementos de un array, además de
ser una de las pocas, por no decir la única, formas de poder acceder a un elemento de un
Console.WriteLi
Ing. Alberto Moreno Cueva ne("Elementos
Página
1129
del array a()= {0}", a.Length)
Dim i As Integer
For Each i In a
Console.WriteLine(i)
Next
Console.ReadLine()
a.Sort(a)
La variable a es un array, por tanto es del tipo Array y como tal, tiene el método Sort, el
Pero esto puede parecer una redundancia, así que es preferible, por claridad, usar el
segundo método:
Array.Sort(a)
En el que usamos el método Sort de la clase Array. Este método es lo que se llama un
muestra el contenido del array usando un bucle For Each, se clasifica y se vuelve a
Sub Main()
Dim i As Integer
For Each i In a
Next
Console.WriteLine()
Array.Sort(a)
For i = 0 To a.Length - 1
Console.WriteLine(a(i))
Next
Console.ReadLine()
End Sub
La única forma de tener copias independientes de dos arrays que contengan los mismos
Esto lo podemos hacer mediante el método CopyTo, al cual habrá que indicarle el array
a.CopyTo(b, 0)
a(3) = 55
99
Dim i As Integer
For i = 0 To a.Length - 1
Next
En este
Ing. Alberto Moreno Cueva ejemplo,
Página
1131
inicializamos un array, declaramos otro con el mismo número de
elementos, utilizamos el método CopyTo del array con los valores, en el parámetro le
decimos qué array será el que recibirá una copia de esos datos y la posición (o índice) a
partir de la que se copiarán los datos, (indicando cero se copiarán todos los elementos);
después cambiamos el contenido de uno de los elementos del array original y al mostrar
el contenido de ambos arrays, comprobamos que cada uno es independiente del otro.
Para poder conseguirlo, debemos usar ReDim seguida de la palabra clave Preserve, por
A partir de ese momento, el array tendrá 11 elementos (de 0 a 10), los 5 primeros con
los valores que antes tenía y los nuevos elementos tendrán un valor cero, que es el valor
Si sólo usamos ReDim a(10), también tendremos once elementos en el array, pero
todos tendrán un valor cero, es decir, si no se usa Preserve, se pierden los valores
contenidos en el array.
que ReDimensionarlo con el mismo número de dimensiones que tenía, ya que Erase sólo
borra el
contenido, no la
Ing. Alberto Moreno Cueva
Página
1132
definición del array.
Console.Write y WriteLine.
Nota: El formato especificado en la cadena usada en los métodos Write y WriteLine será
el mismo que se puede usar con el método Format de la clase String, por tanto, lo aquí
Los marcadores se indican con un número encerrado entre llaves, los números indicarán
el número u orden del parámetro que siga a la cadena en el que está ese marcador.
sucesivamente.
Por ejemplo, para mostrar los valores de dos parámetros usaremos algo como esto:
Console.WriteLine("{0} {1}", i, j)
En este ejemplo, el {0} se sustituirá por el valor de la variable i, y el {1} por el valor de
la variable j.
decir, si usamos el marcador {3}, debería existir ese parámetro, en caso de que haya
Un array permite referirse a una serie de elementos del mismo tipo con un mismo nombre que
están almacenados de forma contigua en la memoria, y hace referencia un único elemento de la
serie utilizando uno o más índices, como un vector o una matriz en Álgebra.
Y se ha llenado así:
V(0)=15
V(1)=21
V(2)=7
V(3)=18
V(4)=4
Índices de Filas
M
Y se ha llenado así:
M(0,0)=0
M(0,1)=1
M(0,2)=2
M(0,3)=3
M(1,0)=4
M(1,1)=5
etc.
Nótese que para llenar una matriz se indica en que fila y columna se va a llenar. Por ejemplo
Por su ámbito:
Dim o Private. La declaración de un array a nivel del módulo o del formulario se hace en la
sección de declaraciones del módulo o del formulario utilizando la sentencia
Por su tamaño:
Ejemplo:
Este ejemplo declara un array de una dimensión, llamado vector, con veinte elementos,
vector(0), vector(1), ... , vector(19), cada uno de los cuales permite almacenar un Double. Salvo
que se indique otra cosa, los índices se empiezan a contar en cero.
Este ejemplo declara un array de dos dimensiones, llamado matriz, con 4 x 6 elementos,
El ejemplo anterior declara un array de una dimensión, cadena, con doce elementos,
caract(0), ... , caract(12), cada uno de los cuáles permite almacenar una cadena de caracteres.
Arrays dinámicos, cuya dimensión se puede modificar durante la ejecución del programa.
El espacio necesario para un array estático se asigna al iniciarse el programa y permanece fijo
durante su ejecución. El espacio para un array dinámico se asigna durante la ejecución del
programa. Un array dinámico, puede ser redimensionado en cualquier momento de la ejecución.
La forma mejor de redimensionar los arrays es mediante variables.
Para crear un array dinámico primero hay que declararlo como si fuera una array estático, pero sin
darle
Ing. Alberto Moreno Cueva
Página
1135
dimensión. Es decir, se deja la lista -entre paréntesis- vacía sin ponerle ningún número. Esto se
hace con la sentencia Public si se quiere que sea global, con Dim o Private si se quiere a nivel de
módulo o con Static, Dim o Private si se quiere que sea local.
Para asignar el número actual de elementos del array se utiliza la sentencia ReDim. La
Ejemplo:
más tarde, un procedimiento Calculo puede asignar espacio para el array, como se indica a
continuación:
Sub Calculo( )
...
ReDim Matriz(F, C)
...
End Sub
Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el array se
pierden (si son Variant se ponen a Empty; si son numéricos a cero y si son cadenas de caracteres
a la cadena vacía). Cuando interese cambiar el tamaño del array conservando los valores del
array, hay que ejecutar ReDim con la palabra clave Preserve.
Ejemplo :
Ejemplo
Ejemplo
V1.CopyTo(V2,0) à Aquí se esta copiando en el arreglo V2 a partir de la posición 0 los datos que
hay en el arreglo V1
Casi siempre el índice menor será 0 al no ser que el arreglo empiece con otro índice.
Ejemplos
Ing. Alberto Moreno Cueva Prácticos en
Página
1137
Vb Net (Arreglos)
Hacemos un for desde 0 hasta el índice mayor del arreglo en este caso 4
For I = 0 To Vec.GetUpperBound(0)
Me.ListBox1.Items.Add(vec(I))
Next
End Sub
End Class
Dim V () As Int16
Sub Listar()
Dim i As Int16
Me.ListBox1.Items.Clear()
For i = 0 To V.GetUpperBound(0)
Me.ListBox1.Items.Add(V(i))
Next
End Sub
Aqui se el asigna un elemento al vector (el índice de ese elemento será 0) ni bien carga el
formulario
End Sub
End Sub
End Class
3.- Llene un vector de 100 elementos con números aleatorios sin que estos se repitan y
muéstrelos en un listbox
For I = 0 To Vec.GetUpperBound(0)
If Vec(I) = N Then
Estado = True
Exit For
End If
Next
BuscarItem = Estado
End Function
Me.ListBox1.Items.Clear()
Do While J <= Vec.GetUpperBound (0) Aquí se inicia el bucle para llenar los datos al vector
Vec(J) = N
End If
Loop
End Sub
End Class
Además hay un botón Buscar que mostrar un INPUTBOX donde se ingresara el nombre de un
país, si ese país existe en el arreglo se seleccionara del Listbox, caso contrario se mostrara un
mensaje indicando que No existe
Dim I As Integer = 0
Se incrementa la variable es la que controla la posición del elemento que se esta llenando en le
vector
I=I+1
Ing. Alberto Moreno Cueva
Página
1141
Aquí se muestra el mensaje y la respuesta se guarda en la variable Rpta (Son 2 posibles
respuestas Si VbYes y No VbNo)
End Sub
Dim I%
For I = 0 To V.GetUpperBound(0)
Me.ListBox1.SelectedIndex = I
Estado = True
End If
Next
End If
End Sub
End Class
Sub Llenar ()
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
Me.ListView1.Items.Add(m(F, 0))
For C = 1 To m.GetUpperBound(1)
Me.ListView1.Items(F).SubItems.Add(m(F, C))
Next
Next
End Sub
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
For C = 0 To m.GetUpperBound(1)
Next
Next
Me.ListView1.View = View.Details
Call Llenar()
End Sub
End Class
Ing. Alberto Moreno Cueva
Página
1143
Bueno para este ejercicio 5 tenemos que tener en cuenta algo:
Se esta utilizando un Listview para poder mostrar los datos de la matriz, este control permite
tener varias columnas y filas como si se tratase de una tabla
Aquí se esta agregando una columna llamada que tiene de ancho 40 y su alineación será al
centro
Me.ListView1.View = View.Details
Esto hace que se vea las columnas, ya que sin esta propiedad no se podría ver los encabezados
de las columnas ni tampoco todas las filas creadas.
Me.ListView1.Items.Add( Peru )
En este ejemplo se esta agregando Perú al listview, cada vez que se agrega un Ítem al Listview
este toma un índice que empezara de 0
Que pasaría si queremos seguir llenando mas países en la misma fila pero en otras columnas?
Me.ListView1.Items(0).SubItems.Add( Bolivia )
Aquí dice que Bolivia será un SubItem de la fila 0 ósea se mostrara en otra columna que no sea la
principal (La principal seria la columna 0)
6.- Llene 2 matrices con números aleatorios y en una tercera matriz guarde la suma de las 2
anteriores, muestre las matrices en Listview
Lista.View = View.Details
End Sub
Se crea un procedimiento llamado Llenar este recibe como parámetro el listview y el arreglo al
cual llenara el Listview enviado
Dim F%, C%
For F = 0 To X.GetUpperBound(0)
Lista.Items.Add(X(F, 0))
For C = 1 To X.GetUpperBound(1)
Lista.Items(F).SubItems.Add(X(F, C))
Next
Next
End Sub
Dim F%, C%
For F = 0
Ing. Alberto Moreno Cueva To
Página
1145
m1.GetUpperBound(0)
For C = 0 To m1.GetUpperBound(1)
Next
Next
For F = 0 To m2.GetUpperBound(0)
For C = 0 To m2.GetUpperBound(1)
Next
Next
For F = 0 To m3.GetUpperBound(0)
For C = 0 To m3.GetUpperBound(1)
Next
Next
Call FormatoLista(Me.ListView2)
Call FormatoLista(Me.ListView3)
End Sub
End Class
7.- Llene 1 matriz con números aleatorios muestrela en un ListView, Al hacer click en el botón
Calcular se debe de mostrar la suma de su diagonal principal y secundaria.
Dim F%, C%
For F = 0 To m.GetUpperBound(0)
Me.ListView1.Items.Add(m(F, 0))
For C = 1 To m.GetUpperBound(1)
Me.ListView1.Items(F).SubItems.Add(m(F, C))
Next
Next
End Sub
For C = 0 To m.GetUpperBound(1)
Next
Next
Se le da formato al ListView
Me.ListView1.View = View.Details
Call Llenar()
End Sub
For F = 0 To m.GetUpperBound(0)
For C = 0 To m.GetUpperBound(1)
If F = C Then
End If
If F + C = 4 Then
End If
Next
Next
Me.lbldiag1.Text = Suma1
Me.lbldiag2.Text = Suma2
End Sub
1.- Al hacer clic en un botón Agregar se ingresara en un InputBox una cadena, esta cadena se
agregara a un vector dinámico y se mostrara en un listbox.
Luego se deberá de ingresar Una letra en una caja de texto, al hacer clic en un botón Buscar se
debe de mostrar la cantidad de veces que se repite esa letra en todo el arreglo dinámico.
Al hacer clic en un botón Separar se deberá de recorrer el arreglo anterior y se separaran los
pares de los
Ing. Alberto Moreno Cueva
Página
1148
impares en arreglos diferentes.
3.- Llenar una matriz de 5 x 5 con números aleatorios sin que estos se repitan, luego mostrarlos en
un ListView
4.- Llenar un vector de 25 elementos con números aleatorios, luego pasarlo a una matriz de 5 x 5
5.- Llenar 2 matrices de 5 x 5 con números aleatorios, luego se deberá de escoger entre un grupo
de opciones (Radiobutton) un signo de operación que podrá ser +, - , *, /.
Al hacer clic en un botón Calcular se deberá de llenar una tercera matriz con la operación
seleccionado entre la matriz 1 y la matriz 2, es decir si se escoge el signo por ejemplo se
deberá de sumar cada elemento de la matriz 1 con la matriz 2
Luego se debe de ingresar un número, si este existe se debe de eliminar dicho número del
arreglo.
Luego la hacer clic en un botón Resumen debe de salir en un listbox los números que se
generaron en el arreglo pero sin repetirse.
ARREGLOS DE CONTROLES
EN Vb Net se puede hacer que un evento funcione para varios controles a esto se le denomina
Arreglo de controles
Por ejemplo
End Sub
Ing. Alberto Moreno Cueva
Página
1149
Lo que se tiene que hacer es agregar los otros controles con su evento click
End Sub
Case "Nuevo"
Call limpia()
Case "Calcular"
Call calcular()
Case "Salir"
End
End Select
End Sub
Donde sender.text devuelve el valor de la propiedad Text del botón al cual se hizo click.
Ahora miren lo
Ing. Alberto Moreno Cueva que se
Página
1150
programo en el Textbox1 en le evento keypress
Case 48 To 57
Case Else
e.Handled = True
End Select
End Sub
Esta programación sirve para que le texto solo acepte números, pero si nos damos cuenta este
evento también funcionara para el textbox2, textbox3 y textbox4
Bueno aquí encontramos los procedimientos que son llamados cuando se presiona el botón
Calcular y Nuevo
Sub limpia()
obj.text = ""
End If
Next
End Sub
Sub calcular()
End If
Next
End Sub
''Aquí se esta creando el evento click para MIBOTON1 (que serán todos los botones)
MsgBox(sender.tag)
End Sub
Dim i As Integer
For i = 1 To 3
Miboton.Tag = i ''Se le pone un valor a la propiedad TAG para diferenciarlo de los demás
Next
End Sub
End Sub
Noten que aquí se esta programando en todos los signos ya que es un arreglo.
txtnum.Text = ""
End Sub
End Select
txtnum.Text = res
End Sub
End Class
La idea es que vayan saliendo los bolos uno por uno, pero para eso
antes en el arreglo ya debe de estar los números generados
La idea es llenar los botones con los números que tendrá este arreglo.
La función Buscar recibe un numero que es el numero que se va a buscar, además recibe otro
parámetro (por referencia) este parámetro será el arreglo donde se piensa buscar el numero
Ing. Alberto Moreno Cueva
Página
1154
Si el numero se encuentra en el arreglo la función devolverá true caso contrario devolverá
false
If N = V (I) Then
Sw = True
Exit For
End If
Next
Buscar = Sw
End Function
El procedimiento Llenar" se encarga de llenar un arreglo con números aleatorios sin que estos se
repitan, recibe un parámetro llamado (por referencia) este parámetro será el arreglo donde se
piensa llenar los números aleatorios
Dim I%, N%
v(I) = N
I += 1
End If
Loop
End Sub
Sub LlenaCartilla ()
I += 1
End If
Next
End Sub
NOTA: Hay que tener en cuenta que al botón Jugar se le debe poner en la propiedad TAG la
letra
Sub BuscarEnCartilla ()
Obj.enabled = False
Cont += 1
Exit For
End If
End If
Next
If Cont = 25 Then
End If
End Sub
Call LlenaCartilla ()
Nro = 0
Cont = 0
Me.Timer1.Enabled = True
End Sub
Aqui en el timer sale cada numero que hay en el arreglo Bolo y por cada numero que sale se
buscara en los botones
Timer1.Enabled = False
Nota: El timer1 deberá de estar desactivado
End If inicialmente
End Sub
End Class
ESTRUCTURAS DE DATOS
Las estructuras son parecidas que las enumeraciones pero con muchas ventajas, entre ellas que
cada elemento de la estructura puede ser de cualquier tipo integer, double, String o matriz,
además, se pueden declaran funciones dentro de la estructura, constructores, ámbito de variables
independientes.
Etc.
Ing. Alberto Moreno Cueva
Página
1157
Una declaración de estructuras empieza con la instrucción Structure, y finaliza con la instrucción
End Structure. Entre estas dos instrucciones debe declararse por lo menos un miembro.
Si desea mantener un nombre de empleado, su teléfono y su salario juntos en una única variable,
puede declarar una estructura para esta información de la siguiente manera:
Structure Empleado
End Structure
Dim R as Empleado
R
Ahora si queremos llenar los datos de varios empleados, se tendría que declarar un arreglo e
empleados
Imagelist
Es un control que va a permitir almacenar imágenes y cada imagen toma un índice empezando de
0
En la propiedad Images iremos agregando las imágenes con las cuales vamos a trabajar
Toolbar
Ing. Alberto Moreno Cueva
Página
1159
Es un control que va a permitir insertar un barra de herramientas va de la mano con el control
IMAGELIST para colocar las imágenes por cada botón
Una vez agregado el botón cambiamos sus propiedades como Text ponemos el texto que va
mostrar, en Tag se le pone un nombre que identificara al botón y en ImageIndex se selecciona
el índice de la imagen que se mostrara en ese botón.
End Select
End Sub
La propiedad e.Button.Tag recupera el valor del Tag que se le dio a cada botón.
Statusbar
Usu= Juana
Me.StatusBar1.Panels(1).Width = 350
1.- Realizar un mantenimiento al arreglo Curso que tendrá 3 campos (Codigo, Nombre y Precio)
Module Module1
Structure Curso
End Structure
End Module
Ahora en el formulario
Dim Índice%
Me.ListView1.View = View.Details
Me.ListView1.FullRowSelect = True
Call listar()
End Sub
End Sub
Else
End If
End Sub
Else
End If
End Sub
Indice = C.GetUpperBound(0) - 1
Call Mostrar(Indice)
End Sub
End Select
End Sub
Sub listar()
For I = 0 To C.GetUpperBound(0) - 1
Me.ListView1.Items.Add(C(I).Cod) : Me.ListView1.Items(I).SubItems.Add(C(I).Nom)
Me.ListView1.Items(I).SubItems.Add(C(I).precio)
Next
End Sub
Sub NUEVO()
If P = 0 Then
txtcod.Text = "C001"
Else
End If
txtnom.Focus()
End Sub
Sub GRABAR()
Dim P% : P = C.GetUpperBound(0)
Call listar()
End Sub
Sub MODIFICAR()
C(índice).precio
Ing. Alberto Moreno Cueva
Página
1165
= CDbl(txtprecio.Text) : Call listar()
End Sub
Sub ELIMINAR()
C(I) = C(I + 1)
Next
Call listar()
End Sub
2.- Realizar una consulta donde se escoja un Curso de un combo y salgan las notas de ese curso.
Para eso se deberá de crear 2 estructuras una llamad Cursos y otra llamada Notas
Structure Curso
End Structure
Structure Nota
End Structure
Sub Main ()
N(3).not2 = 16
End Sub
Nota: Cuando se ejecuta el proyecto el objeto inicial debe de ser el Sub Main .
Para eso lo que se debe de hacer es ir al Explorador de Soluciones y escoger en objeto Inicial
el Sub Main
Esto hará que el objeto a ejecutarse inicialmente sea el procedimiento creado llamado Main
Private Sub
Ing. Alberto Moreno Cueva FrmNotasCurso
Página
1167
_Load( ) Handles MyBase.Load
Dim F%
For F = 0 To C.GetUpperBound(0)
Me.CBOCURSOS.Items.Add(C(F).Nom)
Next
Me.ListView1.View = View.Details
End Sub
OP = C(Me.CBOCURSOS.SelectedIndex).Cod : Me.ListView1.Items.Clear()
R=0
For Y = 0 To N.GetUpperBound(0)
If OP = N(Y).CodCur Then
Me.ListView1.Items.Add(N(Y).nom)
Me.ListView1.Items(R).SubItems.Add(N(Y).not1)
Me.ListView1.Items(R).SubItems.Add(N(Y).not2)
R=R+1
End If
Next
lbltotal.Text = R
End Sub
Treeview
El control Treeview de formularios Windows Forms muestra una jerarquía de nodos similar al
modo en que se muestran los archivos y las carpetas en el panel izquierdo del Explorador de
Windows. Cada nodo puede contener otros nodos, que se denominan nodos secundarios. Los
nodos primarios, nodos que contiene nodos secundarios, pueden mostrarse expandidos o
contraídos. Si la propiedad CheckBoxes se establece en true, las vistas de árbol pueden mostrar
casillas de verificación junto a los nodos. Entonces, es posible activar o desactivar nodos mediante
programación establecimiento la propiedad Checked del nodo en true o false.
APLICACIÓN 1:
En esta aplicación con Treeview, se agregara un nodo raíz y en los nodos secundarios se
agregaran los datos.
Código Fuente:
TreeView1.Nodes.Add("Shapes") ‘Creando
nodo raiz
HabilitarBotones()
End Sub
Sub HabilitarBotones()
End Sub
La colección de Nodes contiene todos los objetos TreeNode secundarios asignados al actual
objeto TreeNode.
Al agregar, quitar o clonar un objeto TreeNode, se agregan o clonan todos los nodos del
arbol secundarios.
nodo.Nodes.Add("Rojo") : nodo.Nodes.Add("Verde")
End Sub
En el boton Add Formas (Shapes) => que tendra como nombre btnFormas.
nodo.Nodes.Add("Cuadrado") : nodo.Nodes.Add("Triangulo")
nodo.Nodes.Add("Circulo") : nodo.Expand()
End Sub
TreeView1.Nodes.Clear()
TreeView1.Nodes.Add("Shapes") : TreeView1.Nodes.Add("Colores")
nodo.Nodes.Add("Cuadrado") : nodo.Nodes.Add("Triangulo")
nodo.Nodes.Add("Rojo") : nodo.Nodes.Add("Verde")
nodo.Nodes.Add("Azucar") : nodo.Nodes.Add("Arroz")
nodo.Nodes.Add("Menestras") : nodo.Expand()
End Sub
‘obtiene o establece un valor que indica si los nodos de arbol de la vista del arbol estan
ordenados.
‘Es True si los nodos de arbol de la vista de arbol estan ordenados, en caso contrario ,
es false.
TreeView1.Sorted = True
End Sub
TreeView1.Sorted = True
End Sub
TreeView1.Nodes.Clear() : DeshabilitarBotones()
End Sub
Sub DeshabilitarBotones()
Try
TreeView1.Nodes.Add("Items movidos")
TreeView1.Nodes(0).Nodes.Add(nodocolor)
TreeView1.Nodes(0).Nodes.Add(nodoshape)
TreeView1.Nodes(0).Nodes.Add(nodosolidos)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Datos del Evento => El controlador de eventos recibe un argumento de tipo TreeViewEventArgs
que contiene datos relacionados con este evento. Las siguientes propiedades de
TreeViewEventArgs proporcionan información específica para el evento.
nodo = TreeView1.SelectedNode
MessageBox.Show(nodo.Text)
End Sub
Listview
Ing. Alberto Moreno Cueva
Página
1172
APLICACIÓN 2:
Configurando el ListView
Propiedades:
GridLines= True
View = Details
Name = ListView1
Agregaremos 5 Columnas:
Columna 3: ColumnHeader3
Columna 1: ColumnHeader1
Propiedades:
Text = Telefono
Name= ColumnHeader1
Width = 70
Text = Nombres y Apellidos
Column 4: ColumnHeader4
Name = ColumnHeader4
Column 5: ColumnHeader5
Text = Ciudad
Propieades:
Width = 80
Ing. Alberto Moreno Cueva
Name = ColumnHeader5
Propiedades:
Name = ColumnHeader2
Text = Direccion
Width = 120
Text = lbltotal
Text = &Adicionar Name = OptM
Label2:
Text = Masculino
Text = Total de Elementos
Button 2:
GroupBox1:
Name = CmdLimpiar
Button 4:
Name = CmdSalir
Text = Salir
Código Fuente:
LimpiarControles() : CmbCiudad.Items.Add("[Seleccione]")
CmbCiudad.Items.Add("Lima") : CmbCiudad.Items.Add("Piura")
CmbCiudad.Items.Add("Puno") : CmbCiudad.SelectedIndex = 0
End Sub
Sub LimpiarControles()
Next
End Sub
Application.Exit()
End If
End Sub
Exit Sub
End If
Lvitem = ListView1.Items.Add(txtnombres.Text)
Lvitem.SubItem
Ing. Alberto Moreno Cueva
Página
1175
s.Add(txtDireccion.Text) : Lvitem.SubItems.Add(txtTelefono.Text)
sexo = "Masculino"
Else
sexo = "Femenino"
End If
Lvitem.SubItems.Add(sexo)
lbltotal.Text = ListView1.Items.Count
End Sub
e.Handled = True
End If
End Sub
e.Handled = True
End If
End Sub
LetrasNumeros = True
Case 8,
32, 44, 46
Ing. Alberto Moreno Cueva
Página
1176
'8=retroceso,32=avance,44=coma(,),46=punto(.)
obj_1.focus()
Exit Function
Else
obj_2.focus()
End If
Case Else
Return False
End Select
End Function
SoloLetras = True
Case 8, 32, 44
Case 65 To 90
Case 97 To 122
Case 13
objtext_1.focus()
Exit Function
Else
objtext_2.Focus()
End If
Case Else
Return False
End Select
End Function
Function SoloNumeros(ByVal num As Integer, Optional ByVal obj_1 As Object = Nothing, Optional
ByVal obj_2 As Object = Nothing) As Boolean
SoloNumeros = True
Case 8, 32, 44
Case 48 To 57
Case 13
obj_1.focus()
Exit Function
Else
obj_2.focus()
End If
Case Else
End Select
End Function
e.Handled = True
End If
End Sub
Call LimpiarControles()
txtnombres.Focus()
CmbCiudad.SelectedIndex = 0
End Sub
'Limpiar ListView1
ListView1.Items.Clear()
txtnombres.Focus()
End Sub
End Class
Ejecutando el Programa:
PROCEDIMIENTOS Y FUNCIONES
DEFINIDAS POR EL USUARIO
SUB (Instrucción).- Es un conjunto de
instrucciones que el compilador procesa y se
utiliza para procesar tareas repetitivas; todo
procedimiento o subrutina tiene que, Declararse
el nombre, los argumentos, y el código que
Ing. Alberto Moreno Cueva componen el
Página
1179
cuerpo de un procedimiento Sub.( Un procedimiento no devuelve valores)
Sintaxis
End Sub
Parte Descripción
Public Opcional. Indica que el procedimiento Sub es accesible para todos los demás procedimientos de todos los
módulos. Si se usa en un módulo que contiene una instrucción Option Private, el procedimiento no está
disponible fuera del proyecto.
Private Opcional. Indica que el procedimiento Sub es accesible sólo para otros procedimientos del módulo en el que
se declara.
Static Opcional. Indica que las variables locales del procedimiento Sub se conservan entre distintas llamadas. El
atributo Static no afecta a las variables que se declaran fuera de Sub, incluso aunque se usen en el
procedimiento.
nombre Requerido. Nombre del procedimiento Sub; sigue las convenciones estándar de nombres de variable.
lista_ Opcional. Lista de variables que representan los argumentos que se pasan al procedimiento Sub cuando se le
argumentos llama. Las distintas variables se separan mediante comas.
instrucciones Opcional. Cualquier grupo de instrucciones que se ejecutan dentro del procedimiento Sub.
Parte Descripción
Optional Opcional. Palabra clave que indica que no se requiere ningún argumento. Si se usa, todos los argumentos
subsiguientes de lista_argumentos también deben ser opcionales y declararse mediante la palabra clave
Optional. Optional no se puede utilizar para ningún argumento si se usa ParamArray.
ByRef Opcional. Indica que el argumento se pasa por referencia. ByRef es el modo predeterminado en Visual Basic.
ParamArray Opcional. Sólo se utiliza como el último argumento de lista_argumentos para indicar que el argumento final es una
matriz Optional de elementos tipo Variant. La palabra clave ParamArray le permite proporcionar un número
arbitrario de argumentos. No se puede utilizar con ByVal, ByRef u Optional.
nombre_ Requerido. Nombre de la variable que representa el argumento; sigue las convenciones estándar de nombres de
variable variables.
Tipo Opcional. El tipo de datos del argumento que se pasa al procedimiento; puede ser Byte, Boolean, Integer, Long,
Currency, Single, Double, Decimal (no admitido actualmente), Date, String (solamente longitud variable), Object,
Variant, o un tipo de objeto específico. Si el parámetro no es Optional, se puede especificar también un tipo
definido por el usuario.
valor_ Opcional. Cualquier constante o expresión de constante. Sólo es válido para parámetros Optional. Si el tipo es
predeterminado Object, un valor predeterminado explícito sólo puede ser Nothing.
Comentarios
Si no se especifica explícitamente mediante Public, Private o Friend, los procedimientos Sub son
públicos de manera predeterminada. Si no se usa Static, el valor de las variables locales no se
mantiene entre distintas llamadas.
Precaución Los procedimientos Sub pueden ser recursivos; es decir, se pueden llamar a sí
mismos para realizar una tarea determinada. Sin embargo, esto puede llevar al desbordamiento
de la pila. La palabra clave Static generalmente no se utiliza con procedimientos recursivos Sub.
Las palabras clave Exit Sub causan la inmediata salida de un procedimiento Sub.
Para llamar a un procedimiento Sub, use el nombre del procedimiento seguido de la lista de
argumentos.
En este ejemplo se utiliza la instrucción Sub para declarar el nombre, los argumentos y el código
que forman el cuerpo del procedimiento Sub.
Dim X As Object
X.Text = ""
End If
Next X
End Sub
Function (Instrucción).-
Es similar a una subrutina a diferencia que va devolver un valor , de acuerdo al tipo de función
declarada.
End Function
Precaución Los procedimientos Function pueden ser recursivos; es decir, pueden llamarse a sí
mismos para realizar una tarea determinada. Sin embargo, la recursión puede provocar el
desbordamiento de pila. La palabra clave Static no se suele utilizar con procedimientos Function
recursivos.
Ing. Alberto Moreno Cueva
Página
1182
La ejecución del programa continúa con la instrucción que sigue a la instrucción que llamó al
procedimiento Function.
En este ejemplo se utiliza la instrucción Function para declarar el nombre, los argumentos y el
código que forman el cuerpo de un procedimiento Function. El último ejemplo utiliza argumentos
Optional inicializados.
El uso de la palabra clave ParamArray permite que una función acepte un número variable de
argumentos. En la siguiente definición, PrimerArg se transfiere por valor.
Ejemplo.-
con = 1
Next
Return Min
End Function
y=y+x
Next x
intSum = y
End Sub
Lbr1.Caption = intSum
Lbr3.Caption = minimo(5,7,3,8)
End Sub
Ejercicios
2) Escribir una función que dado un número entero, devuelva una señal que indique si dicho
número es primo o no.
3) Escribir una función que dados 2 números, calcule el porcentaje que el primero representa
Ing. Alberto Moreno Cueva
Página
1184
respecto del segundo.
4) Escribir una función que dados a y b devuelva el cociente de la división entera, sin utilizar el
operador correspondiente del lenguaje. Validar los tipos de datos de entrada.
5) Escribir una función que dados a y b devuelva el resto de la división entera, sin utilizar el
operador correspondiente de lenguaje. Validar los tipos de datos de entrada.
6) Escribir una función que dado un código numérico de m dígitos, separe un sub-código
consistente en una cantidad n<m de dígitos a partir del k-ésimo lugar a contar del dígito menos
significativo. Utilizarla en un programa que ingrese un listado de códigos numéricos
junto con sus correspondientes parámetros m,n y k y liste dichos códigos de entrada junto
7) Un número entero positivo se dice perfecto si es igual a la suma de todos sus divisores.
excepto el mismo.
son perfectos.
Se pide:
a) Escribir una función booleana que llamada desde un programa, permita discernir si un
b) Dar un ejemplo de cómo se hace referencia a dicha función desde un programa o desde
otro subprograma.
8) Dos números se dicen amigos cuando uno de ellos es igual a la suma de todos los divisores
del otro excepto el mismo.
Se pide:
a) escribir una función booleana que llamada desde un programa, permita discernir si dos
b) Usar otra
Ing. Alberto Moreno Cueva función para
Página
1185
calcular la suma de los divisores de un número determinado.
Ejercicios propuestos
Desarrollar los siguientes procedimientos cuyos nombres y parámetros por valor se detallan en
cada procedimiento:
10. Función SEGPALABRA el cual pasando como parámetro una FRASE, devuelva la segunda
palabra de dicha frase.
Ejemplo: SEGPALABRA CURSO VISUAL BASIC ) --------à VISUAL
11. Crear una función Recursiva FACTORIAL el cual pasando como parámetro un número
devuelva el Factorial de dicho número el procedimiento debe se recursivo.
Nota : Las funciones debe tener su respectiva llamada.
PROBLEMAS PROPUESTOS
NOTA : A cada función elaborada debe darle un nombre adecuado , deber ser llamado en
diferentes formularios (agregarlo a un módulo).
1. Función pasando como parámetro un número de mes (1 al 12), devuelva la cantidad de días
de 1dicho Mes, considere el presente año.
2. Pasando como parámetro la base y la altura de un triángulo rectángulo devuelva su
hipotenusa.
3. Pasando un monto en soles y el tipo de cambio, devuelva el monto convertido a Dólares.
Ing. Alberto Moreno Cueva
Página
1186
4. Pasando tres números devuelva el Mínimo Común Múltiplo, de dichos números.
5. Pasando un número entero de cualquier longitud, devuelva el promedio de dichas cifras.
6. Pasando un número entero de cualquier longitud, devuelva el dígito mayor.
7. Pasando un número entero de cualquier longitud, devuelva el mismo valor de manera
ordenada.
8. Pasando un número de Mes que devuelva dicho Mes en Letras.
9. Pasando una subcadena, una cadena y una posición que permita INSERTAR la subcadena en
dicha cadena a partir de una posición especificada.
Ejemplo : INSERTAR PROGRAMA VISUAL BASIC , 8) ----à VISUAL PROGRAMA BASIC
10. Pasando una cadena, una posición inicial y el número de caracteres a borrar ELIMINE una
subcadena de dicha cadena a partir de una posición especificada.
Ejemplo : DELETEAR VISUAL BASIC , 7, 6) ----à VISUAL
11. Pasando tres números que representan el día, mes y año devuelva una fecha como cadena.
Ejemplo: FECHA(02, 12, 03) ----à 02 de Diciembre del 2003
12. Pasando un valor entero de grados centígrados y un carácter ( “R”, “K”, “F”) que representan
Ranking, Kelvin y Fahrenheit respectivamente, devuelva su valor de conversión al grado
especificado.
Fecha de presentación :
Utilice ToolStrip y sus clases asociadas en nuevas aplicaciones de Windows Forms para crear
barras de herramientas que pueden tener una apariencia y un comportamiento de Windows XP,
Office, Internet Explorer o personalizados, todas ellas con o sin temas, con posibilidad de
desbordamiento y reordenación de elementos en tiempo de ejecución. Los controles ToolStrip
también proporcionan una experiencia completa en tiempo de diseño que incluye la activación y
edición en contexto, diseño personalizado, y uso compartido del espacio horizontal o vertical
dentro de un ToolStripContainer especificado.
La clase ToolStrip proporciona muchos miembros que administran el dibujo y la entrada de datos
mediante mouse (ratón) y teclado, además de la funcionalidad de arrastrar y colocar. Utilice la
clase
Ing. Alberto Moreno Cueva
Página
1187
ToolStripRenderer con la clase ToolStripManager para tener aún más control y posibilidad de
personalización del estilo de dibujo y de diseño de todos los controles ToolStrip en un formulario
Windows Forms.
Los elementos siguientes están diseñados específicamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Están
disponibles de forma predeterminada en tiempo de diseño para el control ToolStrip:
• ToolStripButton
• ToolStripSeparator
• ToolStripLabel
• ToolStripDropDownButton
• ToolStripSplitButton
• ToolStripTextBox
• ToolStripComboBox
Utilice la clase ToolStripControlHost para alojar cualquier otro control de formularios Windows
Forms en ToolStrip.
Ejemplo 18
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
MessageBox.Show("texto","titulo",boton,Icono)
End
End If
Boton Salir:
End
End If
InputBox. Se utiliza cuando se necesita que el usuario introduzca alguna información. La síntaxis
Ing. Alberto Moreno Cueva correcta es:
Página
1190
InputBox(mensaje,titulo)
Ejemplo:
OpenFileDialog
ColorDialog
FontDialog
Es un control que muestra la caja de dialogo para seleccionar el tipo de fuente de una letra
Ejemplo :
Cuando se haga click en el botón Abrir se debe de seleccionar una imagen BMP y ponerla en el
picturebox, el botón pintar deberá de seleccionar un color y un tipo de fuente para el label que dice
hola que tal , por ultimo el botón escuchar permitirá seleccionar un archivo mp3 y reproducirlo en
el Windows media player.
Boton Abrir
Op.FilterIndex = 2 seleccionamos por defecto el filtro 2 que seria BMP (si fuera 1 seria JPG)
End If
Boton Abrir
End If
Label1.Font = Fo.Font
End If
Ojo: aqui se mostraran dos ventanas , primero la del color y luego la del tipo de fuente.
Boton Escuchar
Op.FilterIndex = 1
win.URL = Op.FileName
End If
Los cuadros de dialogos estan disponibles en el Framework .NET. Exploraremos los cuadros de dialogo
FontDialog, ColorDialog, SaveFileDialog, OpenFileDialog, PrintDialog, PrintDocumet, PageSetupDialog y
MainMenu.
Cuando se crea una instancia de PageSetupDialog, se establecen las propiedades de lectura y escritura
en sus valores iniciales. Para obtener una lista de esos valores, vea el constructor PageSetupDialog.
El control RichTextBox permite al usuario escribir y modificar texto, al tiempo que proporciona
características de formato más avanzadas que el control TextBox estándar. El texto se puede asignar
directamente al control o se puede cargar desde un archivo de formato de texto enriquecido (RTF) o de
texto sin formato. Al texto del control se le puede asignar formato de carácter y párrafo.
Abrir Salir
Name = MnuGuarda
Name = MnuCortar
Edicion
Pegar
Propiedad:
Name = MnuPegar
Name = MenuItem8
Seleccionar Todo
Deshacer
Name = MnuSelTodo
Name = MnuDeshacer
Rehacer
Name = MnuRehacer
MENU FORMATO
Copiar Configuración del Menú Formato:
Name = MnuFuente
CODIGO FUENTE
Option Strict On
Imports System.io
Imports System.Drawing.Printing
End Sub
If Me.RichTextBox1.Modified Then
Return False
Else
Return True
End If
Ing. Alberto Moreno Cueva
Página
1197
Else
Return True
End If
End Function
If DeshacerCambios() Then
OpenFileDialog1.InitialDirectory = "c:\temp"
fName = OpenFileDialog1.FileName
Case 1
RichTextBox1.LoadFile(fName, RichTextBoxStreamType.PlainText)
Case 2
RichTextBox1.LoadFile(fName, RichTextBoxStreamType.RichText)
End Select
End If
End If
lblruta.Text = fName
End If
End Sub
SaveFileDialog1.InitialDirectory = "c:\temp"
Case 1
RichTextBox1.SaveFile(SaveFileDialog1.FileName, _
RichTextBoxStreamType.PlainText)
Case 2
RichTextBox1.SaveFile(SaveFileDialog1.FileName, _
RichTextBoxStreamType.RichText)
End Select
End If
End If
End Sub
Try
End If
PageSetupDialog1.PageSettings = mStoredPageSettings
PageSetupDialog1.ShowDialog()
Catch ex As Exception
End Sub
Try
Try
PrintDocument1.DocumentName = fName
PrintDialog1.Document = PrintDocument1
Else
PrintDocument1.Print()
End If
Finally
streamParaImprimir.Close()
End Try
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
linea = streamParaImprimir.ReadLine()
Exit While
End If
contador += 1
End While
ev.HasMorePages = True
Else
ev.HasMorePages = False
End If
End Sub
End
Ing. Alberto Moreno Cueva
Página
1201
End Sub
End Sub
End Sub
Me.RichTextBox1.Copy()
End Sub
Me.RichTextBox1.Cut()
End Sub
Try
Me.RichTextBox1.Paste()
End Try
End Sub
End Sub
FontDialog1.Font = Me.RichTextBox1.SelectionFont
Else
Me.FontDialog1.Font = Nothing
End If
FontDialog1.ShowApply = True
Me.RichTextBox1.SelectionFont = Me.FontDialog1.Font
End If
End Sub
ColorDialog1.Color = Me.RichTextBox1.ForeColor
ColorDialog1.ShowDialog()
Me.RichTextBox1.SelectionColor = ColorDialog1.Color
ColorDialog1.Dispose()
ColorDialog1 = Nothing
End Sub
End Class
Resultado:
Ejemplo 19
El ejemplo de código siguiente crea una aplicación que le permite al usuario abrir los archivos de
texto enriquecido (.rtf) dentro del control RichTextBox.
' The following example displays an application that provides the ability to
' open rich text files (rtf) into the RichTextBox. The example demonstrates
' using the FolderBrowserDialog to set the default directory for opening files.
' The OpenFileDialog class is used to open the file.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.IO
' Bring up a dialog to chose a folder path in which to open or save a file.
Private Sub folderMenuItem_Click(sender As object, e As System.EventArgs) _
Handles folderMenuItem.Click
' Show the FolderBrowserDialog.
Dim result As DialogResult = folderBrowserDialog1.ShowDialog()
If ( result = DialogResult.OK ) Then
folderName = folderBrowserDialog1.SelectedPath
If (not fileOpened) Then
' No file is opened, bring up openFileDialog in selected path.
openFileDialog1.InitialDirectory = folderName
openFileDialog1.FileName = nothing
openMenuItem.PerformClick()
End If
End If
End Sub
End Class
Explorador de Archivos.
Form1.vb
Combobox1
Ing. Alberto Moreno Cueva
Página
1208
Name = CbUnidades
DropDownStyle = DropDownList
ListBox1
Name = lbCarpetas
Listbox2
Name = lbArchivos
Código Fuente:
Imports System.IO
cbUnidades.SelectedIndex = cbUnidades.Items.Count - 1
End If
Next
End Sub
Next
End Sub
Next
Else
End If
End Sub
Path.DirectorySeparatorChar & _
lbArchivos.Text
tbContenido.Text = SRArchivo.ReadToEnd
End Sub
Path.DirectorySeparatorChar & _
lbArchivos.Text
SRArchivo.Write(tbContenido.Text)
End Sub
End Class
Simple código fuente de muestra en visual basic.net que usa un formulario MDI para abrir y crear
archivos de texto
El mismo consta de un form Mdi principal que tiene la opción para crear un nuevo formulario Mdi
Child, creando una nueva instancia ( en este caso de formulario frmDoc).
Este form tiene un Richtextbox donde se puede cargar o crear un archivo de texto. Para leer el
documento se usa el método Loadfile y para guardarlo con saveFile
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la
Ayuda, en función de la configuración activa o la edición. Para cambiar la configuración, elija la
opción Importar y exportar configuraciones en el menú Herramientas.
Esto habilitará al menú Ventana para que mantenga una lista de ventanas secundarias MDI
abiertas, con una marca de verificación junto a la ventana secundaria activa.
Nota
El formulario secundario MDI que creará en este paso es un formulario Windows Forms
estándar. Por tanto, tendrá una propiedad Opacity, que permite controlar la transparencia del
formulario. Sin embargo, la propiedad Opacity está diseñada para ventanas de alto nivel. No la
utilice con formularios MDI secundarios, porque pueden surgir problemas.
Esto hace que el control RichTextBox llene por completo el área del formulario MDI
secundario, aunque se cambie el tamaño del formulario.
7. Cree un controlador de eventos Click para el elemento de menú Nuevo. Para obtener
informaci
Ing. Alberto Moreno Cueva
Página
1213
ón sobre cómo crear controladores de eventos.
8. Inserte el código siguiente para crear un nuevo formulario MDI secundario cuando el
usuario haga clic en el elemento de menú Nuevo.
Nota
En el ejemplo siguiente, el controlador de eventos controla el evento Click para MenuItem2.
Tenga presente que, en función de las características específicas de la arquitectura de la
aplicación, podría ser que el elemento de menú Nuevo no fuese MenuItem2.
9. Visual Basic
10. Protected Sub MDIChildNew_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem2.Click
11. Dim NewMDIChild As New Form2()
12. 'Set the Parent Form of the Child window.
13. NewMDIChild.MdiParent = Me
14. 'Display the new form.
15. NewMDIChild.Show()
16. End Sub
Cuando se crea un control definido por el usuario (User Controls), la ventaja es el siguiente:
• Contienen sus propias variables, así como la definición de los métodos y propiedades de
los controles incluidos en el User Control.
• Estos controles pueden ser utilizados más de una vez sin causar conflictos a las
propiedades y métodos.
• Para crear un User Control, debemos definir el proyecto por medio del icono: Biblioteca de
Controles (Type Control Library), a partir de allí se puede insertar sobre este componente
los controles así como definir propiedades y eventos a dicho control.
Ejercicios Diversos
Nombre del
Seleccionar la carpeta:
Clic en:
Nombre: lsttabla
Listbox
Insertado en el
UserControl
Ing. Alberto Moreno Cueva
Página
1216
Codificando en el UserControl
Inherits System.Windows.Forms.UserControl
Get
End Get
End If
End Set
End Property
For n = 1 To 12
lsttabla.Items.Add(xnumero & " * " & n & " = " & xnumero * n)
Next
End Sub
Ing. Alberto Moreno Cueva
Página
1217
3. Luego grabar por segunda o enésima vez al proyecto
4. Clic en el menú: Generar
Name:
Name: btnsalir
Clic en la opción:
Clic en el botón:
Seleccionar la carpeta:
ComponentesTablaMultiplicar.dll
Clic en el botón:
Clic en Aceptar
End If
End Sub
End If
End Sub
End
End Sub
Ejemplo02 (Crear un componente que nos permita almacenar notas y calcule su promedio y
su observación)
Carpeta: C:\Componentes02
Clic en:
ControlNotas.v
Usercontrol
5. Seleccionar el área de trabajo del usercontrol, Name: frmcontrolnotas
6. Diseño en el Usercontrol
GroupBox
Name:
Name:
Name: Name:
Name: txtobservacion
Name: txtpromedio
Name: txtnota4
Inherits System.Windows.Forms.UserControl
Private n1, n2, n3, n4, promedio As Single (Variable para las notas y promedios)
Get
End Get
Return
• n1=almacena al value
Else • Se invoca al
procedimiento:
n1 = Value Calculo_promedio
• Se invoca a la función:
Call calculo_promedio() calculo_observa por
medio de la variable obs
obs = calculo_observa(promedio)
End If
End Set
End Property
Get
End Get
Return
• n2=almacena al value
Else • Se invoca al
procedimiento:
n2 = Value Calculo_promedio
• Se invoca a la función:
Call calculo_promedio() calculo_observa por
medio de la variable obs
obs = calculo_observa(promedio)
End If
End Set
End Property
Verifica si el value almacena los
valores: 0,-1,21 si es así se cancela
con return
Propiedad mn3 que almacena la nota3
Get
End Get
Return
• n3=almacena al value
Else • Se invoca al
procedimiento:
n3 = Value Calculo_promedio
• Se invoca a la función:
Call calculo_promedio() calculo_observa por
medio de la variable obs
obs = calculo_observa(promedio)
End If
End Set
End Property
End Get
Return
• n4=almacena al value
Else • Se invoca al
procedimiento:
n4 = Value Calculo_promedio
• Se invoca a la función:
Call calculo_promedio() calculo_observa por
obs = calculo_observa(promedio)
End If
End Set
End Property
End Sub
End Select
txtobservacion.Text = obs
End Function
Get
• Almacenando la variable
mpromedio = promedio promedio hacia la propiedad
mpromedio
End Get
End Set
End Property
Get
• Almacenando la variable obs
mobserva = obs hacia la propiedad mobserva
End Get
End Set
End Property
Get
End Get
Si value=0 entonces el valor del
Set(ByVal Value As String)
cuadro de texto txtnota1 es
If Value = 0 Then txtnota1.Text = ""
End Set
End Property
Get
End Get
Si value=0 entonces el valor del
Set(ByVal Value As String)
cuadro de texto txtnota2 es
If Value = 0 Then txtnota2.Text = ""
End Set
End Property
Get
End Get
Si value=0 entonces el valor del
Set(ByVal Value As String)
cuadro de texto txtnota3 es
If Value = 0 Then txtnota3.Text = ""
End Set
Ing. Alberto Moreno Cueva
Página
1229
End Property
Get
End Get
End Set
End Property
If Asc(e.KeyChar) = 13 Then
Si la longitud de txtnota1 es = 0, entonces
If Len(txtnota1.Text) = 0 Then se toma el enfoque de txtnota1
txtnota1.Focus()
Else
mn1 = Val(txtnota1.Text)
Si el rango es de 0 a 20, entonces se almacena el
txtnota2.Focus() valor de txtnota1 en: mn1
Else
txtnota1.Text = ""
Si el rango no es de 0 a 20 entonces se limpia el cuadro
de texto: txtnota1 y se toma el enfoque
Ing. Alberto Moreno Cueva
Página
1230
txtnota1.Focus()
End If
End If
End If
End Sub
If Asc(e.KeyChar) = 13 Then
Si la longitud de txtnota2 es = 0, entonces
If Len(txtnota2.Text) = 0 Then se toma el enfoque de txtnota2
txtnota2.Focus()
Else
mn2 = Val(txtnota2.Text)
Si el rango es de 0 a 20, entonces se almacena el
txtnota3.Focus() valor de txtnota2 en: mn2
Else
txtnota2.Text = ""
Si el rango no es de 0 a 20 entonces se limpia el cuadro
txtnota2.Focus() de texto: txtnota2 y se toma el enfoque
End If
End If
End If
End Sub
Else
mn3 = Val(txtnota3.Text)
Si el rango es de 0 a 20, entonces se almacena el
txtnota4.Focus() valor de txtnota3 en: mn3
txtnota3.Focus()
End If
End If
End If
End Sub
If Asc(e.KeyChar) = 13 Then
Si la longitud de txtnota4 es = 0, entonces
If Len(txtnota4.Text) = 0 Then se toma el enfoque de txtnota4
txtnota4.Text = ""
Else
mn4 = Val(txtnota4.Text)
Si el rango es de 0 a 20, entonces se almacena el
txtobservacion.Focus() valor de txtnota4 en: mn4
Else
End If
End If
End If
End Sub
End If
End Sub
End If
End Sub
End If
End Sub
End If
End Sub
Clic en:
Carpeta: C:\Componentes02
Name:
Name:
Name:
Name: txtcorreo
Herramienta: Tooltip,
sirve para crear
mensajes emergentes
Invocando al control
Private xprom As New Componentes2.frmcontrolnotas con el objeto xprom
With xprincipal
.ShowShortcut = True
End With
With xnuevo
.Shortcut = Shortcut.CtrlN
.ShowShortcut = True
End With
With xcancelar
.ShowShortcut = True
End With
End With
With xsalir
.Shortcut = Shortcut.CtrlS
.ShowShortcut = True
End With
With xprincipal.MenuItems
.Add(xnuevo)
Agregando las opciones a
.Add(xcancelar) xprincipal
.Add(xraya)
.Add(xsalir)
End With
Menu = xmenu
End Sub
Next
End With
xprom.tmn3 = 0
xprom.tmn4 = 0
End Sub
End If
Next
End Sub
End
End Sub
Txtcodigo KeyPress
If Asc(e.KeyChar) = 13 Then
If Len(txtcodigo.Text) = 0 Then
txtcodigo.Focus()
Else
txtpaterno.Focus()
End If
End If
End Sub
Txtpaterno KeyPress
If Asc(e.KeyChar) = 13 Then
If Len(txtpaterno.Text) = 0 Then
txtpaterno.Focus()
Else
txtmaterno.Focus()
End If
End Sub
Txtpaterno TextChanged
If IsNumeric(txtpaterno.Text) Then
txtpaterno.Text = ""
txtpaterno.Focus()
End If
End Sub
Txtmaterno KeyPress
If Asc(e.KeyChar) = 13 Then
If Len(txtmaterno.Text) = 0 Then
txtmaterno.Focus()
Else
txtnombres.Focus()
End If
End If
End Sub
Txtmaterno TextChanged
Private Sub
Ing. Alberto Moreno Cueva txtmaterno_Te
Página
1242
xtChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles
txtmaterno.TextChanged
If IsNumeric(txtmaterno.Text) Then
txtmaterno.Text = ""
txtmaterno.Focus()
End If
End Sub
Txtnombres KeyPress
If Asc(e.KeyChar) = 13 Then
If Len(txtnombres.Text) = 0 Then
txtnombres.Focus()
Else
txtcorreo.Focus()
End If
End If
End Sub
Txtnombres TextChanged
If IsNumeric(txtnombres.Text) Then
txtnombres.Text = ""
End If
End Sub
Txtcorreo
If Asc(e.KeyChar) = 13 Then
If Len(txtcorreo.Text) = 0 Then
txtcorreo.Focus()
Else
xprom.Focus()
End If
End If
End Sub
Debe ingresar el nombre del postulante (tenga en cuenta el tiempo aun no se ejecuta)
En total son 50 preguntas que se deben contestar por medio de una opción (trabajo
determinado para los usuarios finales aquí el time ya se toma en cuenta).
Por cada pregunta se debe desplazar hacia la siguiente respuesta teniendo la opción de
regresar y corregir la pregunta contestada al final debe mostrarle su nota en un mensaje.
Cuando cierra la ventana notara que hay otro mensaje si ha reprobado su examen.
Como resultado final de la operación se debe generar un archivo de texto en la carpeta bin
de la aplicación con un resumen de su examen.
E aquí un demo que le servirá como crear dicha aplicación para que después lo aplique en
su trabajo de medio ciclo correspondiente.
Crear una aplicación teniendo en cuenta los siguientes criterios (las iníciales de los
apellidos y nombres).
Luego procederá a agregar un proyecto con el siguiente nombre (siga los padrones que ya
se le indicaron) en mi caso gahProExamenNet
Agregar un modulo para la declaraciones de los arrays que manejaran las los datos de la
aplicación con el siguiente nombre que ya se les indico en mi caso gahModuleExamenNet
mostrara la siguiente ventana.
Tenga en cuenta q el tiempo de las preguntas es de 20 seg. Por cada una de no contestarla
debe pasar a la siguiente pregunta para no regresar a corregirla si la contesta en forma
incorrecta tiene la posibilidad de regresar a corregirla, el botón terminar solo sebe mostrase
cuando contesto la última pregunta.
S(L) = rbt2.Text
O(L) = "B"
S(L) = rbt3.Text
O(L) = "C"
S(L) = rbt4.Text
O(L) = "D"
Correctas()
Dim NA As String
Dim x As Int32
For x = 0 To O.GetUpperBound(0)
If Convert.ToString(A.GetValue(x)) = Convert.ToString(O.GetValue(x)) And
Convert.ToString(O.GetValue(x)) <> "" Then
Correctos += 1
Ing. Alberto Moreno Cueva
Página
1253
ElseIf Convert.ToString(A.GetValue(x)) <> Convert.ToString(O.GetValue(x)) And
Convert.ToString(O.GetValue(x)) <> "" Then
Incorrectos += 1
Else
SinLlenar += 1
End If
Next
MessageBox.Show("Su Nota es :" & Correctos & "", "Fin del Exámen",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
'determina la ruta para q el archivo tome el nombre del usuario q esta dando el
examen.
NA = Application.StartupPath & "\" & NOM & ".txt"
'crea un archivo para escritura
FileOpen(1, NA, OpenMode.Binary, OpenAccess.ReadWrite)
'por cada fila del archivo se escribe el contenido de la variables
FilePut(1, "Su nombre es : " & NOM & " ")
' la funcion vbcrlf salta una linea a la izquierda
FilePut(1, vbCrLf)
FilePut(1, vbCrLf)
FilePut(1, "Su nota es : " & Correctos & "")
FilePut(1, vbCrLf)
FilePut(1, vbCrLf)
FilePut(1, " Resultados finales en : " & TIEMPO & " min fecha : " & Now.Day & " / " &
Now.Month & " / " & Now.Year)
FilePut(1, vbCrLf)
FilePut(1, "-------------------------------------------------------------")
FilePut(1, vbCrLf)
FilePut(1, vbCrLf)
FilePut(1, " Correctas - Marcadas ")
FilePut(1, vbCrLf)
FilePut(1, "---------------------------------------")
FilePut(1, vbCrLf)
'la funcion getupperbound determina el valor del indice
For x = 0 To A.GetUpperBound(0)
'getvalue captura el contenido de la variable
'convert.tostring pasa un valor determinado a una cadena
If Convert.ToString(A.GetValue(x)) = Convert.ToString(O.GetValue(x)) And
Convert.ToString(O.GetValue(x)) <> "" Then
FilePut(1, "" & x + 1 & ")" & " " & Convert.ToString(A.GetValue(x)) & " "
&_
Convert.ToString(O.GetValue(x)) & " CORRECTA")
FilePut(1, vbCrLf)
ElseIf Convert.ToString(A.GetValue(x)) <> Convert.ToString(O.GetValue(x)) And
Convert.ToString(O.GetValue(x)) <> "" Then
FilePut(1, "" & x + 1 & ")" & " " & Convert.ToString(A.GetValue(x)) & " "
&_
Convert.ToString(O.GetValue(x)) & " INCORRECTA")
FilePut(1, vbCrLf)
Ing. Alberto Moreno Cueva Else
Página
1254
FilePut(1, "" & x + 1 & ")" & " " & Convert.ToString(A.GetValue(x)) & " "
&_
Convert.ToString(O.GetValue(x)) & " EN BLANCO")
FilePut(1, vbCrLf)
End If
Next
'cierra al archivo de escritura
FileClose(1)
Me.Hide()
FR.ShowDialog()
L -= 1 : POS -= 1
PicSig.Enabled = True
If L <= 0 Then
L = 0 : POS = 1 : PicAnt.Enabled = False
PicSig.Enabled = True
End If
Mostrar(L)
grbNPre.Text = "Pregunta " & POS
rbt1.Checked = False
rbt2.Checked = False
rbt3.Checked = False
rbt4.Checked = False
L += 1 : POS += 1
PicAnt.Enabled = True
If L >= 4 Then 'L determina la longitud del array
L = 4 : POS = 5 : PicSig.Enabled = False ' Pos determina el indice del array
PicAnt.Enabled = True
End If
Mostrar(L)
grbNPre.Text = "Pregunta " & POS
Sub Salir()
If Correctos > 10 Then
MessageBox.Show("Estas bien , progresando", "Observación")
Else
MessageBox.Show("Estudie e Intente Otra Vez", "Atención")
End If
Application.Exit()
End sub
Salir()
Las clases
Definen la estructura que van a tener los objetos que se creen a partir de ella, indicando que
propiedades y métodos tendrán los objetos.
Los objetos
Se crean a partir de una serie de especificaciones o normas que definen como va a ser el objeto,
esto es lo que en POO se conoce como una clase.
Las propiedades definen los datos o información del objeto, permitiendo modificar o consultar su
estado, mientras que los métodos son las rutinas que definen el comportamiento del objeto.
Para explicar la creación de clases usaremos un ejemplo sencillo basado en una clase principal
"bicicleta".
Para crear una clase debemos definir sus propiedades y sus métodos, en este ejemplo se usan
los siguientes términos como propiedades de la clase bicicleta: Modelo, Precio,
NumeroDeVelocidades y Velocidad; como métodos de la clase se usan: Acelerar(km) , Frenar() y
ConsultarVelocidad().
Nuestra clase bicicleta consta de varias propiedades y métodos, las palabras Private y Public
definen la accesibilidad de las propiedades, funciones o subrutinas. La definición de una propiedad
o método de tipo privado indica que sólo podrá ser usada dentro del código de la misma clase, si
creásemos un objeto de tipo bicicleta, las especificaciones de la clase no nos permitirían acceder
a la propiedad velocidad para consultarla o modificarla, ya que esta definida como privada. En
cambio se pueden usar las subrutinas Acelerar() y Frenar() ya que son de tipo Public, y desde
dentro de ellas se interactúa con las propiedades privadas, con esto conseguimos encapsular el
código y hacer accesible solo aquello que queramos.
objBicileta.Modelo = "Montaña"
objBicicleta.Precio = 200
objBicicleta.NumeroDeVelocidades = 21
objBicicleta.Acelerar()
objBicicleta.Frenar()
VelocidadActual = objBicicleta.ConsultarVelocidad
Tras la creación del objeto objBicicleta a partir de la clase, se pueden modificar los valores de las
propiedades de tipo Public, y llamar a los métodos de tipo Public.
En el ejemplo se llama a los métodos Acelerar(5), pasándole el numero de Km. que queremos
acelerar a través del parámetro "Km." que está definido en la subrutina.
Luego se llama al método Frenar() que decrementa en una unidad el valor de la propiedad
Velocidad.
Por último se
Ing. Alberto Moreno Cueva usa la función
Página
1267
ConsultarVelocidad(), que retorna el valor de la propiedad Velocidad para introducirlo en la
variable VelocidadActual.
1.- Crear una clase llamada Operaciones que tenga la propiedad n1 y n2 donde se guardaran 2
números.
Debe tener también un método llamado Operar el cual recibirá un signo (+,-,*, /) y según ese
signo se hará una operación aritmética
En el modulo
Module Module1
Public N1 As Integer
Public N2 As Integer
End Select
End Function
End Class
End Module
En el formulario
X.N2 = Val(Me.TextBox2.Text)
Me.Lblres.Text = X.Operar(S)
End Sub
End Class
Miform.BackColor = Fondo
End Sub
Sub FuenteTextos()
Obj.Font = Fuente
End If
Next
End Sub
End Class
x.Miform = Me
x.FuenteTextos()
End Sub
Según se dice por ahí, cualquier lenguaje basado en objetos debe cumplir estos tres requisitos:
1. Herencia
2. Encapsulación
3. Polimorfismo
End Sub
ves.nombre = Me.txtnom.Text
ves.exf = CInt(Me.txtEf.Text)
Me.txtnom.Clear()
txtEf.Clear() : txtep.Clear()
txtnom.Focus()
BtnMuestra_Click(sender, e)
End Sub
strfrm = "{0,-25}{1,15}"
'ListBox1.Items.Clear()
End Sub
End Class
Class estudiante
Get
Return m_nom
End Get
m_nom = value
End Set
m_Exf = value
End Set
End Property
m_exp = value
End Set
End Property
obs = ""
End Select
Return obs
End Function
End Class
End Sub
adder.FirstNumber = CDbl(txtn1.Text)
adder.SecondNumber = CDbl(txtn2.Text)
Me.txtres.Text = CStr(adder.Add)
End Sub
btnMul.Visible = False
btndiv.Visible = False
End Sub
btnMul.Visible = True
btndiv.Visible = True
End Sub
adder.FirstNumber = CDbl(txtn1.Text)
adder.SecondN
Ing. Alberto Moreno Cueva
Página
1275
umber = CDbl(txtn2.Text)
Me.txtres.Text = CStr(adder.Subtract)
End Sub
calc.FirstNumber = CDbl(txtn1.Text)
calc.SecondNumber = CDbl(txtn2.Text)
txtres.Text = CStr(calc.Multiply)
End Sub
calc.FirstNumber = CDbl(txtn1.Text)
calc.SecondNumber = CDbl(txtn2.Text)
txtres.Text = CStr(calc.Divide)
End Sub
End Class
Class AddingMachine
Get
Return m_num1
End Get
m_num1 = value
End Set
End Property
Public
Ing. Alberto Moreno Cueva Property
Página
1276
SecondNumber() As Double
Get
Return m_num2
End Get
m_num2 = value
End Set
End Property
End Function
End Function
End Class
Class Calculator
Inherits AddingMachine
End Function
End Function
End Class
Ing. Alberto Moreno Cueva
Página
1277
PROBLEMAS PROPUESTOS DE CLASES
1.- Realizar una clase vendedor para llevar el control de sus ventas , cuando se crea la clase todo
vendedor debe empezar con cierta cantidad ; el precio del producto se asigna inicialmente , se
deben crear los siguientes métodos:
Void vender(int cant) .-, Solo se puede vender si hay una cantidad de disponible y por cada
venta se tiene que disminuir la cantidad inicial y acumular su monto
Para hacer la prueba crear dos objetos vendedores que parten con cierta cantidad que se le
asigna , cambiar un nuevo precio del vendedor 2 ingresado por teclado.
crear los métodos accesores y constructores para la clase para asignar los datos e imprimirlos.
También deberá crear los métodos Deposito (que acepte un monto e incrementar el saldo) y el
método Retiro (que acepte un monto pero solo se podrá retirar si tiene saldo disponible de lo
contrario muestre un mensaje de error).
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 cualidad de crear clases que estén basadas en otras clases. La nueva clase
heredará todas las propiedades y métodos de la clase de la que está derivada, además de poder
modificar el comportamiento de los procedimientos que ha heredado, así como añadir otros
nuevos.
Supongamos que tenemos una clase Gato que está derivada de la clase Animal.
El Gato hereda de Animal todas las características comunes a los animales, además de añadirle
algunas características particulares a su condición felina.
Podemos decir que un Gato es un Animal, lo mismo que un Perro es un Animal, ambos están
derivados (han heredado) de la clase Animal, pero cada uno de ellos es diferente, aunque en el
fondo los dos son animales.
Esto es herencia: usar una clase base (Animal) y poder ampliarla sin perder nada de lo heredado,
pudiendo ampliar la clase de la que se ha derivado (o heredado).
Encapsulación
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). Pues 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 haga.
Si tomamos el ejemplo de la clase Gato, sabemos que araña, come, se mueve, etc., pero el cómo
lo hace no es algo que deba preocuparnos, salvo que se lance sobre nosotros... aunque, en ese
caso, lo que deberíamos tener es una clase "espanta-gatos" para quitárnoslo de encima lo antes
posible...
Polimorfismo
el Polimorfismo nos permite usar miembros de distintas clases de forma genérica sin tener que
preocuparnos si pertenece a una clase o a otra.
Siguiendo con el ejemplo de los animales, si el Gato y el Perro pueden morder podríamos tener un
"animal" que muerda sin importarnos que sea el Gato o el Perro, simplemente podríamos usar el
método Morder ya que ambos animales tienen esa característica "animal mordedor".
Ejemplo.- Se tiene una clase principal vehiculo que puede ser carro o camion , si es carro paga un
peaje S/3.2 y si es caminon se paga el doble , mostrar en cada instante lo recaudado y cuantos
vehiculos se han procesado.
Codificacion
End Sub
lbnro.Text = cls.cuenta
If Me.rdCamion.Checked Then
Me.lbtot.Text = tipo.camion
Else
Me.lbtot.Text = tipo.carro
End If
End Sub
Class vehiculo
Sub New()
m_can = 0
sm1 = 0
sm2 = 0
End Sub
m_can = m_can + 1
Return m_can
End Function
End Class
Class recauda
Inherits vehiculo
Return sm1
End Function
Return sm2
End Function
End Class
Ing. Alberto Moreno Cueva
Página
1281
Ejemplo de Polimorfismo y Mybase
Codificacion
End Sub
If Me.RdFail.Checked Then
Else
End If
pupil.SocSecNum = txtnum.Text
pupil.Midterm = CDbl(txtep.Text)
pupil.Final = CDbl(txtEf.Text)
lastStudentAdded += 1
students(lastStudentAdded) = pupil
txtnom.Clear()
txtnum.Clear()
txtep.Clear()
txtEf.Clear()
End Sub
ListBox1.Items.Clear()
ListBox1.Items.Add(String.Format(fmtStr, students(i).Name, _
students(i).SocSecNum, students(i).CalcSemGrade))
Next
End Class
Class Student
Get
Return m_name
End Get
m_name = value
End Set
End Property
Get
Return m_ssn
End Get
m_ssn = value
End Set
End Property
Ing. Alberto Moreno Cueva
Página
1284
Public WriteOnly Property Midterm() As Double
m_midterm = value
End Set
End Property
m_final = value
End Set
End Property
'The grade is based upon average of the midterm and final exams.
Case Else
Return "F"
End Select
Ing. Alberto Moreno Cueva
Página
1285
End Function
End Class
Class PFStudent
Inherits Student
'Else
'End If
End Select
End Function
End Class
Ejercicios Propuestos
OBJETIVO.- que el alumno sea capaz de desarrollar sus programas en bases a clases POO.
1.- Diseñe e implemente en Java una clase para trabajar con triángulos isósceles. Para ello, defina
las variables de ejemplar mínimas que requiera, proporcione métodos de consulta, un método
constructor e implemente otros métodos para calcular el perímetro y el área de un triángulo.
2.-Implemente una clase llamado banco ,con los atributos nro de cuenta , nombre del cliente ,
tipo de ahorro( D=dólar y S=soles) y el saldo; Implemente los métodos para deposito , retiro de
dinero. y los métodos constructores respectivos.
La instalacion por defecto de la plataforma .NET aporta cinco ambitos con nombre namespaces
relacionados con ADO.NET, a los cuales habria que añadir uno o mas por cada proveedor
adicional que pudieramos instalar después. Estos cinco ambitos son:
• System.Data: Aloja las clases independientes del origen de datos, asi como las interfaces que
deben implementar las clases dependientes.
• System.Data.Common: Contiene clases que facilitan la implementacion de las interfaces
existentes en System,.Data por parte de los distintos proveedores de datos, asi como otras
compartidas por todos los proveedores.
• System.Data.OleDb : Corresponde al proveedor ADO.NET que permite utilizar cualquier
controlador OLE DB para conectar con un origen de datos. En el se encuentran
implementaciones especificas de clases para comunicarse mediante OLE DB.
Ing. Alberto Moreno Cueva
Página
1288
• System.Data.SqlClient : Como el anterior, alberga clases especificas para operar sobre un
determinado origen de datos, en este caso SQL Server.
• System.Data.OracleClient : Correspondiente al proveedor nativo para acceso a datos Oracle.
Al igual que System.Data.SqlClient o Sytem.Data.OleDb, contiene implementaciones
especificas de clases que facilitan la conexión y comunicación con este RDBMS (Sistema de
administración de base de datos Relacional).
En este conjunto de nombres de espacio, encontraremos casi siempre las clases Connection,
Command, DataAdapter y DataReader como las clases más generales, las cuales nos permiten
establecer la conexión con la fuente de datos.
Dentro del entorno .NET Framework, encontramos un nutrido conjunto de proveedores de acceso
a datos.
• System.Data.Odbc
• System.Data.OleDb
• System.Data.OracleClient
• System.Data.SqlClient
El objeto Connection
Este objeto es el encargado de establecer una conexión física con una base de datos
determinada.
Para establecer la conexión con una determinada fuente de datos, no sólo debemos establecer la
cadena de conexión correctamente, sino que además deberemos usar los parámetros de conexión
y el proveedor de acceso a datos adecuado.
Con este objeto, podremos además abrir y cerrar una conexión.
Este objeto es el que representa una determinada sentencia SQL o un Stored Procedure.
Aunque no es obligatorio su uso, en caso de necesitarlo, lo utilizaremos conjuntamente con el
objeto DataAdapter que es el encargado de ejecutar la instrucción indicada.
El objeto DataAdapter
Este objeto es quizás el objeto más complejo y a la vez complicado de todos los que forman parte
de un proveedor de acceso a datos en .NET.
Cuando deseamos establecer una comunicación entre una fuente de datos y un DataSet,
utilizamos como intermediario a un objeto DataAdapter.
A su vez, un DataAdapter contiene 4 objetos que debemos conocer:
El objeto DataReader
Este objeto es el utilizado en una sóla dirección de datos. Establece una conexión en un modo de
solo lectura.
Se trata de un objeto de acceso a datos muy rápido.
Este objeto puede usar a su vez el objeto Command o el método ExecuteReader.
La clase DataSet
El DataSet contiene en sí, un conjunto de datos que han sido volcados desde el proveedor de
datos.
De esa forma, podemos trabajar con ellos como lo hacíamos en Visual Basic 6 por ejemplo.
De hecho, por marcar una similitud con el RecordSet, el DataSet está preparado para trabajar con
fuentes de datos desconectadas.
La clase DataView
Este objeto nos permite crear múltiples vistas de nuestros datos, además de permitirnos presentar
los datos.
Es la clase que nos permite representar los datos de la clase DataTable, permitiéndonos editar,
ordenar y filtrar, buscar y navegar por un conjunto de datos determinado.
La clase DataTable
Este objeto nos permite representar una determinada tabla en memoria, de modo que podamos
interactuar con ella.
A la hora de trabajar con este objeto, debemos tener en cuenta el nombre con el cuál definamos
una determinada tabla, ya que los objetos declarados en en el DataTable es sensitivo a
mayúsculas y minúsculas.
Lo que sí está claro es que el modelo de datos de ADO.NET que hemos visto, quedaría resumido
en cuanto a la conectividad de la manera en la que se representa en la figura.
Sin embargo, a veces necesitamos trabajar con la fuente de datos estando conectados a ella.
El objeto DataReader nos ofrece precisamente la posibilidad de trabajar con fuentes de datos
conectadas.
Por otro lado, el objeto DataReader tiene algunas particularidades que conviene conocer y que
veremos a continuación.
Microsoft Access
Este producto, que forma parte de la suite Microsoft office, es uno de los gestores de base de
datos mas populares del mercado, especialmente en instalaciones en las que el propio usuario
opera sobre la información.
Desde una aplicación Visual Studio .NET podemos necesitar recuperar la información que el
usuario gestiona habitualmente utilizando Access o, incluso, crear una aplicación que se encargue
de actuar como interfaz para ese usuario a fin de que no tenga que aprender a usar Access.
Creara una carpeta llamada BDVisualNET, será donde se almacenara el proyecto que crearemos.
Form1.Vb
8. Le damos un clic en el botón Probar conexión, para verificar si la conexión fue satisfactori.
9. Luego de damos clic en el botón Aceptar.
12. En este cuadro de Generar las instrucciones SQL, generamos una consulta, le damos clic en el
boton Generador de Consultas.
19. Nos mostrar un cuadro de mensaje, el cual nos indicar si deseamos incluir o no la contraseña,
en nuestra configuración, le damos clic en No incluir contraseña.
20. Notaremos que se agrego en el formulario 2 controles, producto de la configuración realizada.
CODIGO FUENTE
OleDbDataAdapter1.Fill(tbl)
DataGrid1.DataSource = tbl
lblregistros.Text = tbl.Rows.Count
End Sub
Application.Exit()
End If
End Sub
End Class
La clase DataAdapter hace uso de las tres anteriores para actuar de puente entre
la capa conectada y la desconectada como veremos después.
Estas clases son abstractas, es decir, no tienen una implementación real de la que se pueda
hacer uso directamente. Es en este punto en donde entran en juego los proveedores de
datos. Cada origen de datos tiene un modo especial de comunicarse con los
programas que los utilizan, además de otras particularidades que se deben contemplar.
Un proveedor de datos de ADO.NET es una implementación concreta de las clases
conectadas abstractas que hemos visto, que hereda de éstas y que tiene en cuenta ya todas
las particularidades del origen de datos en cuestión.
Así, por ejemplo, las clases específicas para acceder a SQL Server se llaman
SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se encuentran bajo
el espacio de nombres System.Data.SqlClient. Es decir, al contrario que en ADO
clásico no hay una única clase Connection o Command que se use en cada caso, si
no que existen clases especializadas para conectarse y recuperar información de cada tipo de
origen de datos.
• Las clases derivadas de Connection se utilizan para realizar la conexión y enviar y recibir
información.
• Las clases derivadas de Command permiten ejecutar sentencias SQL y procedimientos
almacenados en el gestor de datos.
• Las clases derivadas de DataReader se emplean para obtener los posibles resultados de
un comando utilizando para ello el conducto de comunicación establecido por Connection.
Clases empleadas:
OleDbdataReader.- Proporciona el
modo de lectura de una secuencia de
filas de datos de tipo sólo avance de un
origen de datos. Esta clase no se puede
heredar.
Codificación
Imports System.Data.OleDb
Inherits System.Windows.Forms.Form
+Codigo Generado
cn.Open()
cmd.Connection = cn
cmd.CommandType = CommandType.Text
rdp = cmd.ExecuteReader
While rdp.Read
cboproveedor.Items.Add(rdp("supplierId")).ToString()
End While
cboproveedor.SelectedIndex = 0
rdp.Close()
listarproducto()
End Sub
rds = cmd.ExecuteReader
lstproducto.Items.Clear()
While rds.Read
lstproducto.Items.Add(rds("productName")).ToString()
End While
rds.Close()
End Sub
cmd.CommandType = CommandType.Text
listarproducto()
End Sub
End Class
Controles empleados:
Controles de
opciones:
RbtOrden y rbtFecha
Y cajas de textos:
Txtfe1 y TxtFe2
Y un datagrid1
a)Pasando dos fechas que muestre las ordenes detalle con su total respectivo
@FechaIni Varchar(20),
@FechaFin Varchar(20)
As
OrderDate
Ing. Alberto Moreno Cueva Between
Página
1305
@FechaIni and @FechaFin
Return
@Orden Int
As
Imports System.Data.SqlClient
If rbnOrden.Checked Then
prm.Value = Convert.ToInt32(txtOrden.Text())
Da.SelectCommand = Cmd
Ds.Clear()
Da.Fill(Ds, "Ordenes")
DataGrid1.DataSource = Ds.Tables("Ordenes").DefaultView
Else
Ds.Clear()
End If
cmd2.Connection = Cn
cmd2.CommandType = CommandType.StoredProcedure
cmd2.CommandText = "Sp_ConsultaFecha"
prm2.Direction = ParameterDirection.Input
prm2.Value = Convert.ToDateTime(txtFe1.Text())
prm2.Direction = ParameterDirection.Input
prm2.Value = Convert.ToDateTime(txtfe2.Text())
da2.SelectCommand = cmd2
ds2.Clear()
da2.Fill(ds2, "fechas")
End If
Cn.Close()
End Sub
txtOrden.Clear()
txtFe1.Clear()
txtfe2.Clear()
Cn.Open()
Cmd.Connection = Cn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = "Sp_ConsultaOrden"
prm.Direction = ParameterDirection.Input
End Sub
txtOrden.Enabled = True
txtFe1.Enabled = False
txtfe2.Enabled = False
End Sub
txtOrden.Enabled = False
txtFe1.Enabled = True
End Sub
End Class
Una vez que ya se han recuperado los datos desde un origen de datos la conexión a éste ya no es
necesaria. Sin embargo sigue siendo necesario trabajar con los datos obtenidos de una manera
flexible. Es aquí cuando la capa de datos desconectada entra en juego. Además, en muchas
ocasiones es necesario tratar con datos que no han sido obtenidos desde un origen de datos
relacional con el que se requiera una conexión. A veces únicamente necesitamos un almacén de
datos temporal pero que ofrezca características avanzadas de gestión y acceso a la información.
Finalmente otro motivo por el que es importante el uso de los datos desconectado de su origen es
la transferencia de información entre capas de una aplicación. Éstas pueden encontrarse
distribuidas por diferentes equipos, e incluso en diferentes lugares del mundo gracias a Internet.
Por ello es necesario disponer de algún modo genérico y eficiente de poder transportar los datos
entre diferentes lugares, utilizarlos en cualquiera de ellos y posteriormente tener la capacidad de
conciliar los cambios realizados sobre ellos con el origen de datos del que proceden. Todo esto y
mucho más es lo que nos otorga el uso de los objetos DataSet, núcleo central de la capa
desconectada de ADO.NET.
Un DataAdapter sabe omo manejar correctamente los objetos proporcionados por su proveedor
específico (fundamentalmente los vistos: Connection, Command y DataReader) y proporciona
métodos para trasegar información desde el servidor a DataSets desconectados y viceversa
Así, por ejemplo, el método Fill de un DataSet se utiliza para introducir los resultados de una
consula dentro de un DataSet para luego trabajar con ellos sin preocuparnos de su origen. Del
mismo modo su método Update se utiliza para conciliar automáticamente con el origen de datos
los datos modificados en un DataSet mientras no había conexión.
Como hemos dicho antes un DataSet podría asimilarse a un pequeño gestor de datos en
memoria. Como tal un DataSet permite mantener diversas tablas así como las relaciones entre
ellas, incluso forzando que se cumplan restricciones de creación y actualización, como en una
Ing. Alberto Moreno Cueva
Página
1310
base de datos
"real". Para ello se apoya en el uso de otras clases especializadas que son las siguientes:
• DataTable: representa una tabla o relación de datos. Se puede asimilar a una tabla de un
gestor de datos. Los datos obtenidos de una consulta de tipo SELECT de SQL se
almacenan en un objeto de esta clase.
• DataColumn: ofrece información sobre cada uno de los campos de los registros
almacenados en un DataTable, como su nombre o su tipo.
• DataRow: representa un registro de la tabla virtual definida por el DataTable. Contiene
tantos elementos como campos tiene la tabla, cada uno del tipo definido por el objeto
DataColumn correspondiente.
• Constraint: las clases Constraint se emplean para definir resticciones en los tipos de datos
contenidos en un DataTable. Por ejemplo se puede usar un objeto de esta clase para
indicar que un determinado campo debe ser único o que se trata de una clave externa que
debe ser tenida en cuenta en actualizaciones o borrados en cascada.
• DataRelations: define la relación existente entre dos objetos DataTable. Normalmente se
suelen utilizar un identificador común a ambas tablas aunque pueden ser combinaciones de
más de uno de ellos. De este modo se sabe cómo obtener información de una tabla a partir
de información en otra. Por ejemplo el identificador de una factura (su número, por ejemplo)
puede servir para relacionar su registro con los registros de detalle de factura que están
contenidos en otra tabla.
• DataView: representa una vista concreta de un DataTable. Normalmente se trata de
ordenaciones o filtros sobre los datos originales. Todas las tablas disponen de una vista por
dfecto (propiedad DefaultView) que ofrece los datos tal y como se han introducido en ésta y
es la vista que se usa habitualmente.
EMPLENADO SQL SERVER
Datatable. DefaultView .- Obtiene una vista personalizada de la tabla que puede incluir una vista
filtrada o una posición del cursor.
Dgdproducto
Imports System.Data.SqlClient
Imports System.Data.OleDb
Imports System.Data
'dgdproducto.DataSource = objds.Tables("producto").DefaultView
dgdproducto.DataSource = objds.Tables(0).DefaultView
End Sub
objda.Fill(objds, "categories")
dgdproducto.DataSource = objds.Tables(0).DefaultView
End Sub
End Class
ADO.NET - ACCESS
Procesos de
-ADICION
-CONSULTA
-ACTUALIZACION
Imports System.Data
Imports System.Data.OleDb
OBJDA.Fill(OBJDS, "PRODUCTOS")
DataGridView1.DataSource = OBJDS.Tables("PRODUCTOS").DefaultView
End Sub
TXTCODIGO.Clear()
TXTDES.Clear()
TXTPRE.Clear()
TXTSTK.Clear()
MskFecha.Text = ""
MskFecha.Mask = "99/99/9999"
RBTNACIONAL.Checked = False
RBTIMPORTADO.Checked = False
End Sub
TXTCODIGO.Enabled = False
TXTDES.Enabled = False
TXTSTK.Enabled = False
TXTPRE.Enabled = False
MskFecha.Enabled = False
btnGUARDAR.Enabled = False
GroupBox1.Enabled = False
End Sub
TXTDES.Enabled = True
TXTSTK.Enabled = True
TXTPRE.Enabled = True
MskFecha.Enabled = True
btnGUARDAR.Enabled = True
End Sub
Try
Call LISTAR()
Call Limpiar()
Call Deshabilitar()
Catch ex As Exception
End Try
End Sub
Call Limpiar()
Call Habilitar()
OBJDA.Fill(OBJDS, "PRODUCTOS")
Else
End If
btnNUEVO.Enabled = False
btnGUARDAR.Enabled = True
TXTDES.Focus()
End Sub
MessageBoxButtons.YesNo, MessageBoxIcon.Information)
If Rpta = 6 Then
'Grabar el Registro
Cmd.Connection = Cn
Else
End If
Cn.Open()
Cmd.ExecuteNonQuery()
Call LISTAR()
Cn.Close()
btnGUARDAR.Enabled = False
btnNUEVO.Enabled = True
btnNUEVO.Focus()
End If
End Sub
CadBuscar = "Select * From Productos where CodPro='" & Trim(CODIGO) & "'"
objda.Fill(Dt1)
TXTC.Text = Dt1.Rows(0)(0).ToString
TXTD.Text = Dt1.Rows(0)(1).ToString
TXTF.Text = Dt1.Rows(0)(2).ToString
TXTP.Text = Dt1.Rows(0)(3).ToString
TXTS.Text = Dt1.Rows(0)(4).ToString
Else
MessageBoxButtons.OK, MessageBoxIcon.Error)
TXTD.Clear() : TXTP.Clear()
TXTC.Clear() : TXTS.Clear()
TXTR.Clear() : TXTF.Clear()
End If
End Sub
MessageBoxButtons.YesNo, MessageBoxIcon.Information)
If Rpta = 6 Then
SQL = "UPDATE PRODUCTOS SET DesPro='" & TXTD.Text & "',Fecha='" &
CDate(TXTF.Text) & "',PrePro='" & Val(TXTP.Text) & "',StkPro='" & Val(TXTS.Text) & "',Procede='"
& TXTR.Text & "'"
Cn.Open()
Cmd.Connection = Cn
Cmd.CommandType = CommandType.Text
Cmd.CommandText = SQLCAMBIA
Cmd.ExecuteNonQuery()
Cmd.Dispose()
Ing. Alberto Moreno Cueva
Página
1319
Cn.Close()
Call LISTAR()
End If
End Sub
MessageBoxButtons.YesNo, MessageBoxIcon.Error)
If Rpta = 6 Then
SQL = "DELETE FROM PRODUCTOS WHERE CodPro='" & (TXTC.Text) & "'"
Cn.Open()
Cmd.Connection = Cn
Cmd.CommandType = CommandType.Text
Cmd.CommandText = SQL
Cmd.ExecuteNonQuery()
Cmd.Dispose()
Cn.Close()
Call LISTAR()
TXTD.Clear() : TXTC.Clear()
TXTR.Clear() : TXTS.Clear()
End If
End Sub
Me.Close()
Cn.Close()
End Sub
End Class
A nivel modulo:
VariablesGlobales
Imports System.Data.SqlClient
Module VariablesGlobales
Public Cn As SqlConnection
End Module
TxtUsrname
Imports System.Data.SqlClient
Try
Dim MiCn As String = strCn & ";User Id=" & txtUserName.Text & _
Cn = New SqlConnection(MiCn)
Cn.Open()
Me.Hide()
MiForm.Show()
Case 17
MsgBox("Servidor no reconocido")
Case 4060
Case 18456
Case Else
MsgBox(ex1.Message)
End Select
End Try
End Sub
Cn.Close()
Cn = Nothing
End
End Sub
End Sub
End Class
Menu1
ManteAlumnos.MdiParent = Me
ManteAlumnos.Show()
End Sub
Cn = Nothing
End
End Sub
End Sub
End Sub
Mantetrans.MdiParent = Me
End Sub
frmNota.MdiParent = Me
frmNota.Show()
End Sub
frmcur.MdiParent = Me
frmcur.Show()
End Sub
End Class
FrmCurso
Dim x As Control
canreg = objDS.Tables(0).DefaultView.Count
Else
codc = "C001"
End If
txtcod.Text = codc
txtnom.Focus()
End Sub
fila = objDS.Tables("curso").Rows(nro)
txtcod.Text = fila.Item(0)
txtnom.Text = fila.Item(1)
txthr.Text = fila.Item(2)
End Sub
Sub asigna()
fila.Item(0) = txtcod.Text
fila.Item(1) = txtnom.Text
fila.Item(2) = txthr.Text
End Sub
Try
objDA.Fill(objDS, "Curso")
objDV = objDS.Tables("Curso").DefaultView
objDV.AllowNew = True
objDV.AllowEdit = True
objDV.AllowDelete = True
DgCurso.DataSource = objDV
nr = objDS.Tables(0).DefaultView.Count
indice = 0
If nr > 0 Then
selecciona(btnPri)
End If
MsgBox(ex1.Message)
End Try
End Sub
objDV.Delete(indice)
objDA.Update(objDS.Tables("curso"))
nr = objDS.Tables(0).DefaultView.Count
selecciona(btnPri)
End If
End Sub
indice = 0
indice += 1
indice -= 1
Else
indice = totr
End If
muestra(indice)
End Sub
selecciona(CType(sender, Button))
End Sub
fila = objDS.Tables(0).NewRow
asigna()
objDA.Update(objDS.Tables("curso"))
nr = objDS.Tables(0).DefaultView.Count
selecciona(BtnUlt)
End Sub
End Class
FrmConsultaNotas
Try
objDA.Fill(objDS, "Alumno")
objDV = objDS.Tables("Alumno").DefaultView
objDV.AllowNew = False
objDV.AllowEdit = False
objDV.AllowDelete = False
DGAlumno.DataSource = objDS.Tables(0).DefaultView
MsgBox(ex1.Message)
End Try
End Sub
NroFila = DGAlumno.CurrentRowIndex
xfila = objDS.Tables("Alumno").Rows(NroFila)
ds.Clear()
da.Fill(ds, "notas")
DgNota.DataSource = ds.Tables(0).DefaultView
nf = ds.Tables(0).DefaultView.Count
sm = 0
If nf > 0 Then
For nfila = 0 To nf - 1
sm += ds.Tables(0).Rows(nfila).Item(4)
Next
Else
promedio = 0
End If
End Sub
End If
End Sub
'primera forma
'sql = "select * from alumno where apenom like '" + Trim(txtnom.Text) + "%'"
'objDS.Clear()
'objDA.Fill(objDS, "Alumno")
'objDV = objDS.Tables("Alumno").DefaultView
'DGAlumno.DataSource = objDS.Tables(0).DefaultView
objDV.RowStateFilter = DataViewRowState.CurrentRows
Else
objDV.RowFilter = Nothing
objDV.RowStateFilter = DataViewRowState.OriginalRows
End If
End Sub
End Class
OTRAS APLICACIONES
Realizar un aplicación el nos permita consultar las facturas por medio de un rango de fechas.
Form3.vb
CODIGO FUENTE:
Imports System.Data.OleDb
Dim dv As DataView
da.Fill(ds, "Facturas")
DataGrid1.DataSource = ds.Tables("Facturas")
lblTotal.Text = ds.Tables("Facturas").Rows.Count
txtfecinicial.Text = ""
txtfecFinal.Text = ""
End Sub
txtfecinicial.Focus()
End Sub
Exit Sub
End If
Exit Sub
Ing. Alberto Moreno Cueva
Página
1336
End If
'Inicar el proceso de consulta filtrando los datos por medio del objeto DataView
dv = New DataView(ds.Tables("Facturas"))
Dim str As String = "Fecha >='" & txtfecinicial.Text & "' and Fecha <='" & txtfecFinal.Text & "'"
dv.RowFilter = str
DataGrid1.DataSource = dv
End Sub
dv.RowFilter = Nothing
DataGrid1.DataSource = dv
End Sub
Application.Exit()
End If
End Sub
End Class
Resultado:
Creara una Tabla llamada alumnos en una base de datos en Access llamada ventas.mdb.
Registros:
Imports System.Data.OleDb
Imports vb = Microsoft.VisualBasic
Inherits System.Windows.Forms.Form
Dim da As OleDbDataAdapter
cmd.Connection = OleDb
cmd.CommandType = CommandType.TableDirect
da = New OleDbDataAdapter(cmd)
da.Fill(ds, "Alumnos")
Iposicion = 0
Call limpiar()
txtcodigo.Enabled = False
End Sub
Sub limpiar()
Next
End Sub
Sub cargardatos()
Dim dr As DataRow
dr = ds.Tables("Alumnos").Rows(Iposicion)
txtcodigo.Text = dr("Alu_cod")
txtnombre.Text = dr("Alu_nom")
txtdireccion.Text = dr("Alu_direccion")
txtfecha.Text = dr("Alu_fecha")
OptM.Checked = True
OptF.Checked = False
Else
OptF.Checked = True
End If
End Sub
Call limpiar()
Iposicion = ds.Tables("Alumnos").Rows.Count - 1
Dim maxcodigo As String = dr("Alu_cod") Generando el Codigo apartir del ultmo codigo del
Cliente.
txtnombre.Focus()
End Sub
Iposicion = 0
Me.cargardatos()
End Sub
If Iposicion = 0 Then
Else
Iposicion -= 1
Me.cargardatos()
End If
Ing. Alberto Moreno Cueva
Página
1341
End Sub
Iposicion = ds.Tables("Alumnos").Rows.Count - 1
Me.cargardatos()
End Sub
Else
Iposicion += 1
Me.cargardatos()
End If
End Sub
Dim dr As DataRow
dr = ds.Tables("Alumnos").NewRow()
dr("Alu_cod") = txtcodigo.Text
dr("Alu_nom") = txtnombre.Text
dr("Alu_direccion") = txtdireccion.Text
dr("Alu_fecha") = txtfecha.Text
If OptM.Checked Then
dr("Alu_sexo") = True
Else
End If
ds.Tables("Alumnos").Rows.Add(dr)
da.Update(ds, "Alumnos")
End Sub
Dim dr As DataRow
dr = ds.Tables("Alumnos").Rows(Iposicion)
dr("Alu_nom") = txtnombre.Text
dr("Alu_direccion") = txtdireccion.Text
dr("Alu_fecha") = txtfecha.Text
If OptM.Checked Then
dr("Alu_sexo") = True
Else
dr("Alu_sexo") = False
End If
da.Update(ds, "Alumnos")
End Sub
Dim dr As DataRow
dr = ds.Tables("Alumnos").Rows(Iposicion)
dr.Delete()
TblDelete = ds.Tables("Alumnos").GetChanges(DataRowState.Deleted)
ds.Tables("Alumnos").AcceptChanges()
CmdPrimero.PerformClick()
End Sub
Exit Sub
End If
txtcodigo.Text = dv(0)("Alu_cod")
txtnombre.Text = dv(0)("Alu_nom")
txtdireccion.Text = dv(0)("Alu_direccion")
txtfecha.Text = dv(0)("Alu_fecha")
OptM.Checked = True
OptF.Checked = False
Else
OptM.Checked = False
OptF.Checked = True
End If
End Sub
Application.Exit()
End If
End Sub
End Class
Resultado:
APLICACION 5:
Para desarrollar esta aplicacion necesitara conocer las siguientes tablas Facturas – Detalle
– Producto
Para realizar esta aplicación usaremos los controles comboBox1 y listBox1 enlazados a
datos, debido a que estos controles poseen las mismas propiedades para trabajar con
datos describiremos las siguientes propiedades:
DataSource => Obtiene o establece el origen de datos de este objeto. Existen 2 formas para
rellenar los controles ComboBox1 y ListBox1.
DisplayMember => Obtiene o establece una cadena que especifica la propiedad del origen de
Ing. Alberto Moreno Cueva datos cuyo
Página
1345
contenido se desea mostrar.
ValueMember => Obtiene o establece una cadena que especifica la propiedad del origen de datos
a partir de la cual se va dibujar el valor.
FACTURAS:
DETALLE
PRODUCTO
Button1
Name = CmdFinalizar
Propiedades de los controles del Formulario:
Text = &Finalizar
DataGrid1
Label1
Name = DataGrid1
Name= lblTotal
CaptionText = DETALLE DE FACTURAS
Text = lblTotal
Label2
Combobox1
Name = lblTotalDetalle
Name = ComboBox1
Text = ComboBox1
ListBox1
Ing. Alberto Moreno Cueva
Página
1347
Name = ListBox1
CODIGO FUENTE:
Imports System.Data.OleDb
ComboBox1.DataSource = ds.Tables("Clientes")
ComboBox1.DisplayMember = "Nom_Cli"
ComboBox1.ValueMember = "Cod_Cli"
End Sub
Try
strSQl = "Select Num_Fact From Facturas Where Cod_Cli='" & CodCliente & "'"
da.Fill(ds, "Facturas")
ListBox1.DataSource = ds.Tables("Facturas")
ListBox1.Displa
Ing. Alberto Moreno Cueva
Página
1348
yMember = "Num_Fact"
ListBox1.ValueMember = "Num_Fact"
Catch ex As Exception
End Try
End Sub
Try
da.Fill(ds, "Detalle")
DataGrid1.DataSource = ds.Tables("Detalle")
Calcula la expresion dada de la filas actuales que cumplen los criterios de filtro.
Ejemplo Compute( Sum(Total) Total > 20 ) => solo muestra la suma del campo Total que
cumplen con el criterio.
FormatoGrid()
Catch ex As Exception
End Try
End Sub
Ing. Alberto Moreno Cueva
Página
1349
Sub FormatoGrid()
DataGrid1.TableStyles.Clear()
dts.MappingName = "Detalle"
dts.ReadOnly = True
dts.BackColor = Color.Yellow
dts.ForeColor = Color.Blue
dts.AllowSorting = True
c1.MappingName = "Descrip"
c1.HeaderText = "Producto"
c1.Width = 120
dts.GridColumnStyles.Add(c1)
c2.MappingName = "Precio"
c2.HeaderText = "Precio"
c2.Format = "c"
c2.Width = 50
dts.GridColumnStyles.Add(c2)
c3.MappingName = "Cant"
c3.HeaderText = "Cantidad"
c3.Width = 50
dts.GridColumnStyles.Add(c3)
c4.HeaderText = "Total"
c4.Format = "c"
c4.Width = 70
dts.GridColumnStyles.Add(c4)
DataGrid1.TableStyles.Add(dts)
End Sub
Application.Exit()
End If
End Sub
End Class
Resultado:
BDBANCO
ESPECIFICACIONES
Con el fin de ofrecer el acceso a datos más flexible para los programadores, los controladores de
base de datos de Crystal Reports se han diseñado para proporcionar un modelo de extracción e
inserción de acceso a datos.
Modelo de extracción
Controladores de bases de datos con Crystal Reports para Visual Studio .NET
Controlador de base Base de datos a las que se tiene Método de acceso a datos
de datos acceso
Nota Este
controlador no está
disponible durante el
período de creación
del informe.
Seleccione uno de los
controladores
disponibles para
crearlo.
Visual Studio .NET incluye Crystal Reports como un mecanismo "oficial" de creación de reportes.
Crystal Reports es un producto muy desarrollado y complejo para la creación de reportes, y cuenta
con una infinidad de opciones. En este artículo, nos vamos a concentrar en crear reportes
relativamente sencillos, pero mostrando los detalles específicos de la versión .NET, tanto en
aplicaciones WinForms como en aplicaciones WebForms (ASP.NET). Este artículo considera que
usted ya posee alguna familiaridad con Visual Studio .NET y también con ADO.NET.
Crear un reporte
Crystal Reports se basa en un concepto muy común de la definición de reportes: los reportes se
componen de "secciones", y cada sección es un espacio horizontal en la página. Existen diversos
tipos de secciones, por ejemplo:
• Encabez
Ing. Alberto Moreno Cueva ado del
Página
1359
reporte, aparece en la primera página.
• Encabezado de página, aparece en la parte superior de todas las páginas.
• Detalle: lo más importante. En el tiempo de ejecución, se genera una de estas secciones
para cada línea (registro) en la base de datos.
• Pie de página, aparece en la parte inferior de todas las páginas.
• Pie de reporte, aparece al final del reporte.
En un principio, todos los reportes presentan estas cinco secciones. Otras secciones son
opcionales, como por ejemplo:
Antes de crear el reporte, hay que decidir cuál será el mecanismo utilizado para acceder a la base
de datos. Crystal Reports puede obtener datos de una infinidad de fuentes, pero una buena
cantidad de ellas, como DAO, ADO y OLE/DB, no está "administrada", o sea, es código .NET
"puro". En una aplicación .NET, probablemente sea deseable realizar el acceso a través de
ADO.NET. Para ello, lo más fácil es definir un Conjunto de datos tipificado, aun antes de crear el
reporte.
Crear un proyecto
Vamos a definir ahora el acceso a la base de datos. Como ejemplo, vamos a acceder a la base de
datos "Northwind", que se encuentra como ejemplo en SQL Server. Siga la siguiente ruta:
Ahora, agregaremos un reporte al proyecto. Haga clic en "Proyecto | Agregar elemento nuevo" y
seleccione "Crystal Report":
Presione "Aceptar" para pasar a la pantalla siguiente para la elección de la fuente de los datos.
Seleccione la tabla "Productos" a partir del Conjunto de datos creado y haga clic en "Insertar
tabla":
Las demás opciones no nos interesan en este reporte sencillo. Haga clic en "Finalizar", para crear
el reporte:
• El reporte tiene siete secciones; las cinco obligatorias y dos más relativas al grupo.
• La sección "Encabezado del reporte" tiene la propiedad Suprimir con el valor verdadero,
indicando que no aparecerá en el tiempo de ejecución.
• Puede editar cuantas veces quiera el reporte creado, al agregar componentes o modificar
los que hayan sido colocados.
Presentar el reporte
Una vez definido el reporte, hay que presentarlo al tiempo de ejecución. Para ello, coloque un
componente "CrystalReportViewer" en el formato y seleccione la propiedad "Acoplar" para
"Llenar". Sólo se necesita un componente "Visualizador", aun cuando se hayan creado diversos
reportes en archivos RPT separados.
Para producir el reporte, agregue un componente "Menú principal" y añada un elemento de menú
para producir el reporte. Añada el siguiente código al evento Clic del botón:
sqlDataAdapter1.Fill(dataSet11)
Crea el reporte
Rel.SetDataSource(dataSet11)
crystalReportViewer1.ReportSource = Rel
End sub
Una vez presentado, puede cambiar el tamaño en el botón "aumentar", ir a otra página o hacer clic
del lado
Ing. Alberto Moreno Cueva izquierdo para
Página
1364
solicitar la presentación de algún grupo en particular:
El usuario puede hacer clic en el botón con el icono de la impresora para imprimir el reporte.
Problema Propuesto.
I.- FORMULARIO Nº 1:
ESPECIFICACIONES
LstAutor
LstLibro
http://vagos.wamba.com/
https://www.microsoft.com/downloads/details.aspx?FamilyID=518d870c-fa3e-4f6a-97f5-
acaf31de6dce&DisplayLang=en#filelist
http://programaschampoloco.blogspot.com/
http://msdn.microsoft.com/es-es/library/system.windows.forms.tabcontrol(VS.80).aspx
http://es.gotdotnet.com/quickstart
http://www.solucionesNet.org
http://www.lawebdelprogramador.com
Encargados: