Visual Basic Net

  • Uploaded by: Alberto Moreno Cueva
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Visual Basic Net as PDF for free.

More details

  • Words: 52,671
  • Pages: 367
Facultad de Ingenieria Industrial y de Sistemas

INDICE Introduccion Preambulo Microsoft .Net Semana 1 : Introducción a programación con ventanas. Semana 2 : Uso de Controles Comunes Semana 3 : Contenedores de elementos Semana 4 : Uso de Controles Comunes Semana 5 : Controles contenedores de menus Semana 6 : Uso de Controles Cuadros de dialogo Semana 7 : Uso de dmi Semana 8 : Creacion de Controles Semana 9 : desarrollo de una aplicación Semana 11 : Introduccion a OOP Semana 12 : Constructores Y Sobrecarga Semana 13 : Herencia e Interface Semana 14 : Programacion con Ado .NET Semana 15 : Trabajo con ambiente Conectado Semana 16 : Trabajo en Ambiente Desconectado Semana 17 : Uso de DataTable y DataView Semana 18 : Creacion Y genaracion de Reportes Semana 19 : (Examen Final) Semana 20 : (Examen de Recuperacion)

Ing. Alberto Moreno Cueva Página 11

Facultad de Ingenieria Industrial y de Sistemas

Microsoft .Net Consideraciones La plataforma .NET de Microsoft es un componente de software que puede ser añadido al sistema operativo Windows. Provee un extenso conjunto de soluciones predefinidas para necesidades generales de la programación de aplicaciones, y administra la ejecución de los programas escritos específicamente con la plataforma. Esta solución es el producto principal en la oferta de Microsoft, y pretende ser utilizada por la mayoría de las aplicaciones creadas para la plataforma Windows. .NET Framework se incluye en Windows Server 2008 y Windows Vista. De igual manera, la versión actual de dicho componente puede ser instalada en Windows XP, y en la familia de sistemas operativos Windows Server 2003. Una versión "reducida" de .NET Framework está disponible para la plataforma Windows Mobile, incluyendo teléfonos inteligentes. NET es un proyecto de Microsoft para crear una nueva plataforma de desarrollo de software con énfasis en transparencia de redes, con independencia de plataforma de hardware y que permita un rápido desarrollo de aplicaciones. Basado en ella, la empresa intenta desarrollar una estrategia horizontal que integre todos sus productos, Componentes Los principales componentes del marco de trabajo son: • • •

El conjunto de lenguajes de programación La Biblioteca de Clases Base o BCL El Entorno Común de Ejecución para Lenguajes o CLR por sus siglas en inglés.

Debido a la publicación de la norma para la infraestructura común de lenguajes (CLI por sus siglas en inglés), el desarrollo de lenguajes se facilita, por lo que el marco de trabajo .NET soporta ya más de 20 lenguajes de programación y es posible desarrollar cualquiera de los tipos de aplicaciones soportados en la plataforma con cualquiera de ellos, lo que elimina las diferencias que existían entre lo que era posible hacer con uno u otro lenguaje. Algunos de los lenguajes desarrollados para el marco de trabajo .NET son: C#, Visual Basic, C++, J#, Perl, Python, Fortran, Cobol y PowerBuilder. Common Language Runtime (CLR)

Ing. Alberto Moreno Cueva Página 12

Facultad de Ingenieria Industrial y de Sistemas Common Language Runtime Estructura interna del entorno de ejecución en lenguaje común (CLR sus siglas en inglés).

por Este de

es el lenguaje insignia .NET Framework (marco de trabajo .NET) y pretende reunir las ventajas de lenguajes como C, C++ y Visual Basic en uno solo. El CLR es el verdadero núcleo del framework de .NET, entorno de ejecución en el que se cargan las aplicaciones desarrolladas en los distintos lenguajes, ampliando el conjunto de servicios del sistema operativo (W2k y W2003). La herramienta de desarrollo compila el código fuente de cualquiera de los lenguajes soportados por .NET en un código intermedio, el MSIL (Microsoft Intermediate Lenguaje), similar al BYTECODE de Java. Para generarlo, el compilador se basa en la especificación CLS (Common Language Specification) que determina las reglas necesarias para crear el código MSIL compatible con el CLR. Características Es el encargado de proveer lo que se llama código administrado, es decir, un entorno que provee servicios automáticos al código que se ejecuta. Los servicios son variados: • •







Cargador de clases: permite cargar en memoria las clases. Compilador MSIL a nativo: transforma código intermedio de alto nivel independiente del hardware que lo ejecuta a código de máquina propio del dispositivo que lo ejecuta. Administrador de código: coordina toda la operación de los distintos subsistemas del Common Language Runtime. Recolector de basura: elimina de memoria objetos no utilizados. Motor de seguridad: administra la seguridad del código que se ejecuta.

Ing. Alberto Moreno Cueva Página 13

Facultad de Ingenieria Industrial y de Sistemas Biblioteca de Clases Base de .NET Diagrama básico de la Biblioteca de Clases Base. 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: • • • • • • • • • • •

Interacción con los dispositivos periféricos Manejo de datos (ADO.NET) Administración de memoria Cifrado de datos Transmisión y recepción de datos por distintos medios (XML, TCP/IP) Administración de componentes Web que corren tanto en el servidor como en el cliente (ASP.NET) Manejo y administración de excepciones Manejo del sistema de ventanas Herramientas de despliegue de gráficos (GDI+) Herramientas de seguridad e integración con la seguridad del sistema operativo Compilación de código

Esta funcionalidad se encuentra organizada por medio de espacios de nombres jerárquicos. La Biblioteca de Clases Base se clasifica, en cuatro grupos clave: • • • •

ASP.NET y Servicios Web XML Windows Forms ADO.NET .NET

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. Los ensamblados pueden tener diferentes decoradores que definen el entorno Ing. Alberto Moreno Cueva Página 14

Facultad de Ingenieria Industrial y de Sistemas de ejecución de los mismos COM+, DCOM, Remouting, etc.

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 Esta clase contiene todos los miembros para la creación y manipulación de formularios. Tras instanciar un objeto de Form, mediante la configuración de las adecuadas propiedades, podemos crear formularios estándar, de diálogo, de interfaz múltiple o MDI, con diferentes bordes, etc. Creación de un formulario básico A pesar de que en los temas iniciales de este texto, se describió el modo de creación de una aplicación basada en formularios Windows, en el presente tema abordaremos la creación y diseño de formularios, desde un mayor número de perspectivas, relacionadas con los estilos de formularios, controles, creación desde código, herencia, etc. Comenzaremos creando una aplicación basada sólo en un formulario, para repasar el diseñador de formularios del IDE, y algunas de sus propiedades. Iniciaremos por lo tanto Visual Studio .NET, y crearemos un nuevo proyecto VB.NET de tipo aplicación Windows, proceso este, que ya describimos en los mencionados temas iniciales. En este ejemplo dejaremos el nombre de proyecto que nos propone el propio IDE, que será WindowsApplication1, o bien otro número, si ya hemos creado algún proyecto con este nombre.

Ing. Alberto Moreno Cueva Página 15

Facultad de Ingenieria Industrial y de Sistemas Creación de proyectos Windows Forms 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. pantalla aparecerá los últimos programas hechos o accedidos con su respectiva fecha, también podrá abrir cualquier solución de visual Studio .Net o crear una nueva. Para crear un proyecto haga los siguientes pasos.

Mostrara la siguiente ventana

Ing. Alberto Moreno Cueva Página 16

Facultad de Ingenieria Industrial y de Sistemas

Mostrara la ventana

Nos presentara el siguiente IDE.

Ing. Alberto Moreno Cueva Página 17

Facultad de Ingenieria Industrial y de Sistemas

1 2

3

10

8 11 4

7

9

5 6

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: Ø Ø Ø Ø Ø Ø Ø

Class View (Ctrl + Shift + C) Resource View (Ctrl + Shift + E) Macro Explorer (Alt + F8) Document Outline (Ctrl Alt + T) Task List (Ctrl + Alt + K) Command Window (Ctrl + Alt + A) Find Symbol Results (Ctrl +Alt + Y) Ing. Alberto Moreno Cueva Página 18

Facultad de Ingenieria Industrial y de Sistemas Si se habrán dado cuenta, siempre se inicia en el visual Basic, y aparece seleccionada la opción Aplicación para Windows, justamente lo que más vamos a utilizar, para programar. En donde dice nombre, va a ir el nombre de nuestro proyecto, y en donde dice ubicación es en donde se va a ubicar nuestro proyecto o mejor dicho en donde lo vamos a guardar. En el proyecto, se habrá creado un formulario, el cual seguramente te lo mostrará de forma automática. En el lado derecho de la pantalla, verás que hay un Panel o Ventana en la que se indica el proyecto actual y se muestran es el Solution Explorer o Explorardorde Soluciones. Para que se muestre el formulario (Form1), haz doble clic en dicho Elemento del explorador de soluciones. Lo que vamos a hacer ahora es cambiar la separación de los puntos que se muestran en el formulario, ese grid o grilla, servirá para ajustar los controles (ya sabrás de qué hablo) que se añadan a dicho formulario. Por defecto la separación es de 8x8 puntos o pixels... y vamos a ponerlo en 4x4. Selecciona el formulario, simplemente con hacer un clic en él es suficiente.

En el panel de la derecha, debajo del explorador de soluciones, está la ventana de propiedades del elemento que actualmente esté seleccionado, en nuestro caso son las propiedades del Form1. Vamos a buscar el elemento GridSize para poder cambiar el tamaño de Ing. Alberto Moreno Cueva Página 19

Facultad de Ingenieria Industrial y de Sistemas 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. Para añadir controles al formulario, hay que usar la barra de herramientas que está situada en la parte izquierda del IDE de Visual Studio .NET, por ejemplo para añadir una etiqueta (Label) y una caja de texto (TextBox), simplemente haz doble clic sobre esos elementos de la barra de herramientas y se añadirán al formulario. . Te mostrará esto: (realmente te mostrará más cosas, pero por ahora centrate sólo en este código). Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End Sub Lo que vamos a hacer ahora, como ya te he dicho, es escribir el código que se ejecutará cuando se haga clic en ese botón, lo cual producirá el evento clic asociado con dicho botón, ese evento se producirá si se hace un clic propiamente dicho, es decir con el ratón, o bien porque se pulse intro o la barra espaciadora cuando el botón tenga el foco. La nomenclatura, (forma de llamar a las cosas), para los eventos de Visual Basic siguen el siguiente esquema : [nombre del control] [guión bajo] [nombre del evento]

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 Página 110

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas del procedimiento: Handles Button1.Clic, con esto es con lo que el compilador/intérprete de Visual Basic sabe que este procedimiento es un evento y que dicho evento es el evento Clic del objeto Button1. Cuando ese evento se produzca, en este caso vamos a a hacer que se muestre un cuadro de diálogo mostrándonos el nombre que previamente hemos escrito en el cuadro de texto. Escribe lo siguiente en el hueco dejado por el Visual Basic, la línea que hay entre Private Sub... y End Sub MsgBox("Hola..: " & TextBox1.Text) Ejecutar el proyecto que se ejecute el código que hemos escrito o pulsa en el botón play que está en la barra de botones. Escribe algo en la caja de textos, que por defecto tendrá TextBox1 , (que es el valor que por defecto Visual Basic le asigna a la propiedad Text de dicho control), pulsa en el botón Mostrar y verás que se muestra un cuadro de diálogo diciéndote Hola y a continuación lo que hayas escrito en el TextBox 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, simplemente pulsando en el botón AZ: Tipos de datos Son aquellos que identifican que valores se ingresan a las variables de esta forma se realiza un control. Entre estos tipos de datos tenemos.

Tipo de dato

Tipo de dato en VB.NET

Descripci ón Entero sin signo de 8 bit Entero sin signo de 8 bit (tipo no acorde con el CLS)

(Nombre de Byte

Byte

SByte Int16

SByte (tipo de dato no nativo) Short

Entero con signo de 16 bit

Int32

Integer

Entero con signo de 32 bit

Int64

Long

Entero con signo de 64 bit Página 111

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas UInt16 UInt32

UInt64

Entero sin signo de 16 bit (tipo no acorde con el CLS) Entero sin signo de 32 bit (tipo no acorde con el CLS) Entero sin signo de 64 bit (tipo no acorde con el CLS)

UInt16 (tipo de dato no nativo) UInt32 (tipo de dato no nativo) UInt64 (tipo de dato no nativo) Single

Numero con coma flotante de precisión simple, de 32 bit

Double

Double

Numero con coma flotante de precisión doble, de 64 bit

Boolean

Boolean

Valor lógico

Char

Char

Caracter Unicode de 16 bit

Decimal

Decimal

Valor decimal de 96 bit

IntPtr

IntPtr (tipo de dato no nativo)

UIntPtr

UIntPtr (tipo de dato no nativo)

String

String

Entero con signo con tamaño dependiente de la plataforma: 32 bit en Entero sin signo con tamaño dependiente de la plataforma: 32 bit en plataformas de 32 bit yCadena 64 bit en plataformas de 64 de caracteres

Single

TIPO DE CONVERSION Las variables pueden convertirse de un tipo de dato a otro, por ejemplo: Una expresión cadena, convertirla a Numero. Veamos un resumen de las distintas funciones de conversión de tipos y algunos ejemplos: (estos están tomados de la ayuda de Visual Basic .NET) Nombre de la función

Valores del argumento "expresion" Tipo de datos que devuelve

CBool(expresion) Boolean

Cualquier valor de cadena o expresión numérica.

CByte(expresion) Byte

de 0 a 255; las fracciones se redondean.

CChar(expresion) Char

Cualquier expresión de cadena; los valores deben ser de 0 a 65535.

CDate(expresion) Date

Cualquier representación válida de una fecha o una hora.

Página 112

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas CDbl(expresion)

Double

Cualquier valor Duoble, ver la tabla anterior para los valores posibles.

CDec(expresion) Decimal

Cualquier valor Decimal, ver la tabla anterior para los valores posibles.

CInt(expresion)

Cualquier valor Integer, ver la tabla anterior para los valores posibles, las fracciones se redondean.

Integer

CLng(expresion) Long

Cualquier valor Long, ver la tabla anterior para los valores posibles, las fracciones se redondean.

CObj(expresion)

Cualquier expresión válida.

Object

CShort(expresion) Short

Cualquier valor Short, ver la tabla anterior para los valores posibles, las fracciones se redondean.

CSng(expresion) Single

Cualquier valor Single, ver la tabla anterior para los valores posibles.

CStr(expresion)

Depende del tipo de datos de la expresión.

String

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). Cualquier tipo de datos CType(expresion, El Tipo) indicado en el segundo parámetro

Val(expresion)

Double

Una cadena de caracteres.

Página 113

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Fix(expresion)

Depende Cualquier tipo de datos del tipo de datos de la expresión

Int(expresion)

Depende Cualquier tipo de datos del tipo de datos de la expresión

Malla de los tipos de datos.

Para asignar a una variable un valor se procede de la siguiente manera: 1. Se declara la variable. Ejemplo Dim va As Integer Y las constantes se declaran como constantes precisamente. También se pueden declarar varias variables en una misma línea por ejemplo:

Página 114

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Dim a,b,c As Short En la línea anterior a, b y c serán de tipo Short Lo anterior se pudo haber escrito como: Dim a As Short Dim b As Short Dim c As Short O bien Dim a As Short ,b As Short, c As Short Igualmente Sólo tendrá un valor de 3 Todas las variables numéricas al no inicializarlas tendrán como valor 0. 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: Tipo de dato

conversor

Integer

Cint

Long

Clng

Double

Cdbl

Decimal

Cdec

Char

Cchar

String

Cstr

Página 115

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

INSTRUCCIONES CONDICIONALES Las instrucciones básicas de todo lenguaje comprenden las Estructuras Condiciones y los ciclos o Estructuras Repetitivas. Entre ellas veremos: Estructura Condicional: If Esta estructura se usa para evaluar la condición de la Variable Dim i As Short=5 If i > 0 then Haga cualquier cosa End if Como también se puede evaluar la parte negativa If i > 0 then Haga cualquier cosa else Tambien haga cualquier cosa End if Cómo también se puede evaluar varias alternativas cómo If i =1 0 then Muestre el valor elseif i=2 then Muestre el valor else Tambien haga cualquier otra cosa Página 116

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas End if También podemos usar la función IIF, que funciona de la siguiente forma iif(i=1, uno otro ) o iif(i>0, Positivo Negativo ), si tuviéramos el siguiente caso if B=5 then A=1 Elseif B<=0 then A=-1 Else A=0 End if Lo llevaríamos a la función iif de la siguiente forma A=iif(B=5,1,iif(B<=0,-1,iif(B>5,1,0))) La función Switch El switch es parecido al iif con la diferencia que se puede poner varias condiciones con un solo switch A=Switch(B=5,1,B<=0,-1,B>5,1) Como observará el primer elemento de cada pareja es la expresión a evaluar. También se puede anidar las instrucciones if. Por ejemplo If A>0 then If (A mod 2 )=0 then Número par Else Número impar End if Else Nùmero negativo End if Página 117

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ESTRUCTURA SELECTIVA: Select case Esta instrucción permite evaluar múltiples valores por ejemplo: Dim B As Short =30 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 Si fuera mayor o igual a 23 y menor e igual a 25 Case 1 to 2 Si fuera 1 o 2 Case 26 to 28,31 Si fuera mayor o igual a 26 y menor e igual a 28 o si es 31 Case else Si no es ninguna de las anteriores End select ESTRUCTURAS REPETITIVAS FOR.(Para Hasta) Sintaxis: For var=valorinicial to valorfinal step(incremento) (programacion) Next var El For es una sentencia repetitiva donde var es la variable de control que dara las vueltas. Página 118

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Ejemplos: Visualize en el formulario los numeros pares del 100 al 2(100,98,96..) For i=100 to 2 step 2 Print i Ejemplo:

Next I

3+5+7+...+81 Genere y visualize numeros del 10 al 90 y al Sumar= final muestre la suma de ellos Dim suma as integer,i as integer Sm=0 Suma=0

For N=3 to 81 Step 3

For I=10 to 99

Sm=Sm+n

Print I

Next

Suma=Suma + i Next Print La suma es & suma el & concatena DO WHILE.…LOOP.(Hacer mientras) , DO…. LOOP UNTIL(Hacer Hasta) Sintaxis: Do while condicion (programacion) Loop Do (programacion) Loop Until Condicion Genere y visualize numeros del 10 al 90 y al final muestre la suma de ellos Do while Dim i as integer,suma as integer Suma=0 i=10

Página 119

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Do while i <= 90 Print I : Suma= Suma + i : i= i +1 Loop Print La suma es & suma Do Loop until Dim i as integer,suma as integer Suma=0 i=10 Do Print I Suma= Suma + I i= i +1 Loop Until i > 90 Print La suma es & suma WHILE..WEND(Hacer Cuando) Sintaxis: While condicion (Programacion) wend Dim i as integer,suma as integer Suma=0 : i=10 while i <= 90 Print I : Suma= Suma + i : i= i +1 wend Print La suma es & suma Con la sentencia while wend, no se podra utilizar la setencia EXIT

Página 120

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas FOR EACH Repite un grupo de instrucciones colección.

para cada elemento de una matriz o

Sintaxis: FOR EACH elemento IN grupo (Instrucciones) NEXT Ejemplo: Poner a las cajas de texto color de fondo rojo Private Sub CmdCambiar_Click() 'Se declara una varibale de tipo Object Dim obj As Object 'Por cada objeto que se encuentre en el formulario actual 'Este for dara vueltas segun la cantidad de objetos que hay en le formulario For Each obj In Me.Controls 'Pregunta si el objeto es un Textbox si lo es cambia de color de fondo If TypeOf obj Is TextBox Then obj.BackColor = vbRed End If Next End Sub Sentencia EXIT La sentencia EXIT permitira salir de un bucle,funcion,procedimiento,etc.Dependiendo de donde se quiere salir se aplicará la sentencia: Exit For .- Sale de un for Exit Do.- Sale de un Do Exit Sub.- Sale de un procedimiento

Página 121

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Exit Function.- Sale de una funcion , etc.

Página 122

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Semana 2 : Uso de Controles Comunes El control Label._ En un control que permite visualizar un título o texto, también permite Visualizar un resultado. Este es uno de los controles más utilizado, porque es utilizado para Visualizar un título a un control; puede mostrar el resultado de una Operación, etc. Las propiedades de este control:

Si te habrás dado cuenta a la hora de utilizar la propiedad de TextAlign del control label, este te muestra una imagen en donde hay nuevo opciones de alienar el texto a comparación de la versión anterior que solo te mostraba tres opciones.

Ejemplo 01 Esta aplicación es fácil de hacer, el formulario que vas a crear deberá tener el siguiente diseño.

Página 123

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

El control Textbox._ Es el segundo botón control más utilizado en todas aplicaciones y formularios, porque permite: Ingresar datos por teclado, visualizar datos o resultados. Las propiedades de este control:

Página 124

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

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.

diseño de código le daremos doble clic en el formulario. Seleccionar el objeto TXTN1 y su evento KEYPRESS: Private Sub Txtn1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles Txtn1.KeyPress Donde escribiremos el siguiente código: If Asc(e.KeyChar) = 13 Then txtn2.Focus() End If End Sub Private Sub txtn2_KeyPress(ByVal sender As Object, ByVal e As

Página 125

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas KeyPressEventArgs) Handles txtn2.KeyPress If Asc(e.KeyChar) = 13 Then txtpromedio.Text = (Val(Txtn1.Text) + Val(txtn2.Text)) / 2 End If End Sub Una de las características del Textbox es que permite controlar el ingreso de los datos por el Teclado, a través del Evento KeyPress.

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.

Página 126

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

El control Button._ Es el control más por los programadores y utilizado en todas aplicaciones y formularios, porque Permite: Ejecutar un conjunto de instrucciones al hacer clic en el control.

Las propiedades de este control:

Página 127

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Ejemplo 04 Reconociendo VB .NET y Trabajando con el Lenguaje Duración: 20 minutos Cargue Visual Studio .NET, aparecerá la página de inicio, en ella elegir la opción Get Started y luego elegir Create New Project , observe los diferentes tipos de proyectos y sus respectivas plantillas. 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 ingrese Lab03_1 . 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. Vamos a empezar a crear una aplicación en la que en un formulario se ingresen los datos de unos alumnos, tal como su nombre, notas de sus exámenes parcial y final y se calculará el promedio y condición. Además, en otro formulario se mostrará un informe del total de alumnos ingresados, aprobados, desaprobados y el promedio total Primero en la ventana del Solution Explorer seleccionar el nombre del formulario y en la ventana de propiedades escribir en la propiedad FileName el nombre frmDatos.vb . Realizar el diseño del formulario similar al de la figura 1.18, ingresando como prefijo de la propiedad Name de las etiquetas las iniciales lbl , para los textos txt y para los botones btn , seguido del nombre que generalmente es similar al contenido de la propiedad Text . Después de realizar el diseño y configurar las respectivas propiedades de los objetos, visualice el código del formulario. Observe las nuevas características del Lenguaje y notes la diferencias entre esta versión y la anterior. Diseño del formulario frmDatos Página 128

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Para realizar los cálculos de la aplicación vamos a crear variables y funciones públicas en un módulo estándar, para lo cual del menú Project elegimos la opción Add Module y luego escribimos en el nombre Modulo.vb Escribir el siguiente código en el módulo: Module Modulo Public NTotal, NAprobados, NDesaprobados As Byte Public Suma, PromTot As Single

Public Function Calcular_Promedio(ByVal Par As Byte, _ ByVal Fin As Byte) As Single Return ((Convert.ToSingle(Par + 2 * Fin)) / 3) End Function Public Function Calcular_Condicion(ByVal Pro As Single) _ As String NTotal = +1 : Suma = +Pro If Pro > 10.5 Then NAprobados = +1 :

Return ("Aprobado")

Else NDesaprobados = +1 : Return ("Desaprobado") End If End Function End Module Regresar al formulario y proceder a escribir código en los eventos de los botones, tal como se muestra a continuación: Protected Sub btnCalcular_Click(

)

Dim Par, Fin As Byte : Dim Pro As Single : Par =

Página 129

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Convert.ToByte(txtParcial.Text) Fin = Convert.ToByte(txtFinal.Text) : Pro = Calcular_Promedio(Par, Fin) txtPromedio.Text = Format(Pro, "#.00") : txtCondicion.Text = Calcular_Condicion(Pro) End Sub Protected Sub btnNuevo_Click(ByVal sender As Object,

)

Dim X As Control For Each X In Me.Controls If TypeOf X Is TextBox Then X.Text = "" Next :

txtNombre.Focus()

End Sub Protected Sub btnInforme_Click(ByVal sender As Object, Dim X As New frmInforme() :

)

X.ShowDialog()

End Sub Protected Sub btnSalir_Click(ByVal sender As Object,

)

Me.Close End Sub Para mostrar el informe de situación de alumnos ir al menú Project y elegir la opción Add Windows Form y en el nombre escribir frmInforme.vb . Luego realizar el diseño del formulario, tal como se muestra en la figura de abajo. Diseño del formulario frmInforme Ingresar al código del formulario frmInforme y proceder a escribir código en el evento Load para que se muestre las estadísticas de los alumnos: Public Sub frmInforme_Load(

)

txtTotal.Text = NTotal.ToString : txtAprobados.Text = NAprobados.ToString

Página 130

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas txtDesaprobados.Text = NDesaprobados.ToString txtPromedioTotal.Text = Format((Suma / NTotal), "#.00") End Sub Luego programar en los botones de Aceptar y Cancelar el regreso y la finalización de la aplicación respectivamente, similar al código mostrado abajo: Protected Sub btnAceptar_Click(ByVal sender As Object,

)

Me.Close() End Sub Protected Sub btnCancelar_Click(ByVal sender As Object,

)

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. Diríjase al Explorador de Windows y analice el contenido de la carpeta Lab01_1 , observe que existen varios tipos de extensiones, sln para la solución, vbproj para la aplicación y vb para los formularios y el módulo. Finalmente, ingrese a la carpeta bin de Lab01_1 y observe dos archivos: uno ejecutable (extensión exe) y otro archivo intermedio (extensión pdb), ¿Cuál de estos es conocido como Assemblie?. Ejemplo 05 Implementando Multi Thread y Control de Excepciones 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 . Se va a crear una aplicación en la que se implemente múltiples threads para iniciar la lectura de un archivo de texto extenso y poder cancelar este proceso si es necesario, además para evitar los errores en tiempo de ejecución haremos uso del control estructurado de excepciones visto en este módulo. Primero en la ventana del Solution Explorer seleccionar el nombre del Página 131

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas formulario y en la ventana de propiedades escribir en la propiedad FileName el nombre frmArchivo.vb . Realizar el diseño del formulario similar al presentado aquí abajo: Diseño del formulario frmArchivo

Declarar una variable llamada Hilo de tipo thread y definir una subrutina que lea el archivo de texto cuya ruta y nombre está especificado en el cuadro de texto, esta rutina usa Try..Catch..Finally para controlar errores en tiempo de ejecución. Dim Hilo As System.Threading.Thread 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 txtArchivo.Text = txtArchivo.Text + Linea + Chr(13) + Chr(10) Loop Catch X As IO.IOException MsgBox(X.Message, MsgBoxStyle.Information, "No se pudo") txtNombre.Clear() :

Exit Sub

End Try Flujo.Close() : btnSuspender.Enabled = False : btnContinuar.Enabled = False btnCancelar.Enabled = False End Sub Página 132

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Escribir código en el evento TextChanged de txtNombre y en los eventos Click de los Botones . Private Sub txtNombre_TextChanged(ByVal sender As

) Handles

btnLeer.Enabled = : txtNombre.Text <> "" End Sub Private Sub btnLeer_Click(ByVal sender As

) Handles

Hilo = New System.Threading.Thread(AddressOf LeerArchivo) : Hilo.Start() btnSuspender.Enabled = True :

btnCancelar.Enabled = True

End Sub Private Sub btnCancelar_Click(ByVal sender As

) Handles

Hilo.Abort() : btnLeer.Enabled = False : btnSuspender.Enabled = False btnCancelar.Enabled = False End Sub Private Sub btnNuevo_Click(ByVal sender As txtNombre.Clear() :

) Handles

txtArchivo.Clear() :

txtNombre.Focus()

End Sub Private Sub btnSuspender_Click(ByVal sender As Hilo.Suspend() : = True

btnLeer.Enabled = False :

) Handles btnContinuar.Enabled

btnCancelar.Enabled = False End Sub Private Sub btnContinuar_Click(ByVal sender As

) Handles

Hilo.Resume() End Sub Private Sub btnSalir_Click(ByVal sender As

) Handles ...

Me.Close()

Página 133

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas End Sub Finalmente, grabar y ejecutar la aplicación. Ejemplo 05 Ejercicio Modelo Para Desarrollar en Laboratorio. 1. Crear una Carpeta con el nombre: Visualnet, en la unidad C: o Unidad D: 2. Activar el .Net, seleccionar el botón: 3. Se visualiza la siguiente pantalla:

4. Activar el Explorador de soluciones:

• O también pulsando las teclas: Ctrl + Alt + L 5. Se visualiza lo siguiente:

Renombrar Form1.vb por Demo01.vb

6. Cerrar la ventana del Explorador de soluciones y activar la ventana de propiedades (F4) 7. Aplicar las propiedades del formulario: Name

frmdemo01

Text

Primera Practica Net

Opacity

90%

StartPosition

CenterScreen

FormBorderStyle

Fixed3D

Página 134

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas BackgroundImage

1 imagen de Archivo

Cursor

Hand

Icon

Seleccionar un archivo icono

8. Del Cuadro de Herramientas, insertar al formulario lo siguiente: Componente: GroupBox

El formulario tendrá el siguiente diseño:

Objeto: GroupBox

9. Propiedades del GroupBox1 (Ventana de Propiedades) Name

gbxcuadros

Text

Operaciones Con Cuadros

Font

Bold à True

Forecolor

1 Color

BackgroundImage

La misma imagen del Formulario

Cursor

PanNorth

10. El formulario tendrá el siguiente aspecto:

Página 135

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 11. Del cuadro de Herramientas:

Insertar el Objeto Label dentro del GroupBox

12. El formulario tendrá el siguiente aspecto:

Objeto Label Insertado dentro del GroupBox

13. Propiedades del Objeto Label Name

Label1

Text

Ingrese El Primer Numero :

BorderStyle

Fixed3D

Image

Insertar un icono de imagen

ImageAlign

MiddleRight

TextAlign

MiddleLeft

Font

Bold à True

Forecolor

Un color

Autosize

False

BackColor

1 Color

14. El formulario tendrá el siguiente aspecto:

Página 136

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

15. Copiar y Pegar (4 Label) à Total de Labels (5 Labels) 16. Modificar los Text de los labels, tal como se visualiza en la siguiente imagen:

17. Del cuadro de herramientas:

Insertar el cuadro de texto: Textbox, dentro

18. El formulario tendrá el siguiente aspecto:

Cuadro de Texto: Textbox1, insertado en el objeto GroupBox

19. Propiedades del Textbox1 Nam e

txtuno

Text

Vacio

Forecolor y Backcolor

1 Color

Font

Bold à True

20. Copiar y pegar los cuadros de Textos, el formulario tendrá el siguiente aspecto:

Página 137

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Name: txtdos Name: txttres Name: txtcuatro

Name: txtcinco

21. Insertar un segundo GroupBox hacia el formulario, tal como se muestra en la siguiente imagen:

Name

gbxopciones

Text

Opciones de Control

Font

Bold à True

Forecolor

1 Color

BackgroundIma ge

La misma imagen del Formulario

Cursor

PanWest

22. El formulario tendrá el siguiente aspecto:

23. Del Cuadro de Herramientas:

Insertar un botón de comando, Button hacia el GroupBox

24. El formulario tendrá el siguiente aspecto:

Página 138

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Botón de Comando Button1

25. Propiedades del botón de Comando: Nam e

btnnuevo

Text

&Nuevo

BackgroundImage

La misma imagen del Formulario

Image

Un icono

ImageAlign

BottomCenter

TextAlign

MiddleCenter

Forecolor

1 Color

Cursor

Hand

26. Copiar y pegar 4 botones de comando con el objeto Button, hacia el

objeto GroupBox

Name:

Name: btnmultiplica

Name: btnprome

Name: btnsalir

27. En el formulario:

Página 139

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Copiar y pegar el Objeto Label y el TextBox

28. El formulario tendrá el siguiente aspecto:

Name: txtresultado Text: Vacio

Name: Label6 Text: El Resultado Es : TextAlign: MiddleCenter

29. Pulsar doble clic en el objeto TextBox: txtuno, evento: Keypress

30. Seleccionar el objeto: txtdos, evento: Keypress

Página 140

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 31. Seleccionar el objeto: txttres, evento: keypress

32. Seleccionar el objeto: txtcuatro, evento: Keypress

33. Seleccionar el objeto: txtcinco, evento: Keypress

34. Seleccionar el Objeto: btnnuevo, evento: Click

Página 141

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

35. Seleccionar el objeto: btnsuma, evento: Click

36. Seleccionar el objeto: btnmultiplica, evento: Click

37. Seleccionar el objeto: btnprome, evento: Click

38. Seleccionar el objeto: btnsalir, evento: Click Grabar y Ejecutar La Aplicación

Esta aplicación nos permitir hallar la venta de un producto cualquiera, Calculando el Subtotal, IGV y Total de la venta, y a su vez nos mostrara la hora actualizándose cada segundo, mediante un control Timer.

Página 142

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Primero comencemos con los nombres de cada control, aunque creo que esto es lo que más me toma tiempo, empecemos, el Label que nos mostrara la fecha se llamara lblFecha, el que nos mostrara se llamara lblHora, el del subtotal se llamara lblSubTotal, el del total se llamara lblTotal y el del IGV se llamara lblIgv, el TextBox que captura el nombre del producto se llamara txtNombProd, el del precio unitario se llamara txtPrecUnit y el de la cantidad se llamara txtCant, los botones de Nuevo, Resultados y Salir se llamaran btnNuevo, btnResultados y btnSalir, respectivamente. frmAplicacion89 (Evento FormClosing) Dim Resp As MsgBoxResult Resp = MsgBox("¯Desea salir de la Aplicaci¤n?", sgBoxStyle.YesNo, "Cuidado") If Resp = MsgBoxResult.No Then e.Cancel = True End If frmAplicacion89 (Evento Load) 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.lblHora.Text = Format(Now, "hh:mm:ss tt") btnSalir (Evento Click) Me.Close()

Página 143

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas btnNuevo (Evento Click) Me.txtCant.Text = "" Me.txtNombProd.Text = "" Me.txtPrecUnit.Text = "" Me.lblIgv.Text = "" Me.lblSubTotal.Text = "" Me.lblTotal.Text = "" Me.txtNombProd.Focus() btnResultados (Evento Click) Dim SubTotal, IGV, Total As Single SubTotal = CStr(Val(Me.txtCant.Text) * Val(Me.txtPrecUnit.Text)) IGV = SubTotal * 0.19 Total = IGV + SubTotal Me.lblSubTotal.Text = Format(SubTotal, "###,##0.00") Me.lblIgv.Text = Format(IGV, "###,##0.00") Me.lblTotal.Text = Format(Total, "###,##0.00") 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

Página 144

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Indicaciones: Cuando se ejecuta la aplicación deberá realizar lo siguiente: Respecto a los botones • •

El botón Nuevo, nos permite limpiar los cuadros de textos El botón Calcular nos permite realizar las siguientes operaciones: Sub Total, Igv y A pagar • El botón: Salir, nos permite salir de la aplicación Respecto a los GroupBox •

Cuando se selecciona el botón: Nuevo, se activa los Groupbox: Datos del cliente y Compras del cliente, para ingresar los datos • Se digita los datos de un cliente • Se ingresa un código de un producto • La descripción de un producto • El precio • Cuando se digita la cantidad, debe que visualizarse automáticamente en la columna total, el producto del precio por la cantidad • Cuando se hay llenado las compras del Cliente • Se pulsa el botón: Calcular, para que halle los resultados mencionados anteriormente Validaciones • •

En la columna precio y cantidad, solamente acepta valores numéricos En los Cuadros de textos, se debe que utilizar el evento Keypress

Ejercicios propuestos •

Ingresar tres números y determinar cuál de ellos es el menor.



Llamar de un formulario a otro usando botones.



Ingresar dos números realizar la suma de estos, enviar a otro formulario y acumularlos en un label.



Ingresar un valor inicial y final con la estructura repetitiva for .. to realizar la secuencia para determinar cuántos pares e impares existen así como su acumulado de cada uno, debe mostrar en un control textbox de múltiples líneas las respuestas de la serie respectiva.

Página 145

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas •

Mostrar en el formulario la tabla de dividir de un numero ingresado dicha tabla solo se mostrar si este número está comprendido entre 1 y 12.



En un formulario y en 25 botones determinar al azar sin que se repitan la emulación de un bingo.

Semana 3 : Contenedores de elementos El control combo box._ 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: 1. Simple Combo. En este caso el registro seleccionado también es editable, y se muestra una lista no desplegable dotada si es necesario de una scrollbar. 2.- DropDown ._ es el valor más habitual y corresponde a el caso en el que sólo se muestra el registro seleccionado, que es editable por el usuario, permaneciendo el resto oculto hasta que el usuario despliega la lista con el mouse. 3. DropDown List. En este último caso el registro seleccionado no es editable y la lista es desplegable. En una caja combinada, al igual que en una caja de texto sencilla, está permitido escribir con el teclado en tiempo de ejecución, si la propiedad Enabled vale True. En una lista esto no es posible. El control list box._ Un ListBox es un control en el que se pueden mostrar varios registros o líneas, teniendo uno o varios de ellos seleccionado(s). Si en la lista hay más registros de los que se pueden mostrar al mismo tiempo, se añade automáticamente un Página 146

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas scrollBar. Para añadir o eliminar registros de la lista se utilizan la Colección Ítems cuyos métodos son Add y Remove respectivamente. Esto sólo puede hacerse en modo de ejecución, y no en modo de diseño. Se suelen inicializar desde el evento MyBase.Load. Propiedades - Ítems. Es una colección de elementos que se almacena en el ListBox. En dicha colección se utilizan los siguientes métodos: - Add.- Añadir un Item. Clear. Limpiar los Ítems de la Lista. - Remove. Quitar un Item de la Lista. - Count. Retorna el número de Ítems en la Lista. - SelectedIndex. Retorna el índice del elemento seleccionado. Hay que tener en cuenta que los elementos de la lista se empiezan a numerar por cero, y en el caso de no haber ninguno seleccionado esta propiedad vale -1. - SelectedItem. Retorna el valor del elemento seleccionado, también se utiliza la propiedad Text. - SetSelected (pos,valor). Indica si una lista esta seleccionada, esta si esta en true indica que ese elemento ha sido seleccionado. - SelectionMode esta es una propiedad que indica si se podra seleccionar una propiedad neta del ListBox y se dara en tiempo de diseño. Ejemplo 06 Este Formulario nos permite ingresar un nombre de un trabajador y al seleccionar el tipo de pago del trabajador, automáticamente nos hallara el pago por hora, y tendremos que ingresar las horas trabajadas. Esta aplicación nos permite ingresar un numero entero cualquiera a un ListBox, y después podemos ordenarlos Página 147

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ascendentemente o descendentemente, o eliminar los elementos seleccionados, también podremos hallar la media de los elementos del control, teniendo en cuenta que si el número de elementos de la lista es impar, la media es igual al número colocado en la posicion media de la lista, o si el número de elementos de la lista es par, la media es igual al promedio de los dos valores medios de la lista. NOTA que se debe de tener ordenados los elementos de la lista en forma ascendente para poder hallar la media.

Los controles tendrán su nombre respectivo, con referencia a su función, el tectbox se llama txtNumIng, el botón añadir se llamara btnAñadir, el botón cerrar se llamara btnCerrar, el botón ordenar se llamara btnOrdenar, el botón eliminar se llamara btnEliminar, el botón ejecutar clculo se llamara btnEjecutar, la lista de números (ListBox) se llamar lstNumeros, el radio button ascendente se llamar rdbAscendente y el del descendente se llamara rdbDescendente y por último el Label que muestra la media de la lista de números se llamara lblCalculo. Cuando seleccionaremos un elemento o más de uno, se activara el botón de Eliminar, en caso contrario debe de estar desactivado. Declaramos variables a Nivel del Formulario Dim Ordenado As Boolean = False txtNumIng (Evento TextChanged) If IsNumeric(Me.txtNumIng.Text) = True Then Me.btnA adir.Enabled = True Else Me.btnA adir.Enabled = False End If btnAñadior (Evento Click) Me.lstNumeros.Items.Add(Me.txtNumIng.Text) Me.txtNumIng.Text = "" Me.txtNumIng.Focus() rdbAscendente (Evento CheckedChanged)

Página 148

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas If Me.rdbAscendente.Checked = True Then Me.btnOrdenar.Enabled = True Else Me.btnOrdenar.Enabled = False End If rdbDescendente (Evento CheckedChanged) If Me.rdbDescendente.Checked = True Then Me.btnOrdenar.Enabled = True Else Me.btnOrdenar.Enabled = False End If btnOrdenar (Evento Click) Dim NumItems, J, K, Mayor As Integer NumItems = Me.lstNumeros.Items.Count - 1 Dim Temp(NumItems) As Integer 'Almacenamos los valores en un array temporal For J = 0 To NumItems Temp(J) = CInt(Me.lstNumeros.Items(J)) Next 'M»todo de Ordenaci¤n llamada BURBUJA For J = 0 To NumItems For K = 0 To NumItems If K < NumItems Then If Temp(K) > Temp(K + 1) Then Mayor = Temp(K) : Temp(K) = Temp(K + 1) : Temp(K + 1) = Mayor

Página 149

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas End If End If Next Next If Me.rdbAscendente.Checked = True Then 'Limpiar y Llenar el ListBox Me.lstNumeros.Items.Clear() For J = 0 To NumItems Me.lstNumeros.Items.Add(CStr(Temp(J))) Next Ordenado = True ElseIf Me.rdbDescendente.Checked = True Then 'Limpiar y Llenar el ListBox Me.lstNumeros.Items.Clear() For J = 0 To NumItems Me.lstNumeros.Items.Add(CStr(Temp(NumItems - J))) Next Ordenado = False End If lstNumeros (Evento SelectedIndexChanged) Me.btnEliminar.Enabled = True btnEliminar (Evento Click) Dim i As Integer : Me.btnEliminar.Enabled = False With Me.lstNumeros For i = .SelectedItems.Count - 1 To 0 Step -1 .Items.Remove(.SelectedItems.Item(i))

Página 150

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Next End With btnEjecutar (Evento Click) Dim NumItems, Index, Q As Integer : Dim Media As Single NumItems = Me.lstNumeros.Items.Count If Ordenado = False Then MsgBox("Para Hallar la Media, Primero Debe de Ordenar los Elementos en Forma Ascendente", MsgBoxStyle.Information, "ERROR!") Exit Sub End If Q = NumItems \ 2 : Index = NumItems - (Q * 2) 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) btnOrdenar (Evento Click) Me.Close()

Página 151

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Empleo de listas

Codificacion Public Class Form1 Private Const msgbox_Title As String = "Lista de Elementos" Private Const msgbox_Eliminar As String = "Para eliminar un dato, debe seleccionarlo previamente" Private Const msgbox_Pasar_Dato As String = "Para pasar un dato, debe seleccionarlo previamente" Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 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("Uvas") : .Items.Add("Sandía") : .Items.Add("Limón") .Items.Add("Fresquilla") End With Label1.Text = ListBox1.Items.Count & " elemento(s)" End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

Página 152

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 'Añadir ListBox1 If TextBox1.Text <> "" Then ListBox1.Items.Add(TextBox1.Text) Label1.Text = ListBox1.Items.Count & " elemento(s)" TextBox1.Text = "" End If End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click 'Eliminar ListBox1 If ListBox1.SelectedIndex <> -1 Then 'Si hay datos seleccionados en el control, eliminamos el dato seleccionado ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) Label1.Text = ListBox1.Items.Count & " elemento(s)" Else MessageBox.Show(msgbox_Eliminar, msgbox_Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Pasa todos los elementos del control ListBox1 al control ListBox2 While ListBox1.Items.Count > 0 ListBox1.SelectedIndex = ListBox1.Items.Count - 1 ListBox2.Items.Add(ListBox1.SelectedItem) ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) End While Página 153

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Label1.Text = ListBox1.Items.Count & " elemento(s)" Label2.Text = ListBox2.Items.Count & " elemento(s)" End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click ListBox2.Sorted = True :

ListBox2.Sorted = False

End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 'Pasa todos los elementos del control ListBox2 al control ListBox1 While ListBox2.Items.Count > 0 ListBox2.SelectedIndex = ListBox2.Items.Count - 1 ListBox1.Items.Add(ListBox2.SelectedItem) ListBox2.Items.RemoveAt(ListBox2.SelectedIndex) End While Label1.Text = ListBox1.Items.Count & " elemento(s)" Label2.Text = ListBox2.Items.Count & " elemento(s)" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim a As Integer = 0 'Pasa un dato seleccionado del control ListBox1 al control ListBox2 If ListBox1.SelectedIndex <> -1 Then ' 'Si hay datos seleccionados en el control,'pasamos el dato seleccionado While a < ListBox1.Items.Count ' si el elemento esta seleccionado If ListBox1.GetSelected(a) = True Then Página 154

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ListBox2.Items.Add(ListBox1.Items.Item(a)) ListBox1.SetSelected(a, False) : ListBox1.Items.RemoveAt(a) 'elimina de la lista el item copiado End If a += 1 End While Label1.Text = ListBox1.Items.Count & " elemento(s)" Label2.Text = ListBox2.Items.Count & " elemento(s)" Else If ListBox1.Items.Count > 0 Then MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If End If End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 'Pasa un dato seleccionado del control ListBox2 al control ListBox1 If ListBox2.SelectedIndex <> -1 Then 'Si hay datos seleccionados en el control, 'pasamos el dato seleccionado ListBox1.Items.Add(ListBox2.SelectedItem) ListBox2.Items.RemoveAt(ListBox2.SelectedIndex) Label1.Text = ListBox1.Items.Count & " elemento(s)" Label2.Text = ListBox2.Items.Count & " elemento(s)" Else

Página 155

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas If ListBox2.Items.Count > 0 Then MessageBox.Show(msgbox_Pasar_Dato, msgbox_Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If End If End Sub End Class Ejemplo 07 : Elegir un nuevo proyecto Visual Basic y una plantilla de Aplicación Windows , seleccionar en ubicación la carpeta C:\VBNET\Labs y como nombre escribir Lab04_1 . : Vamos a crear una aplicación de tipo Proforma, que calcule el precio a pagar por un Computador eligiendo las partes básicas y opcionalmente sus accesorios; para esto, el nombre del formulario será frmProforma.vb . : Realizar el diseño del formulario añadiendo un TabControl con 3 TabPages y diseñar las fichas, tal como se muestran en la figuras de abajo:

Página 156

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Diseño de la primera ficha de frmProforma frmProforma

Diseño de la segunda ficha de

Nota: Los GroupBox de lectoras y los ListBox están deshabilitados.

: Luego de realizar el diseño y configurar las propiedades de los controles; lo primero que haremos es escribir una rutina que permita llenar el combo y Página 157

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas las listas, de la siguiente forma:

Public Sub Llenar_Listas() With cboProcesador.Items .Add("Pentium II 350 Mhz") :

.Add("Pentium III 400 Mhz")

.Add("Pentium III 500 Mhz") :

.Add("Pentium III 700 Mhz")

End With With lstMemoria.Items .Add("32 Mb") : .Add("64 Mb") .Add("128 Mb") End With With lstDisco.Items .Add("10 Gb") :

.Add("20 Gb")

.Add("30 Gb") End With With lstImpresora.Items .Add("Stylus Color 400") :

.Add("Stylus Color 500")

.Add("Stylus Color 700") End With With lstScanner.Items .Add("Pequeño") : .Add("Mediano") :

.Add("Grande")

End With End Sub : A continuación, se debe llamar a la rutina después que se crea el formulario: Public Sub frmProforma_Load( )

Página 158

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Llenar_Listas() End Sub : Se debe programar el combo y las listas de la primera ficha Configuración Básica para que al elegir un tipo de procesador, memoria o disco duro, se muestre el precio respectivo: Public Sub cboProcesador_SelectedIndexChanged(ByVal sender As Select Case cboProcesador.SelectedIndex Case 0 : txtPrecioProcesador.Text = "100" Case 1 : txtPrecioProcesador.Text = "150" Case 2 : txtPrecioProcesador.Text = "200" Case 3 : txtPrecioProcesador.Text = "300" End Select End Sub Public Sub lstMemoria_SelectedIndexChanged(ByVal sender As

)

Select Case lstMemoria.SelectedIndex Case 0 : txtPrecioMemoria.Text = "30" Case 1 : txtPrecioMemoria.Text = "50" Case 2 : txtPrecioMemoria.Text = "70" End Select End Sub Public Sub lstDisco_SelectedIndexChanged(ByVal sender As

)

Select Case lstDisco.SelectedIndex Case 0 :

txtPrecioDisco.Text = "80"

Case 1 : txtPrecioDisco.Text = "100" Case 2 : txtPrecioDisco.Text = "120" End Select

Página 159

Ing. Alberto Moreno Cueva

)

Facultad de Ingenieria Industrial y de Sistemas End Sub : También se debe realizar lo mismo al elegir una opción del grupo de botones, tanto del monitor como del teclado: Public Sub rbnMonitor14_Click(ByVal sender As Object, ) txtPrecioMonitor.Text = "150" End Sub Public Sub rbnMonitor15_Click(ByVal sender As Object,

)

txtPrecioMonitor.Text = "200" End Sub Public Sub rbnTecladoSimple_Click(ByVal sender As Object,

)

txtPrecioTeclado.Text = "15" End Sub Public Sub rbnTecladoLujo_Click(ByVal sender As Object,

)

txtPrecioTeclado.Text = "30" End Sub : Programamos la segunda ficha de Accesorios , iniciando por la casilla de lectora de disco, para que al elegir este accesorio se habilite sus opciones (ya que las deshabilitamos en diseño) y al elegir un modelo se muestre su precio: Public Sub chkLectoraDisco_Click(ByVal sender As Object, ) gbxLectoraDisco.Enabled = chkLectoraDisco.Checked End Sub Public Sub rbnLectoraDisco1_Click(ByVal sender As Object,

)

txtPrecioLectoraDisco.Text = "20" End Sub Public Sub rbnLectoraDisco2_Click(ByVal sender As Object,

)

txtPrecioLectoraDisco.Text = "40" End Sub

Página 160

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Public Sub rbnLectoraDisco3_Click(ByVal sender As Object,

)

txtPrecioLectoraDisco.Text = "50" End Sub : De manera similar, lo hacemos con la lectora de CD ROM: Public Sub chkLectoraCD_Click(ByVal sender As Object, ) gbxLectoraCD.Enabled = chkLectoraCD.Checked End Sub Public Sub rbnLectoraCD40X_Click(ByVal sender As Object,

)

txtPrecioLectoraCD.Text = "40" End Sub Public Sub rbnLectoraCD60X_Click(ByVal sender As Object,

)

txtPrecioLectoraCD.Text = "50" End Sub Public Sub rbnLectoraCD80X_Click(ByVal sender As Object,

)

txtPrecioLectoraCD.Text = "70" End Sub : Para la opción de Impresoras y Scanner se realiza el mismo procedimiento: Public Sub chkImpresora_Click(ByVal sender As Object, ) lstImpresora.Enabled = chkImpresora.Checked End Sub Public Sub lstImpresora_SelectedIndexChanged(ByVal sender As lstImpresora.SelectedIndexChanged Select Case lstImpresora.SelectedIndex Case 0 : txtPrecioImpresora.Text = "100" Case 1 :

txtPrecioImpresora.Text = "200"

Case 2 : txtPrecioImpresora.Text = "300" End Select

Página 161

Ing. Alberto Moreno Cueva

)

Facultad de Ingenieria Industrial y de Sistemas End Sub Public Sub chkScanner_Click(ByVal sender As Object,

)

lstScanner.Enabled = chkScanner.Checked End Sub Public Sub lstScanner_SelectedIndexChanged(ByVal sender As

)

Select Case lstScanner.SelectedIndex Case 0 : txtPrecioScanner.Text = "100" Case 1 : txtPrecioScanner.Text = "200" Case 2 : txtPrecioScanner.Text = "400" End Select End Sub : Finalmente, programamos los botones de la tercera ficha General , que calculen el precio a pagar, limpie los datos ingresados y finalice la aplicación respectivamente: Public Sub btnCalcular_Click(ByVal sender As Object, ) Dim PrePro, PreMem, PreDis, PreMon, PreTec As Integer Dim PreLDi, PreLCD, PreImp, PreSca As Integer Dim TotBas, TotAcc, TotVen, TotIGV, TotPag As Single 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

Página 162

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas TotBas = PrePro + PreMem + PreDis + PreMon + PreTec TotAcc = PreLDi + PreLCD + PreImp + PreSca TotVen = TotBas + TotAcc TotIGV = (0.18 * TotVen).ToSingle TotPag = TotVen + TotIGV txtTotalBasico.Text = TotBas.ToString txtTotalAccesorios.Text = TotAcc.ToString txtTotalVenta.Text = TotVen.ToString txtTotalIGV.Text = TotIGV.ToString txtTotalPagar.Text = TotPag.ToString End Sub Public Sub btnNuevo_Click(ByVal sender As Object,

)

Dim X As Control For Each X In Controls If ((TypeOf X Is TextBox) Or (TypeOf X Is ComboBox)) Then X.Text = "" End If Next End Sub Public Sub btnSalir_Click(ByVal sender As Object,

)

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 Página 163

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas base de datos que maneje información se haría engorrosa y los datos no estarían tan seguros, veamos un ejemplo de este tipo de aplicación sin una base de datos, y como seria su programación, primero veremos por formulario, así que el primero ser el formulario frmInfo. frmInfo

Este formulario tendrá un GropuBox que conservara su propio nombre y los Labels de este formulario que solo nos mostraran lo que decepcionan del otro formulario, tendrán los siguientes nombres, de acuerdo a su etiqueta de su costado; lblMainboard, lblProcesador, lblDiscoDuro, lblMemoriaRAM, lblTarjVideo,blTarjRed, lblCase. Y el único que contendrá el formulario va a ser en el control GroupBox1 GroupBox1 (Evento Click) Me.Close() frmAplicacion90

Página 164

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Ahora pondremos los nombres respectivos a cada control, en este caso, yo solo daría referencia a que control me refiero y ustedes deben de saber identificar qué control es. Ok!, por ejemplo en qué forma se está mostrando los Buttons, los GroupBox y el PictureBox. QUE ES LO QUE SE PIDE? 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 selecciona un CPU, se nos pueda mostrar su descripción de ella nada mas, también podremos añadir los artículos seleccionados al carrito, y también eliminar elementos seleccionados y nos debe de mostrar el total de todos los productos, el subtotal y el IGV. Y para los que les guste hacerlo ms perfecto, también le pueden Página 165

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas agregar un botón de impresión donde se imprimir el formulario en pantalla. Una vez ya tenido el diseños del formulario listo y sus descripciones que debe tener, procederemos a codificación.

Realizar la siguiente aplicació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 Almacenar dentro un combo box el ingreso de un producto y cuando este sea seleccionado de la lista desplegable muestra en un list box la cantidad de vocales, consonantes y espacios en blanco que tiene el ítem.

Página 166

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 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. 3.- Ingresar el nombre de un trabajador, la cantidad de hijos y su sueldo, si este tiene hijos se le dará una bonificación de S./40.00 por hijo y si no tiene hijos se le dara el 25% de su sueldo se deberá mostrar la bonificación y el sueldo final.

4.- Ingrese por teclado dos números y al escoger un signo de operación se debera mostrar el resultado de la operación.

5.- Ingrese un numero máximo de 2 cifras si el numero es de una cifra se deberá mostrar cuanto falta para convertirse en un numero de 2 cifras, y si es de 2 cifras se deberá mostrar cuanto falta para convertirse en un numero de 3 cifras. 6.- Ingrese un numero cualquiera y muestre la cantidad de cifras que tiene según sea el caso. 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. - Varon mayor de edad - Varon menor de edad - Dama mayor de edad -Dama menor de edad 8.- Ingrese un numero y visualícelo en romano.

Página 167

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 9.- Ingrese por teclado el día de nacimiento y el mes de nacimiento de una persona al hacer clic se deberá mostrar su signo zodiacal así como también deberá aparecer la imagen del signo Zodiacal en un control PictureBox. 10.- Se deberá desarrollar un algoritmo en el cual se deberá ingresar el nombre de un alumno y se deberá escoger el turno en el que estudia (M , T y N) asi como tambien el ciclo (I, II, III, IV, V, VI y SIDET) y la carrera (CI, Enfermeria y Administración) se debera calcular el pago de su pension en base a los siguientes datos: el precio por carrera es: CI = 320.00 Enfermeria = 280.00 Administración = 270.00 Ademas que dependiendo del ciclo en el que estan se pagara un recargo precio de 10,20,30,40,50,60 y 70% (para sidet). Asi como tambien si es turno se debera recargar 10% mas solo si esta en I, II, o III ciclo, si es turno se recarga el 15 % mas solo si esta en I, o II y por utlimo si es turno se se la hara un descuento del 15 % solo si esta en SIDET

del del del del

Al finalizar solo se debe mostrar el monto de la pension. 11.- Realizar el siguiente formulario: . Se deberá ingresar el largo y el ancho del terreno y conforme vayan digitándolo deberá salir el total (Largo * ancho) Se deberá ingresar el precio por metro y al escoger una categoría el precio se incrementara en un 10, 20, y 30 % respectivamente según la categoria, ademas de salir el precio total que sera el total de area * el precio y si se escogio en tipo de alquiler Contado se le hara un Descuento de 10% al precio total y si es credito se le hara un recargo de 15 %.

Página 168

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Finalmente se deberá escoger si se pagara alumbrado, parques o serenazgo sacando los % correspondientes al precio total según indica el fomulario el precio final debera salir al hacer clic en el boton calcular. 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. 3.- Genere 100 numeros aleatorios y al finalizar diga cual es el mayor y el menor. 4.- Ingrese un numero de cualquier cifra y mostrarlo en forma invertida 5.- Ingrese un numero y conviértalo en base 2 6.- Ingrese una cadena y muestre lo siguiente • • •

La cadena en forma invertida Diga cuantas vocales tiene Diga cuantos espacios en blancos hay

7.- Ingrese una cadena y conviértalo en mayúscula y en minusculas sin utilizar las funciones ucase y lcase. 8.- Genere 10 numeros aleatorios y si el numero es par se debera incrementar el numero con la suma de su raiz cuadrada,si el numero es impar se debera incrementar el numero con la suma del seno del numero. AL finalizar se debe mostrar la suma de todos los numeros. 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 11.- Ingrese un usuario y un password y si se equivoca tres veces debe salir Página 169

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas de la aplicación 12.- Realice el siguiente formulario: En este formulario se debera escoger un color y un objeto(checks,text,options) y al hacer clic en fondo o en letra debera cambiar al color que se ecogio ya sea el fondo(backcolor o la letra(forecolor) Luego al hacer clic en cursiva (font.italic) o en negrita (font.bold) o subrayado (font.underline) se debera cambiar la apariencia de los controles que se escog io (Chec ks, text ,Optio ns)

13.Realic e el siguiente formulario: Cuando se haga clic en Mostrar Resultado se debe mostrar la edad del trabajador, el tiempo de servicio y el codigo que se generara de la siguiente manera: el año de ingreso luego la letra o según su sexo , los 2 primeros caracteres de su apellido paterno, los 2 primeros caracteres de su apellido materno, el primer carácter de su nombre y un correlativo Ademas al ingresar sus nombres al perder el enfoque se debera cambiar el texto por mayúsculas y al entrar al enfoque de algun texto el color de fondo debera cambiar y al salir del enfoque debera regresar al color original que tuvo.

Página 170

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Semana 4 : Uso de Controles Comunes Los controles radio y checkbox

El control RadioButton Es el control de selección de opciones, el cual permite seleccionar una opcion, de un conjunto de opciones. Este control se utiliza en forma grupal, agrupados por un control GroupBox. Las propiedades de este control:

Los eventos que utiliza con mayor frecuencia el Button.

Ejemplo 8 Desarrolle un programa donde al seleccionar un estado civil visualice: Soltero: Sueldo 450, Tiempo de Servicio 5, No Hijos: 2 Casado: Sueldo 250, Tiempo de Servicio 2, No Hijos: 0

Diseño de controles. Página 171

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

btnsalir (Evento clic) Me.Close() rdbsoltero (Evento CheckedChanged) lblestado.Text = Nº de Hermanos :lblsueldo.Text = 200.00 lbltiempoest.Text = Edad :txttiempest.Focus() rdbcasado (Evento CheckedChanged) lblestado.Text = Nº de Hijos :lblsueldo.Text = 250.00 lbltiempoest.Text = Tiempo de Servicio :txttiempest.Focus() frmaplicacion (Evento load) Iniciar() btnnuevo (Evento clic) Iniciar() Función Iniciar Sub Iniciar() txtnombre.Text =

:txttiempest.Text =

:txtnumest.Text =

rdbsoltero.Checked = True :lblestado.Text = Nº de Hermanos lblsueldo.Text = 200.00 :lbltiempoest.Text = Edad 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

Página 172

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas este control:

Los eventos que utiliza con mayor frecuencia el Button.

Ejemplo 9 Diseñe un programa para calcular el monto de su remuneración. Ingrese su nombre, seleccione su categoría: Empleado Obrero Auxiliar

Sueldo500 Sueldo 550 Sueldo 200

Seleccione: Bonificación: 25% del sueldo y movilidad:

15% del sueldo. El monto es la suma de sus ingresos.

Página 173

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Private bonificacion, movilidad As Single Private Sub RadioButton1_CheckedChanged() Handles RadioButton1.CheckedChanged TXTSUELDO.Text = 500 End Sub Private Sub RadioButton2_CheckedChanged() Handles RadioButton2.CheckedChanged TXTSUELDO.Text = 550 End Sub Private Sub RadioButton3_CheckedChanged() Handles RadioButton3.CheckedChanged TXTSUELDO.Text = 200 End Sub Private Sub CheckBox1_CheckedChanged() Handles CheckBox1.CheckedChanged If CheckBox1.Checked = True Then bonificacion = 0.25 * Convert.ToSingle(TXTSUELDO.Text) Else: bonificacion = 0 End If TXTMONTO.Text=Convert.ToSingle(TXTSUELDO.Text)+bonificacion + movilidad End Sub Private Sub CheckBox2_CheckedChanged() Handles CheckBox2.CheckedChanged If CheckBox1.Checked = True Then movilidad = 0.15 * Convert.ToSingle(TXTSUELDO.Tex t) Else: movilidad = 0 End If TXTMONTO.Text = Convert.ToSingle(TXTSUELDO.Text) + bonificacion + movilidad End Sub Página 174

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Private Sub BTNLIMPIAR_Click() Handles BTNLIMPIAR.Click TXTEMPLEADO.Text = TXTSUELDO.Text = TXTMONTO.Text = RadioButton1.Checked = False RadioButton2.Checked = False RadioButton3.Checked = False CheckBox1.Checked = False CheckBox2.Checked = False End Sub

El control PictureBox Este control nos permite mostrar una imagen de una ruta específica. Comentarios Se suele utilizar el control PictureBox para mostrar gráficos de un archivo de mapa de bits, metarchivo, icono, JPEG, GIF o PNG. Establezca la propiedad image en el objeto Image que desea mostrar, ya sea en tiempo de diseño o en tiempo de ejecución. Además, puede especificar la imagen estableciendo la propiedad imagelocation y cargar la imagen de forma sincrónica utilizando el método Load o de forma asincrónica mediante el método LoadAsing. 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. La propiedad sizemode, establecida en los valores en la enumeración PictureBoxSizeMode, controla el recorte y la posición de la imagen en el área de presentación. Se puede cambiar el tamaño del área de presentación en tiempo de ejecución con la propiedad ClientSize. De forma predeterminada, el control PictureBox se muestra sin bordes. Para proporcionar un borde estándar o tridimensional, utilice la propiedad BorderStyle con el fin de distinguir el cuadro de imagen del resto del formulario, incluso si no contiene ninguna imagen. El control PictureBox no se puede seleccionar, lo que significa que no puede recibir el foco de entrada.

Página 175

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Ejemplo 10 En la figura 1 tienes el formulario en tiempo de diseño, que como puedes ver es muy simple: Una caja de textos (txtFic) para el nombre del fichero a mostrar, un botón (btnExaminar) para seleccionar el fichero a mostrar, un PictureBox (pic) para mostrar la imagen, tres RadioButtons (optRotarIzq, optRotarDer y optRotarLibre) para diferentes opciones de rotación y un botón para rotar la imagen (btnRotar).

Imports Microsoft.VisualBasic Imports System Imports System.Windows.Forms Imports System.Drawing Public Class Form1 Private inicializando As Boolean = True Private Sub Form1_Load() Handles MyBase.Load pic.SizeMode = PictureBoxSizeMode.StretchImage txtFic.Text = My.Settings.txtPic ' Si existe la imagen, cargarla If System.IO.File.Exists(txtFic.Text) Then pic.Load(txtFic.Text) End If Select Case My.Settings.optRotar Case -1 optRotarIzq.Checked = True optRotarDer.Checked = False optRotarLibre.Checked = False Página 176

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 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 Private Sub optRotarIzq_CheckedChanged() Handles optRotarIzq.CheckedChanged, optRotarDer.CheckedChanged, optRotarLibre.CheckedChanged ' Este evento se produce al asignar el valor inicial ' y si eso ocurre, no vale de nada el valor de Settings If inicializando Then Exit Sub Select Case True Case optRotarIzq.Checked My.Settings.optRotar = -1 Case optRotarDer.Checked My.Settings.optRotar = 0 Case Else My.Settings.optRotar = 1 End Select End Sub Private Sub txtFic_KeyUp() Handles txtFic.KeyUp If e.KeyCode = Keys.Return Then e.Handled = True ' Si existe la imagen, cargarla If System.IO.File.Exists(txtFic.Text) Then pic.Load(txtFic.Text) End If End If End Sub Private Sub btnExaminar_Click( ) Handles btnExaminar.Click Dim ofd As New OpenFileDialog With ofd .FileName = txtFic.Text .Filter = "Imágenes|*.jpg;*.png;*.gif;*.bmp|Todos (*.*)|*.*" If .ShowDialog = DialogResult.OK Then txtFic.Text = .FileName My.Settings.txtPic = txtFic.Text pic.Load(.FileName) End If Página 177

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas End With End Sub Private Sub btnRotar_Click() Handles btnRotar.Click Dim bmp As Image = pic.Image If optRotarIzq.Checked Then bmp.RotateFlip(RotateFlipType.Rotate90FlipXY) ElseIf optRotarDer.Checked Then bmp.RotateFlip(RotateFlipType.Rotate270FlipXY) Else bmp.RotateFlip(RotateFlipType.Rotate90FlipNone) End If pic.Image = bmp 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 Podemos restringir el rango de fechas a mostrar por este control con las propiedades MinDate y MaxDate. Si queremos, por otra parte, que la fecha se muestre con un formato personalizado, aplicaremos dicho formato mediante la propiedad CustomFormat, teniendo en cuenta que no se hará efectivo hasta que a la propiedad Format no le asignemos el valor Custom. El botón btnCambiosFecha del formulario realiza algunas modificaciones por código sobre el control DateTimePicker dtpFNacim del formulario Private Sub btnCambiosFecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCambiosFecha.Click ' configurar por código el ' control DateTimePicker Página 178

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 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 Determinar cuál es el primer y ultimo día del mes. Dim ultimoDia As Date Function PrimerDiaDelMes( Date PrimerDiaDelMes = DateSerial(Year(dtmFecha), Month(dtmFecha), 1) End Function

) As

Function UltimoDiaDelMes(ByVal dtmFecha As Date) As Date UltimoDiaDelMes = DateSerial(Year(dtmFecha), Month(dtmFecha) + 1, 0) End Function Private Sub Button2_Click( Handles Button2.Click

)

MsgBox(PrimerDiaDelMes((DateTimePicker1.Value))) End Sub Private Sub Button3_Click( ) Handles Button3.Click MsgBox(UltimoDiaDelMes((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

Página 179

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas número negativo incluirá el signo menos (-) y ningún espacio inicial. Dim MyString As String MyString = Str(459) ' Returns " 459". MyString = Str(-459.65) ' Returns "-459.65". Left (cadena, n)._ Extrae los n primeros caracteres de una cadena, comenzando por la izquierda. Si cadena = Curso de Visual Basic Right (cadena, n)._

(Para todos los ejemplos)

Extrae lo n últimos caracteres de la cadena

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"

subString = Microsoft.VisualBasic.Left(myString, 5) ' Returns "Curso" Mid (cadena, m, n)._Extrae n caracteres de la cadena, siendo el carácter extraído el que ocupa el lugar m.

primer

Resultado = Mid (cadena, 3, 10) ----> Resultado = rso de Vis Segundo formato desde una posición hasta la posición final Resultado=Mid(cadena,6) à de visual net LCase (cadena)._ Devuelve otra cadena igual, pero con todos los caracteres en minúsculas. (LCase = Lower Case) Resultado = Lcase (cadena)

---->

Resultado = curso de visual

basic

UCase (cadena)._ Devuelve otra cadena igual, pero con todos loscaracteres en mayúsculas. (UCase = Upper Case) Resultado = UCase (cadena) Len (cadena)._

---->

Resultado = CURSO DE VISUAL BASIC

Devuelve la longitud de la cadena

Resultado = Len (cadena) ---->

Resultado = 21

Space(n)._ Devuelve una cadena formada por n espacios. Resultado = "A" + Space (6)+ "B" Página 180

---->

Resultado = A

B

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 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

por su derecha. (No elimina los espacios centrales de la cadena) InStr._ (cadena, cadena1) Busca la cadena1 dentro de cadena y devuelve el número de orden dentro de cadena donde se encuentra la primera letra de cadena1 Resultado = InStr (cadena, "sua")

----> Resultado = 12

StrConv._ Convierte una cadena de caracteres en otra, según las instrucciones que le sigan. Puede sustituir a UCase o LCase si la instrucción es UpperCase o LowerCase respectivamente, o poner la primera letra de todas las palabras de la cadena en mayúsculas, si la instrucción es ProperCase. Resultado = StrConv (cadena, UpperCase) VISUAL BASIC

----> Resultado = CURSO DE

Resultado = StrConv (cadena, LowerCase) basic

----> Resultado = curso de visual

Resultado = StrConv (cadena, ProperCase) Visual Basic

----> Resultado = Curso De

En este ejemplo se pone un texto todo en minúsculas. Dim sText, sNewText As String sText = "Hello World" sNewText = StrConv(sText, VbStrConv.LowerCase) Debug.WriteLine (sNewText) ' Outputs "hello world". STRING._ Tipo de dato ,Para obtener una lista de todos los miembros de este tipo, Obj.Metodo Metodo.-Remove,Insert,copy, touuper,tolower,indexof,len,substring, etc 5.2.- FUNCIONES CON NUMEROS Funcion

Devuelve

Abs

Valor absoluto de un numero real

Int

Parte entera de un real

Página 181

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Rnd

Un numero al azr entre 0 y 1

Exp

Exponecial de un numero real es decir e = 2.71828

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: Public Class FRMCADENA Private Sub BTNSPLIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNSPLIT.Click

Página 182

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Dim CAD As String Dim VEC() As String Dim I As Integer CAD = TXTCAD.Text.Trim ListBox1.Items.Clear() VEC = CAD.Split(" ".ToCharArray) For I = 0 To UBound(VEC) ListBox1.Items.Add(VEC(I)) Next End Sub Private Sub FRMCADENA_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub FRMCADENA_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated TXTCAD.Text = "esto es una prueba" End Sub Private Sub HandleCheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbn1.CheckedChanged, rbn2.CheckedChanged, rbn3.CheckedChanged, rbn4.CheckedChanged, rbn5.CheckedChanged, rbn6.CheckedChanged, rbn7.CheckedChanged DisplayText(CType(sender, RadioButton)) End Sub Private Sub DisplayText(ByVal rbtn As RadioButton) Dim cadr, texto As String texto = TXTCAD.Text.Trim If rbtn Is rbn1 Then cadr = texto.Insert(3, " ojo")

Página 183

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ElseIf rbtn Is rbn2 Then cadr = texto.Replace("prueba", "practica") ElseIf rbtn Is rbn3 Then 'extraer apartir de la izquierda cadr = texto.Substring(0, 3) ElseIf rbtn Is rbn4 Then 'borrar los carect. desde la posicion 3 cinco caracteres cadr = texto.Remove(3, 5) ElseIf rbtn Is rbn5 Then 'extraer apartir de la derecha cadr = texto.Substring(texto.Length - 3, 3) ElseIf rbtn Is rbn6 Then ' extraer apartir de una posicion cadr = texto.Substring(4, 5) ElseIf rbtn Is rbn7 Then ' extraer apartir de una posicion cadr = "posicion " & texto.IndexOf("t").ToString End If lblres.Text = cadr End Sub End Class Ejemplo 2.-Empleando el Split Mostrando el formulario principal

Página 184

Ing. Alberto Moreno Cueva

Controles: Txtoutput(textbox) TxtInput TxtSeparator

Facultad de Ingenieria Industrial y de Sistemas

Codificación; Formulario frm3 (codificacion) Public Class Form3 #Region " Windows Form Designer generated code " Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim x As New Form1() x.ShowDialog() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim x As New Form2() x.ShowDialog() End Sub End Class b) el formulario 1.- Pasando una cadena a un vector Public Class Form1 Private Sub btnSplit_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles btnSplit.Click Dim TempArray() As String

Página 185

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Dim CurIndex As Integer lstOutput.Items.Clear() If txtInput.Text.Length > 0 And _ txtSeparator.Text.Length > 0 Then TempArray = txtInput.Text.Split(txtSeparator.Text) For CurIndex = 0 To TempArray.GetUpperBound(0) lstOutput.Items.Add(TempArray(CurIndex)) Next End If End Sub End Class -El formulario2 .-(join) Public class form2 Private Sub btnJoin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnJoin.Click Dim TempArray() As String Dim RandomInteger As New System.Random() Dim CurIndex As Integer Dim NumElements As Integer = Convert.ToInt32(txtArraySize.Text) 'Generate random numbers, put in TempArray If NumElements > 0 Then ReDim TempArray(NumElements) For CurIndex = 0 To NumElements - 1 TempArray(CurIndex) = RandomInteger.Next(1000).ToString Next End If 'Join array elements into a comma-separated string

Página 186

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas txtOutput.Text = String.Join(",", TempArray) End Sub End Class Aplicación 3.- Conversión de un numero al sistema binario y hexadecimal Private Sub CmdBin_Click(….) Dim cad as String Dim N, r as String n = Val(TxtNum.text)

Private Sub Cmdhexa_Click(….)

cad = ""

Dim cad As String , N, R as integer

Do While n <> 0

Dim n%

r = n Mod 2

n = Val(Text1.text) : cad = "" Do While n <> 0

Hacer mientras n sea diferente a cero

r = n Mod 16 :n = n \ 16 If r > 9 Then cad = cad + Chr(55 + r) Else cad = cad + Str(r) 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 Página 187

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Private Sub CmdInvertir_Click( sender as object , e as Eventargs) Dim PA, P, K, M as Integer Dim Cad, palabra, scad as String cad = Trim(Text1.text) scad = "" PA = 1

la Frase ingresada

Cadena Vacia Para Formar la frase invertida es la posición inicial de la palabra

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 PALABRA = Mid(cad, k, 1) + PALABRA Next scad = scad + " " + PALABRA End If PA = P + 1 Next Text2.text = scad

Muestra cada palabra de forma invertida

End Sub Private Sub CmdPiramide_Click() List1.Items.Clear cad = Trim(Text1.text)

Almacena el valor de la Frase

List1.Width = Len(cad) * 100 P = Len(cad) \ 2 + 1

El ancho queda definido por la frase en centenas Obtiene la posición media de la frase

PL = Len(cad): a = 1: con = 1 CR = 1

Separamos en dos mitades la parte derecha un contador CR

Página 188

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas CI = 1

Un contador para la parte Izquierda

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 Modifique el ejemplo anterior para mostrar en una lista los siguiente: 1)

C

colocar las palabras de izquierda a derecha

Cr Cri 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.-

Página 189

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas El numero de Ruc se genera a partir del numero de libreta electoral , en el text1 solo se ingresara números, luego este numero se descompone de la sgte manera: Sm= D1*1 + D2*2 + D3*3 +.....+D8*8 Donde D1, D2 ...son los dígitos Luego esta suma se divide entre 13, su residuo se le concatena con el numero electoral al final. Los dos primeros dígitos puden ser:

-

10 = Persona natural

8.-Generación de los carnet de esalud

12= Persona Jurídica E l numero de Carnet es de 15 caracteres y se forma de la siguiente manera: Ejm: Nombre Claudia Ap. Paterno: Moreno Ap. Materno: Lee Fecha de Nac. 26/11/80 Sexo : F Nro: generado 8011260MELEC001 Sexo 0=Femen 1=Masc 8 y 9 Corresponde al Primer y cuarto carac. Del Paterno

De la misma forma es para 10 y 11 posición con el materno, claro si la longitud del apellido es menor de cuatro caracteres se cogerá el tercero, la 12 posición es el Primer carácter del nombre y los tres últimos un correlativo para este caso asumirlo como un contador de registro. 3.-Verificación de Códigos

Página 190

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

El código ingresado será de 7 caracteres los seis primeros son dígitos y el ultimo una letra de verificación:

Para verificar un código se procede de la siguiente manera: Suma= D1*6 + D2*5+D3*4+ D4*3 + D5* 2 + D6*1 Esta suma se divide entre 7 y su residuo se le asigna una letra correspondiente de acuerdo a: 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. Funciones con fechas. 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 Day._ Obtiene el día, a partir de una fecha Dim MyDate As Date Página 191

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Dim MyDay As Integer MyDate = #2/12/1969# . MyDay = Microsoft.VisualBasic.Day(MyDate) ' MyDay contains 12. Month._ Obtiene el mes a partir de una fecha. MyMonth = Month(MyDate) ' MyMonth contains 2. Year._

Obtiene el año a partir de una fecha.

MyYear = Year(MyDate) ' MyYear contains 1969. Hour._

Obtiene la hora a partir de una hora

Minute._

Obtiene el minuto a partir de una hora.

Second._

Obtiene el segundo a partir de una hora.

DateAdd._ Añade un intervalo de tiempo a una fecha Interval Requerido. Valor de enumeración DateInterval o expresión String que representa el intervalo de tiempo que se desea agregar. Number Requerido. Double. Expresión de punto flotante que representa el número de intervalos que se desea agregar. Number puede ser un valor positivo (para obtener fechas u horas futuras) o negativo (para obtener fechas u horas pasadas). Puede contener una parte decimal cuando Interval especifica horas, minutos o segundos. Para otros valores de Interval, se omite cualquier parte decimal de Number. DateValue Requerido. Date. Expresión que representa la fecha y la hora a la que debe agregarse el intervalo. El propio DateValue no se modifica en el programa que realiza la llamada. Valores El argumento Interval puede tener uno de los siguientes valores: Valor de enumeración Cadena Unidad de intervalo de tiempo agregada DateInterval.Day

d

Día; truncado al valor integral

DateInterval.DayOfYear y

Día; truncado al valor integral

Página 192

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas DateInterval.Hour

h

Hora; redondeada al milisegundo más cercano

DateInterval.Minute

n

Minuto; redondeado al milisegundo más cercano

DateInterval.Month

m

Mes; truncado al valor integral

DateInterval.Quarter

q

Trimestre; truncado al valor integral

DateInterval.Second

s

Segundo; redondeado al milisegundo más cercano

DateInterval.Weekday

w

Día; truncado al valor integral

DateInterval.WeekOfYear ww

Semana; truncada al valor integral

DateInterval.Year

Año; truncado al valor integral

yyyy

Dim NextTime As Date = Now ' Current date and time. NextTime = NextTime.AddDays(3.4) ' Increment by 3 2/5 days. En este ejemplo se toma una fecha y mediante la función DateAdd, se muestra la fecha correspondiente un número especificado de meses en el futuro. Dim Msg, Number, StartDate As String 'Declare variables. Dim Months As Double Dim SecondDate As Date Dim IntervalType As DateInterval IntervalType = DateInterval.Month ' Especifica intervalos en meses. StartDate = InputBox("Ingrese fecha ") SecondDate = CDate(StartDate) Number = InputBox("Ingrsa el numero de meses a adicionar") Months = Val(Number) Msg = "New date: " & DateAdd(IntervalType, Months, SecondDate) MsgBox (Msg) DateDiff._

Obtiene el intervalo de tiempo entre dos fechas

DateDiff(intervalo, fecha1, fecha2[, primerdíasemana[, primerasemanaaño]]) Intervalo

Descripción

yyyy

Año

Q

Trimestre

Página 193

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas M

Mes

Y

Día del año

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. Dim DatTim1 As Date = #1/4/2004# ' primera fecha. Dim DatTim2 As Date = #1/9/2004# ' segunda fecha. Dim dias As Long = DateDiff("d", DatTim1, DatTim2) Dim meses As Long = DateDiff("m", DatTim1, DatTim2) 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) DatePart._ Devuelve una parte de una fecha (semana, trimestre, etc.) El argumento Interval puede tener uno de los siguientes valores:

Página 194

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Valor de enumeración

Cadena

Parte del valor de fecha u hora devuelta

DateInterval.Day

D

Día del mes (del 1 al 31)

DateInterval.DayOfYear

Y

Día del año (del 1 al 366)

DateInterval.Hour

H

Hora

DateInterval.Minute

N

Minuto

DateInterval.Month

M

Mes

DateInterval.Quarter

Q

Trimestre

DateInterval.Second

S

Segundo

DateInterval.Weekday

W

Día de la semana (del 1 al 7)

DateInterval.WeekOfYear

Ww

Semana del año (de la 1 a la 53)

DateInterval.Year

yyyy

Año

Este ejemplo obtiene una fecha y, utilizando la función DatePart, muestra el trimestre del año que ocurre. Dim FirstDate, Msg As String 'Declare variables. Dim SecondDate As Date FirstDate = InputBox("Enter a date:") SecondDate = CDate(FirstDate) Msg = "Quarter: " & DatePart(DateInterval.Quarter, SecondDate) MsgBox (Msg) Datetime._ Representa un instante de tiempo, normalmente expresado en forma de fecha y hora del día. (es propio del framework) Dim objdate as datetime Objdate.Metodo.- Lista de metodos Objdate.day dia del mes Similares a las funciones anteriores ,DayOfweek (dia de la semana),Month,Now,Hour,Minute,seconds, etc Función FORMAT Esta función permite presentar cadenas de numéricas o fechas de una determinada forma. Permite establecer el Formato de esa cadena. FechadeHoy = Format (Now, yyyy-mm-dd ) la variable FechadeHoy tendrá el valor 1998-05-21, que se refiere al día 21 de mayo de

Página 195

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 1998, según el formato recomendado por la norma ISO-8601 para la presentación de fechas. Si hubiésemos puesto la expresión FechadeHoy = Format (Now, dd/mm/yy ) , la variable FechadeHoy contendría el valor 21/05/98 referido al día citado. firstdayofweek. Especifica el primer día de la semana. Puede tomar uno de estos valores o constantes : Constante

Valor

Descripción

VbSunday

1

Domingo (valor por defecto)

vbMonday

2

Lunes

vbTuesday 3 vbWednesday

Martes 4

Miércoles

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. Para poner los números separados por millares : Variable = Format(1234567, "##,###,###")

Variable = 1.234.567

Ejemplos de funciones fecha: Ingresando una fecha mostrar la edad exacta de cualquier presenta.

Public Class Form1 Private Sub BTnCalculo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCalculo.Click Dim FE, FA, FN As Date FA = Today : FE = CDate(TXTFE.Text) Página 196

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Dim DIAS, MES, AA, DA, DN As Integer AA = Year(FA) - Year(FE) FN = CDate(FE.Day & "/" & FE.Month & "/" & FA.Year) DA = FA.DayOfYear : DN = FN.DayOfYear If DN > DA Then AA = AA

1

FE = FE.AddYears(AA) : MES = DateDiff("M", FE, FA) FE = FE.AddMonths(MES) If DN > DA Then DIAS = DateDiff("D", FA, FE) Else DIAS = DateDiff("D", FE, FA) End If LBFE.Text = AA :

LBDIA.Text = DIAS :

LBMES.Text = MES

End Sub End Class Ejercicios empleando funciones Fechas.1.- Realizar un programa que permita generar los códigos de los empleados que serán almacenados en una lista , el código se genera en función del cargo y año de ingreso según: el código esta compuesto de seis Caracteres. Apellidos = Laura Lee Cargo = Docente

: fecha = 20/02/2001

Su código será : D01001 Consideración: el Campo apellido y nombre solo debe aceptar letras y espacios en Blanco, La fecha debe ser correcta. 2.- Aplicando Fechas.- Ingrese como datos Monto de la cuota, fecha de Página 197

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas 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: Menor a una semana

1% por cada dia

Entre 2 y 3 semanas

1.5% por dia

Mayor a 3 semanas

2% por dia

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. Ejemplo para 20 Bolas serán 3 superficies y sobran 6 bolas. 4.- Alquiler de Maquinas El pago hora es de acuerdo al usuario: Estudiante S/1.0

S/. 1.50

Publico

S/2.00

Docente

5.- Realice una aplicación en donde se ingrese a cuadros de texto el Día(entre 1 y 31), Mes(entre 1 y 12) y Año de Nacimiento(4 dígitos) de una persona, luego al pulsar un clic sobre el botón Calcular mostrar su Edad y el signo Zodiacal (control Image) al que pertenece. NOTA : Validar que en los cuadros de texto sólo se debe ingresar dígitos.

1. ENUNCIADO : diseñe un formulario que simule un cheque bancario F Se ingresa el Valor del monto del cheque (sólo dígitos entero positivo de máximo cuatro dígitos). F La cantidad del monto en letras se mostrará automáticamente una vez ingresado el valor del monto del cheque. Página 198

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas F Al pulsar Enter el enfoque pasará a ingresar el nombre del titular del cheque F La fecha de mostrará en formato largo. F Mostrar la firma del administrador general del banco

Aplicacion nro 3.- Juego de dados

Codificación Public Class frmdado Dim ruta As String = "d:\bakupweb\dibujos\dado" Private Shared myTimer As New System.Windows.Forms.Timer() Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True txtvueltas.Text = "" End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As Página 199

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas System.EventArgs) Handles Timer1.Tick Static n As Integer :

Dim d1, d2 As Integer

Randomize() d1 = CInt(Rnd() * 5) + 1 : d2 = CInt(Rnd() * 5) + 1 txtvueltas.Text = (5 - n).ToString : n = n + 1 pic1.Image = Drawing.Image.FromFile(ruta & d1 & ".bmp") pic2.Image = Drawing.Image.FromFile(ruta & d2 & ".bmp") 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

Aplicación empleando funciones y modulos

Página 1100

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Module Module1 Variables Publicas para todos los formularios Public ntotal, naprobados, ndesaprobados As Byte Public suma, ptotal As Single Public Function calcular_promedio(ByVal exp As Byte, ByVal exf As Byte) As Single Return (Convert.ToSingle(exp * 2 + exf) / 3) End Function Public Function calcularCondicion(ByVal prom As Single) As String suma += prom ntotal += 1 If (prom > 13) Then naprobados += 1 Return ("aprobado") Else ndesaprobados += 1 Return ("desaprobado") End If End Function End Module

Codificación Para el formulario 1.-(frmproceso) Public Class frmProceso Private Sub Btnnuevo_Click(ByVal sender As System.Object, ByVal e As Página 1101

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas System.EventArgs) Handles Btnnuevo.Click Dim x As Control For Each x In Controls If TypeOf x Is TextBox Then x.Text = "" Next End Sub Private Sub BtnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCalcular.Click Dim ep, ef As Byte : Dim pro As Single ep = Convert.ToByte(txteparcial.Text) : Convert.ToByte(txtefinal.Text)

ef =

pro = calcular_promedio(ep, ef) : txtpromedio.Text = Format(pro, "#0.0") txtcondicion.Text = calcularCondicion(pro) If pro > 10.5 Then txtcondicion.ForeColor = System.Drawing.Color.Blue Else txtcondicion.ForeColor = System.Drawing.Color.Red End If End Sub Private Sub txtnombre_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnombre.KeyPress 'Para enfocar otro objeto If Asc(e.KeyChar) = 13 Then txteparcial.Focus() End If End Sub Function SoloNumeros(ByVal Keyascii As Short) As Short

Página 1102

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas If InStr("1234567890", Chr(Keyascii)) = 0 Then SoloNumeros = 0 Else SoloNumeros = Keyascii End If Select Case Keyascii Case 8 :

SoloNumeros = Keyascii

Case 13 : SoloNumeros = Keyascii End Select End Function Private Sub Btninforme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btninforme.Click Dim miform As New frmInforme()

Para llamar al formulario informe

miform.ShowDialog() End Sub Private Sub BtnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSalir.Click Me.Close() End Sub Private Sub txteparcial_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txteparcial.TextChanged End Sub Private Sub txteparcial_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txteparcial.KeyPress Dim KeyAscii As Short = CShort(Asc(e.KeyChar)) Dim n As Byte KeyAscii = CShort(SoloNumeros(KeyAscii))

Página 1103

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas If KeyAscii = 0 Then e.Handled = True ElseIf KeyAscii = 13 Then n = Convert.ToByte(txteparcial.Text) If n < 0 Or n > 20 Then MsgBox("solo un valor de 0 a 20") End If End If End Sub End Class Para el formulario Informe.Public Class frmInforme Private Sub frmInforme_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txttotAlum.Text = ntotal.ToString : txtNaprob.Text = naprobados.ToString txtNdes.Text = ndesaprobados.ToString txtPtotal.Text = Format(suma / ntotal, "#.00") End Sub End Class

Página 1104

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas

Semana 5 : Controles contenedores de menus Control GroupBox Nos permite, como indica su nombre, agrupar controles en su interior, tanto RadioButton como de otro tipo, ya que se trata de un control contenedor. Una vez dibujado un GroupBox sobre un formulario, podemos arrastrar y soltar sobre él, controles ya existentes en el formulario, o crear nuevos controles dentro de dicho control. De esta forma, podremos ya, en este ejemplo, seleccionar más de un RadioButton del formulario. Ejemplo 13 El evento CheckedChanged, al igual que ocurría con los controles CheckBox, será el que tendremos que escribir para ejecutar el código en respuesta a la pulsación sobre un control RadioButton. El el código que se muestra los eventos correspondientes a los controles de radio de este ejemplo. Para cambiar el tipo de fuente, instanciamos un objeto Font y lo asignamos a la propiedad Font del TextBox; mientras que para cambiar el color, utilizamos la estructura Color y la propiedad BackColor, también del TextBox. Private Sub rbtTahoma_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtTahoma.CheckedChanged Me.txtNombre.Font = New Font("Tahoma", 12) End Sub Private Sub rbtGaramond_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtGaramond.CheckedChanged Me.txtNombre.Font = New Font("Garamond", 8) End Sub Private Sub rbtComic_CheckedChanged( rbtComic.CheckedChanged

) Handles

Me.txtNombre.Font = New Font("Comic Sans MS", 15) End Sub Página 1105

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas Private Sub rbtVerde_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtVerde.CheckedChanged 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 Para mostrar algunas de las funcionalidades de este control, utilizaremos el proyecto de ejemplo ListBoxPru que empl ea listas, groupbox . El ejemplo, como puede comprobar el lector, consiste en un formulario que contiene un ListBox principal, con el nombre lstValores, que dispone de una serie de valores asignados en tiempo de diseño.

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 Public Const TITULO As String = "Elemento seleccionado: " ' este evento se produce cada vez que se cambia el Página 1106

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ' índice seleccionado del ListBox Private Sub lstValores_SelectedIndexChanged( lstValores.SelectedIndexChanged

) Handles

' mostrar en el título del formulario el valor ' actualmente seleccionado de la lista Me.Text = TITULO & Me.lstValores.SelectedItem 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 Private Sub chkOrdenar_CheckedChanged(..) Handles chkOrdenar.CheckedChanged ' según el valor del CheckBox, ordenamos o quitamos ' la opción de ordenar del ListBox Me.lstValores.Sorted = Me.chkOrdenar.Checked End Sub Private Sub chkColumnas_CheckedChanged(..) Handles chkColumnas.CheckedChanged

Página 1107

Ing. Alberto Moreno Cueva

Facultad de Ingenieria Industrial y de Sistemas ' según el valor del CheckBox, mostramos el ListBox ' en varias columnas o en una 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 Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click Dim iPosicion As Integer ' el método FindString() de la lista busca un valor iPosicion = Me.lstValores.FindString(Me.txtValor.Text) ' el campo NoMatches indica si no existe el valor buscado If iPosicion = Me.lstValores.NoMatches Then MessageBox.Show("No existe el valor")

Página 1108

Ing. Alberto Moreno Cueva

Else ' si encontramos el valor en la lista, lo seleccionamos por código Me.lstValores.SelectedIndex = iPosicion End If 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

Página 1109

Ing. Alberto Moreno Cueva

Private Sub btnLimpiar_Clic

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 Utilizado para agrupar colecciones de controles. Espacio de nombres: System.Windows.Forms Creacion de controles mediante codigo. 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

Página 1110

Ing. Alberto Moreno Cueva

fuente para el formulario. Visual Basic Public Sub CreateMyPanel() Dim panel1 As New Panel() : Dim label1 As New Label() :

Dim textBox1 As New TextBox() ' Iniciar el Panel de control.

panel1.Location = New Point(56, 72) :

panel1.Size = New Size(264, 152)

' Establecer la propiedad BorderStyle para el Grupo en tres dimensiones. panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D ' Inicializar la etiqueta y controles TextBox. label1.Location = New Point(16, 16) label1.Text = "label1" :

label1.Size = New Size(104, 16)

textBox1.Location = New Point(16, 32) textBox1.Text = "" :

textBox1.Size = New Size(152, 20)

' Añadir el Grupo de control a la forma. Me.Controls.Add(panel1) ' Añadir la etiqueta y controles TextBox al Grupo. panel1.Controls.Add(label1) :

panel1.Controls.Add(textBox1)

End Sub Control

TabControl (Clase)

Administra un conjunto relacionado de páginas de fichas. Espacio de nombres: System.Windows.Forms Ensamblado: System.Windows.Forms (en system.windows.forms.dll) 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

Página 1111

Ing. Alberto Moreno Cueva

propiedades de TabControl siguientes: •

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 Página 1112

Ing. Alberto Moreno Cueva

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 En el ejemplo de código siguiente se utiliza el Diseñador de Windows Forms de Visual Studio .NET para crear un control TabControl con tres páginas de fichas. Cada página de fichas contiene varios controles. Visual Basic Ejemplo 15 Public Class Form1 ' Variable del diseñador requerida Private components As System.ComponentModel.Container ' Declaracion variables tipo objetos. Private tab3RadioButton2 As System.Windows.Forms.RadioButton Private tab3RadioButton1 As System.Windows.Forms.RadioButton Private tab2CheckBox3 As System.Windows.Forms.CheckBox Private tab2CheckBox2 As System.Windows.Forms.CheckBox Private tab2CheckBox1 As System.Windows.Forms.CheckBox

Página 1113

Ing. Alberto Moreno Cueva

Private tab1Label1 As System.Windows.Forms.Label Private WithEvents tab1Button1 As System.Windows.Forms.Button Private tabPage3 As System.Windows.Forms.TabPage Private tabPage2 As System.Windows.Forms.TabPage Private tabPage1 As System.Windows.Forms.TabPage Private tabControl1 As System.Windows.Forms.TabControl --------------------------------------------------------------------------------------------------------------Public Sub New() ' Esta convocatoria es necesaria para el Diseñador de Windows Forms apoyo. 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" Página 1114

Ing. Alberto Moreno Cueva

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) Página 1115

Ing. Alberto Moreno Cueva

tabPage3.Controls.Add(Me.tab3RadioButton1) 'agrega los controles a la pestaña. tabPage1.Controls.Add(Me.tab1Label1) tabPage1.Controls.Add(Me.tab1Button1) 'agregra el tabcontrol al formulario. Me.Controls.Add(tabControl1) ' Añade la página a la ficha TabControl tabControl1.Controls.Add(Me.tabPage1) tabControl1.Controls.Add(Me.tabPage2) : tabControl1.Controls.Add(Me.tabPage3) End Sub -----------------------------------------------------------------------------------------------------------------Private Sub tab1Button1_Click(sender As Object, e As System.EventArgs) _ Handles tab1Button1.Click ' Inserta el código que debe ejecutar cuando se hace clic en el botón End Sub ------------------------------------------------------------------------------------------------------------------Public Shared Sub Main() Application.Run(New Form1()) End Sub End Class

Control

MenuStrip (Clase)

Proporciona una estructura de menú para un formulario. MenuStrip es el contenedor de nivel superior que reemplaza a MainMenu. También proporciona las características de control de claves y de interfaz de múltiples documentos (MDI). Funcionalmente, ToolStripDropDownItem y ToolStripMenuItem operan junto con MenuStrip, aunque se derivan de ToolStripItem. 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:

Página 1116

Ing. Alberto Moreno Cueva



ToolStripMenuItem



ToolStripTextBox



ToolStripComboBox

El control MenuStrip representa el contenedor para la estructura de menú de un formulario. Puede agregar objetos ToolStripMenuItem al objeto MenuStrip, que representan los comandos de menú individuales de la estructura de menú. Cada objeto ToolStripMenuItem puede ser un comando de la aplicación o un menú primario para otros elementos de submenú. Aunque el control MenuStrip reemplaza y agrega funcionalidad al control MainMenu de versiones anteriores, se conserva MainMenu a efectos de compatibilidad con versiones anteriores y uso futuro, en su caso. Ejemplo 16 En el ejemplo de código siguiente se muestra un MenuStrip en un escenario de interfaz de múltiples documentos (MDI). Visual Basic ' Este ejemplo de código muestra cómo utilizar ToolStripPanel ' los controles con un interfaz de documento múltiple (MDI). Public Class Form1 Inherits Form Public Sub New() Me.IsMdiContainer = True ' Crear controles ToolStripPanel. Dim tspTop As New ToolStripPanel() :

Dim tspBottom As New ToolStripPanel()

Dim tspLeft As New ToolStripPanel() :

Dim tspRight As New ToolStripPanel()

' ToolStripPanel los controles portuarios a los bordes de la forma. tspTop.Dock = DockStyle.Top : tspLeft.Dock = DockStyle.Left :

tspBottom.Dock = DockStyle.Bottom tspRight.Dock = DockStyle.Right

' ToolStrip crear controles para desplazarse por los

Página 1117

Ing. Alberto Moreno Cueva

' ToolStripPanel controles. ' Crear el "Top" ToolStrip control y añadir Dim tsTop As New ToolStrip() tsTop.Items.Add("Top") tspTop.Join(tsTop) ' Crear el "fondo" y añadir el control ToolStrip ' correspondiente a la ToolStripPanel. Dim tsBottom As New ToolStrip() tsBottom.Items.Add("Bottom") tspBottom.Join(tsBottom) ' Create the "Right" ToolStrip control and add ' to the corresponding ToolStripPanel. Dim tsRight As New ToolStrip() tsRight.Items.Add("Right") tspRight.Join(tsRight) ' Create the "Left" ToolStrip control and add ' to the corresponding ToolStripPanel. Dim tsLeft As New ToolStrip() tsLeft.Items.Add("Left") tspLeft.Join(tsLeft) ' Create a MenuStrip control with a new window. Dim ms As New MenuStrip() Dim windowMenu As New ToolStripMenuItem("Window") Dim windowNewMenu As New ToolStripMenuItem("New", Nothing, New EventHandler(AddressOf windowNewMenu_Click)) windowMenu.DropDownItems.Add(windowNewMenu) CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowImageMargin = False CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowCheckMargin = True ' Assign the ToolStripMenuItem that displays ' the list of child forms. ms.MdiWindowListItem = windowMenu ' Add the window ToolStripMenuItem to the MenuStrip. Página 1118

Ing. Alberto Moreno Cueva

ms.Items.Add(windowMenu) ' Dock the MenuStrip to the top of the form. ms.Dock = DockStyle.Top ' The Form.MainMenuStrip property determines the merge target. Me.MainMenuStrip = ms ' Add the ToolStripPanels to the form in reverse order. Me.Controls.Add(tspRight) Me.Controls.Add(tspLeft) Me.Controls.Add(tspBottom) Me.Controls.Add(tspTop) ' Add the MenuStrip last. ' This is important for correct placement in the z-order. Me.Controls.Add(ms) End Sub ' This event handler is invoked when ' the "New" ToolStripMenuItem is clicked. ' It creates a new Form and sets its MdiParent ' property to the main form. Private Sub windowNewMenu_Click(ByVal sender As Object, ByVal e As EventArgs) Dim f As New Form() f.MdiParent = Me f.Text = "Form - " + Me.MdiChildren.Length.ToString() f.Show() End Sub End Class Aplicacion.- Empleo de Menus , Cuadro de dialogo , statubar , imagelist

Página 1119

Ing. Alberto Moreno Cueva

Controles empleados en el formulario

ColoDialog OpenFileDailog FontDialog

Codificación: Modulo1 Module Module2 Public n As Byte End Module Para el primer formulario editor (frmEditor) Public Class frmeditor Private Sub MnuArchivo_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventAr Ing. Alberto Moreno Cueva Página 1120

gs) Handles MnuArchivo_nuevo.Click Dim x As New frmdocumento() x.MdiParent = Me x.Show() n += 1 x.Text = " documento " & n.ToString End Sub Private Sub frmeditor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load StatusBarPanel3.Text = " 0 documento" StatusBarPanel3.ToolTipText = "Documentos Abiertos" StatusBarPanel4.Text = Date.Now.ToLongTimeString StatusBarPanel4.ToolTipText = Date.Now.Today.ToLongDateString End Sub Private Sub MnuArchivo_abrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuArchivo_abrir.Click Dim y As New frmdocumento() Dim nom As String With OdgEditor .Title = "Archivo de texto enrriquecido" .Filter = "Abrir archivo (*.rtf)|*.rtf" If (.ShowDialog = DialogResult.OK) And .FileName <> "" Then y.MdiParent = Me y.Show() :

nom = .FileName

Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl x.Text = nom

Página 1121

Ing. Alberto Moreno Cueva

End If

End With End Sub Private Sub MnuFormato_fondo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFormato_fondo.Click With CdgEditor If (.ShowDialog = DialogResult.OK) Then Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl x.BackColor = .Color End If End With End Sub Private Sub MnuFormato_fuente_Click(

) Handles MnuFormato_fuente.Click

With FdgEditor If (.ShowDialog = DialogResult.OK) Then Dim x As RichTextBox = Me.ActiveMdiChild.ActiveControl x.ForeColor = .Color x.Font = .Font End If End With End Sub Private Sub mnuventana_horizontal_Click( ) Handles mnuventana_horizontal.Click Me.LayoutMdi(MdiLayout.TileHorizontal) End Sub Private Sub mnuVentana_cascada_Click(

) Handles mnuVentana_cascada.Click

Me.LayoutMdi(MdiLayout.Cascade) End Sub Página 1122

Ing. Alberto Moreno Cueva

Private Sub MnuVentana_vertical_Click(

) Handles MnuVentana_vertical.Click

Me.LayoutMdi(MdiLayout.TileVertical) End Sub Private Sub tbrmenu_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles tbrmenu.ButtonClick Select Case e.Button.ImageIndex Case 0 :

MnuArchivo_nuevo.PerformClick()

Case 1 :

MnuArchivo_abrir.PerformClick()

Case 2 :

'MnuArchivo_nuevo.PerformClick()

End Select End Sub End Class Control

StatusStrip (Clase)

Representa un control en la barra de estado de Windows. StatusStrip reemplaza el control StatusBar. Las características especiales de StatusStrip incluyen un diseño de tabla personalizada, compatibilidad con los controles de tamaño y movimiento del formulario y con la propiedad Spring, que permite que ToolStripStatusLabel rellene automáticamente espacio disponible. 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, Página 1123

Ing. Alberto Moreno Cueva

los

componentes del objeto o información contextual relativa a la operación de ese objeto en la aplicación. Normalmente, un control StatusStrip está formado por objetos ToolStripStatusLabel, cada uno de los cuales muestra texto, un icono o ambas cosas. StatusStrip también puede contener controles ToolStripDropDownButton, ToolStripSplitButton y ToolStripProgressBar. El control StatusStrip predeterminado no tiene paneles. Para agregar paneles a un StatusStrip, utilice el método ToolStripItemCollection.AddRange en tiempo de diseño, o utilice Editor de la colección de elementos de StatusStrip en tiempo de diseño para agregar, quitar o reorganizar elementos y modificar propiedades. Utilice el Tareas de StatusStrip (Cuadro de diálogo) en tiempo de diseño para ejecutar los comandos comunes. Aunque StatusStrip reemplaza y amplía el control StatusBar de versiones anteriores, se conserva StatusBar a efectos de compatibilidad con versiones anteriores y uso futuro, en su caso. Ejemplo 17 Imports System Imports System.Text Imports System.Windows.Forms Public Class Form1 Inherits Form Private statusStrip1 As StatusStrip Private toolStripStatusLabel1 As ToolStripStatusLabel Public Sub New() InitializeComponent() End Sub <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub

Página 1124

Ing. Alberto Moreno Cueva

Private Sub InitializeComponent() statusStrip1 = New System.Windows.Forms.StatusStrip() toolStripStatusLabel1 = New System.Windows.Forms.ToolStripStatusLabel() statusStrip1.SuspendLayout() SuspendLayout() ' ' The following code example demonstrates the syntax for setting ' various StatusStrip properties. statusStrip1.Dock = System.Windows.Forms.DockStyle.Top statusStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Visible statusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {toolStripStatusLabel1}) statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow statusStrip1.Location = New System.Drawing.Point(0, 0) statusStrip1.Name = "statusStrip1" statusStrip1.ShowItemToolTips = True statusStrip1.Size = New System.Drawing.Size(292, 22) statusStrip1.SizingGrip = False statusStrip1.Stretch = False statusStrip1.TabIndex = 0 statusStrip1.Text = "statusStrip1" ' ' toolStripStatusLabel1 toolStripStatusLabel1.Name = "toolStripStatusLabel1" toolStripStatusLabel1.Size = New System.Drawing.Size(109, 17) toolStripStatusLabel1.Text = "toolStripStatusLabel1" ' ' Form1 ' ClientSize = New System.Drawing.Size(292, 273) Controls.Add(statusStrip1) Name = "Form1" statusStrip1.ResumeLayout(False) Página 1125

Ing. Alberto Moreno Cueva

statusStrip1.PerformLayout() ResumeLayout(False) PerformLayout() End Sub End Class Los Arrays Las variables que hemos estado usando hasta ahora, eran de tipo escalar: sólo pueden contener un valor a la vez. 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 mediante un índice numérico. Por ejemplo, si tenemos la variable discografía y queremos acceder al tercer disco, podríamos hacerlo de la siguiente forma: discografía(3). Sabiendo esto, podemos comprobar que sería fácil recorrer el contenido de los arrays mediante un bucle For. Qué tipos de datos se pueden usar para crear arrays? Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo, dependiendo de lo que queramos guardar. Por ejemplo, si queremos guardar los 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 que exista en el .NET Framework. Vale, muy bien, pero ¿cómo narices le digo al Visual Basic que una variable es un array? Declarar variables como arrays

Página 1126

Ing. Alberto Moreno Cueva

Para poder indicarle al VB

que nuestra intención es crear un array podemos hacerlo de dos formas distintas, para este ejemplo crearemos un array de tipo Integer: 1- La clásica (la usada en versiones anteriores) Dim a() As Integer 2- La nueva forma introducida en .NET: 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 tiene reservado ningún espacio de memoria. Reservar memoria para un array Para poder hacerlo tenemos que usar la instrucción ReDim: ReDim a(5) Al ejecutarse este código, tendremos un array con capacidad para 6 elementos. Y son seis y no cinco, (como por lógica habría que esperar), porque en .NET Framework el índice menor de un array siempre es cero y en Visual Basic, el índice superior es el indicado entre paréntesis. Por tanto el array a tendrá reservada memoria para 6 valores de tipo Integer, los índices serían desde 0 hasta 5 ambos inclusive. Además de usar ReDim, que realmente sirve para "redimensionar" el contenido de un 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: Dim a(5) As Integer Con este código estaríamos declarando la variable a como un array de 6 elementos (de 0 a 5) del tipo Integer. Cuando indicamos la cantidad de elementos que contendrá el array no podemos usar la

Página 1127

Ing. Alberto Moreno Cueva

segunda forma de declaración

que te mostré anteriormente: Dim a As Integer(5) ya que esto produciría un error sintáctico. 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 C#) con 5 elementos, de 0 a 4. Asignar valores a un array Para asignar un valor a un elemento de un array, se hace de la misma forma que con las variables normales, pero indicando el índice (o posición) en el que guardará el valor. Por ejemplo, para almacenar el valor 15 en la posición 3 del array a, haríamos lo siguiente: a(3) = 15

o tambien puede ser

i = b * a(3)

Los límites de los índices de un array Como ya he comentado antes, el índice inferior de un array, siempre es cero, esto es 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 memoria disponible se puede agotar si pretendemos usar un valor exageradamente alto. Realmente el índice superior de un array es 2^64 -1 (el valor máximo de un tipo Long) Longitud de Un array arreglo.length Esto es útil si queremos acceder mediante un bucle For, en el siguiente código se mostrarían todos los elementos del array a: For i = 0 To a.Length - 1 Console.WriteLine(a(i)) Next

Página 1128

Ing. Alberto Moreno Cueva

Inicializar un array al declararla Para inicializar un array debemos declarar ese array sin indicar el número de elementos que contendrá, seguida de un signo igual y a continuación los valores encerrados en llaves. Veamos un ejemplo: Dim a() As Integer = {1, 42, 15, 90, 2} También podemos hacerlo de esta otra forma: Dim a As Integer() = {1, 42, 15, 90, 2} Usando cualquiera de estas dos formas mostradas, el número de elementos será 5, por tanto los índices irán desde 0 hasta 4. Los arrays pueden ser de cualquier tipo En todos estos ejemplos estamos usando valores de tipo Integer, pero podríamos hacer lo mismo si fuesen de tipo String o cualquier otro. En el caso de que sean datos de tipo String, los valores a asignar deberán estar entre comillas dobles o ser variables de tipo String. Por ejemplo: Dim s As String() = {"Hola", "Mundo, ", "te", "saludo"} s(3) = "saludamos" Dim i As Integer For i = 0 To s.Length - 1 Console.WriteLine(s(i)) Next Usar un bucle For Each para recorrer los elementos de un array 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 array sin indicar el índice. Dim a() As Integer = {1, 42, 15, 90, 2}

Página 1129

Ing. Alberto Moreno Cueva

Console.WriteLi ne("Elementos

del array a()= {0}", a.Length) Dim i As Integer For Each i In a Console.WriteLine(i) Next Console.WriteLine("Pulsa Intro para finalizar") Console.ReadLine() Sort, el cual sirve para clasificar el contenido de un array. Para clasificar el array a, podemos hacerlo de dos formas: a.Sort(a) La variable a es un array, por tanto es del tipo Array y como tal, tiene el método Sort, el cual se usa pasando como parámetro el array que queremos clasificar. 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 método "compartido" y por tanto se puede usar directamente. Veamos ahora un ejemplo completo en el que se crea y asigna un array al declararla, se muestra el contenido del array usando un bucle For Each, se clasifica y se vuelve a mostrar usando un bucle For normal. Sub Main() Dim a() As Integer = {1, 42, 15, 90, 2} Console.WriteLine("Elementos del array a(): {0}", a.Length) Dim i As Integer For Each i In a

Página 1130

Ing. Alberto Moreno Cueva

Console.WriteLine(i) Next Console.WriteLine() Array.Sort(a) For i = 0 To a.Length - 1 Console.WriteLine(a(i)) Next Console.WriteLine("Pulsa Intro para finalizar") Console.ReadLine() End Sub

Copiar los elementos de un array en otro array La única forma de tener copias independientes de dos arrays que contengan los mismos elementos es haciendo una copia de un array a otro. Esto lo podemos hacer mediante el método CopyTo, al cual habrá que indicarle el array de destino y el índice de inicio a partir del cual se hará la copia.,ejemplo: Dim a() As Integer = {1, 42, 15, 90, 2} Dim b(a.Length - 1) As Integer a.CopyTo(b, 0) a(3) = 55 99 Dim i As Integer For i = 0 To a.Length - 1 Console.WriteLine("a(i) = {0}, b(i)= {1}", a(i), b(i)) Next

Página 1131

Ing. Alberto Moreno Cueva

En este ejemplo,

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. Cambiar el tamaño de un array y mantener los elementos que tuviera. Para poder conseguirlo, debemos usar ReDim seguida de la palabra clave Preserve, por tanto si tenemos la siguiente declaración: Dim a() As Integer = {1, 2, 3, 4, 5} Y queremos que en lugar de 5 elementos (de 0 a 4) tenga, por ejemplo 10 y no perder los otros valores, usaremos la siguiente instrucción: ReDim Preserve a(10) 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 por defecto de los valores numéricos. 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. Eliminar un array de la memoria. _ Si en algún momento del programa queremos eliminar el contenido de un array, porejemplo para que no siga ocupando memoria, ya que es posible que no siga ocupandomemoria, podemos usar Erase seguida del array que queremos "limpiar", por ejemplo: Erase a ._ Esto eliminará el contenido del array a. Si después de eliminar el contenido de un array queremos volver a usarlo, tendremos que ReDimensionarlo con el mismo número de dimensiones que tenía, ya que Erase sólo

Página 1132

Ing. Alberto Moreno Cueva

borra el contenido, no la

definición del array. Los formatos a usar con las cadenas de 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í explicado será aplicable a cualquier cadena. 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. Como es habitual, el primer parámetro estará representado por el cero y así 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. Cuando se indican marcadores, estos deben coincidir con el número de parámetros, es decir, si usamos el marcador {3}, debería existir ese parámetro, en caso de que haya menos de 4 parámetros (de 0 a 3), se producirá una excepción. Arreglos de Variables (Vectores y Matrices) 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.

Ejemplos Grafico de un vector:

V

Página 1133

Ing. Alberto Moreno Cueva

El vector se ha declarado de la siguiente manera: Dim V(4) as Integer Y se ha llenado así: V(0)=15 V(1)=21 V(2)=7 V(3)=18 V(4)=4 Otra forma de llenar un vector es al momento de declararlo: Dim V() As Integer = {15, 21, 7, 18, 4} Ejemplos Grafico de una Matriz: Índices de Columna

Índices de Filas M

La matriz se ha declarado de la siguiente manera: Dim M (2,3) as Integer 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 Página 1134

Ing. Alberto Moreno Cueva

M(1,3) se esta refiriendo a la fila 1 columna 3 Otra forma de llenar una matriz es al momento de declararlo: Dim M(,) As Integer = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 5, 8}} Los arrays de variables podemos clasificarlos de la siguiente manera: Por su ámbito: Public La declaración de un array público se hace en la sección de declaraciones de un módulo (esto estará disponible para todo el proyecto) 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: Arrays estáticos, cuya dimensión es siempre la misma. Ejemplo: Dim vector (19) As Double 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. Dim matriz(3, 5) As Integer Este ejemplo declara un array de dos dimensiones, llamado matriz, con 4 x 6 elementos, matriz(0,1), ... matriz(3,6), de tipo entero. Public cadena(12) As String 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 Página 1135

Ing. Alberto Moreno Cueva

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 sentencia ReDim puede aparecer solamente en un procedimiento y permite cambiar el número de elementos del array y sus límites inferior y superior, pero no el número de dimensiones. Esto quiere decir que, por ejemplo, no se puede trasformar un vector en una matriz. Ejemplo: Aquí se declara el arreglo Dim V() as integer Aqui se le asigna un tamaño en este caso 4 elementos (del 0 al 3) Redim Preserve V(3) A continuación se presenta un ejemplo de cómo se declaran arrays dinámicos. Si se declara el array Matriz a nivel del formulario, Dim Matriz( ) As Integer 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. Propiedades de los Arreglos: Entre las más importantes tenemos:

Página 1136

Ing. Alberto Moreno Cueva

Length.- Devuelve la cantidad de elementos que tiene un arreglo Ejemplo : Dim v(4) as String v.length() à esto devolvería 5 , ya que el arreglo

tiene 5 elementos (0 al 4)

Sort.- Ordena un arreglo. Se utiliza la clase Array Ejemplo Dim V(3) as Integer ={13,7,16} Array.Sort(V) à aquí la clase Array esta ordenado el Arreglo CopyTo.- Copia los datos de un arreglo a otro en una posición dada. Sintaxis: Arreglo1.CopyTo (Arreglo2, Posición) Ejemplo Dim V1(3) as Integer ={13,7,16} Dim V2(3) as Integer 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 GetUpperBound (Indice_Dimension).- Esta función devuelve el índice mayor de un arreglo. Dim V(3) as Integer Si nos damos cuenta el arreglo declarado es un arreglo de una dimensión. Esta dimensión seria la dimensión 0 v.GetUpperBound(0)à esto devolvería 3 Ahora si el arreglo tuviera2 dimensiones Dim M (2,3) as Integer, tendríamos la dimensión 0 (0 al 2) y la dimensión 1 (0 al 3) M.GetUpperBound (0)à esto devuelve 2 M.GetUpperBound (1)à esto devuelve 3 GetLowerBound (Indice_Dimension).- Esta función devuelve el índice menor de un arreglo. Casi siempre el índice menor será 0 al no ser que el arreglo empiece con otro índice.

Página 1137

Ing. Alberto Moreno Cueva

Ejemplos Prácticos en

Vb Net (Arreglos) 1.- Llene un vector de 5 elementos con números aleatorios y muéstrelos en un listbox

Public Class Form1 Dim vec (4) As Integer Se declara el vector Private Sub Button2_Click(

) Handles Button2.Click

Dim I As Int16 : Dim N As Int16 Hacemos un for desde 0 hasta el índice mayor del arreglo en este caso 4 For I = 0 To Vec.GetUpperBound(0) N = CInt (Rnd () * 100) Generamos el numero aleatorio Vec (I) = N Guardamos el numero en el vector Agregamos al Listbox el dato del vector que se acaba de llenar Me.ListBox1.Items.Add(vec(I)) Next End Sub End Class

2.- Ingrese un numero en una caja de texto, al hacer click en el botón Agregar se debe de agregar el numero a un arreglo dinámico además de mostrador en un listbox Public Class Form2 Aquí se declara el arreglo que es dinámico (nótese que no va nada entre los paréntesis) Dim V () As Int16 Este procedimiento se encarga de llenar el listbox con los datos que tiene el vector Sub Listar() Página 1138

Ing. Alberto Moreno Cueva

Me.ListBox1.Items.Clear() Dim i As Int16 Me.ListBox1.Items.Clear() For i = 0 To V.GetUpperBound(0) Me.ListBox1.Items.Add(V(i)) Next End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Aqui se el asigna un elemento al vector (el índice de ese elemento será 0) ni bien carga el formulario ReDim Preserve V(0) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim pos As Int16 pos = V.GetUpperBound (0) Capturamos el índice mayor del arreglo V (pos) = Me.TextBox1.Text Llenamos el vector en la ultima posición el dato ingresado ReDim Preserve V (pos + 1) Se le agrega un elemento mas al arreglo 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 Public Class Form3 Dim Vec (99) As Integer Declaramos el vector Ahora creamos una función llamada BuscarItem , esta función recibirá como parámetro un numero y se buscara en todo el vector. Si ese numero se encuentra la función devuelve True caso contrario False Página 1139

Ing. Alberto Moreno Cueva

Function BuscarItem(ByVal N%) As Boolean Dim Estado As Boolean = False :

Dim I As Integer

For I = 0 To Vec.GetUpperBound(0) If Vec(I) = N Then Estado = True Exit For End If Next BuscarItem = Estado End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim N As Int16 :

Dim J As Int16 = 0

Me.ListBox1.Items.Clear() Do While J <= Vec.GetUpperBound (0) Aquí se inicia el bucle para llenar los datos al vector N = CInt (Rnd () * 100) Se genera el numero aleatorio If Not BuscarItem(N) Then Llamamos a la función BuscarItem y le enviamos el numero generado si la función devuelve False quiere decir que no lo encontró. Si no lo encontró lo agrega al vector. Vec(J) = N Me.ListBox1.Items.Add (Vec (J)) Ademas de agrega a la lista J = J + 1 aumentamos el valor de la variable J que es la que esta controlando la posición del vector que se esta llenando End If Loop End Sub End Class

Página 1140

Ing. Alberto Moreno Cueva

4.- Llene un vector dinámico con nombres de países. Al hacer click en el botón Agregar se mostrara un INPUTBOX donde se debe de ingresar el nombre del país, inmediatamente se mostrara un mensaje indicando si se quiere continuar alo cual si se responde Si se repetirá el proceso. El proceso terminara cuando se responda No

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 Public Class Form4 Dim V () As String Se declara el arreglo dinámico Private Sub CmdAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim Rpta As Integer, P As String Dim I As Integer = 0 Do Empieza el proceso hasta cuando en el mensaje se responda No P = InputBox ("Ingrese País") Se abre un cuadro de dialogo para ingresar un país ReDim Preserve V (I) Se agrega un elemento al vector V (I) = P Se agrega el país al vector Me.ListBox1.Items.Add (UCase (V (I))) Se agrega el valor del vector al Listbox Se incrementa la variable vector

es la que controla la posición del elemento que se esta llenando en le

I=I+1 Página 1141

Ing. Alberto Moreno Cueva

Aquí se muestra el mensaje y la respuesta se guarda en la variable Rpta (Son 2 posibles respuestas Si VbYes y No VbNo) Rpta = MsgBox ("Desea Continuar...?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Confirmar") Loop Until Rpta = vbNo End Sub Private Sub CmdBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim P As String :

Dim Estado As Boolean = False

P = InputBox ("Ingrese país a buscar") Se ingresa el país a buscar Dim I% For I = 0 To V.GetUpperBound(0) If UCase (P) = V (I) Then Se busca y si e encuentra se selecciona el listbox Me.ListBox1.SelectedIndex = I Estado = True End If Next Al final si Estado es igual False quiere decir que no se encontró If Not Estado Then MsgBox("No se encontró el país", MsgBoxStyle.Critical, "Advertencia") End If End Sub End Class 5.- Llene una matriz con números aleatorios y muéstrelos en un Listview Public Class Form5 Dim m (4, 4) As Integer Se declara la matriz Este sub se encarga de llenar los datos de la matriz Página 1142

Ing. Alberto Moreno Cueva

al Listview 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 Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim F%, C% For F = 0 To m.GetUpperBound(0) For C = 0 To m.GetUpperBound(1) m(F, C) = CInt(Rnd() * 100) Next Next Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("2", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("3", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("4", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("5", 40, HorizontalAlignment.Center) Me.ListView1.View = View.Details Call Llenar() End Sub End Class Página 1143

Ing. Alberto Moreno Cueva

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 Para agrega una columna se hace lo sgte: Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center) Aquí se esta agregando una columna llamada centro

que tiene de ancho 40 y su alineación será al

Hay que tener en cuenta también: 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. Ahora para llenar algo a un ListView se hace: 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? La sentencia seria esta Me.ListView1.Items(0).SubItems.Add( Bolivia ) Notese esto: 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

Public Class Form6 Dim m1(4, 4) As Integer Página 1144

Ing. Alberto Moreno Cueva

Dim m2(4, 4) As Integer :

Dim m3(4, 4) As Integer

Se crea un procedimiento llamado FormatoLista es te recibe como parámetro el listview y le dará el formato correspondiente Sub FormatoLista(ByRef Lista As ListView) Lista.Columns.Add("1", 40, HorizontalAlignment.Center) Lista.Columns.Add("2", 40, HorizontalAlignment.Center) Lista.Columns.Add("3", 40, HorizontalAlignment.Center) Lista.Columns.Add("4", 40, HorizontalAlignment.Center) Lista.Columns.Add("5", 40, HorizontalAlignment.Center) 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 Sub Llenar(ByRef Lista As ListView, ByVal X(,) As Integer) 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 Private Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Randomize() Dim F%, C% Aqui se llenan las 3 matrices con números aleatorios For F = 0 Página 1145

Ing. Alberto Moreno Cueva

To

m1.GetUpperBound(0) For C = 0 To m1.GetUpperBound(1) m1(F, C) = CInt(Rnd() * 100) Next Next For F = 0 To m2.GetUpperBound(0) For C = 0 To m2.GetUpperBound(1) m2(F, C) = CInt(Rnd() * 100) Next Next For F = 0 To m3.GetUpperBound(0) For C = 0 To m3.GetUpperBound(1) m3(F, C) = m1(F, C) + m2(F, C) Next Next Call FormatoLista (Me.ListView1) Se le da formato al ListView1 Call FormatoLista(Me.ListView2) Call FormatoLista(Me.ListView3) Call Llenar (Me.ListView1, m1) Aqui se llena el Listview1 con la matriz m1 Call Llenar(Me.ListView2, m2) Call Llenar(Me.ListView3, m3) 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.

Página 1146

Ing. Alberto Moreno Cueva

Public Class Form7 Dim m(4, 4) As Integer Sub Llenar () Este sub llena de la matriz al ListView 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 Private Sub Form7_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim F%, C% For F = 0 To m.GetUpperBound(0) Aqui se sella la matriz For C = 0 To m.GetUpperBound(1) m(F, C) = CInt(Rnd() * 10) Next Next Se le da formato al ListView Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("2", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("3", 40, HorizontalAlignment.Center) Página 1147

Ing. Alberto Moreno Cueva

Me.ListView1.Columns.Add("4", 40, HorizontalAlignment.Center) Me.ListView1.Columns.Add("5", 40, HorizontalAlignment.Center) Me.ListView1.View = View.Details Call Llenar() End Sub Private Sub CmdCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim F%, C%, Suma1%, Suma2% For F = 0 To m.GetUpperBound(0) For C = 0 To m.GetUpperBound(1) If F = C Then suma1 = suma1 + m(F, C) End If If F + C = 4 Then Suma2 = Suma2 + m(F, C) End If Next Next Me.lbldiag1.Text = Suma1 Me.lbldiag2.Text = Suma2 End Sub Ejercicios Propuestos (Arreglos) 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. 2.- Generar 100 números aleatorios y guardarlos en un arreglo. Al hacer clic en un botón Separar se deberá de recorrer el arreglo anterior y se separaran los pares de los Página 1148

Ing. Alberto Moreno Cueva

impares en arreglos diferentes. Los 3 arreglos se mostraran en un listbox 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 Mostrar el arreglo en un listbox y la matriz en un Listview 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 6. Llenar un vector con números aleatorios. Luego se debe de ingresar un número, si este existe se debe de eliminar dicho número del arreglo. Utilice un arreglo dinámico. 7.- Llenar un vector con 100 números aleatorios del 1 al 20. 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 En este formulario tenemos 3 botones queremos que el evento click de los 3 botones sea el mismo para todos. Para eso entramos al evento de cualquier botón por ejemplo el primero (botón- Nuevo) Inicialmente el botón estará así: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End Sub Página 1149

Ing. Alberto Moreno Cueva

Lo que se tiene que hacer es agregar los otros controles con su evento click

Al final el botón quedara así: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click End Sub De esta forma lo que se programe en el boton1_click funcionara para el botn2_click y el boton3_click Ahora podriamos programar esto: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click Select Case sender.text 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. Depende de eso se podrá saber que botón se presiono.

Página 1150

Ing. Alberto Moreno Cueva

Ahora miren lo que se

programo en el Textbox1 en le evento keypress Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox2.KeyPress, TextBox3.KeyPress, TextBox4.KeyPress Select Case Asc(e.KeyChar) Case 48 To 57 Case Else MsgBox("Error solos e acepta Números") 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() Dim obj As Object For Each obj In Me.Controls If TypeOf obj Is TextBox Then obj.text = "" End If Next End Sub Sub calcular() Dim obj As Object Dim Suma As Integer = 0 For Each obj In Me.Controls Página 1151

Ing. Alberto Moreno Cueva

If TypeOf obj Is TextBox Then Suma = Suma + Val(obj.text) End If Next MsgBox("La suma de los números es :" & Suma, MsgBoxStyle.Information, "Resultado") End Sub Ahora veremos como crear un arreglo de controles en forma dinámica

Public Class Form1 ''Aquí se esta creando el evento click para MIBOTON1 (que serán todos los botones) Private Sub Miboton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) MsgBox(sender.tag) End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim Miboton As Button ''Se declara una variable de tipo button For i = 1 To 3 Miboton = New Button ''Se crea un nuevo boton Miboton.Text = "Boton" & i ''Se pone nombre a ese nuevo botón Miboton.Top = 50 ''Se le da una ubicación de arriba hacia abajo Miboton.Left = (i * 100) ''Se le da una ubicación de derecha a izquierda al botón Miboton.Tag = i ''Se le pone un valor a la propiedad TAG para diferenciarlo de los demás Me.Controls.Add (Miboton) ''Se agrega el botón al formulario

Página 1152

Ing. Alberto Moreno Cueva

AddHandler

Miboton.Click, AddressOf Miboton1_Click ''Se crea el evento click al botón ''Ojo el evento click se esta creando con el nombre de MIBOTON1 Next End Sub Ejemplos Prácticos en Vb Net (Arreglos de Controles) 1.- Diseñar un programa que simule el funcionamiento de una calculadora Lo primero que debe de hacerse es crear 2 grupos de arreglos de controles, el primer grupo de arreglos estará conformado por los números (del 0 al 9) y el otro grupo de arreglo estará conformado por los signos (+,-,*, /) Luego en el formulario programamos lo siguiente: Public Class Form1 Aqui se declaran las variables publicas para el formulario Dim Signo As String, V1 As Integer, V2 As Integer Noten que aquí se esta programando en todos los botones de los números ya que es un arreglo. Private Sub cmd0_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd0.Click, cmd1.Click, cmd2.Click, cmd3.Click, cmd4.Click, cmd5.Click, cmd6.Click, cmd7.Click, cmd8.Click, cmd9.Click Me.txtnum.Text = Me.txtnum.Text & sender.text End Sub Noten que aquí se esta programando en todos los signos ya que es un arreglo. Private Sub cmdmas_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdmas.Click, cmdmenos.Click, cmdpor.Click, cmdentre.Click V1 = Val (txtnum.Text) Aqui guardamos lo que hay en le texto Signo = sender.text Aqui se guarda el signo seleccionado txtnum.Text = "" End Sub

Página 1153

Ing. Alberto Moreno Cueva

Aquí se calcula la operación dependiendo del signo Private Sub cmdigual_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdigual.Click Dim res As Integer :

V2 = Val (txtnum.Text)

Select Case Signo Case "+" :

res = V1 + V2

Case "-" :

res = V1 - V2

Case "*" :

res = V1 * V2

Case "/" :

res = V1 / V2

End Select txtnum.Text = res End Sub End Class 2.- Diseñar un programa que simule el juego de un bingo

Este formulario llenara 25 botones con números aleatorios, luego cada segundo se mostrara en un Label y este se buscara en los botones si se encuentra el botón se desactivara. Public Class Form2 Dim Bolos (99) As Integer :Dim Cartilla (24) As Integer Dim Nro%, Cont% El arreglo bolos tendrá números del 1 al 100 en desorden. 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 El arreglo cartilla tendrá 25 números aleatorios sin que estos se repitan. 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 Página 1154

Ing. Alberto Moreno Cueva

Si el numero false

se encuentra en el arreglo

la función devolverá true caso contrario devolverá

Function Buscar (ByVal N%, ByRef V () As Integer) As Boolean Dim I% :

Dim Sw As Boolean :

Sw = False

For I = 0 to V.GetUpperBound (0) 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 Sub Llenar (ByRef v () As Integer) Dim I%, N% Do While I <= v.GetUpperBound (0) N = CInt (Rnd () * 99) + 1 If Not Buscar (N, v) Then v(I) = N I += 1 End If Loop End Sub

Página 1155

Ing. Alberto Moreno Cueva

El procedimiento LlenaCartilla" se encarga de llenar los botones con lo que tiene el arreglo Cartilla Sub LlenaCartilla () Dim Obj as Object : Dim I% :

I=0

For Each Obj In Me.Controls If TypeOf Obj Is Button And Obj.tag <> "A" Then Obj.text = Cartilla (I) 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 El procedimiento BuscarEnCartilla" se encarga de buscar el numero que saldrá cada segundo en los botones si se encuentra se desactivara le botón Sub BuscarEnCartilla () Dim Obj As Object For Each Obj In Me.Controls If TypeOf Obj Is Button And Obj.tag <> "A" Then If Trim (Obj.text) = Trim (Me.LblBolo.Text) Then Obj.enabled = False Cont += 1 Exit For End If End If Next If Cont = 25 Then

Página 1156

Ing. Alberto Moreno Cueva

Timer1.Enabled = False MsgBox ("UD ha ganado el juego de bingo") End If End Sub Private Sub cmdJugar_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdJugar.Click Call Llenar (Bolos) Aquí se llenan los bolos Call Llenar (Cartilla) Aquí se llenan los números de la cartilla 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 Private Sub Timer1_Tick (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Me.LblBolo.Text = Bolos (Nro) : Call BuscarEnCartilla () : Nro += 1 If Nro > Bolos.GetUpperBound (0) Then Timer1.Enabled = False

Nota: El timer1 deberá de estar desactivado inicialmente

End If 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. Página 1157

Ing. Alberto Moreno Cueva

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 Dim Nombre As String : Dim Telefono As String : Dim Salario As Decimal End Structure Ahora si declaramos una variable de ese tipo seria así: Dim R as Empleado

R

Parra llenar datos en esa variable seria: R.nombre= Anastacia : R.telefono= 5682547 : R.salario=1000.00 Ahora si queremos llenar los datos de varios empleados, se tendría que declarar un arreglo e empleados

Dim R(4) as Empleado Para ingresar datos a la variable seria así: R(0).nombre= Juan :R(0).telefono= 2457810 R(0).salario=250 :R(1).nombre= Maria R(1).telefono= 4178920 :R(1).salario=590 Página 1158

Ing. Alberto Moreno Cueva

Y así sucesivamente Creación de Menús, Toolbar, ImageList y StatusBar Imagelist Es un control que va a permitir almacenar imágenes y cada imagen toma un índice empezando de 0

Luego nos vamos a sus propiedades y escogemos la propiedad Images

Se agrega el ImageList

En la propiedad Images iremos agregando las imágenes con las cuales vamos a trabajar Toolbar Página 1159

Ing. Alberto Moreno Cueva

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

Se agrega el toolbar al formulario

Una vez agregado nos vamos a sus propiedades y en la propiedad ImageList se escoge el imagelist del cual se van a jalar las imágenes. Luego se escoge la propiedad Buttons

En la propiedad Buttons se podrá agregar botones al Toolbar haciendo click en el botón Agregar . 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.

Página 1160

Ing. Alberto Moreno Cueva

Una vez que ya se agregaron los botones se podrá programar en el toolbar . Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case e.Button.Tag Case "N" :

Call NUEVO()

Case "G" :

Call GRABAR()

Case "M" :

Call MODIFICAR()

Case "E" :

Call ELIMINAR()

Case "S" :

Me.Close()

End Select End Sub La propiedad e.Button.Tag recupera el valor del Tag que se le dio a cada botón. Se supone que al botón Nuevo se le puso

en la propiedad Tag , al grabar

, etc.

Statusbar Es un control que va a permitir insertar una barra de estado dentro de un formulario. Se agrega el StatusBar al formulario y hay que cambiar la propiedad ShowPanels y poner el valor de True (Esto permitirá que se muestre los paneles que se van a Página 1161

Ing. Alberto Moreno Cueva

crear) Luego nos vamos a la propiedad Panels y se mostrara la sgte. Ventana:

Aquí agregamos los paneles que tendrá el StatusBar , por cada panel que se agrega se cambia la propiedad Text ya que aquí se pondrá lo que mostrara el panel. Si se desea se podrá dejar vació. Si se quiere llenar un panel de un Statusbar en ejecución se hará lo sgte: Usu= Juana Me.StatusBar1.Panels(1).Width = 350 Me.StatusBar1.Panels(1).Text = " Bienvenido Usuario " & usu Donde Panels (1) es el índice del panel con el cual se va a trabajar

Ejemplo Práctico en Vb Net (Estructuras de Datos) 1.- Realizar un mantenimiento al arreglo Curso que tendrá 3 campos (Codigo, Nombre y Precio)

Primero en un modulo se crea una estructura Module Module1 Structure Curso Dim Cod As String Dim Nom As String

Página 1162

Ing. Alberto Moreno Cueva

Dim precio As Double End Structure End Module Ahora en el formulario Dim Índice% Private Sub Cursos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.ListView1.View = View.Details Me.ListView1.FullRowSelect = True Me.ListView1.Columns.Add("Codigo", 50, HorizontalAlignment.Center) Me.ListView1.Columns.Add("Nombre", 100, HorizontalAlignment.Left) Me.ListView1.Columns.Add("Precio", 100, HorizontalAlignment.Center) Call listar() End Sub Ir al primer registro del arreglo Private Sub CmdInicio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Indice = 0 :

Call Mostrar(Indice)

End Sub Ir al siguiente registro del arreglo Private Sub CmdNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If índice >= C.GetUpperBound(0) - 1 Then MsgBox ("Se ha llegado al fin del archivo") Else Indice = Indice + 1 :

Call Mostrar(Indice)

End If End Sub

Página 1163

Ing. Alberto Moreno Cueva

Ir al anterior registro del arreglo Private Sub CmdPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If índice <= 0 Then MsgBox("Se ha llegado al inicio del Archivo") Else Indice = Indice

1:

Call Mostrar(Indice)

End If End Sub Ir al ultimo registro del arreglo Private Sub CmdUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Indice = C.GetUpperBound(0) - 1 Call Mostrar(Indice) End Sub Depende del botón al cual se le hizo click se llamara a una rutina Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case e.Button.Tag Case "N" :

Call NUEVO()

Case "G" :

Call GRABAR()

Case "M" : Call MODIFICAR() Case "E" : Case "S" :

Call ELIMINAR(Indice) Me.Close()

End Select End Sub Aqui vemos los procedimiento que serán llamados en el ToolBar Sub listar() Página 1164

Ing. Alberto Moreno Cueva

Dim I% : Me.ListView1.Items.Clear() 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() Dim CODIGO as string, P as integer : P = C.GetUpperBound(0) If P = 0 Then txtcod.Text = "C001" Else CODIGO = C(P - 1).Cod : txtcod.Text = "C" & Microsoft.VisualBasic.Right(CStr(Val(Microsoft.VisualBasic.Right(CODIGO, 3)) + 1001), 3) End If txtprecio.Text = "" :

txtnom.Text = ""

txtnom.Focus() End Sub Sub GRABAR() Dim P% :

P = C.GetUpperBound(0)

C(P).Cod = txtcod.Text :

C(P).Nom = txtnom.Text

C(P).precio = CDbl(txtprecio.Text) :

ReDim Preserve C(P + 1)

Call listar() End Sub Sub MODIFICAR() C(índice).Cod = txtcod.Text :

C(índice).Nom = txtnom.Text

Página 1165

Ing. Alberto Moreno Cueva

C(índice).precio

= CDbl(txtprecio.Text) :

Call listar()

End Sub Sub ELIMINAR() For I = Indice To C.GetUpperBound(0) - 1 C(I) = C(I + 1) Next ReDim Preserve C(C.GetUpperBound(0) - 1) 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

Antes que todo debemos de crear un MODULO En el Modulo se programa esto: Structure Curso Dim Cod As String : Dim Nom As String Dim precio As Double End Structure Structure Nota Dim codcur As String Dim codalu As String :

Dim not1 As Integer

Dim not2 As Integer End Structure Se crean las estructuras Public C(2) As Curso :Public N(3) As Nota Página 1166

Ing. Alberto Moreno Cueva

Se declaran la variable que hace referencia a la estructura Curso y la variable referencia ala estructura Nota

que hace

Se debe de crear un procedimiento llamado main en donde se ingresaran datos manualmente a las variables y Sub Main () C(0).Cod = "C001" : C(0).Nom = "Java" : C(0).precio = 250 C(1).Cod = "C002" : C(1).Nom = "SQL" : C(1).precio = 300 C(2).Cod = "C003" : C(2).Nom = "Flash" : C(2).precio = 180 N(0).codcur = "C001" : N(0).codalu = "Javier Santana" N(0).not1 = 12 : N(0).not2 = 17 : N(1).codcur = "C001" N(1).codalu = "Frank Rojas" : N(1).not2 = 18 :

N(2).codcur = "C003"

N(2).codalu = "Mia Solano" : N(2).not2 = 12 :

N(1).not1 = 12

N(2).not1 = 15

N(3).codcur = "C003"

N(3).codalu = "Very Grijalva" : N(3).not1 = 14 N(3).not2 = 16 Se llama al formulario form1 Dim xform as new Form1 : Xform.showdialog() 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 Ahora en el formulario debemos de hacerlo siguiente: Public Class Form2 Aqui se llena el combo con lo que tiene el arreglo C

Página 1167

Ing. Alberto Moreno Cueva

Private Sub FrmNotasCurso

_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 Me.ListView1.Columns.Add("ALUMNO", 100, HorizontalAlignment.Center) Me.ListView1.Columns.Add("NOTA 1 ", 100, HorizontalAlignment.Center) Me.ListView1.Columns.Add("NOTA 2 ", 100, HorizontalAlignment.Center) End Sub Al escoger un curso deben de salir las notas de ese curso Private Sub CBOCURSOS_SelectedIndexChanged( ) Handles CBOCURSOS.SelectedIndexChanged Dim OP$, Y%, J%, R% 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 Página 1168

Ing. Alberto Moreno Cueva

TREEVIEW Y LISTVIEW 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: En el boton Add Categorías que tiene como nombre btnCategorias. Private Sub btnCategorias_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCategorias.Click TreeView1.Nodes.Clear() ‘Limpiar los nodos del TreeView1 TreeView1.Nodes.Add("Shapes") ‘Creando nodo raiz TreeView1.Nodes.Add("Colores") ‘Creando nodo raiz HabilitarBotones() End Sub Sub HabilitarBotones() btnColores.Enabled = True :

btnFormas.Enabled = True

End Sub

Página 1169

Ing. Alberto Moreno Cueva

En el boton Add Colores => que tendra como nombre btnColores. Private Sub btnColores_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnColores.Click Dim nodo As TreeNode ‘Representa un nodo del TreeView 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 = TreeView1.Nodes(1) : nodo.Nodes.Add("Rojo") :

nodo.Nodes.Add("Azul") nodo.Nodes.Add("Verde")

nodo.Expand() ‘Para expandir todos los niveles de nodos de arbol secundarios en la colección de Nodes. End Sub En el boton Add Formas (Shapes) => que tendra como nombre btnFormas. Private Sub btnFormas_Click( Dim nodo As TreeNode :

.) Handles btnFormas.Click nodo = TreeView1.Nodes(0)

nodo.Nodes.Add("Cuadrado") : nodo.Nodes.Add("Circulo") :

nodo.Nodes.Add("Triangulo") nodo.Expand()

End Sub En el boton Listar Todos => que tendra como nombre btnListado. Private Sub btnListado_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListado.Click TreeView1.Nodes.Clear() Dim nodo As TreeNode TreeView1.Nodes.Add("Shapes") :

TreeView1.Nodes.Add("Colores")

TreeView1.Nodes.Add("Productos") :

nodo = TreeView1.Nodes(0)

nodo.Nodes.Add("Cuadrado") :

nodo.Nodes.Add("Triangulo")

Página 1170

Ing. Alberto Moreno Cueva

nodo.Nodes.Ad

d("Circulo") :

nodo.Expand()

nodo = TreeView1.Nodes(1) : nodo.Nodes.Add("Rojo") :

nodo.Nodes.Add("Azul")

nodo.Nodes.Add("Verde")

nodo.Expand() : nodo = TreeView1.Nodes(2) nodo.Nodes.Add("Azucar") :

nodo.Nodes.Add("Arroz")

nodo.Nodes.Add("Menestras") :

nodo.Expand()

End Sub En el boton Ordenar Ítems => que tendra como nombre btnOrdenarItems. Private Sub btnOrdenarItems_Click(

) Handles btnOrdenarItems.Click

‘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 En el boton Ordenar Listado => que tendra como nombre btnOrdenarListado. Private Sub btnOrdenarListado_Click(

) Handles btnOrdenarListado.Click

TreeView1.Sorted = True btnListado_Click(sender, e) ‘Llamando al boton Listar Todos en el evento Clic. End Sub En el boton Limpiar Control => que tendra como nombre btnLimpiar. Private Sub btnLimpiar_Click( TreeView1.Nodes.Clear() :

) Handles btnLimpiar.Click DeshabilitarBotones()

End Sub Sub DeshabilitarBotones() btnColores.Enabled = False : btnFormas.Enabled = False

Página 1171

Ing. Alberto Moreno Cueva

End Sub En el boton Mover Arbol => que tendra como nombre btnMoverArbol. Private Sub btnMoverArbol_Click(

) Handles btnMoverArbol.Click

Try Dim nodocolor, nodoshape, nodosolidos As TreeNode nodocolor = TreeView1.Nodes(0) : nodoshape = TreeView1.Nodes(1) nodosolidos = TreeView1.Nodes(2) :

TreeView1.Nodes.Clear()

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 Mostrar el dato seleccionado en el TreeView usando el evento AfterSelect. AfterSelect => Se produce después de seleccionarse el nodo de arbol. 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. Private Sub TreeView1_AfterSelect(

) Handles TreeView1.AfterSelect

'Mostrar el dato del nodo seleccionado Dim nodo As TreeNode TreeView1.SelectedNode

nodo =

MessageBox.Show(nodo.Text) End Sub

Página 1172

Ing. Alberto Moreno Cueva

Listview

APLICACIÓN 2: Usando el ListView, realizar un ingreso de datos en el ListView1. [FrmListView.vb]

Configurando el ListView Propiedades: GridLines= True View = Details Name = ListView1 Columns = [Colección] <= le damos un clic en botón.

Definiendo el diseño de las columnas con su respectivo ancho de cada uno, donde se almacenaran cada fila proveniente de los controles del GroupBox1. Agregaremos 5 Columnas: Columna 3: ColumnHeader3

Columna 1: ColumnHeader1 Propiedades: Name= ColumnHeader1 Text = Nombres y Apellidos

Propiedades: Name = ColumnHeader3 Text = Telefono Width = 70 Column 4: ColumnHeader4

Width = 120

Propiedades: Name = ColumnHeader4 Column 5: ColumnHeader5 Text = Ciudad Propieades: Width = 80

Página 1173

Name = ColumnHeader5 Ing. Alberto Moreno Cueva Text = Sexo Width = 70

Columna 2: ColumnHeader2 Propiedades: Name = ColumnHeader2 Text = Direccion Width = 120

Propiedaes de los controles: Button 1 :

Label1:

Name = CmdAdicionar

Name = lbltotal

Text = &Adicionar

RadioButton1

Text = lbltotal

Name = OptM

Label2:

Text = Masculino

Text = Total de Elementos

Button 2:

GroupBox1:

Name = CmdNuevo

Text = INGRESO DE DATOS

Text = &Nuevo

GroupBox2:

Button 3:

Text = MOSTRAR DATOS

Name = CmdLimpiar Text = Limpiar ListView Button 4: Name = CmdSalir Text = Salir Código Fuente: Public Class FrmListView Private Sub FrmListView_Load( LimpiarControles() :

) Handles MyBase.Load

CmbCiudad.Items.Add("[Seleccione]")

CmbCiudad.Items.Add("Lima") :

Página 1174

CmbCiudad.Items.Add("Piura")

Ing. Alberto Moreno Cueva

CmbCiudad.Ite

ms.Add("Ica") :

CmbCiudad.Items.Add("Tumbes")

CmbCiudad.Items.Add("Puno") :

CmbCiudad.SelectedIndex = 0

End Sub Sub LimpiarControles() Dim obj As Object For Each obj In GroupBox1.Controls If TypeOf obj Is TextBox Then obj.text = "" If TypeOf obj Is RadioButton Then obj.checked = False Next End Sub Private Sub CmdSalir_Click() Handles CmdSalir.Click If MessageBox.Show("Desea Salir", "ListView", 4, 32) = 6 Then Application.Exit() End If End Sub Private Sub CmdAdicionar_Click(

) Handles CmdAdicionar.Click

'Validando las cajas de texto antes de ingresar el dato al ListView1. If txtnombres.Text = "" Or txtDireccion.Text = "" Or txtTelefono.Text = "" Or CmbCiudad.Text = "[Seleccione]" Then MessageBox.Show("Ingrese un Dato", "Validando Datos") Exit Sub End If 'Representa un elemento de un control ListView. Dim Lvitem As ListViewItem Lvitem = ListView1.Items.Add(txtnombres.Text)

Página 1175

Ing. Alberto Moreno Cueva

Lvitem.SubItem

s.Add(txtDireccion.Text) :

Lvitem.SubItems.Add(txtTelefono.Text)

Lvitem.SubItems.Add(CmbCiudad.Text) :

Dim sexo As String

If OptM.Checked Then 'Verificando la selección del Radiobutton sexo = "Masculino" Else sexo = "Femenino" End If Lvitem.SubItems.Add(sexo) lbltotal.Text = ListView1.Items.Count End Sub 'Validando el ingreso de datos, en las cajas de texto. Private Sub txtnombres_KeyPress( ) Handles txtnombres.KeyPress If Not SoloLetras(Asc(e.KeyChar), txtnombres, txtDireccion) Then e.Handled = True End If End Sub Private Sub txtDireccion_KeyPress(

) Handles txtDireccion.KeyPress

If Not LetrasNumeros(Asc(e.KeyChar), txtDireccion, txtTelefono) Then e.Handled = True End If End Sub Function LetrasNumeros(ByVal num As Integer, Optional ByVal obj_1 As Object = Nothing, Optional ByVal obj_2 As Object = Nothing) As Boolean LetrasNumeros = True Select Case num

Página 1176

Ing. Alberto Moreno Cueva

Case 8, 32, 44, 46

'8=retroceso,32=avance,44=coma(,),46=punto(.) Case 65 To 90 '65 hasta 90 =(A-Z) Case 97 To 122 '97 hasta 122 =(a-z) Case 241, 209 '241=ñ,209=Ñ Case 48 To 57 '48 hasta 57=(0-9) Case 13 'Tecla Enter If obj_1.text = "" Then MessageBox.Show("No Ingreso el Dato", "Validando Datos") obj_1.focus() Exit Function Else obj_2.focus() End If Case Else Return False End Select End Function Function SoloLetras(ByVal num As Integer, Optional ByVal objtext_1 As Object = Nothing, Optional ByVal objtext_2 As Object = Nothing) As Boolean SoloLetras = True Select Case num Case 8, 32, 44 Case 65 To 90 Case 97 To 122 Case 241, 209 Case 13 Página 1177

Ing. Alberto Moreno Cueva

If objtext_1.Text = "" Then MessageBox.Show("No ingreso el Dato", "Validando Datos") 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 Select Case num Case 8, 32, 44 Case 48 To 57 Case 13 If obj_1.text = "" Then MessageBox.Show("No Ingreso el Dato", "Validando Datos") obj_1.focus() Exit Function Else obj_2.focus() End If Case Else Página 1178

Ing. Alberto Moreno Cueva

Return False End Select End Function Private Sub txtTelefono_KeyPress( ) Handles txtTelefono.KeyPress If Not SoloNumeros(Asc(e.KeyChar), txtTelefono, CmbCiudad) Then e.Handled = True End If End Sub Private Sub CmdNuevo_Click(

) Handles CmdNuevo.Click

Call LimpiarControles() txtnombres.Focus() CmbCiudad.SelectedIndex = 0 End Sub Private Sub CmdLimpiarLV_Click(

) Handles CmdLimpiarLV.Click

'Limpiar ListView1 ListView1.Items.Clear() txtnombres.Focus() End Sub End Class Ejecutando el Programa:

PROCEDIMIENTOS Y FUNCIONES DEFINIDAS POR EL USUARIO

Página 1179

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 componen el Ing. Alberto Moreno Cueva

cuerpo de un procedimiento Sub.( Un procedimiento no devuelve valores) Sintaxis [Private | Public | [Static] Sub nombre [(lista_argumentos)] [instrucciones] [Exit Sub] [instrucciones] End Sub La sintaxis de la instrucción Sub consta de las siguientes partes: 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_ argumentos

Opcional. Lista de variables que representan los argumentos que se pasan al procedimiento Sub cuando se le llama. Las distintas variables se separan mediante comas.

instrucciones

Opcional. Cualquier grupo de instrucciones que se ejecutan dentro del procedimiento Sub.

El argumento lista_argumentos consta de las siguientes partes y sintaxis: [Optional] [ByVal | ByRef] [ParamArray] nombre_variable[( )] [As tipo] [= valor_predeterminado] 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.

Página 1180

Ing. Alberto Moreno Cueva

ByVal

Opcional. Indica que el argumento se pasa por valor.

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_ variable

Requerido. Nombre de la variable que representa el argumento; sigue las convenciones estándar de nombres de 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_ predeterminado

Opcional. Cualquier constante o expresión de constante. Sólo es válido para parámetros Optional. Si el tipo es 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. Ejemplo de la instrucción Sub 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. ' Definición del procedimiento Sub. ' Procedimiento Sub con dos argumentos. Sub SubAreaPC(Largo, Ancho) Dim Area As Double ' Declara la variable local. If Largo = 0 Or Ancho = 0 Then ' Si cualquier argumento = 0. Exit Sub ' Sale inmediatamente de Sub. End If Página 1181

Ing. Alberto Moreno Cueva

Area = Largo * Ancho ' Calcula el área del rectángulo. Debug.Print Area ' Imprime el área en la ventana de depuración. End Sub 'Procedimiento que limpia los Cuadros de Texto Public Sub Limpiar() Dim X As Object For Each X In Form1.Controls If TypeOf X Is TextBox Then 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. Declara el nombre, los argumentos y el código que componen el cuerpo de un procedimiento Function. [Public | Private | Friend] [Static] Function nombre [(lista_argumentos)] [As tipo] [instrucciones] [nombre = expresión] [Exit Function] [instrucciones] [nombre = expresión] End Function La sintaxis de la instrucción Function consta de las siguientes partes: El argumento lista_argumentos tiene la siguiente sintaxis y partes: [Optional] [ByVal | ByRef] [ParamArray] nombre_variable[( )] [As tipo] [= valor_predeterminado] Las clausulas de las funciones son similares a los procedimientos. 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. Página 1182

Ing. Alberto Moreno Cueva

La ejecución del programa continúa con la instrucción que sigue a la instrucción que llamó al procedimiento Function. Ejemplo de la instrucción 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. ' La siguiente función definida por el usuario devuelve ' la raíz cuadrada del argumento que se le pasa. Function CalculaRaizCuadrada(ArgNumerico As Double) As Double If ArgNumerico < 0 Then ' Se evalúa el argumento. Exit Function ' Salida hacia el procedimiento. Else CalculaRaizCuadrada = Sqr(ArgNumerico) ' Devuelve la raíz cuadrada End If End Function Function CalcSum(ByVal ParamArray Args() As Double) As Object ' The function can be invoked as follows: Dim ReturnedValue As Object ReturnedValue = CalcSum(4, 3, 2, 1) ' Variables locales: ' Args(0) = 4, Args(1) = 3, and so on. 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. Aplicación.-Empleando Funciones pasando parametros variables Ejemplo.Dim intSum As Integer Public Function minimo(ByVal ParamArray obj() As Integer) As Integer Dim z, con, min As Integer con = 1 For Each z In obj If con = 1 Then Min = z If z < Min Then Min = z

Página 1183

Ing. Alberto Moreno Cueva

con = con + 1 Next Return Min End Function Sub Sum(ParamArray Nums() as integer) Acepta un arreglo de datos y pueden ser de cualquier tipo, nums es una variable cualquiera receptor de datos

Dim y,x As Integer For Each x In Nums y=y+x Next x intSum = y End Sub Private Sub Cmdcalculo_Click()

Llamado a la funcion y al procedimiento

Sum Text2, Text3, Text4 Lbr1.Caption = intSum Lbr2.Caption = minimo(Textbox1.text, Textbox2.text, Textbox3.text) Lbr3.Caption = minimo(5,7,3,8) 'la suma de 3 valores Sum Text1, Text3, Text4 MsgBox "la suma del texto 1,3y 4 " & intSum End Sub Ejercicios 1) Escribir una función que dados a y b enteros devuelva ab. 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 Página 1184

Ing. Alberto Moreno Cueva

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 con el sub-código deseado. 7) Un número entero positivo se dice perfecto si es igual a la suma de todos sus divisores. excepto el mismo. Ejemplo: los números 6 (1+2+3), 28 (1+2+4+7+14) y 496 (1+2+4+8+16+31+62+124 +248) son perfectos. Se pide: a) Escribir una función booleana que llamada desde un programa, permita discernir si un número (único parámetro) es perfecto. b) Dar un ejemplo de cómo se hace referencia a dicha función desde un programa o desde otro subprograma. Nota: no usar variables globales. 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. Ejemplo: los números 220 (1+2+4+5+10+11+20+22+44+55+110=284) y 284 (1+2+4+71+142=220) son amigos. Se pide: a) escribir una función booleana que llamada desde un programa, permita discernir si dos números (parámetros) son amigos.

Página 1185

Ing. Alberto Moreno Cueva

b) Usar otra función para

calcular la suma de los divisores de un número determinado. c) Hacer referencia a dichas funciones desde un programa o desde otro subprograma. Ejercicios propuestos Desarrollar los siguientes procedimientos cuyos nombres y parámetros por valor se detallan en cada procedimiento: 1. Función ACUADRADO pasando como valor un lado devuelva su área. A=L2 2. Función MAYOR pasando como valores dos números devuelva el valor máximo de dichos números. 3. Función ATRIANGULO pasando como valor tres lados de un triángulo, en caso de que forme un triángulo devuelva su área, de lo contrario devuelva un valor 0. A=

Sp x (Sp-La) x (Sp-Lb) x (Sp – Lc)

4. Subrutina INTERCAMBIO pasando dos parámetros por referencia intercambie el contenido de dicho números. 5. Función MINIMO pasando tres valores numéricos de tipo real devuelva el menor valor. 6. Función MCD pasando dos valores numéricos devuelva el Máximo común Divisor de dichos números. 7. Subrutina PROMEDIO el cual pasando dos parámetros por valor y uno por referencia devuelva el promedio de dichos números. 8. Función PRIMO pasando por valor un número entero devuelva True si el número es Primo y False si el número no es primo. 9. Función CUENTAVOCALES el cual pasando como parámetro una frase devuelva la cantidad de vocales contenidas en dicha frase. Ejemplo CUENTAVOCALES( VISUAL BASIC ) --------à 5 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. Página 1186

Ing. Alberto Moreno Cueva

4. 5. 6. 7.

Pasando tres números devuelva el Mínimo Común Múltiplo, de dichos números. Pasando un número entero de cualquier longitud, devuelva el promedio de dichas cifras. Pasando un número entero de cualquier longitud, devuelva el dígito mayor. 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 : Grupo máximo Nota

: 2 alumnos : Las funciones serán llamados desde diferentes formularios.

Modo de Presentación : Sólo en Usb. Control ToolStrip (Clase) Proporciona un contenedor para los objetos de barra de herramientas de Windows. ToolStrip es la clase base abstracta para MenuStrip, StatusStrip y ContextMenuStrip. 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 Página 1187

Ing. Alberto Moreno Cueva

clase

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

Puede unir controles ToolStrip en un ToolStripContainer especificado y combinar controles ToolStrip entre sí. Utilice ToolStripPanel en lugar de ToolStripContainer para las aplicaciones de interfaz de múltiples documentos (MDI). Normalmente, ToolStrip no participa en el orden de tabulación a menos que tenga una posición absoluta en lugar de estar acoplado o en un ToolStripPanel. Utilice la clase ToolStripControlHost para alojar cualquier otro control de formularios Windows Forms en ToolStrip. De forma predeterminada, ToolStrip se almacena en búfer doble, para lo que aprovecha la configuración de OptimizedDoubleBuffer. Aunque el control ToolStrip reemplaza y agrega funcionalidad al control ToolBar de versiones anteriores, se conserva ToolBar a efectos de compatibilidad con versiones anteriores y uso futuro, en su caso. Ejemplo 18

Página 1188

Ing. Alberto Moreno Cueva

En el ejemplo de código siguiente se muestra cómo agregar un ToolStripContainer y un ToolStrip a un formulario Windows Forms, cómo agregar elementos a ToolStrip y cómo agregar ToolStrip al TopToolStripPanel de ToolStripContainer. Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Text Imports System.Windows.Forms Public Class Form1 Inherits Form Private toolStripContainer1 As ToolStripContainer Private toolStrip1 As ToolStrip Public Sub New() InitializeComponent() End Sub 'New <STAThread()> _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub 'Main Private Sub InitializeComponent() toolStripContainer1 = New System.Windows.Forms.ToolStripContainer() toolStrip1 = New System.Windows.Forms.ToolStrip() ' Add items to the ToolStrip. toolStrip1.Items.Add("One") :

toolStrip1.Items.Add("Two")

toolStrip1.Items.Add("Three") ' Add the ToolStrip to the top panel of the ToolStripContainer. toolStripContainer1.TopToolStripPanel.Controls.Add(toolStrip1) Página 1189

Ing. Alberto Moreno Cueva

' Add the ToolStripContainer to the form. Controls.Add(toolStripContainer1) End Sub 'InitializeComponent End Class 'Form1 Cuadros de Dialogo (MsgBox,Messagebox,InputBox, OpenFileDialog,ColorDialog, FontDialog) MessageBox .- Muestra un mensaje MessageBox.Show("texto","titulo",boton,Icono) Ejemplo: Mostrar el sgte mensaje Dim Nom As String = "Juana" MessageBox.Show("Bienvenido " & Nom, "Acceso", MessageBoxButtons.OK, MessageBoxIcon.Information) Ejemplo: Mostrar un mensaje si se desea salir, si se presiona si se cerrara la aplicación. Private Sub cmdsalir_Click If MessageBox.Show("Desea Salir", "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then End End If

MsgBox .- Muestra un mensaje MsgBox(mensaje,botones,titulo) Msgbox ( Ingrese un precio valido , MsgBoxStyle .Critical, Mensaje ) Boton Salir: If MsgBox("Desea Salir", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Confirmar") = MsgBoxResult.Yes Then End End If InputBox. Se utiliza cuando se necesita que el usuario introduzca alguna información. La síntaxis correcta es: Ing. Alberto Moreno Cueva Página 1190

InputBox(mensaje,titulo) Ejemplo: nom = InputBox("Ingrese nombre", "Artefacto") En este casos e mostrar un mensaje y lo que se ingrese se guardara en la variable nom si se hace clic en Cancelar en nom se guardar NULL

OpenFileDialog Es un control que muestra una ventana donde se podrá seleccionar un archivo. ColorDialog Es un control que muestra la caja de dialogo para seleccionar el color 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.

Lo primero que debemos de hacer es agregar los controles

Página 1191

Ing. Alberto Moreno Cueva

Cuando agregamos esos controles no se muestran en el formulario, debemos de poner un nombre adecuado a cada control (openfiledialog op, ColorDialog co, fontDialog-fo)

Boton Abrir Para que solo se pueda abrir estos tipos de archivos Op.Filter = "Archivos JPG|*.jpg|Archivos BMP|*.bmp" Op.FilterIndex = 2 seleccionamos por defecto el filtro 2 que seria BMP (si fuera 1 seria JPG) If Op.ShowDialog = DialogResult.OK Then Si seleccionamos un archivo Me.PictureBox1.Image = Image.FromFile(Op.FileName) op.Filename recupera el nombre (con toda su ruta) del archivo seleccionado End If

Boton Abrir

Página 1192

Ing. Alberto Moreno Cueva

If Co.ShowDialog = DialogResult.OK Then si seleccionamo ok al momento de abrir la ventana de color Label1.ForeColor = Co.Color le ponemos el color seleccionado End If If Fo.ShowDialog = DialogResult.OK Then 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.Filter = "Archivos MP3|*.mp3|Archivos MPG|*.mpg" Op.FilterIndex = 1 If Op.ShowDialog = DialogResult.OK Then win.URL = Op.FileName End If

Página 1193

Ing. Alberto Moreno Cueva

Semana 6 : Uso de Controles Cuadros de dialogo Casi todas las aplicaciones necesitan preguntar a los usuarios para abrir o grabar un archivo. Usted puede construir su propio form para permitírselo, pero esta posibilidad ya está directamente disponible en Windows, accesible desde un simple control Common Dialog de VB5/6 o a través de controles especializados de Visual Studio.Net. Lo mejor de estos controles standard es que los usuarios ya saben cómo usarlos porque son los mismos que se usan en Word, Excel y la gran mayoría de las aplicaciones. Los cuadros de dialogos estan disponibles en el Framework .NET. Exploraremos los cuadros de dialogo FontDialog, ColorDialog, SaveFileDialog, OpenFileDialog, PrintDialog, PrintDocumet, PageSetupDialog y MainMenu.

Control

FontDialog (Clase)

FontDialog => Representa un cuadro de dialogo comun que muestra una lista con las fuentes que normalmente se instalan en el sistema. Se debe de invocar al miembro heredado ShowDalog para crear este cuadro de dialogo comun especifico.

Control

ColorDialog (Clase)

ColorDialog => Representa un cuadro de dialogo comun que muestra los colores disponibles, asi como los controles que permiten a los usuarios definir colores personalizados.

Control

SaveDialog (Clase)

SaveFileDialog => Representa un cuadro de dialogo comun que permite al usuario especificar las opciones para guardar un archivo. Esta clase no puede heredarse. Esta clase permite abrir y sobrescribir un archivo existente o crear un archivo nuevo.

Control

OpenFileDialog (Clase)

OpenFileDialog => Representa un cuadro de dialogo comun que muestra el control que permite al usuario abrir un archivo. Esta clase no puede heredarse. Esta clase permite comprobar si existe un archivo y abrirlo. La propiedad ShowReadOnly determina si aparece una casilla de verificación de solo lectura en el cuadro de dialogo.La propiedad ReadOnlyChecked indica la casilla de verificación de solo lectura esta activada. La mayor parte de la funcionalidad de esta clase se encuentra en la clase FileDialog.

Control

PrintDialog (Clase)

PrintDialog => Permite a los usuarios seleccionar una impresora y elegir que partes del documento se deben imprimir.

Página 1194

Ing. Alberto Moreno Cueva

Cuando se crea una instancia de PrintDialog, se establecen las propiedades de lectura y escritura en sus valores iniciales.

Control

PrintDocument (Clase)

PrintDocument => Define un objeto reutilizable que envia el resultado a una impresora. Normalmente se crea una nueva instancia de la clase PrintDocument, se establecen las propiedades que describen como imprimir y se llama al metodo Print para iniciar el proceso de impresión. Para especificar el resultado que se va a imprimir, hay que controlar el evento PrintPage y utilizar Graphics que se incluyen en PrintPageEventArgs.

Control

PageSetupDialog (Clase)

PageSetupDialog => Representa un cuadro de dialogo que permite a los usuarios manipular la configuración de pagina, incluidos los margenes y la orientación del papel. El cuadro de diálogo PageSetupDialog modifica la información de PageSettings y PrinterSettings para un determinado Document. El usuario puede habilitar secciones del cuadro de diálogo para manipular la configuración de la impresora, los márgenes, la orientación, el tamaño y el origen del papel, así como para mostrar los botones de ayuda y de red. MinMargins define los márgenes mínimos que puede seleccionar un usuario. 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.

Control RichTextBox

=> Representa un control Rcihtextbox de Windows.

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.

EDITOR DE TEXTO (WORDPAD)

Página 1195

Ing. Alberto Moreno Cueva

MENU ARCHIVO

Configuración del Menú Archivo:

Configurar Página

Archivo Name = MnuConfigurarPagina

Propiedad: Name = MenuItem1

Imprimir

Nuevo

Name = MnuImprimir

Name = MnuNuevo Abrir

Salir

Name = MnuAbrir

Name = MnuSalir

Guardar Name = MnuGuarda

MENU EDICION

Cortar

Configuración del Menú Edicion:

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 = MnuCopiar

Formato

Página 1196

Ing. Alberto Moreno Cueva Propiedad: Name = MenuItem16 Fuente Name = MnuFuente

CODIGO FUENTE Option Strict On Imports System.io Imports System.Drawing.Printing Public Class Form1 Private FuenteImpresion As Font Private mStoredPageSettings As System.Drawing.Printing.PageSettings Dim fName As String Dim streamParaImprimir As StreamReader Private Sub MnuNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuNuevo.Click If DeshacerCambios() Then Me.RichTextBox1.Clear() End Sub Function DeshacerCambios() As Boolean If Me.RichTextBox1.Modified Then Dim replicar As MsgBoxResult replicar = MsgBox("Los cambios no se han guardado.Deshacer cambios?", MsgBoxStyle.YesNo) If replicar = MsgBoxResult.No Then Return False Else Return True

Página 1197

Ing. Alberto Moreno Cueva

End If

Else Return True End If End Function Private Sub MnuAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuAbrir.Click If DeshacerCambios() Then OpenFileDialog1.Title = "Seleccione el archivo para Abrir" OpenFileDialog1.Filter = "Text file|*.txt|Rich text file|*.rtf" OpenFileDialog1.InitialDirectory = "c:\temp" If OpenFileDialog1.ShowDialog = DialogResult.OK Then If OpenFileDialog1.FileName <> "" Then fName = OpenFileDialog1.FileName Select Case OpenFileDialog1.FilterIndex 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 Private Sub MnuGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuGuardar.Click

Página 1198

Ing. Alberto Moreno Cueva

SaveFileDialog1.Title = "Guarde su archivo" SaveFileDialog1.Filter = "Text file (*.txt)|*.txt|Rich text file (*.rtf)|*.rtf" SaveFileDialog1.InitialDirectory = "c:\temp" If SaveFileDialog1.ShowDialog = DialogResult.OK Then If SaveFileDialog1.FileName <> "" Then Select Case SaveFileDialog1.FilterIndex Case 1 RichTextBox1.SaveFile(SaveFileDialog1.FileName, _ RichTextBoxStreamType.PlainText) Case 2 RichTextBox1.SaveFile(SaveFileDialog1.FileName, _ RichTextBoxStreamType.RichText) End Select End If End If End Sub Private Sub MnuConfigurarPagina_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuConfigurarPagina.Click Try If mStoredPageSettings Is Nothing Then mStoredPageSettings = New System.Drawing.Printing.PageSettings End If PageSetupDialog1.PageSettings = mStoredPageSettings PageSetupDialog1.ShowDialog() Catch ex As Exception MessageBox.Show("Un error a ocurrido - " + ex.Message) Página 1199

Ing. Alberto Moreno Cueva

End Try End Sub Private Sub MnuImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuImprimir.Click Try streamParaImprimir = New StreamReader(fName) Try FuenteImpresion = New Font("Tahoma", 10) AddHandler PrintDocument1.PrintPage, AddressOf pd_ImpresionporPagina PrintDocument1.DocumentName = fName PrintDialog1.Document = PrintDocument1 If PrintDialog1.ShowDialog() = DialogResult.Cancel Then MessageBox.Show("Cancelando la Impresion", "Impresion del Documento") Else PrintDocument1.Print() End If Finally streamParaImprimir.Close() End Try Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Private Sub pd_ImpresionporPagina(ByVal sender As Object, ByVal ev As PrintPageEventArgs) Dim lineasporPaginas As Single = 0 Dim yPos As Single = 0 Página 1200

Ing. Alberto Moreno Cueva

Dim contador As Integer = 0 Dim MargenIzquierdo As Single = ev.MarginBounds.Left Dim MargenSuperior As Single = ev.MarginBounds.Top Dim linea As String = Nothing 'Calcular el numero de lineas por pagina. lineasporPaginas = ev.MarginBounds.Height / FuenteImpresion.GetHeight(ev.Graphics) 'Imprime cada linea del archivo. While contador < lineasporPaginas linea = streamParaImprimir.ReadLine() If linea Is Nothing Then Exit While End If yPos = MargenSuperior + contador * FuenteImpresion.GetHeight(ev.Graphics) ev.Graphics.DrawString(linea, FuenteImpresion, Brushes.Black, MargenIzquierdo, yPos, New StringFormat) contador += 1 End While 'si hay mas lineas existente, imprime otra pagina. If Not (linea Is Nothing) Then ev.HasMorePages = True Else ev.HasMorePages = False End If End Sub Private Sub MnuSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuSalir.Click

Página 1201

Ing. Alberto Moreno Cueva

End

End Sub Private Sub MnuDeshacer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuDeshacer.Click If Me.RichTextBox1.CanUndo Then Me.RichTextBox1.Undo() End Sub Private Sub MnuRehacer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuRehacer.Click If Me.RichTextBox1.CanRedo Then Me.RichTextBox1.Redo() End Sub Private Sub MnuCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuCopiar.Click Me.RichTextBox1.Copy() End Sub Private Sub MnuCortar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuCortar.Click Me.RichTextBox1.Cut() End Sub Private Sub MnuPegar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPegar.Click Try Me.RichTextBox1.Paste() Catch exc As Exception MsgBox("No se puede pegar el contenido actual en el portapapeles") End Try End Sub Private Sub MnuSelTodo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuSelTodo.Click

Página 1202

Ing. Alberto Moreno Cueva

Me.RichTextBox1.SelectAll() End Sub Private Sub MnuFuente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuFuente.Click If Not Me.RichTextBox1.SelectionFont Is Nothing Then FontDialog1.Font = Me.RichTextBox1.SelectionFont Else Me.FontDialog1.Font = Nothing End If FontDialog1.ShowApply = True If FontDialog1.ShowDialog = DialogResult.OK Then Me.RichTextBox1.SelectionFont = Me.FontDialog1.Font End If End Sub Private Sub MnuColor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuColor.Click ColorDialog1.Color = Me.RichTextBox1.ForeColor ColorDialog1.ShowDialog() Me.RichTextBox1.SelectionColor = ColorDialog1.Color ColorDialog1.Dispose() ColorDialog1 = Nothing End Sub End Class Resultado:

Página 1203

Ing. Alberto Moreno Cueva

Control

FolderBrowserDialog (Clase)

Pide al usuario que seleccione una carpeta. Esta clase no se puede heredar. Esta clase proporciona un modo de preguntar al usuario si desea examinar, crear y, posteriormente, seleccionar una carpeta. Utilice esta clase si sólo desea que el usuario seleccione carpetas, pero no archivos. Las carpetas se examinan mediante un control de árbol. Sólo se pueden seleccionar las carpetas del sistema de archivos, las carpetas virtuales no. Normalmente, después de crear un FolderBrowserDialog nuevo, RootFolder se establece en la ubicación desde donde se va a comenzar a examinar. SelectedPath puede establecerse también en una ruta de acceso absoluta a una subcarpeta de RootFolder que se seleccionará inicialmente. Otra posibilidad es establecer la propiedad Description para proporcionar instrucciones adicionales al usuario. Por último, se llama al método ShowDialog para que muestre el cuadro de diálogo al usuario. Si se cierra el cuadro de diálogo y el resultado de ShowDialog es DialogResult.OK, SelectedPath será una cadena que contenga la ruta de acceso a la carpeta seleccionada. Es posible utilizar la propiedad ShowNewFolderButton para controlar si el usuario tiene permiso para crear carpetas nuevas con el botón Nueva carpeta. FolderBrowserDialog es un cuadro de diálogo modal, por lo tanto, cuando se muestra, bloquea el resto de la aplicación hasta que el usuario elige una carpeta. Cuando un cuadro de diálogo se Página 1204

Ing. Alberto Moreno Cueva

muestra en

forma modal, no puede producirse ninguna entrada de datos (mediante teclado o haciendo clic con el mouse), a excepción de los objetos del cuadro de diálogo. El programa debe ocultar o cerrar el cuadro de diálogo (normalmente, como respuesta a alguna acción del usuario) antes de que pueda producirse una entrada de datos en el programa de llamada. 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 Public Class FolderBrowserDialogExampleForm Inherits Form Private folderBrowserDialog1 As FolderBrowserDialog Private openFileDialog1 As OpenFileDialog Private richTextBox1 As RichTextBox Private mainMenu1 As MainMenu Private fileMenuItem As MenuItem Private WithEvents folderMenuItem As MenuItem, _ closeMenuItem As MenuItem, _ openMenuItem As MenuItem Private openFileName As String, folderName As String Private fileOpened As Boolean = False Public Sub New() Me.mainMenu1 = New System.Windows.Forms.MainMenu() Página 1205

Ing. Alberto Moreno Cueva

Me.fileMenuItem = New System.Windows.Forms.MenuItem() Me.openMenuItem = New System.Windows.Forms.MenuItem() Me.folderMenuItem = New System.Windows.Forms.MenuItem() Me.closeMenuItem = New System.Windows.Forms.MenuItem() Me.openFileDialog1 = New System.Windows.Forms.OpenFileDialog() Me.folderBrowserDialog1 = New System.Windows.Forms.FolderBrowserDialog() Me.richTextBox1 = New System.Windows.Forms.RichTextBox() Me.mainMenu1.MenuItems.Add(Me.fileMenuItem) Me.fileMenuItem.MenuItems.AddRange( _ New System.Windows.Forms.MenuItem() {Me.openMenuItem, _ Me.closeMenuItem, _ Me.folderMenuItem}) Me.fileMenuItem.Text = "File" :

Me.openMenuItem.Text = "Open..."

Me.folderMenuItem.Text = "Select Directory..." : Me.closeMenuItem.Text = "Close" Me.closeMenuItem.Enabled = False : Me.openFileDialog1.DefaultExt = "rtf" Me.openFileDialog1.Filter = "rtf files (*.rtf)|*.rtf" ' Set the Help text description for the FolderBrowserDialog. Me.folderBrowserDialog1.Description = _ "Select the directory that you want to use As the default." ' Do not allow the user to create New files via the FolderBrowserDialog. Me.folderBrowserDialog1.ShowNewFolderButton = False ' Default to the My Documents folder. Me.folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Personal Me.richTextBox1.AcceptsTab = True Me.richTextBox1.Location = New System.Drawing.Point(8, 8) Me.richTextBox1.Size = New System.Drawing.Size(280, 344) Me.richTextBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or _ AnchorStyles.Bottom Or AnchorStyles.Right Me.ClientSize = New System.Drawing.Size(296, 360) Me.Controls.Add(Me.richTextBox1) :

Me.Menu = Me.mainMenu1

Me.Text = "RTF Document Browser" End Sub

Página 1206

Ing. Alberto Moreno Cueva

<STAThread()> _ Shared Sub Main() Application.Run(New FolderBrowserDialogExampleForm()) End Sub ' Bring up a dialog to open a file. Private Sub openMenuItem_Click(sender As object, e As System.EventArgs) _ Handles openMenuItem.Click ' If a file is not opened, then set the initial directory to the ' FolderBrowserDialog.SelectedPath value. If (not fileOpened) Then openFileDialog1.InitialDirectory = folderBrowserDialog1.SelectedPath openFileDialog1.FileName = nothing End If ' Display the openFile dialog. Dim result As DialogResult = openFileDialog1.ShowDialog() ' OK button was pressed. If (result = DialogResult.OK) Then openFileName = openFileDialog1.FileName Try ' Output the requested file in richTextBox1. Dim s As Stream = openFileDialog1.OpenFile() richTextBox1.LoadFile(s, RichTextBoxStreamType.RichText) s.Close() fileOpened = True Catch exp As Exception MessageBox.Show("An error occurred while attempting to load the file. The error is:" _ + System.Environment.NewLine + exp.ToString() + System.Environment.NewLine) fileOpened = False End Try Invalidate() closeMenuItem.Enabled = fileOpened ' Cancel button was pressed. Página 1207

Ing. Alberto Moreno Cueva

ElseIf (result = DialogResult.Cancel) Then return End If End Sub ' Close the current file. Private Sub closeMenuItem_Click(sender As object, e As System.EventArgs) _ Handles closeMenuItem.Click richTextBox1.Text = "" fileOpened = False closeMenuItem.Enabled = False End Sub ' 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

Propiedades de los controles usados: Combobox1 Página 1208

Ing. Alberto Moreno Cueva

Name = CbUnidades DropDownStyle = DropDownList

ListBox1 Name =

lbCarpetas

Listbox2 Name = lbArchivos Código Fuente: Imports System.IO Public Class Form1 ' Al abrirse el formulario Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Unidad As String ' para recorrer las unidades ' Añadimos cada una de las unidades lógicas For Each Unidad In Directory.GetLogicalDrives cbUnidades.Items.Add(Unidad) ' a la lista combinada If Unidad = "C:\" Then ' cuando encontremos la unidad C:\ ' la establecemos como seleccionada por defecto cbUnidades.SelectedIndex = cbUnidades.Items.Count - 1 End If Next End Sub ' Al seleccionarse una unidad Private Sub cbUnidades_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbUnidades.SelectedIndexChanged

Página 1209

Ing. Alberto Moreno Cueva

Dim Carpeta As String ' para recorrer las carpetas lbCarpetas.Items.Clear() ' eliminamos la lista actual de carpetas ' por cada carpeta existente For Each Carpeta In Directory.GetDirectories(cbUnidades.Text) lbCarpetas.Items.Add(Path.GetFileName(Carpeta)) ' añadimos un elemento a la lista Next lbCarpetas.SelectedIndex = 0 ' seleccionamos la primera carpeta End Sub ' Al seleccionarse una carpeta Private Sub lbCarpetas_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbCarpetas.SelectedIndexChanged Dim Archivo As String ' para recorrer los archivos lbArchivos.Items.Clear() ' eliminamos la lista actual ' por cada archivo de texto existente For Each Archivo In Directory.GetFiles(cbUnidades.Text & lbCarpetas.Text, "*.txt") lbArchivos.Items.Add(Path.GetFileName(Archivo)) ' añadimos un elemento a la lista Next If lbArchivos.Items.Count <> 0 Then ' si al menos un archivo lbArchivos.SelectedIndex = 0 ' lo seleccionamos Else tbContenido.Text = "" ' eliminamos el contenido anterior End If End Sub ' Al seleccionarse un archivo Private Sub lbArchivos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbArchivos.SelectedIndexChanged

Página 1210

Ing. Alberto Moreno Cueva

' Componemos el nombre del archivo Dim NombreArchivo As String = _ cbUnidades.Text & lbCarpetas.Text & _ Path.DirectorySeparatorChar & _ lbArchivos.Text ' y lo abrimos para lectura Dim SRArchivo As StreamReader = File.OpenText(NombreArchivo) ' lo leemos completo asignando el contenido al TextBox tbContenido.Text = SRArchivo.ReadToEnd SRArchivo.Close() ' y finalmente lo cerramos End Sub ' Al pulsar el botón Guardar Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Componemos el nombre del archivo Dim NombreArchivo As String = _ cbUnidades.Text & lbCarpetas.Text & _ Path.DirectorySeparatorChar & _ lbArchivos.Text ' y lo creamos nuevo Dim SRArchivo As StreamWriter = File.CreateText(NombreArchivo) ' escribimos el contenido en el archivo SRArchivo.Write(tbContenido.Text) SRArchivo.Close() ' y finalmente lo cerramos End Sub End Class Página 1211

Ing. Alberto Moreno Cueva

Semana 7 : Uso de dmi Las aplicaciones MDI (interfaz de múltiples documentos) permiten mostrar varios documentos al mismo tiempo, cada uno de ellos en su propia ventana. Las aplicaciones MDI suelen tener un elemento de menú Ventana con submenús que permiten cambiar entre ventanas o documentos. 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

En el procedimiento siguiente, creará formularios MDI secundarios que muestran un control RichTextBox, similar a la mayoría de aplicaciones de procesamiento de textos. Si sustituye el control System.Windows.Forms por otros controles, tales como el control DataGridView o una mezcla de controles, podrá crear ventanas secundarias MDI (y, por extensión, aplicaciones MDI) con diversas posibilidades. 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.

Página 1212

Ing. Alberto Moreno Cueva

Para crear formularios MDI secundarios 1. Cree un formulario primario MDI con una estructura de menús que contenga los elementos de menú Archivo y Ventana de nivel superior y los elementos de menú Nuevo y Cerrar. 2. En la lista desplegable que se encuentra en la parte superior de la ventana Propiedades, seleccione el elemento de menú correspondiente al elemento Ventana y establezca el valor de la propiedad MdiList en true. 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. 3. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto, haga clic en Agregar y seleccione Agregar nuevo elemento. Este formulario será la plantilla de los formularios MDI secundarios. 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. 4. En el cuadro de diálogo Agregar nuevo elemento, seleccione Formulario Windows Forms (en Visual Basic o Visual C#) o Aplicación de Windows Forms (.NET) (en Visual C++) desde el panel Plantillas. En el cuadro Nombre, asigne al formulario el nombre Form2. Haga clic en el botón Abrir para agregar el formulario al proyecto. Se abrirá el Diseñador de Windows Forms, que mostrará el formulario Form2. 5. En el Cuadro de herramientas, arrastre un control RichTextBox al formulario. 6. En la ventana Propiedades, establezca la propiedad Anchor en Top, Left y la propiedad Dock en Fill. 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 Página 1213

Ing. Alberto Moreno Cueva

ó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

Página 1214

Ing. Alberto Moreno Cueva

Semana 8 : Creacion de Controles Componentes en .Net 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 • Crear una carpeta cuyo nombre es: Componentes en la unidad C: Ejemplo 01 (Crear un componente que liste la tabla de multiplicar)

1. Activar el Visual Studio .net

Clic en: Biblioteca de

Nombre del

Seleccionar la carpeta:

Clic en:

Página 1215

Ing. Alberto Moreno Cueva

Nombre del Nombre de la clase (User

Doble clic y modificamos el UserControl

2. En el área de trabajo del UserControl:

Nombre: lsttabla Font / Bold= True

Listbox Insertado en el UserControl Página 1216

Ing. Alberto Moreno Cueva

Codificando en el UserControl Inherits System.Windows.Forms.UserControl Private xnumero As Single (Variable que almacena el numero) Public Property mnumero() As Single Get End Get Set(ByVal Value As Single) (Analizando al Value) If Value = 0 Then (Si value=0) lsttabla.Items.Clear() (Se limpia el listbox) Return (Se Cancela el conjunto de instrucciones) Else (En caso Contrario) lsttabla.Items.Clear() (Se Limpia el listbox) xnumero = Value (Se almacena el valor de value a la variable xmumero) Call listatabla() (Se invoca al procedimiento listatabla) End If End Set End Property

Creando al procedimiento listatabla Private Sub listatabla() Dim n As Single (Variable n para el For) For n = 1 To 12 lsttabla.Items.Add(xnumero & " * " & n & " = " & xnumero * n) Next End Sub Página 1217

Ing. Alberto Moreno Cueva

3. Luego grabar por segunda o enésima vez al proyecto 4. Clic en el menú: Generar

Clic en: Generar Solución

5. Se Visualiza la siguiente ventana:

6. Activar el .net por segunda vez 7. Seleccionar lo siguiente: Clic en: Aplicación para

Nombre del Archivo: Página 1218

Ing. Alberto Moreno Cueva

8. Nombre del Formulario: Frmtabla 9. Text: Tabla de Multiplicar 10. Nombre del Archivo: Tabla01 (Explorador de Soluciones) 11. Diseño del Formulario Name:

Name: btnsalir

12. Insertamos el control en el cuadro de herramientas 13. Ubicarse en el cuadro de herramientas, pulsar clic derecho 14. Se visualiza lo siguiente: Clic en la opción:

Página 1219

Ing. Alberto Moreno Cueva

15. Se visualiza lo siguiente:

Clic en el botón:

Seleccionar la carpeta:

Clic en el archivo:

Página 1220

ComponentesTablaMultiplicar.dll

Ing. Alberto Moreno Cueva

Clic en el botón:

16. Se visualiza lo siguiente:

Componente Insertado en las opciones de lista

Clic en Aceptar

17. En el cuadro de herramientas, se visualiza lo siguiente:

Compone

18. Codificando en el formulario Página 1221

Ing. Alberto Moreno Cueva

Variable tablita de tipo componente Private tablita As New ComponentesTablaMultiplicar.tabla01 Private num As Single (Variable num que almacena el numero) Creando al handle hnd_numero para el cuadro de texto: txtnumero, evento :KeyPress Private Sub hnd_numero(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnumero.KeyPress If Asc(e.KeyChar) = 13 Then (Si se pulsa enter) num = Val(txtnumero.Text) (Se almacena en la variable num) tablita.mnumero = num (el valor de num se almacena en la propiedad mnumero) tablita.Top = 35 (el top de tablita es 35) tablita.Left = 35 (el left de tablita es 35) Me.Controls.Add(tablita) (se Agrega hacia el formulario) End If End Sub Creando al handle hnd_limpia para el cuadro de texto: txtnumero, evento : TextChanged Private Sub hnd_limpa(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtnumero.TextChanged If Len(txtnumero.Text) = 0 Then (Si la longitud de txtnumero es igual a 0) num = Val(txtnumero.Text) (El valor 0 lo almacenamos en num) tablita.mnumero = num (Luego el valor de num que es 0 lo almacenamos en mnumero) End If End Sub Creando al handle hnd_salir para el botón. Btnsalir, evento: Click Private Sub hnd_salir(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsalir.Click End End Sub Página 1222

Ing. Alberto Moreno Cueva

19. Grabar y ejecutar la aplicación

Ejemplo02 (Crear un componente que nos permita almacenar notas y calcule su promedio y su observación) 1. Crear una carpeta cuyo nombre es: Componentes02 en la unidad C: 2. Activar el Visual Studio .net 3. Seleccionar el siguiente icono: Seleccionar: Biblioteca de controles de

Nombre del Proyecto:

Carpeta: C:\Componentes02

Clic en:

Página 1223

Ing. Alberto Moreno Cueva

4. En el explorador de soluciones, cambiar el archivo físico por lo siguiente:

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 Página 1224

Ing. Alberto Moreno Cueva

7. Codificando en la clase: Public Class frmcontrolnotas Inherits System.Windows.Forms.UserControl Private n1, n2, n3, n4, promedio As Single (Variable para las notas y promedios) Private obs As String (Variable para la observación)

Propiedad mn1 que almacena la nota1

Verifica si el value almacena los valores: 0,-1,21 si es así se cancela con return

Public Property mn1() As Single Get End Get Set(ByVal Value As Single)

If (Value = 0) Or (Value <= -1) Or (Value >= 21) Then Return • •

Else n1 = Value



Call calculo_promedio() obs = calculo_observa(promedio)

n1=almacena al value Se invoca al procedimiento: Calculo_promedio Se invoca a la función: calculo_observa por medio de la variable obs

End If End Set End Property

Propiedad mn2 que almacena la nota2 Public Property mn2() As Single

Verifica si el value almacena los valores: 0,-1,21 si es así se cancela con return

Get End Get

Página 1225

Ing. Alberto Moreno Cueva

Set(ByVal Value As Single) If (Value = 0) Or (Value <= -1) Or (Value >= 21) Then Return • •

Else n2 = Value



Call calculo_promedio() obs = calculo_observa(promedio)

n2=almacena al value Se invoca al procedimiento: Calculo_promedio Se invoca a la función: calculo_observa por medio de la variable obs

End If End Set End Property

Propiedad mn3 que almacena la nota3

Verifica si el value almacena los valores: 0,-1,21 si es así se cancela con return

Public Property mn3() As Single Get End Get Set(ByVal Value As Single) If (Value = 0) Or (Value <= -1) Or (Value >= 21) Then Return • •

Else n3 = Value



Call calculo_promedio() obs = calculo_observa(promedio)

n3=almacena al value Se invoca al procedimiento: Calculo_promedio Se invoca a la función: calculo_observa por medio de la variable obs

End If End Set End Property

Página 1226

Ing. Alberto Moreno Cueva

Propiedad mn4 que almacena la nota4 Verifica si el value almacena los valores: 0,-1,21 si es así se cancela con return

Public Property mn4() As Single Get End Get Set(ByVal Value As Single)

If (Value = 0) Or (Value <= -1) Or (Value >= 21) Then Return

• •

Else n4 = Value



Call calculo_promedio()

n4=almacena al value Se invoca al procedimiento: Calculo_promedio Se invoca a la función: calculo_observa por

obs = calculo_observa(promedio) End If End Set End Property

Creando un sub-procedimiento calculo_promedio (Halla el promedio de las 4 notas) Private Sub calculo_promedio() promedio = ((n1 + n2 + n3 + n4) / 4)

• Calculando las 4 notas y se almacena en la variable: promedio • Se visualiza el valor de la variable promedio en el cuadro de texto:

txtpromedio.Text = promedio.ToString End Sub Creando la function: Calculo_observa, que nos permita hallar la observación de acuerdo al promedio Private Function calculo_observa(ByVal prom As Single) As String Parámetro Prom que almacena el

Select Case prom Case 0 To 4 : calculo_observa = "Bruto" Case 5 To 10 : calculo_observa = "Malo" Página 1227



Se Analiza la variable prom con el select case • Luego almacena en el Ing. Alberto MorenoseCueva cuadro de texto: txtobservacion

Case 11 To 14 : calculo_observa = "Regular" Case 15 To 18 : calculo_observa = "Bueno" Case 19 To 20 : calculo_observa = "Excelente" Case Else : calculo_observa = "" End Select txtobservacion.Text = obs End Function

Creando una propiedad mpromedio donde se almacena el promedio Public Property mpromedio() As Single Get



mpromedio = promedio

Almacenando la variable promedio hacia la propiedad mpromedio

End Get Set(ByVal Value As Single) End Set End Property

Creando una propiedad mobserva donde se almacena la observación (obs ß Variable) Public Property mobserva() As String Get mobserva = obs



Almacenando la variable obs hacia la propiedad mobserva

End Get Set(ByVal Value As String) End Set End Property

Página 1228

Ing. Alberto Moreno Cueva

Creando una propiedad tmn1 para manipular al cuadro de texto: txtnota1

Public Property tmn1() As String Get End Get Si value=0 entonces el valor del cuadro de texto txtnota1 es

Set(ByVal Value As String) If Value = 0 Then txtnota1.Text = "" End Set End Property

Creando una propiedad tmn2 para manipular al cuadro de texto: txtnota2 Public Property tmn2() As String Get End Get Si value=0 entonces el valor del cuadro de texto txtnota2 es

Set(ByVal Value As String) If Value = 0 Then txtnota2.Text = "" End Set End Property

Creando una propiedad tmn3 para manipular al cuadro de texto: txtnota3 Public Property tmn3() As String Get End Get Si value=0 entonces el valor del cuadro de texto txtnota3 es

Set(ByVal Value As String) If Value = 0 Then txtnota3.Text = ""

End Set Página 1229

Ing. Alberto Moreno Cueva

End Property

Creando una propiedad tmn4 para manipular al cuadro de texto: txtnota4 Public Property tmn4() As String Get End Get Set(ByVal Value As String) If Value = 0 Then txtnota4.Text = "" : txtpromedio.Text = "" : txtobservacion.Text = "" End Set End Property Si value=0 entonces el valor del cuadro de texto txtnota4, txtpromedio, txtobservacion están vacíos

Trabajando con los eventos de los cuadro de textos En el objeto: txtnota1, evento: Keypress

Private Sub txtnota1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnota1.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtnota1.Text) = 0 Then

Si la longitud de txtnota1 es = 0, entonces se toma el enfoque de txtnota1

txtnota1.Focus() Else If (Integer.Parse(txtnota1.Text) >= 0 And Integer.Parse(txtnota1.Text)) <= 20 Then mn1 = Val(txtnota1.Text) txtnota2.Focus()

Si el rango es de 0 a 20, entonces se almacena el 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 En el objeto: txtnota2, evento: Keypress

Private Sub txtnota2_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnota2.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtnota2.Text) = 0 Then

Si la longitud de txtnota2 es = 0, entonces se toma el enfoque de txtnota2

txtnota2.Focus() Else If (Integer.Parse(txtnota2.Text) >= 0 And Integer.Parse(txtnota2.Text)) <= 20 Then mn2 = Val(txtnota2.Text) txtnota3.Focus()

Si el rango es de 0 a 20, entonces se almacena el valor de txtnota2 en: mn2

Else txtnota2.Text = "" txtnota2.Focus()

Si el rango no es de 0 a 20 entonces se limpia el cuadro de texto: txtnota2 y se toma el enfoque

End If End If End If End Sub En el objeto: txtnota3, evento: Keypress Private Sub txtnota3_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnota3.KeyPress

Página 1231

Ing. Alberto Moreno Cueva

If Asc(e.KeyChar) = 13 Then If Len(txtnota3.Text) = 0 Then

Si la longitud de txtnota3 es = 0, entonces se toma el enfoque de txtnota3

txtnota3.Focus() Else If (Integer.Parse(txtnota3.Text) >= 0 And Integer.Parse(txtnota3.Text)) <= 20 Then mn3 = Val(txtnota3.Text) txtnota4.Focus() Else

Si el rango es de 0 a 20, entonces se almacena el valor de txtnota3 en: mn3

Si el rango no es de 0 a 20 entonces se limpia el cuadro de texto: txtnota3 y se toma el enfoque

txtnota3.Text = "" txtnota3.Focus() End If End If End If End Sub En el objeto: txtnota4, evento: Keypress

Private Sub txtnota4_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnota4.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtnota4.Text) = 0 Then

Si la longitud de txtnota4 es = 0, entonces se toma el enfoque de txtnota4

txtnota4.Text = "" Else If (Integer.Parse(txtnota4.Text) >= 0 And Integer.Parse(txtnota4.Text)) <= 20 Then mn4 = Val(txtnota4.Text) txtobservacion.Focus()

Si el rango es de 0 a 20, entonces se almacena el valor de txtnota4 en: mn4

Else Página 1232

Ing. Alberto Moreno Cueva

txtnota4.Text = "" txtnota4.Focus()

Si el rango no es de 0 a 20 entonces se limpia el cuadro de texto: txtnota4 y se toma el enfoque

End If End If End If End Sub En el objeto: txtnota1, evento: TextChanged Private Sub txtnota1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnota1.TextChanged If Not IsNumeric(txtnota1.Text) Then txtnota1.Text = "" txtnota1.Focus()

Si no se digita un numero en el cuadro de texto: txtnota1, entonces se limpia el cuadro y se toma el enfoque

End If End Sub

En el objeto: txtnota2, evento: TextChanged Private Sub txtnota2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnota2.TextChanged If Not IsNumeric(txtnota2.Text) Then txtnota2.Text = ""

Si no se digita un numero en el cuadro de texto: txtnota2, entonces se limpia el cuadro y se toma el enfoque

txtnota2.Focus() End If End Sub

En el objeto: txtnota3, evento: TextChanged Private Sub txtnota3_TextChanged(ByVal sender As System.Object, ByVal e As System.Event Args) Handles Página 1233

Ing. Alberto Moreno Cueva

txtnota3.TextChanged If Not IsNumeric(txtnota3.Text) Then txtnota3.Text = ""

Si no se digita un numero en el cuadro de texto: txtnota3, entonces se limpia el cuadro y se toma el enfoque

txtnota3.Focus() End If End Sub

En el objeto: txtnota4, evento: TextChanged Private Sub txtnota4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnota4.TextChanged If Not IsNumeric(txtnota4.Text) Then txtnota4.Text = "" txtnota4.Focus()

Si no se digita un numero en el cuadro de texto: txtnota4, entonces se limpia el cuadro y se toma el enfoque

End If End Sub

8. Luego seleccionar la opción: Generar / Generar Solución

Página 1234

Ing. Alberto Moreno Cueva

9. Seleccionar: Generar / Generar Componentes2

10. Activar el Visual Studio .net, por segunda vez

Nombre del Proyecto: Clic en: Aplicación Para

Clic en:

Carpeta: C:\Componentes02 Página 1235

Ing. Alberto Moreno Cueva

11. Propiedades del Formulario: • • •

Name: frmdatos Text: Ingreso de Datos StartPosition: Center Screen

12. Diseño del Formulario Name: gbxdatos / Enabled:

Name: Name:

Name: Name: Name: txtcorreo

13. Del Cuadro de Herramientas, seleccionar: Herramienta: Tooltip, sirve para crear mensajes emergentes

14. Se visualiza en la parte inferior de la pantalla:

15. Seleccionar el cuadro de texto: txtcodigo y en el cuadro de propiedades Digitar el texto: Ingrese Un

Página 1236

Ing. Alberto Moreno Cueva

16. Seleccionar el cuadro de texto: txtpaterno y en el cuadro de propiedades Digitar el texto: Ingrese Un Apellido

17. Seleccionar el cuadro de texto: txtpaterno y en el cuadro de propiedades Digitar el texto: Ingrese Un Apellido Materno

18. Seleccionar el cuadro de texto: txtnombres y en el cuadro de propiedades Digitar el texto: Ingrese Un Nombre

19. Seleccionar el cuadro de texto: txtcorreo y en el cuadro de propiedades

Digitar el texto: Ingrese Un

20. Codificando en el formulario Public Class frmdatos

Private xmenu As New MainMenu

Creando un objeto xmenu de tipo Menú Principal Página 1237

Ing. Alberto Moreno Cueva

Creando las opciones del menú con sus eventos correspondientes

Private WithEvents xprincipal, xnuevo, xcancelar, xraya, xsalir As New MenuItem

Private xprom As New Componentes2.frmcontrolnotas 21. En el Objeto: Form, evento Load Form

Invocando al control con el objeto xprom

Load

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With xprincipal .Text = "&Opciones Generales" Creando a la opción: “&Opciones Generales”

.Shortcut = Shortcut.CtrlO .ShowShortcut = True End With With xnuevo

Creando a la opción: “&Nuevo Registro”

.Text = "&Nuevo Registro" .Shortcut = Shortcut.CtrlN .ShowShortcut = True End With With xcancelar .Text = "&Cancelar Todo"

Creando a la opción: “&Cancelar Todo”

.Shortcut = Shortcut.CtrlShiftC .ShowShortcut = True End With

Página 1238

Ing. Alberto Moreno Cueva

With xraya

Creando a la opción: “-“

.Text = "-" End With With xsalir .Text = "&Salir"

Creando a la opción: “&Salir”

.Shortcut = Shortcut.CtrlS .ShowShortcut = True End With

With xprincipal.MenuItems .Add(xnuevo)

Agregando las opciones a xprincipal

.Add(xcancelar) .Add(xraya) .Add(xsalir) End With xmenu.MenuItems.Add(xprincipal)

Agregando xprincipal a xmenu

Menu = xmenu End Sub Creando un handle hnd_nuevo para la opción: xnuevo, evento: Click Private Sub hnd_nuevo(ByVal sender As Object, ByVal e As System.EventArgs) Handles xnuevo.Click gbxdatos.Enabled = True (Se activa el groupbox) Dim obj1 As Object (Se declara un objeto obj1) For Each obj1 In Me.gbxdatos.Controls If TypeOf obj1 Is TextBox Then CType(obj1, TextBox).Text = "" Página 1239

Se Limpia los cuadros de textos Ing. Alberto Moreno Cueva

End If Next With xprom (Con el objeto xprom) .Top = Me.gbxdatos.Height (Se da un valor al top – El alto de gbxdatos) .Left = gbxdatos.Left (Se da un valor al left – El left de gbxdatos) End With xprom.tmn1 = 0

Se dan valores de 0 a la propiedades, para que los cuadros de textos se

xprom.tmn2 = 0 xprom.tmn3 = 0 xprom.tmn4 = 0 Me.Controls.Add(xprom) (Se agrega el objeto xprom al formulario) txtcodigo.Focus() (Se toma el enfoque al objeto: txtcodigo) End Sub Creando un handle hnd_cancelar, para la opción: xcancelar, evento: Click Private Sub hnd_cancelar(ByVal sender As Object, ByVal e As System.EventArgs) Handles xcancelar.Click Dim obj2 As Object (Se crea el objeto obj2) For Each obj2 In Me.gbxdatos.Controls Se Limpia los cuadros de textos

If TypeOf obj2 Is TextBox Then CType(obj2, TextBox).Text = "" End If Next

gbxdatos.Enabled = False - (El groupbox se desactiva) Me.Controls.Remove(xprom) - (Se elimina el objeto xprom que esta en el Formulario) End Sub Creando el handle hnd_salir, para la opción xsalir, evento: Click Página 1240

Ing. Alberto Moreno Cueva

Private Sub hnd_salir(ByVal sender As Object, ByVal e As System.EventArgs) Handles xsalir.Click End End Sub Manipulando los eventos de los cuadros de textos Txtcodigo

KeyPress

Private Sub txtcodigo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtcodigo.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtcodigo.Text) = 0 Then MessageBox.Show("Ingrese Un Codigo", "Pulse Clic En Aceptar") txtcodigo.Focus() Else txtpaterno.Focus() End If End If End Sub Txtpaterno

KeyPress

Private Sub txtpaterno_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtpaterno.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtpaterno.Text) = 0 Then MessageBox.Show("Ingrese Un Apellido Paterno", "Pulse Clic En Aceptar") txtpaterno.Focus() Else txtmaterno.Focus() End If Página 1241

Ing. Alberto Moreno Cueva

End If End Sub Txtpaterno

TextChanged

Private Sub txtpaterno_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtpaterno.TextChanged If IsNumeric(txtpaterno.Text) Then txtpaterno.Text = "" txtpaterno.Focus() End If End Sub

Txtmaterno

KeyPress

Private Sub txtmaterno_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtmaterno.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtmaterno.Text) = 0 Then MessageBox.Show("Ingrese Un Apellido Materno", "Pulse Clic En Aceptar") txtmaterno.Focus() Else txtnombres.Focus() End If End If End Sub Txtmaterno

TextChanged

Página 1242

Ing. Alberto Moreno Cueva

Private Sub txtmaterno_Te

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

Private Sub txtnombres_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtnombres.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtnombres.Text) = 0 Then MessageBox.Show("Ingrese Un Nombre", "Pulse Clic En Aceptar") txtnombres.Focus() Else txtcorreo.Focus() End If End If End Sub Txtnombres

TextChanged

Private Sub txtnombres_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtnombres.TextChanged If IsNumeric(txtnombres.Text) Then txtnombres.Text = "" End If End Sub Txtcorreo Página 1243

Ing. Alberto Moreno Cueva

KeyPress Private Sub txtcorreo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtcorreo.KeyPress If Asc(e.KeyChar) = 13 Then If Len(txtcorreo.Text) = 0 Then MessageBox.Show("Ingrese Un Correo Electrónico", "Pulse Clic En Aceptar") txtcorreo.Focus() Else xprom.Focus() End If End If End Sub 22. Grabar y ejecutar la aplicación

Página 1244

Ing. Alberto Moreno Cueva

Semana 9 : desarrollo de una aplicación examen virtual Diseñar una aplicación que me permita simular el examen virtual de operaciones básicas de del sistema operativo de Windows, este ejemplo es solo para 5 preguntas Ud. Debe de presentarlo de 25 preguntas, lod temas serán dejados por el profesor del curso de diferentes programas de la carrera. 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.

Página 1245

Ing. Alberto Moreno Cueva

Mostrara como resultado una pequeña estadística de las preguntas correctas, en blanco y las que contesto en forma incorrecta.

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.

Página 1246

Ing. Alberto Moreno Cueva

Este archivo se generara en esta ruta según mi programación c:\gahExamen\gahProExamenNet\bin\Debug 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). Crear una solución en blanco con el siguiente nombre.

En el nombre se debe denotar lo siguiente.

galopin alberc o a Así se presentara la solución.

herna n

Nombre de la solución

Luego procederá a agregar un proyecto con el siguiente nombre (siga los padrones que ya se le indicaron) en mi caso gahProExamenNet

Página 1247

Ing. Alberto Moreno Cueva

Debe mostrar la siguiente ventana

Elimine el formulario que se muestra por defecto. 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.

Luego debe crear una carpeta y en ella copiar y pegar las imágenes que usara en la solución de la aplicación muestra la siguiente ventana.

Agregar los otros formulario a su proyecto mostrando la siguiente ventana.

Página 1248

Ing. Alberto Moreno Cueva

Programación del Modulo (

)

Página 1249

Ing. Alberto Moreno Cueva

Programación del formulario

Debe usar los siguientes controles 1 groupbox, 1 textbox, 2 button, 1 picturebox El size del formulario debe de ser de 357, 159

Página 1250

Ing. Alberto Moreno Cueva

PROGRAMACION DE LOS BOTONES

'variable nom asume del nombre del usuario 'validarlo para que solo acepte letras y espacios en blanco NOM = txtnom.Text.ToUpper If Trim(txtnom.Text) = "" Or IsNumeric(txtnom.Text) = True Then MessageBox.Show("Olvido escribir su Nombre", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) txtnom.Text = "" txtnom.Focus() Else Me.Hide() gahfrmpre.ShowDialog() End If

If MessageBox.Show("¿Deseas salir ?", "Cuidado...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then Me.Close() Else txtnom.Text = "" txtnom.Focus() End If

Programación del formulario

Página 1251

Ing. Alberto Moreno Cueva

Controles a usar 3 picturebox, 1 textbox, 11 label, 2 groupbox, 1 button, 4 radio button. 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. El size del formulario debe ser de 731, 597

Página 1252

Ing. Alberto Moreno Cueva

Leer(0) Mostrar(L) POS = 1 grbNPre.Text = "Pregunta " & POS

S(L) = rbt1.Text 'determina que radio button fue seleccionado O(L) = "A" ' cuando escojio la respuesta a, seria igual para los otros radio button

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 Página 1253

Ing. Alberto Moreno Cueva

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) Else Ing. Alberto Moreno Cueva Página 1254

FilePut(1, "" & x + 1 & ")" & "

" & Convert.ToString(A.GetValue(x)) & "

&_ Convert.ToString(O.GetValue(x)) & " FilePut(1, vbCrLf) End If Next 'cierra al archivo de escritura FileClose(1) Me.Hide() FR.ShowDialog()

EN BLANCO")

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 El código que falta debe de determinarlo 'programar para q el titulo del formulario tenga el efecto de mobimiento Me.Text = Mid(Me.Text, 2) + Microsoft.VisualBasic.Left(Me.Text, 1)

El código que falta debe de determinarlo Página 1255

Ing. Alberto Moreno Cueva

ss = ss + 1

"

If ss = 60 Then ss = 0 mm = mm + 1 If mm = 60 Then mm = 0 Timer2.Enabled = False Me.Hide() FR.Show() End If End If txttime.Text = Format(mm, "00") + ":" + Format(ss, "00") TIEMPO = txttime.Text Programación del formulario

Controles a usar 1 listbox,5 label, 1 groupbox, 1 picturebox, 3 textbox, 1 button El size del formulario es 416, 488

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 Página 1256

Ing. Alberto Moreno Cueva

txtCorrecto.Text = Correctos txtIncorrecto.Text = Incorrectos txtBlanco.Text = SinLlenar If Correctos = 0 Then lblCorrecto.Visible = False If Incorrectos = 0 Then lblIncorrecto.Visible = False If SinLlenar = 0 Then lblBlanco.Visible = False lblCorrecto.Location = New Point(96, 352 - Correctos * 16.4) lblIncorrecto.Location = New Point(192, 352 - Incorrectos * 16.4) lblBlanco.Location = New Point(288, 352 - SinLlenar * 16.4)

Salir() Determinar este codigo como se muestra Private Sub gahResultadoExamenNet_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing Salir() End Sub

Desarrollo de Integraciones Manejo de Ítems La manipulación de datos se desarrolla con el manejo de una estructura y de dimensiones con el almacenamientos de datos dentro de un archivo el será leído tantas veces como el usuario lo desee. Planteamiento del problema.

Página 1257

Ing. Alberto Moreno Cueva

Página 1258

Ing. Alberto Moreno Cueva

Establecer como formulario de inicio al frmServicio.

Página 1259

Ing. Alberto Moreno Cueva

Página 1260

Ing. Alberto Moreno Cueva

Página 1261

Ing. Alberto Moreno Cueva

Página 1262

Ing. Alberto Moreno Cueva

Página 1263

Ing. Alberto Moreno Cueva

Página 1264

Ing. Alberto Moreno Cueva

Página 1265

Ing. Alberto Moreno Cueva

Semana 11 : (Programación Orientada a Objetos) La programación orientada a objetos es una evolución de la programación procedural basada en funciones. La POO nos permite agrupar secciones de código con funcionalidades comunes. Una de las principales desventajas de la programación procedural basada en funciones es su construcción, cuando una aplicación bajo este tipo de programación crece, la modificación del código se hace muy trabajosa y difícil debido a que el cambio de una sola línea en una función, puede acarrear la modificación de muchas otras líneas de código pertenecientes a otras funciones que estén relacionadas. Con la programación orientada a objetos se pretende agrupar el código encapsulándolo y haciéndolo independiente, de manera que una modificación debida al crecimiento de la aplicación solo afecte a unas pocas líneas. 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. La creación de un objeto a partir de una clase se conoce como instanciación de un 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(). Public Class Bicicleta Public Modelo as String Public Precio as Double Public NumeroDeVelocidades as Integer Private Velocidad as Integer Public Sub Acelerar() Velocidad = Velocidad + 1 Página 1266

Ing. Alberto Moreno Cueva

End Sub

Public Sub Frenar() If Velocidad > 0 Then Velocidad = Velocidad -1 End If End Sub Public Function ConsutarVelocidad() As Integer Return Velocidad End Function End Class 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. Una vez está construida la clase ya se pueden instanciar objetos de la misma. Dim objBicicleta as New Bicicleta Dim VelocidadActual as Integer 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.

Página 1267

Ing. Alberto Moreno Cueva

Por último se usa la función

ConsultarVelocidad(), que retorna el valor de la propiedad Velocidad para introducirlo en la variable VelocidadActual.

Página 1268

Ing. Alberto Moreno Cueva

Ejemplo Practico en Vb Net 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 Class Operaciones Public N1 As Integer Public N2 As Integer Function Operar(ByVal Signo As String) Select Case SIgno Case "+" : Operar = N1 + N2 Case "-" : Operar = N1 - N2 Case "*" : Operar = N1 * N2 Case "/" : Operar = N1 / N2 Case Else : Operar = 0 End Select End Function End Class End Module En el formulario Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim S As String = InputBox("Ingrese signo a operar (+,-,*,/) ") Dim X As New Operaciones

Página 1269

Ing. Alberto Moreno Cueva

X.N1 = Val(Me.TextBox1.Text) X.N2 = Val(Me.TextBox2.Text) Me.Lblres.Text = X.Operar(S) End Sub End Class Aquí hay otro ejemplo de una clase Formulario Public Class Formulario Public Miform As Form Public Fuente As Font Sub ColorFondo(ByVal Fondo As Color) Miform.BackColor = Fondo End Sub Sub FuenteTextos() Dim Obj As Object For Each Obj In Miform.Controls If TypeOf Obj Is TextBox Then Obj.Font = Fuente End If Next End Sub End Class Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim x As New Formulario x.Miform = Me x.Fuente = New Font("Arial Black", 10, FontStyle.Bold) Página 1270

Ing. Alberto Moreno Cueva

x.ColorFondo(Color.Aquamarine) x.FuenteTextos() End Sub

Los tres pilares de la Programación Orientada a Objetos Según se dice por ahí, cualquier lenguaje basado en objetos debe cumplir estos tres requisitos: 1. Herencia 2. Encapsulación 3. Polimorfismo

Página 1271

Ing. Alberto Moreno Cueva

Semana 12 : (Constructores y Sobrecarga) Toda clase tiene por lo menos un constructor aun si no es declarado explícitamente java le genera uno por defecto. El constructor es un método que se ejecuta al inicializar el objeto y su contenido de código generalmente inicializa las variables o propiedades de la clase. El nombre de un método constructor debe ser siempre el nombre de la clase. Que es sobrecargado de metodos? La sobrecarga de métodos consiste en poner varios métodos con el mismo nombre en la misma clase, pero siempre que su lista de argumentos sea distinta. Ojo, repito, siempre que su lista de argumentos sea distinta, es decir, no puede haber dos métodos que se llamen igual con la misma lista de argumentos, aunque devuelvan datos de distinto tipo. El compilador sabría a cuál de todas las sobrecargas nos referimos por los argumentos que se le pasen en la llamada, pero no sería capaz de determinar cuál de ellas debe ejecutar si tienen la misma lista de argumentos. Ejemplo .-Realizar el ingreso de nuevos alumnos y almacenarlos en un listbox , se debe calcular su promedio para cada uno. Public Class Form1 Dim ves As estudiante Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub BtnAcepta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAcepta.Click ves = New estudiante ves.nombre = Me.txtnom.Text ves.exf = CInt(Me.txtEf.Text)

Página 1272

Ing. Alberto Moreno Cueva

ves.exp = CInt(Me.txtep.Text) Me.txtnom.Clear() txtEf.Clear() : txtep.Clear() txtnom.Focus() BtnMuestra_Click(sender, e) End Sub Private Sub BtnMuestra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMuestra.Click Dim strfrm As String strfrm = "{0,-25}{1,15}" 'ListBox1.Items.Clear() ListBox1.Items.Add(String.Format(strfrm, ves.nombre, ves.obser)) End Sub End Class

Class estudiante Private m_nom As String Private m_exp As Integer Private m_Exf As Integer Public Property nombre() As String Get Return m_nom End Get Set(ByVal value As String) m_nom = value End Set Página 1273

Ing. Alberto Moreno Cueva

End Property Public WriteOnly Property exf() As Integer Set(ByVal value As Integer) m_Exf = value End Set End Property Public WriteOnly Property exp() As Integer Set(ByVal value As Integer) m_exp = value End Set End Property Function obser() As String Dim pro As Single, obs$ pro = (m_exp + 2 * m_Exf) / 3 obs = "" Select Case pro Case 0 To 6 : obs = "deficiente" Case 7 To 10 : obs = "desparobado" Case 11 To 15 : obs = "aprobado" Case 16 To 20 : obs = "excelente" End Select Return obs End Function End Class Ejemplo.- Elaborar una calculadora empleando clases.

Página 1274

Ing. Alberto Moreno Cueva

Public Class Form2 Dim adder As New AddingMachine() Dim calc As New Calculator() Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub

Private Sub btnadd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnadd.Click adder.FirstNumber = CDbl(txtn1.Text) adder.SecondNumber = CDbl(txtn2.Text) Me.txtres.Text = CStr(adder.Add) End Sub Private Sub rdmac_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdmac.CheckedChanged btnMul.Visible = False btndiv.Visible = False End Sub Private Sub rdCalcula_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdCalcula.CheckedChanged btnMul.Visible = True btndiv.Visible = True End Sub Private Sub btnres_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnres.Click adder.FirstNumber = CDbl(txtn1.Text)

Página 1275

Ing. Alberto Moreno Cueva

adder.SecondN

umber = CDbl(txtn2.Text) Me.txtres.Text = CStr(adder.Subtract) End Sub Private Sub btnMul_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMul.Click calc.FirstNumber = CDbl(txtn1.Text) calc.SecondNumber = CDbl(txtn2.Text) txtres.Text = CStr(calc.Multiply) End Sub Private Sub btndiv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btndiv.Click calc.FirstNumber = CDbl(txtn1.Text) calc.SecondNumber = CDbl(txtn2.Text) txtres.Text = CStr(calc.Divide) End Sub End Class Class AddingMachine Private m_num1, m_num2 As Double Public Property FirstNumber() As Double Get Return m_num1 End Get Set(ByVal value As Double) m_num1 = value End Set End Property

Página 1276

Ing. Alberto Moreno Cueva

Public Property

SecondNumber() As Double Get Return m_num2 End Get Set(ByVal value As Double) m_num2 = value End Set End Property Function Add() As Double Return FirstNumber + SecondNumber End Function Function Subtract() As Double Return FirstNumber - SecondNumber End Function End Class Class Calculator Inherits AddingMachine 'Calculator inherits properties FirstNumber and SecondNumber 'and functions Add() and Subtract(). Function Multiply() As Double Return FirstNumber * SecondNumber End Function Function Divide() As Double Return FirstNumber / SecondNumber End Function End Class Página 1277

Ing. Alberto Moreno Cueva

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: SuperVendedor

Static double precio=120;

Un constructor (int cantidad) .- debe pasar la cantidad a vender Void cambiaPrecio( double nuevoPrecio)

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. -Comprar cantidades del vendedor 1 y 2 ingresando por teclado la cantidad. - Imprimir su totales ventas por cada vendedor. 2.- Crear la clase Ahorro : String nrocta, String Cliente,double saldo 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). Comprobarlo en un programa principal. (6

Página 1278

Ing. Alberto Moreno Cueva

Semana 13 : (Herencias e Interfaces) Según la documentación de Visual Studio .NET: 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 Según la documentación de Visual Studio .NET: La encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes de encapsular elementos. Cuando usamos las clases, éstas tienen una serie de características (los datos que manipula) así como una serie de comportamientos (las acciones a realizar con esos datos). 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

Página 1279

Ing. Alberto Moreno Cueva

Según la documentación de Visual Studio .NET: El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable mediante código cliente en tiempo de ejecución. 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 Public Class frmherencia Dim cls As New vehiculo Dim tipo As New recauda Private Sub frmherencia_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click lbnro.Text = cls.cuenta If Me.rdCamion.Checked Then Me.lbtot.Text = tipo.camion Else Me.lbtot.Text = tipo.carro End If End Sub Página 1280

Ing. Alberto Moreno Cueva

End Class Class vehiculo Private m_can As Integer Private sm1, sm2 As Single Sub New() m_can = 0 sm1 = 0 sm2 = 0 End Sub Function cuenta() As Integer m_can = m_can + 1 Return m_can End Function End Class Class recauda Inherits vehiculo Private sm1, sm2 As Single Function carro() As Single sm1 = sm1 + 3.2 Return sm1 End Function Function camion() As Single sm2 = sm2 + 6.4 Return sm2 End Function End Class Página 1281

Ing. Alberto Moreno Cueva

Ejemplo de Polimorfismo y Mybase La observacion es de acuerdo al puntaje que se obtiene como promedio , si es un estudiante de primaria o secundaria ; si es de primaria el promedio se le asigna una letra correspondiente, y si es de secundaria el promedio que le corresponde. Codificacion Public Class frmPoliformismo Dim students(49) As Student

'Stores the class

Dim lastStudentAdded As Integer = -1 'Last student added to students Private Sub frmPoliformismo_Load(

) Handles MyBase.Load

End Sub Private Sub BtnAcepta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAcepta.Click Dim pupil As Student 'Create the appropriate object depending upon the radio button. If Me.RdFail.Checked Then pupil = New PFStudent() Else pupil = New Student() End If 'Store the values in the text boxes into the object.

Página 1282

Ing. Alberto Moreno Cueva

pupil.Name = txtnom.Text pupil.SocSecNum = txtnum.Text pupil.Midterm = CDbl(txtep.Text) pupil.Final = CDbl(txtEf.Text) 'Add the student to the array. lastStudentAdded += 1 students(lastStudentAdded) = pupil 'Clear text boxes and list box. txtnom.Clear() txtnum.Clear() txtep.Clear() txtEf.Clear() ListBox1.Items.Add("Student #" & lastStudentAdded + 1 _ & " recorded.") End Sub

Private Sub BtnMuestra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnMuestra.Click 'Display the students' information and semester grade. Dim fmtStr As String = "{0,-20}{1,-15}{2,-4}" ListBox1.Items.Clear() 'Loop over all available elements of the Student array. For i As Integer = 0 To lastStudentAdded ListBox1.Items.Add(String.Format(fmtStr, students(i).Name, _ students(i).SocSecNum, students(i).CalcSemGrade)) Next Página 1283

Ing. Alberto Moreno Cueva

End Sub End Class Class Student 'Member variables to hold the property values Private m_name As String Private m_ssn As String Private m_midterm As Double Private m_final As Double Public Property Name() As String 'The student's name Get Return m_name End Get Set(ByVal value As String) m_name = value End Set End Property Public Property SocSecNum() As String 'The student's Social Security Number Get Return m_ssn End Get Set(ByVal value As String) m_ssn = value End Set End Property Página 1284

Ing. Alberto Moreno Cueva

Public WriteOnly Property Midterm() As Double 'The student's score on the midterm exam Set(ByVal value As Double) m_midterm = value End Set End Property Public WriteOnly Property Final() As Double 'The student's score on the final exam Set(ByVal value As Double) m_final = value End Set End Property Overridable Function CalcSemGrade() As String 'The student's grade for the semester Dim grade As Double 'The grade is based upon average of the midterm and final exams. grade = (m_midterm + m_final) / 2 grade = Math.Round(grade) 'Round the grade. Select Case grade Case Is >= 90 :

Return "A"

Case Is >= 80 :

Return "B"

Case Is >= 70 :

Return "C"

Case Is >= 60 :

Return "D"

Case Else Return "F" End Select Página 1285

Ing. Alberto Moreno Cueva

End Function End Class Class PFStudent Inherits Student Overrides Function CalcSemGrade() As String 'The student's grade for the semester 'If MyBase.CalcSemGrade = "F" Then '

Return "Fail"

'Else '

Return "Pass"

'End If Select Case MyBase.CalcSemGrade Case "A", "B" : Return "Aprobado" Case "C", "D", "F" : Return "desaprobado" 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. Esta aplicación impleméntelo : a) Primero en modo de consola , empleando un ArrayList para almacenar un conjunto de clientes , se debe elaborar un menú que contemple las siguientes opciones: Página 1286

Ing. Alberto Moreno Cueva

(1) Nuevos ahorristas (2) Consulta de Saldos (3) Movimiento de Cuentas (4) Listado de Ahorristas (5) Anulación de cuentas (6) Salir En la opción 2 se realiza la búsqueda por medio de un numero de cuenta En la opción 3 se realiza el deposito o retiro a través de un numero de cuenta actualizando el saldo respectivo. La anulación también se realiza por medio del nro de cuenta. b) Realizar la misma aplicación pero empleando formularios.

Página 1287

Ing. Alberto Moreno Cueva

Semana 14 : (Programacion Con Ado . Net) ADO .NET es la nueva versión del modelo de objetos ADO (ActiveX Data Object), es decir la estrategia que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado para cubrir todas las necesidades que ADO no ofrecía, y esta diseñado para trabajar con conjuntos de datos desconectados, lo que permite reducir el trafico de red. ADO .NET utiliza XML con formato universal de transmisión de los datos.

Estructura del modelo de objetos Ambitos con nombre de ADO .NET 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. Página 1288

Ing. Alberto Moreno Cueva

• •

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).

Proveedores de acceso a datos Los proveedores de acceso a datos es la capa inferior de la parte correspondiente al acceso de datos y es la responsable de establecer la comunicación con las fuentes de datos. 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. Proveedor de acceso a datos de .NET Framework Dentro del entorno .NET Framework, encontramos un nutrido conjunto de proveedores de acceso a datos. Estos son los siguientes: • ODBC .NET Data Provider • OLE DB .NET Data Provider • Oracle Client .NET Data Provider • SQL Server .NET Data Provider Estos proveedores de acceso a datos incluidos en Microsoft .NET Framework, los podemos encontrar en los nombres de espacio: • • • •

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.

Página 1289

Ing. Alberto Moreno Cueva

El objeto Command 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: •

SelectCommand es el objeto encargado de realizar los trabajos de selección de datos con una fuente de datos dada. En sí, es el que se encarga de devolver y rellenar los datos de una fuente de datos a un DataSet. • DeleteCommand es el objeto encardago de realizar las acciones de borrado de datos. • InsertCommand es el objeto encardago de realizar las acciones de inserción de datos. • UpdateCommand es el objeto encardago de realizar las acciones de actualización de datos. Los objetos DeleteCommand, InsertCommand y UpdateCommand son los objetos que se utilizan para manipular y transmitir datos de una fuente de datos determinada, al contrario del objeto SelectCommand que tan sólo interactúa con la fuente de datos para recuperar una porción o todos los datos indicados en el objeto Command anteriormente comentado. 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 Página 1290

Ing. Alberto Moreno Cueva

Puede que sea la capa más externa e importante del modelo ADO.NET, pero es la que contiene quizás, el modelo de colecciones y trabajo que más le puede resultar familiar al programador de Visual Basic 6, sobre todo a los anteriormente comentados RecordSets. 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.

Página 1291

Ing. Alberto Moreno Cueva

El objeto DataSet nos ofrece la posibilidad de almacenar datos, tablas y bases de datos de una determinada fuente de datos. De esta manera, podemos trabajar con las aplicaciones estando desconectados de la fuente de datos. 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. Motor de Base de Datos 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. Estructura de una tabla creada en Access.

Página 1292

Ing. Alberto Moreno Cueva

Aplicación 1: Creara una carpeta llamada BDVisualNET, será donde se almacenara el proyecto que crearemos.

Form1.Vb

Realizando la conexión, con el control OleDbDataAdapter. 1. Nos ubicamos en la barra de herramientas, seleccionamos el cuadro de herramientas Datos, y buscamos el control OleDbDataAdapter. 2. Le damos un clic en el control OleDbDataAdapter y lo arrastramos al formulario actual que estamos trabajando. 3. Nos mostrara un Asistente para la configuración del adaptador de datos.

Página 1293

Ing. Alberto Moreno Cueva

4. En elegir conexión de datos, crearemos una conexión nueva a la base de datos Access, le damos clic en el boton Nueva conexión.

5. Nos ubicamos en la etiqueta Proveedor, y seleccionamos el Proveedor OLE DB => Microsoft Jet 4.0 OLE DB Provider.

Página 1294

Ing. Alberto Moreno Cueva

6. Le damos clic en el botón siguiente. 7. En la ventana conexión seleccionamos la base de datos en Access ventas, como punto de trabajo, le damos clic en el boton , para buscar la base de datos.

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.

Página 1295

Ing. Alberto Moreno Cueva

10. Le damos clic en el botón siguiente. 11. En el tipo de consulta, dejamos la selección por defecto, usar instrucciones SQL, el cual nos permitirá buscar la tabla o tablas para mostrar en nuestro DataGrid1. Le damos clic en siguiente.

12. En este cuadro de Generar las instrucciones SQL, generamos una consulta, le damos clic en el boton Generador de Consultas.

Página 1296

Ing. Alberto Moreno Cueva

13. En el Generador de Consultas, seleccionamos la tabla o tablas que deseamos visualizar, le damos un clic en el boton Agregar, y clic en cerrar.

14. En la tabla agregada Clientes, marcamos el check mostrar todos los campos de la tabla Clientes.

Página 1297

Ing. Alberto Moreno Cueva

, el nos permitirá

15. Notamos en la imagen que se genera una conjunto de sentencias SQL (Lenguaje de consulta estructurado), el cual define los campos a mostrar, le damos un clic en el botón Aceptar.

16. Clic en el botón siguiente. 17. En esta pantalla nos muestra los resultados del asistente. El cual ha pasado toda la configuración correctamente. Página 1298

Ing. Alberto Moreno Cueva

18. Clic en botón Finalizar.

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.

Una vez terminado la configuración del OleDbDataAdapter.

21. Nos ubicamos en el formulario creado, y programamos lo siguiente. CODIGO FUENTE Public Class Form1

Página 1299

Ing. Alberto Moreno Cueva

Inherits System.Windows.Forms.Form Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim tbl As New DataTable OleDbDataAdapter1.Fill(tbl) DataGrid1.DataSource = tbl lblregistros.Text = tbl.Rows.Count End Sub Private Sub CmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdSalir.Click If MessageBox.Show("Desea Salir", "Listado de Registros", 4, 32) = 6 Then Application.Exit() End If End Sub End Class

Resultado del Formulario.

Página 1300

Ing. Alberto Moreno Cueva

Página 1301

Ing. Alberto Moreno Cueva

Semana 15 : (Trabajo de ambiente Conectado) La capa conectada de ADO.NET contiene objetos especializados en la conexión con los orígenes de datos. Así, la clase genérica Connection se utiliza para establecer conexiones a los orígenes de datos. La clase Command se encarga de enviar comandos de toda índole al origen de datos. Por fin la clase DataReader está especializada en leer los resultados de los comandos. 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. En resumen: con la capa conectada de ADO.NET realizamos la conexión y comunicación con los orígenes de datos. Cada proveedor de datos implementa su propia versión de las clases Connection, Command, DataReader y DataAdapter (entre otras). • 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. Aplicacion Empleando la Clase OledbDataReader

Página 1302

Ing. Alberto Moreno Cueva

Controles empleados Combobox1 Y Listbox con nombre Lstproducto 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. Para crear OleDbDataReader, se debe llamar al método ExecuteReader del objeto OleDbCommand, en lugar de utilizar directamente un constructor.

Codificación Imports System.Data.OleDb Public Class frmProveedor Inherits System.Windows.Forms.Form +Codigo Generado Dim cn As New OleDbConnection("provider=sqloledb;uid=sa;pwd=;database=northwind; server=.") Dim cmd As New OleDbCommand() Dim rdp As OleDbDataReader Dim rds As OleDbDataReader Dim prm As OleDbParameter

Private Sub frmProveedor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cn.Open() cmd.Connection = cn cmd.CommandType = CommandType.Text Página 1303

Ing. Alberto Moreno Cueva

cmd.CommandText = "select supplierId from suppliers" rdp = cmd.ExecuteReader While rdp.Read cboproveedor.Items.Add(rdp("supplierId")).ToString() End While cboproveedor.SelectedIndex = 0 rdp.Close() cmd.CommandText = "select * from products" listarproducto() End Sub Public Sub listarproducto() rds = cmd.ExecuteReader lstproducto.Items.Clear() While rds.Read lstproducto.Items.Add(rds("productName")).ToString() End While rds.Close() End Sub Private Sub btnok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnok.Click cmd.CommandType = CommandType.Text cmd.CommandText = "select * from products where supplierid=" + cboproveedor.Text listarproducto() End Sub End Class

Página 1304

Ing. Alberto Moreno Cueva

Aplicacion empleando Store Procedure (procedimientos almacenados)

Controles empleados: Controles de opciones: RbtOrden y rbtFecha Y cajas de textos: Txtfe1 y TxtFe2

Y un datagrid1

Procedimiento almacenados ejecutarlo en el Query Analizador: a)Pasando dos fechas que muestre las ordenes detalle con su total respectivo Create Procedure Sp_ConsultaFecha @FechaIni Varchar(20), @FechaFin Varchar(20) As Select Orders.OrderID,ProductName,[Order Details].UnitPrice as Precio,Quantity as Cantidad, [Order Details].UnitPrice * Quantity as Subtotal From [Order Details],Products,Orders where [Order Details].ProductID=Products.ProductID and Orders.OrderId=[Order Details].OrderID and

Página 1305

Ing. Alberto Moreno Cueva

OrderDate Between

@FechaIni and @FechaFin Return

b) Psando un orden de pedido que muestre su detalle Create Procedure Sp_ConsultaOrden @Orden Int As Select Orders.OrderID,ProductName,[Order Details].UnitPrice as Precio,Quantity as Cantidad, [Order Details].UnitPrice * Quantity as Subtotal From [Order Details],Products,Orders where [Order Details].ProductID=Products.ProductID and Orders.OrderId=[Order Details].OrderID and Orders.OrderID=@Orden Codificacion del Formulario Imports System.Data.SqlClient Public Class Ordenes Public Cn As New SqlConnection("Server=(Local);uid=sa;Database=Northwind") Public Ds, ds2 As New DataSet() Public Cmd As New SqlCommand() Public Da As New SqlDataAdapter() Dim prm As New SqlParameter() Private Sub Ok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ok.Click Dim cmd2 As New SqlCommand() Dim da2 As New SqlDataAdapter() Dim prm2 As New SqlParameter() If rbnOrden.Checked Then

Página 1306

Ing. Alberto Moreno Cueva

If Len(txtOrden.Text) = 5 Then prm.Value = Convert.ToInt32(txtOrden.Text()) Da.SelectCommand = Cmd Ds.Clear() Da.Fill(Ds, "Ordenes") DataGrid1.CaptionText = "Consulta por Ordenes" DataGrid1.DataSource = Ds.Tables("Ordenes").DefaultView Else Ds.Clear() End If ElseIf RbnFecha.Checked Then cmd2.Connection = Cn cmd2.CommandType = CommandType.StoredProcedure cmd2.CommandText = "Sp_ConsultaFecha" Adiciona los parametros que necesita el procedimiento prm2 = cmd2.Parameters.Add("@FechaIni", SqlDbType.DateTime) prm2.Direction = ParameterDirection.Input prm2.Value = Convert.ToDateTime(txtFe1.Text()) prm2 = cmd2.Parameters.Add("@FechaFin", SqlDbType.DateTime) prm2.Direction = ParameterDirection.Input prm2.Value = Convert.ToDateTime(txtfe2.Text()) da2.SelectCommand = cmd2 ds2.Clear() da2.Fill(ds2, "fechas") DataGrid1.CaptionText = "Consulta por Fechas"

Página 1307

Ing. Alberto Moreno Cueva

DataGrid1.Data

Source = ds2.Tables("fechas").DefaultView End If Cn.Close() End Sub Private Sub Ordenes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txtOrden.Clear() txtFe1.Clear() txtfe2.Clear() Cn.Open() Cmd.Connection = Cn Cmd.CommandType = CommandType.StoredProcedure Cmd.CommandText = "Sp_ConsultaOrden" prm = Cmd.Parameters.Add("@Orden", SqlDbType.Int) prm.Direction = ParameterDirection.Input End Sub Private Sub rbnOrden_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbnOrden.CheckedChanged txtOrden.Enabled = True txtFe1.Enabled = False txtfe2.Enabled = False End Sub Private Sub RbnFecha_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RbnFecha.CheckedChanged txtOrden.Enabled = False txtFe1.Enabled = True

Página 1308

Ing. Alberto Moreno Cueva

txtfe2.Enabled = True End Sub End Class

Página 1309

Ing. Alberto Moreno Cueva

Semana 16 : (Trabajo con Ambiewnte Desconectado) La capa desconectada 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. Unión entre capa conectada y desconectada La clase DataAdapter se ha incluido anteriormente en la capa conectada por que está implementada por cada proveedor de un modo diferente. En realidad es una clase que pone sus pies en ambos mundos (conectado y sin conexión) y sirve de nexo entre ellos. 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 haciendo uso de dichos objetos específicos del proveedor. 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. Otras clases dependientes de DataSet 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 Página 1310

Ing. Alberto Moreno Cueva

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. En el ejemplo también se muestra el enlace de un control DataGrid.Datasource con un DataTable Aplicación .- Lectura aplicando diferentes espacios de trabajo

Página 1311

Ing. Alberto Moreno Cueva

Datagrid con el nombre Dgdproducto

Imports System.Data.SqlClient Imports System.Data.OleDb Imports System.Data Public Class frmproducto Private Sub btnsql_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsql.Click ' es exclusivo para sqlserver Dim cn As New SqlConnection("uid=sa;pwd=;database=northwind;server=(local)") ' equivale tambien a ==>dim cn as sqlconnection=new sqlconnection("") Dim objda As New SqlDataAdapter("select * from products", cn) Dim objds As New DataSet() objda.Fill(objds, "producto") ' es un nombre que se le asigna en memoria 'dgdproducto.DataSource = objds.Tables("producto").DefaultView 'puede ser con el indice o nombre del dataset en memoria dgdproducto.DataSource = objds.Tables(0).DefaultView End Sub

Página 1312

Ing. Alberto Moreno Cueva

Private Sub btnole_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnole.Click ' se puede conectar para oracle, access,sysbase ,etc. Dim cn As New OleDbConnection("provider=sqloledb;uid=sa;pwd=;database=northwind; server=.") Dim objda As New OleDbDataAdapter("select * from categories", cn) Dim objds As New DataSet() objda.Fill(objds, "categories") dgdproducto.DataSource = objds.Tables(0).DefaultView End Sub End Class ADO.NET - ACCESS MANTENIMIENTO DE UNA TABLA DE DATOS

Página 1313

Ing. Alberto Moreno Cueva

Mantenimiento a una Tabla de Base de Datos, utilizando el método de acceso ADO.NET

Procesos de -ADICION -CONSULTA -ACTUALIZACION

Imports System.Data Imports System.Data.OleDb Public Class Form1 Const CadSQL As String = "SELECT * FROM PRODUCTOS" Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=C:\VENTAS.MDB") Dim OBJDA As OleDbDataAdapter Dim OBJDS As New DataSet Public Sub LISTAR() 'Listar todos los registros de la tabla productos Dim OBJDS As New DataSet OBJDA.Fill(OBJDS, "PRODUCTOS") DataGridView1.DataSource = OBJDS.Tables("PRODUCTOS").DefaultView End Sub Public Sub Limpiar()

Página 1314

Ing. Alberto Moreno Cueva

'LIMPIAR CONTROLES TXTCODIGO.Clear() TXTDES.Clear() TXTPRE.Clear() TXTSTK.Clear() MskFecha.Text = "" MskFecha.Mask = "99/99/9999" RBTNACIONAL.Checked = False RBTIMPORTADO.Checked = False End Sub Public Sub Deshabilitar() 'deshabilitar todos los controles TXTCODIGO.Enabled = False TXTDES.Enabled = False TXTSTK.Enabled = False TXTPRE.Enabled = False MskFecha.Enabled = False btnGUARDAR.Enabled = False GroupBox1.Enabled = False End Sub Public Sub Habilitar()

'habilitar todos los controles

TXTDES.Enabled = True TXTSTK.Enabled = True TXTPRE.Enabled = True MskFecha.Enabled = True btnGUARDAR.Enabled = True

Página 1315

Ing. Alberto Moreno Cueva

GroupBox1.Enabled = True End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try OBJDA = New OleDbDataAdapter(CadSQL, Cn) MessageBox.Show("OK!!!CONEXION CORRECTA", "CONEXION") Call LISTAR() Call Limpiar() Call Deshabilitar() Catch ex As Exception MessageBox.Show("ERROR!!! CONEXION INCORRECTA" & ex.Message) End Try End Sub Private Sub btnNUEVO_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNUEVO.Click Dim Nr As Integer

'Número de Registros

Dim XCOD As String Call Limpiar() Call Habilitar() OBJDA.Fill(OBJDS, "PRODUCTOS") Nr = OBJDS.Tables(0).DefaultView.Count ‘Cantidad de Registros If Nr > 0 Then 'SI HAY REGISTROS XCOD = OBJDS.Tables(0).Rows(Nr - 1).Item(0) TXTCODIGO.Text = "P" & Format(Val(Mid(XCOD, 2, 3)) + 1, "000") Else

Página 1316

Ing. Alberto Moreno Cueva

TXTCODIGO.Text = "P001" End If btnNUEVO.Enabled = False btnGUARDAR.Enabled = True TXTDES.Focus() End Sub Private Sub btnGUARDAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGUARDAR.Click Dim Rpta As Byte Rpta = MessageBox.Show("Seguro de Guardar", "Grabar", _ MessageBoxButtons.YesNo, MessageBoxIcon.Information) If Rpta = 6 Then 'Grabar el Registro Dim Cad1 As String Cad1 = "INSERT INTO PRODUCTOS(Codpro,DesPro,Fecha,PrePro,StkPro,Procede) VALUES(@Cod,@Des,@Fe,@Pre,@Stk,@Pro)" Dim Cmd As New OleDbCommand(Cad1) Cmd.Connection = Cn Cmd.Parameters.Add("@Cod", OleDbType.Char).Value = TXTCODIGO.Text Cmd.Parameters.Add("@Des", OleDbType.VarChar).Value = Trim(TXTDES.Text) Cmd.Parameters.Add("@Fe", OleDbType.Date).Value = CDate(MskFecha.Text) Cmd.Parameters.Add("@Pre", OleDbType.Double).Value = Val(TXTPRE.Text) Cmd.Parameters.Add("@Stk", OleDbType.Integer).Value = Val(TXTSTK.Text) If RBTNACIONAL.Checked = True Then Cmd.Parameters.Add("@Pro", OleDbType.Char).Value = "N" Else

Página 1317

Ing. Alberto Moreno Cueva

Cmd.Parameter

s.Add("@Pro", OleDbType.Char).Value = "I" End If Cn.Open() Cmd.ExecuteNonQuery() MessageBox.Show("Registro Ha Sido Grabado", "GRABACION OK") Call LISTAR() Cn.Close() btnGUARDAR.Enabled = False btnNUEVO.Enabled = True btnNUEVO.Focus() End If End Sub Private Sub BTNBUSCAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNBUSCAR.Click Dim CadBuscar, CODIGO As String Dim Dt1 As New DataTable CODIGO = InputBox("INGRESE CODIGO A BUSCAR", "BUSQUEDA") CadBuscar = "Select * From Productos where CodPro='" & Trim(CODIGO) & "'" Dim objda As New OleDbDataAdapter(CadBuscar, Cn) objda.Fill(Dt1) If Dt1.Rows.Count > 0 Then 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 Página 1318

Ing. Alberto Moreno Cueva

TXTR.Text = Dt1.Rows(0)(5).ToString Else MessageBox.Show("Error!!!Producto no existe", "Error Búsqueda", _ MessageBoxButtons.OK, MessageBoxIcon.Error) TXTD.Clear() : TXTP.Clear() TXTC.Clear() : TXTS.Clear() TXTR.Clear() : TXTF.Clear() End If End Sub Private Sub btnACTUALIZAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnACTUALIZAR.Click Dim Rpta As Integer Rpta = MessageBox.Show("Seguro de Modificar", "MODIFICAR", _ MessageBoxButtons.YesNo, MessageBoxIcon.Information) If Rpta = 6 Then Dim SQL, SQLCAMBIA As String SQL = "UPDATE PRODUCTOS SET DesPro='" & TXTD.Text & "',Fecha='" & CDate(TXTF.Text) & "',PrePro='" & Val(TXTP.Text) & "',StkPro='" & Val(TXTS.Text) & "',Procede='" & TXTR.Text & "'" SQLCAMBIA = SQL & "WHERE CodPro='" & (TXTC.Text) & "'" Dim Cmd As New OleDbCommand Cn.Open() Cmd.Connection = Cn Cmd.CommandType = CommandType.Text Cmd.CommandText = SQLCAMBIA Cmd.ExecuteNonQuery()

Página 1319

Ing. Alberto Moreno Cueva

Cmd.Dispose()

Cn.Close() MessageBox.Show("Datos Actualizados Correctamente") Call LISTAR() End If End Sub Private Sub BTNELIMINAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNELIMINAR.Click Dim Rpta As Integer Rpta = MessageBox.Show("Seguro de Eliminar", "MODIFICAR", _ MessageBoxButtons.YesNo, MessageBoxIcon.Error) If Rpta = 6 Then Dim SQL As String SQL = "DELETE FROM PRODUCTOS WHERE CodPro='" & (TXTC.Text) & "'" Dim Cmd As New OleDbCommand If Cn.State = ConnectionState.Open Then Cn.Close() Cn.Open() Cmd.Connection = Cn Cmd.CommandType = CommandType.Text Cmd.CommandText = SQL Cmd.ExecuteNonQuery() Cmd.Dispose() Cn.Close() MessageBox.Show("Registro Eliminado Correctamente") Call LISTAR() TXTD.Clear() : TXTC.Clear() TXTR.Clear() : TXTS.Clear() Página 1320

Ing. Alberto Moreno Cueva

TXTP.Clear() : TXTF.Clear() End If End Sub Private Sub btnSALIR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSALIR.Click Me.Close() Cn.Close() End Sub End Class

Página 1321

Ing. Alberto Moreno Cueva

Semana 17 : (Uso de DataTable y DataView) Aplicación de un sistema de notas.La base de Dato a emplear UNIVERSIDAD:

A nivel modulo: VariablesGlobales Imports System.Data.SqlClient Module VariablesGlobales Public Cn As SqlConnection Public MiFila As DataRow Dim objDSAlumnos As DataSet End Module

Página 1322

Ing. Alberto Moreno Cueva

FrmLogin Los objetos de tipo texto

TxtUsrname

Imports System.Data.SqlClient Public Class frmLogin Const strCn As String = "Data Source=(local);Initial Catalog=bdMatricula" Private Sub btnAceptar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAceptar.Click Try Dim MiCn As String = strCn & ";User Id=" & txtUserName.Text & _ ";Password=" & txtPassword.Text Cn = New SqlConnection(MiCn) Cn.Open() Me.Hide() Dim MiForm As New frmPrincipal() MiForm.Show() Catch ex1 As SqlException Select Case ex1.Number Case 17 MsgBox("Servidor no reconocido") Case 156, 170

Página 1323

Ing. Alberto Moreno Cueva

MsgBox("Sente

ncia Incorrecta") Case 4060 MsgBox("Base de Datos incorrecta") Case 18456 MsgBox("Usuario o Password incorrecto") Case Else MsgBox(ex1.Message) End Select txtUserName.Text = "" : txtPassword.Text = "" : txtUserName.Focus() End Try End Sub Private Sub btnCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancelar.Click Cn.Close() Cn = Nothing End End Sub Private Sub frmLogin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub End Class

El Formulario Menu FrmPrincipal Insertar el control menu Menu1

Página 1324

Ing. Alberto Moreno Cueva

Public Class frmPrincipal Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click Para mantenieminto de la Dim ManteAlumnos As New frmManteAlumnos() tabla alumnos ManteAlumnos.MdiParent = Me ManteAlumnos.Show() End Sub Private Sub MenuItem8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem8.Click Cn.Close()

Para salir

Cn = Nothing End End Sub Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click End Sub Private Sub MenuItem12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem12.Click Dim Mantetrans As New frmTRanscript() Mantetrans.MdiParent = Me

Página 1325

Ing. Alberto Moreno Cueva

Mantetrans.Show() End Sub Private Sub MenuItem10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem10.Click Dim frmNota As New frmconsultaNotas() Para consultas de Notas frmNota.MdiParent = Me frmNota.Show() End Sub Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click Dim frmcur As New FRMCURSO() Mantenimiento de la tabla Curso frmcur.MdiParent = Me frmcur.Show() End Sub End Class

FrmCurso

Página 1326

Ing. Alberto Moreno Cueva

Imports System.Data.SqlClient Public Class FRMcURSO Const strSQL As String = "Select * From curso" Dim objDA As SqlDataAdapter Dim objDS As New DataSet() Dim objDV As New DataView() Dim objCM As SqlCommandBuilder Dim fila As DataRow Dim nr, indice As Integer Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click Dim x As Control Dim codc As String Dim canreg As Integer For Each x In Me.Controls If TypeOf x Is TextBox Then x.Text = "" Página 1327

Ing. Alberto Moreno Cueva

Next canreg = objDS.Tables(0).DefaultView.Count If canreg > 0 Then codc = objDS.Tables(0).Rows(nr - 1).Item(0) codc = "C" + Format(Val(codc.Substring(1, 3)) + 1, "000") Else codc = "C001" End If txtcod.Text = codc txtnom.Focus() End Sub Sub muestra(ByVal nro As Integer) 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 Private Sub FRMcURSO_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try objDA = New SqlDataAdapter(strSQL, Cn) Página 1328

Ing. Alberto Moreno Cueva

objCM = New SqlCommandBuilder(objDA) 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 Catch ex1 As SqlException MsgBox(ex1.Message) End Try End Sub Private Sub BtnAnula_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnula.Click If indice >= 0 Then objDV.Delete(indice) objDA.Update(objDS.Tables("curso")) nr = objDS.Tables(0).DefaultView.Count selecciona(btnPri) End If End Sub Sub selecciona(ByVal btn As Button) Página 1329

Ing. Alberto Moreno Cueva

Dim totr As Integer = nr - 1 If btn Is btnPri Then indice = 0 ElseIf btn Is btnSig Then indice += 1 If indice > totr Then indice = totr ElseIf btn Is BtnAnt Then indice -= 1 If indice < 0 Then indice = 0 Else indice = totr End If muestra(indice) txtreg.Text = (indice + 1).ToString & "/" & nr

End Sub Private Sub handleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPri.Click, btnSig.Click, BtnAnt.Click, BtnUlt.Click selecciona(CType(sender, Button)) End Sub Private Sub BtnGraba_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGraba.Click Dim sql As String Dim codc As String fila = objDS.Tables(0).NewRow asigna()

Página 1330

Ing. Alberto Moreno Cueva

objDS.Tables(0).Rows.Add(fila) objDA.Update(objDS.Tables("curso")) nr = objDS.Tables(0).DefaultView.Count selecciona(BtnUlt) End Sub End Class Para el formulario de Consulta de Notas Empleando filtros , ingresando los primeros carecteres del apellido que muestre todos los alumnos que tengan esa coincidencia , y al hacer un clic en un alumno mostrar todos los cursos que ha llevado el alumno con su promedio respectivo. FrmConsultaNotas

Página 1331

Ing. Alberto Moreno Cueva

Imports System.Data.SqlClient Public Class frmconsultaNotas Const strSQL As String = "Select * From Alumno" Dim objDA, da As SqlDataAdapter Dim objDS, ds As New DataSet() Dim objDV, objdv2 As New DataView() 'Dim objCM As SqlCommandBuilder Dim xfila As DataRow Private Sub frmconsultaNotas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try objDA = New SqlDataAdapter(strSQL, Cn) objDA.Fill(objDS, "Alumno") objDV = objDS.Tables("Alumno").DefaultView objDV.AllowNew = False objDV.AllowEdit = False objDV.AllowDelete = False DGAlumno.DataSource = objDS.Tables(0).DefaultView Catch ex1 As SqlException MsgBox(ex1.Message) End Try End Sub Private Sub DGAlumno_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGAlumno.Click Dim NroFila As Integer Dim sql As String

Página 1332

Ing. Alberto Moreno Cueva

Dim nf, nfila As Integer Dim sm, promedio, pro As Single NroFila = DGAlumno.CurrentRowIndex xfila = objDS.Tables("Alumno").Rows(NroFila) sql = "select C.codcur,asignatura=nomcur,ep,ef,promedio=(ep+2*ef)/3 " sql += "from notas n inner join curso c on c.codcur=n.codcur " sql += "where codalu='" & xfila.Item(0) & "'" da = New SqlDataAdapter(sql, Cn) 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 promedio = Math.Round(sm / nf, 0) Else promedio = 0 End If LBLProm.Text = Format(promedio, "00") End Sub Private Sub DGAlumno_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DGAlumno.KeyUp If e.KeyCode = Keys.Down Or e.KeyCode = Keys.Up Then Página 1333

Ing. Alberto Moreno Cueva

DGAlumno_Click(sender, e) End If End Sub

Private Sub txtnom_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtnom.TextChanged Dim sql As String 'primera forma 'sql = "select * from alumno where apenom like '" + Trim(txtnom.Text) + "%'" 'objDA = New SqlDataAdapter(sql, Cn) 'objDS.Clear() 'objDA.Fill(objDS, "Alumno") 'objDV = objDS.Tables("Alumno").DefaultView 'DGAlumno.DataSource = objDS.Tables(0).DefaultView 'Segunda Forma utilizando filtros If Len(txtnom.Text) > 0 Then objDV.RowFilter = "apenom like '" & Trim(txtnom.Text) & "%'" objDV.RowStateFilter = DataViewRowState.CurrentRows Else objDV.RowFilter = Nothing objDV.RowStateFilter = DataViewRowState.OriginalRows End If

End Sub End Class OTRAS APLICACIONES Página 1334

Ing. Alberto Moreno Cueva

APLICACIÓN 3: 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 Public Class Form3 Página 1335

Ing. Alberto Moreno Cueva

Dim OleDbCn As New OleDbConnection("Provider=Microsoft.jet.OleDb.4.0;Data Source=i:\ventas.mdb") Dim ds As New DataSet Dim dv As DataView Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim da As New OleDbDataAdapter("Select Num_Fact,Sub_Total,Igv,Total,Fecha From Facturas", OleDbCn) da.Fill(ds, "Facturas") DataGrid1.DataSource = ds.Tables("Facturas") lblTotal.Text = ds.Tables("Facturas").Rows.Count txtfecinicial.Text = "" txtfecFinal.Text = "" End Sub Private Sub Form3_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated txtfecinicial.Focus() End Sub Private Sub CmdConsultar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdConsultar.Click 'Validando el ingreso de fechas IsDate(Expresión) If txtfecinicial.Text = "" Or Not IsDate(txtfecinicial.Text) Then MessageBox.Show("Validando el Ingreso de Fecha Inicial", "Validacion Fechas") Exit Sub End If If txtfecFinal.Text = "" Or Not IsDate(txtfecFinal.Text) Then MessageBox.Show("Validando el Ingreso de la Fecha Final", "Validacion de Fechas") Exit Sub Página 1336

Ing. Alberto Moreno Cueva

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 Private Sub Cmdnuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdMostrar.Click txtfecinicial.Text = "" : txtfecFinal.Clear() dv.RowFilter = Nothing DataGrid1.DataSource = dv End Sub Private Sub CmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdSalir.Click If MessageBox.Show("Desea Salir", "Consultas entre Fechas", 4, 32) = 6 Then Application.Exit() End If End Sub End Class

Resultado:

Página 1337

Ing. Alberto Moreno Cueva

APLICACION 4: Mantenimiento de Registros de Alumnos. Creara una Tabla llamada alumnos en una base de datos en Access llamada ventas.mdb. Tendrá la siguiente estructura.

Registros:

Diseño del Formulario:

Página 1338

Ing. Alberto Moreno Cueva

CODIGO FUENTE: Imports System.Data.OleDb Imports vb = Microsoft.VisualBasic Public Class Form4 Inherits System.Windows.Forms.Form Dim OleDb As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=i:\ventas.mdb") Dim da As OleDbDataAdapter Dim ds As New DataSet Dim Iposicion As Integer Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim cmd As New OleDbCommand cmd.Connection = OleDb cmd.CommandType = CommandType.TableDirect

Página 1339

Ing. Alberto Moreno Cueva

cmd.CommandText = "Alumnos" da = New OleDbDataAdapter(cmd) Dim CmdBuilder As New OleDbCommandBuilder(da) da.Fill(ds, "Alumnos") Iposicion = 0 Call limpiar() txtcodigo.Enabled = False End Sub Sub limpiar() Dim obj As Object For Each obj In Me.Controls If TypeOf obj Is TextBox Then obj.text = "" 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") If dr("Alu_sexo") = True Then OptM.Checked = True OptF.Checked = False Else

Página 1340

Ing. Alberto Moreno Cueva

OptM.Checked = False OptF.Checked = True End If End Sub Private Sub CmdNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdNuevo.Click Call limpiar() Iposicion = ds.Tables("Alumnos").Rows.Count - 1 Dim dr As DataRow = ds.Tables("Alumnos").Rows(Iposicion) Dim maxcodigo As String = dr("Alu_cod") Generando el Codigo apartir del ultmo codigo del Cliente. Dim CodigoAlumno As String = IIf(IsDBNull(maxcodigo), "A0000", maxcodigo) txtcodigo.Text = "A" + vb.Right("0000" + LTrim(vb.Right(CodigoAlumno, 4) + 1), 4) txtnombre.Focus() End Sub Private Sub CmdPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdPrimero.Click Iposicion = 0 Me.cargardatos() End Sub Private Sub CmdAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAnterior.Click If Iposicion = 0 Then MessageBox.Show("Primer registro", "Navegador de Registros") Else Iposicion -= 1 Me.cargardatos()

Página 1341

Ing. Alberto Moreno Cueva

End If

End Sub Private Sub CmdUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdUltimo.Click Iposicion = ds.Tables("Alumnos").Rows.Count - 1 Me.cargardatos() End Sub Private Sub CmdSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdSiguiente.Click If Iposicion = ds.Tables("Alumnos").Rows.Count - 1 Then MessageBox.Show("Ultimo registro", "Navegador de Registros") Else Iposicion += 1 Me.cargardatos() End If End Sub Private Sub CmdAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAgregar.Click 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

Página 1342

Ing. Alberto Moreno Cueva

dr("Alu_sexo") = False End If ds.Tables("Alumnos").Rows.Add(dr) da.Update(ds, "Alumnos") End Sub Private Sub CmdActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdActualizar.Click 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 Private Sub CmdEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdEliminar.Click Dim dr As DataRow dr = ds.Tables("Alumnos").Rows(Iposicion) dr.Delete() Dim TblDelete As DataTable TblDelete = ds.Tables("Alumnos").GetChanges(DataRowState.Deleted)

Página 1343

Ing. Alberto Moreno Cueva

da.Update(TblDelete) ds.Tables("Alumnos").AcceptChanges() CmdPrimero.PerformClick() End Sub Private Sub CmdBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdBuscar.Click Dim cadena As String cadena = InputBox("Ingrese el Codigo del alumno a buscar", "Busqueda de Alumnos", "") If cadena = "" Then MessageBox.Show("No ingreso el Codigo del Alumno", "Busqueda de Alumnos") Exit Sub End If Dim dv As New DataView(ds.Tables("Alumnos")) dv.RowFilter = "Alu_cod='" & cadena & "'" txtcodigo.Text = dv(0)("Alu_cod") txtnombre.Text = dv(0)("Alu_nom") txtdireccion.Text = dv(0)("Alu_direccion") txtfecha.Text = dv(0)("Alu_fecha") If dv(0)("Alu_sexo") = True Then OptM.Checked = True OptF.Checked = False Else OptM.Checked = False OptF.Checked = True End If End Sub Página 1344

Ing. Alberto Moreno Cueva

Private Sub CmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdSalir.Click If MessageBox.Show("Desea Salir", "Mantenimiento de Alumnos", 4, 32) = 6 Then Application.Exit() End If End Sub End Class Resultado:

APLICACIONES CON LISTBOX Y COMBOBOX 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 datos cuyo Ing. Alberto Moreno Cueva 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. SelectedValue => Obtiene o establece el valor de la propiedad miembro especificado por la propiedad ValueMember. FACTURAS:

DETALLE

PRODUCTO

Página 1346

Ing. Alberto Moreno Cueva

Form4.vb [Diseño del Formulario]

Button1

Propiedades de los controles del Formulario:

Name = CmdFinalizar Text = &Finalizar

DataGrid1

Label1

Name = DataGrid1 CaptionText = DETALLE DE FACTURAS

Name= lblTotal Text = lblTotal Label2

Combobox1

Name = lblTotalDetalle

Name = ComboBox1 Text = ComboBox1

ListBox1 Página 1347

Ing. Alberto Moreno Cueva

Name = ListBox1

CODIGO FUENTE: Imports System.Data.OleDb Public Class Form6 Dim OleDbCn As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=i:\ventas.mdb") Private Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim da As New OleDbDataAdapter("Select Cod_Cli,Nom_Cli From Clientes", OleDbCn) Dim ds As New DataSet da.Fill(ds, "Clientes") Almacenamos la tabla Clientes al DataSet. ComboBox1.DataSource = ds.Tables("Clientes") ComboBox1.DisplayMember = "Nom_Cli" ComboBox1.ValueMember = "Cod_Cli" End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try Dim CodCliente As String = ComboBox1.SelectedValue Dim strSQL As String strSQl = "Select Num_Fact From Facturas Where Cod_Cli='" & CodCliente & "'" Dim da As New OleDbDataAdapter(strSQl, OleDbCn) Dim ds As New DataSet da.Fill(ds, "Facturas") ListBox1.DataSource = ds.Tables("Facturas")

Página 1348

Ing. Alberto Moreno Cueva

ListBox1.Displa

yMember = "Num_Fact" ListBox1.ValueMember = "Num_Fact" lbltotal.Text = ListBox1.Items.Count Cuenta el total de elementos Catch ex As Exception End Try End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Try Dim CodFacturas As String = ListBox1.SelectedValue Obtiene el dato del campo enlazado. Dim strSQL As String Realizando una consulta de 2 tablas. strSQL = "Select Descrip,Producto.Precio,Cant,(Producto.Precio * Cant) as Total From Producto,Detalle " & _ " Where Producto.Cod_Prod=Detalle.Cod_Prod and Num_Fact='" & CodFacturas & "'" Dim da As New OleDbDataAdapter(strSQL, OleDbCn) Dim ds As New DataSet 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. lblTotalDetalle.Text = ds.Tables("Detalle").Compute("Sum(Total)", "") FormatoGrid() Catch ex As Exception End Try End Sub Página 1349

Ing. Alberto Moreno Cueva

Sub FormatoGrid() DataGrid1.TableStyles.Clear() Dim dts As New DataGridTableStyle dts.MappingName = "Detalle" dts.ReadOnly = True dts.BackColor = Color.Yellow dts.ForeColor = Color.Blue dts.AllowSorting = True Dim c1 As New DataGridTextBoxColumn c1.MappingName = "Descrip" c1.HeaderText = "Producto" c1.Width = 120 dts.GridColumnStyles.Add(c1) Dim c2 As New DataGridTextBoxColumn c2.MappingName = "Precio" c2.HeaderText = "Precio" c2.Format = "c" c2.Width = 50 dts.GridColumnStyles.Add(c2) Dim c3 As New DataGridTextBoxColumn c3.MappingName = "Cant" c3.HeaderText = "Cantidad" c3.Width = 50 dts.GridColumnStyles.Add(c3) Dim c4 As New DataGridTextBoxColumn

Página 1350

Ing. Alberto Moreno Cueva

c4.MappingName = "Total" c4.HeaderText = "Total" c4.Format = "c" c4.Width = 70 dts.GridColumnStyles.Add(c4) DataGrid1.TableStyles.Add(dts) End Sub Private Sub CmdFinalizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdFinalizar.Click If MessageBox.Show("Desea Salir", "Consultas Datos", 4, 32) = 6 Then Application.Exit() End If End Sub End Class

Resultado:

Página 1351

Ing. Alberto Moreno Cueva

Ejercicios con BDD Desarrollar los siguientes formularios: 1.- Consulta de Notas

Página 1352

Ing. Alberto Moreno Cueva

2.- Consulta de alumnos por curso

3.- Consulta En Cascada Alumnos con sus cursos llevados

Página 1353

Ing. Alberto Moreno Cueva

5.- Consulta en Cascada

a) Al seleccionar el nombre del curso , no necesita escribir todo el nombre completo , mostrara en el grid el codigo , nombre del alumo y su promedio respectivo que llevaron dicho curso b) Muestra a todos los alumnos que comienzan con dicho caracteres c) Al seleccionar la especialidad Se activara el combo para elegir una especialidad y mostrara en el grid todos los alumnos que estan en dicha especialidad. Página 1354

Ing. Alberto Moreno Cueva

La Base de datos se Llama BD Matricula

Propuesto nro 2.BDBANCO

Tabla: CLIENTES

Tabla: CUENTAS

Página 1355

Tabla: MOVIMIENTOS

Ing. Alberto Moreno Cueva

I.- FORMULARIO Nº 1: ESPECIFICACIONES • • • •

En el ListBox1 Clientes se mostrarán todos clientes de la tabla CLIENTES. Al elegir un Cliente del ListBox1 se deberá mostrar en el listbox2 de cuentas, sólo las cuentas asignadas al cliente, seleccionado de la tabla CUENTAS. Seleccionando el número de cuenta del ListBox2 Cuentas listará en el DataGridView el movimiento de saldos de esa cuenta de la tabla MOVIMIENTOS ; a la vez Seleccionando el número de cuenta del Listbox2 Cuentas, mostrará en la etiqueta lbltipo el tipo de cuenta, en el label saldo anterior nos mostrará el último saldo de la tabla CUENTAS, debemos ingresar el número de movimiento, seleccionar un tipo de movimiento (Depósito o Retiro) e ingresar un valor numérico que representa el importe de la operación, el cual calculará el nuevo saldo automáticamente. Nota: Si es Depósito aumenta el saldo, si es Retiro disminuye el Saldo.



El botón Grabar registra los datos en la tabla MOVIMIENTOS Nota: El número de Cuenta a Grabar obtenerlo del Listbox2 de la propiedad SelectedValue.



El botón Reporte muestra en el formulario frmReporte un informe en Crystal Reports de todos los registros de la tabla MOVIMIENTOS. El botón Salir finaliza el proyecto.



Página 1356

Ing. Alberto Moreno Cueva

Semana 18 : (Creacion de Reportes) Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se escribe para controlar un tipo de base de datos específico o la tecnología de acceso a bases de datos. Modelos de extracción e inserción 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

En un modelo de extracción, el controlador se conectará a la base de datos y extraerá datos cuando se necesiten. Con este modelo, Crystal Reports controla tanto la conexión a la base de datos como el comando SQL que se ejecuta para obtener los datos y no necesita ninguna codificación del programador. Si no se escribe ningún código especial en tiempo de ejecución, se utiliza el modelo de extracción. Modelo de inserción

En comparación, el modelo de inserción necesita que el programador escriba código para conectarse a la base de datos, ejecutando un comando SQL para crear un conjunto de registros o de datos que se ajusten a los campos del informe y enviando ese objeto al informe. Este método le permite crear recursos compartidos de conexión en la aplicación y filtrar los datos antes de que Crystal Reports los reciba.

Los controladores de bases de datos se utilizan durante el tiempo de creación y de procesamiento. Durante el tiempo de creación, el controlador de la base de datos se utiliza para identificar el esquema de los datos. Con los controladores OLEDB, ODBC y Access/Excel, este proceso implica la conexión a una base de datos y la selección de las tablas, vistas o procedimientos almacenados para especificar el esquema. Con los controladores ADO.NET y de definición de campos, este proceso implica la selección de un esquema con la forma de un archivo XML (*.xml) o de un Página 1357

Ing. Alberto Moreno Cueva

archivo de definición de datos (*.ttx). Durante el tiempo de procesamiento, el informe utilizará el mismo controlador de base de datos utilizado para crear el informe. No obstante, si los datos se insertan en el informe, el informe seleccionará el controlador adecuado para controlar el conjunto de registros o el conjunto de datos. Controladores de bases de datos con Crystal Reports para Visual Studio .NET Controlador de base Base de datos a las que se tiene de datos acceso

Método de acceso a datos

OLEDB

Cualquier base de datos que tenga un proveedor OLEDB.

Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros ADO.

ODBC

Cualquier base de datos que tenga un proveedor ODBC.

Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros RDO.

Access/Excel

Bases de datos de Microsoft Access y libros de Microsoft Excel.

Admite tanto la extracción de datos de la base de datos como la inserción de datos en el informe de un conjunto de registros DAO.

ADO.NET

Cualquier base de datos con un proveedor gestionado.

Admite la inserción de datos en el informe desde un conjunto de datos ADO.NET.

Definición de campo Ninguna. Este controlador especial se utiliza para crear informes basados únicamente en un esquema sin datos reales.

Este controlador no extraerá datos por sí mismo. El controlador se incluye principalmente para la compatibilidad con versiones anteriores y sólo se utiliza durante el proceso de creación de informes. En tiempo de ejecución, debe enviarse un conjunto de registros o un conjunto de datos a un informe creado con el controlador.

Página 1358

Ing. Alberto Moreno Cueva

Objeto de datos Crystal (CDO)

Ninguna.

Este controlador se incluye principalmente para la Este controlador especial obtiene compatibilidad con versiones acceso a datos que no residen en anteriores. una base de datos tradicional. Este controlador sólo admite la inserción de datos en un informe desde un conjunto de registros CDO; no extraerá datos por sí mismo. Utilice la biblioteca de objetos de datos Crystal para llenar un conjunto de registros CDO. Nota Este controlador no está disponible durante el período de creación del informe. Seleccione uno de los controladores disponibles para crearlo. REPORTES EN .NET CON CRYSTAL REPORTS

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 Independientemente de cómo se hará la presentación, el reporte se define en un archivo ".RPT", que forma parte de su proyecto. Ese archivo especifica el modo en que se hará la presentación del reporte, pero no incluye los datos propiamente dichos. Los datos se definirán en el tiempo de ejecución. 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:

Página 1359

Ing. Alberto Moreno Cueva



Encabez ado del

• • • •

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: • •

Encabezado de grupo, aparece antes de un grupo. Pie de grupo, aparece al final del grupo.

Se podrá omitir una o más secciones, en caso de que no sean necesarias. Acceder a la base de datos 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 Veamos cómo crear un reporte en un programa WinForms. Inicialmente, genere un proyecto en VB de tipo "Windows Application". 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: • • • •

Agregue un componente de tipo SqlDataAdapter. Seleccione la conexión con la base Northwind. Introduzca el comando SQL "select * from Products order by CategoryID, ProductName" Haga clic con el botón alterno del mouse sobre el componente DataAdapter, seleccione "Create DataSet" y acepte el nombre sugerido ("DataSet1").

Ahora, agregaremos un reporte al proyecto. Haga clic en "Proyecto | Agregar elemento nuevo" y seleccione "Crystal Report":

Página 1360

Ing. Alberto Moreno Cueva

Acepte el nombre "CrystalReport1.rtp", al presionar Intro. Crystal Reports mostrará un asistente. Marque "Usar el Experto en reportes" y "Estándar":

En este momento, cabe hacer algunos comentarios:

Página 1361

Ing. Alberto Moreno Cueva





El asistente puede ayudarle a crear diversos tipos de reportes, pero vamos a explorar solamente algunas posibilidades más sencillas. Puede probar después con otros tipos de reportes; Crystal Reports pedirá que realice el registro de su copia; mostramos el uso con una copia ya registrada.

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":

Haga clic en "Siguiente" y seleccione las columnas que aparecerán en el reporte:

Página 1362

Ing. Alberto Moreno Cueva

Haga clic en "Siguiente" y defina un grupo haciendo clic en la columna "CategoryID" al lado izquierdo, y después en "Agregar":

Las demás opciones no nos interesan en este reporte sencillo. Haga clic en "Finalizar", para crear el reporte:

Página 1363

Ing. Alberto Moreno Cueva

Observe lo siguiente: • • •

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.

Las secciones contienen componentes que se pueden obtener en dos lugares: • •

Página "Crystal Reports" de la Caja de herramientas, si se trata de textos fijos, líneas y cajas. "Explorador de campos", en el caso de campos de la base de datos, fórmulas, totales, grupos y otros datos específicos del reporte, como fecha, hora y numeración de páginas.

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: private sub menuItem2_Click(byval sender as Object, byval e as System.EventArgs) Ejecuta la consulta a la base dados sqlDataAdapter1.Fill(dataSet11) Crea el reporte Dim Rel as new CrystalReport1() Asocia el conjunto de datos con el reporte Rel.SetDataSource(dataSet11) Asocia el reporte con el Visualizador 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 izquierdo para Ing. Alberto Moreno Cueva 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.

Página 1365

Ing. Alberto Moreno Cueva

I.

PREGUNTA BDBIBLIOTECA

I.- FORMULARIO Nº 1:

ESPECIFICACIONES LstAutor

• • • • •



LstLibro

Desarrolle la aplicación con programación en n-capas.(capa de datos,negocios,..) con aplicación de mínimo tres procedimientos almacenados. En el ListBox (lstAutor) se mostrarán todos los nombres de autores de la tabla AUTOR.(3 pts) Al elegir un Autor se deberá mostrar en el listbox de libros, sólo los libros asignados al autor seleccionado de la tabla LIBROS. (3 ptos.) Seleccionando el nombre del libro en el lstLibros listará en el DataGridView el movimiento de préstamos de ese libro de la tabla PRESTAMO (3 Ptos) Sólo si ha elegido un Autor y un libro, se podrá agregar operaciones a la tabla PRESTAMO, para lo cual se ingresará el número de préstamo, se debe elegir el nombre del alumno (mostrará su código), deberá ingresar o seleccionar la fecha de préstamo y la fecha de devolución, el campo estado de préstamo tendrá un valor igual a 1 que significa libro en estado pendiente. ( 2 ptos ) El botón Grabar registra los datos en la tabla PRESTAMO ( 4 ptos) Página 1366

Ing. Alberto Moreno Cueva

• •

El botón Reporte muestra en el formulario frmReporte un informe en Crystal Reports de todos los registros de la tabla PRESTAMO. El botón Salir finaliza el proyecto.

Semana 19 : (Examen Final) Semana 20 : (Examen de Recuperacion) Direcciones de Internet

http://vagos.wamba.com/ https://www.microsoft.com/downloads/details.aspx?FamilyID=518d870c-fa3e-4f6a-97f5acaf31de6dce&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: Ing: Alberto Moreno Cueva

Página 1367

Ing. Alberto Moreno Cueva

Related Documents

Visual Basic .net
November 2019 10
Visual Basic Net
May 2020 10
Visual Basic
June 2020 18

More Documents from ""