Programación Orientada A Objetos I
Programación Orientada A Objetos I
Programación Orientada A Objetos I
CARRERAS PROFESIONALES
CIBERTEC
NDICE
Presentacin Red de contenidos UNIDAD 1 SEMANA 1 SEMANA 2 UNIDAD 2 SEMANA 3 SEMANA 4 UNIDAD 3 SEMANA 5 SEMANA 6 SEMANA 7 SEMANA 8 SEMANA 9 UNIDAD 4 SEMANA 10 SEMANA 11 UNIDAD 5 SEMANA 12 SEMANA 13 SEMANA 14 SEMANA 15 SEMANA 16 SEMANA 17 : Implementacin de Seguridad en Aplicaciones .NET : Interoperabilidad y Reflection : Implementacin de Globalizacin : Examen final de laboratorio : Sustentacin de proyectos : Examen final de teora 169 189 199 : Implementacin de Serializacin en .NET : Administracin de Sistemas de Archivos 135 151 : Administracin de servicios Windows : Construir aplicaciones Windows que utilicen Threads y Configuraciones : Semana de exmenes parciales teora : Semana de exmenes parciales laboratorio : Implementacin de Diagnosticos en .NET 121 91 105 : Desarrollo de aplicaciones con Tipos de datos y Colecciones I : Desarrollo de aplicaciones con Colecciones II 53 75 : Introduccin a la arquitectura .NET Framework : Desarrollo de aplicaciones Windows y POO 7 25 5 6
CIBERTEC
CARRERAS PROFESIONALES
CARRERAS PROFESIONALES
CIBERTEC
PRESENTACIN
.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 rpido desarrollo de aplicaciones. Basado en ella, la empresa intenta desarrollar una estrategia horizontal que integre todos sus productos, desde el sistema operativo hasta las herramientas de mercado. El objetivo de .NET es obtener un entorno especficamente diseado para el desarrollo y ejecucin del software en forma de servicios que puedan ser tanto publicados como accedidos a travs de Internet de forma independiente del lenguaje de programacin, modelo de objetos, sistema operativo y hardware utilizados tanto para desarrollarlos como para publicarlos. ste entorno es lo que se denomina la plataforma.NET, y los servicios antes mencionados son a los que se denomina servicios web.
El manual para el curso de POOI ha sido elaborado bajo unidades de aprendizaje, las que desarrollamos durante semanas determinadas. As mismo, los temas que presenta este manual son parte del temario para rendir el examen de Microsoft 70 536 que es el requisito para obtener una serie de certificaciones como MCTS Windows, MCTS ADO.NET, MCTS Web. La distribucin de temas para este manual empieza por una introduccin a la plataforma .NET. Luego, se va desarrollando los temas como Tipos de Datos y Colecciones, Servicios de Windows, Diagnosticos, Procesos, Manejo de archivos, Serializacin, Seguridad, Interoperabilidad, Reflection y por ltimo Globalizacin.
CIBERTEC
CARRERAS PROFESIONALES
RED DE CONTENIDOS
Tipos y Colecciones
Interoperabilidad y Reflection
Diagnsticos Serializacin
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
1
SEMANA
1
INTRODUCCIN A LA ARQUITECTURA .NET FRAMEWORK 3.5
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos describen el funcionamiento de una aplicacin .NET bajo la arquitectura del Framework .NET 2.0 explicando los elementos necesarios que se utilizan en la elaboracin de esta
aplicacin. TEMARIO Arquitectura del .Net Framework, definicin Manejo de clases y sus miembros Creacin de proyectos Windows Application
ACTIVIDADES PROPUESTAS Los alumnos reconocen el entorno de Visual Studio 2008 Los alumnos crean aplicaciones Windows con Visual Studio 2008 Los alumnos ejecutan los formularios de las aplicaciones creadas.
CIBERTEC
CARRERAS PROFESIONALES
1. Microsoft .NET
Es el conjunto de nuevas tecnologas en las que Microsoft ha estado trabajando durante los ltimos aos con el objetivo de obtener una plataforma sencilla y potente para distribuir el software en forma de servicios que puedan ser suministrados remotamente y que puedan comunicarse y combinarse unos con otros de manera totalmente independiente de la plataforma, lenguaje de programacin y modelo de componentes con los que hayan sido desarrollados. sta es la llamada plataforma .NET, y a los servicios antes comentados se les denomina servicios Web. Para crear aplicaciones para la plataforma .NET, tanto servicios Web como aplicaciones tradicionales (aplicaciones de consola, aplicaciones de ventanas, servicios de Windows NT, etc.), Microsoft ha publicado el denominado kit de desarrollo de software conocido como .NET Framework SDK, que incluye las herramientas necesarias tanto para su desarrollo como para su distribucin y ejecucin y Visual Studio.NET, que permite hacer todo la anterior desde una interfaz visual basada en ventanas.
2. .NET Framework
.NET Framework es un componente integral de Windows que admite la creacin y la ejecucin de la siguiente generacin de aplicaciones y servicios Web XML. El diseo de .NET Framework est enfocado a cumplir los objetivos siguientes:
Proporcionar un entorno coherente de programacin orientada a objetos, en el que el cdigo de los objetos se pueda almacenar y ejecutar de forma local, ejecutar de forma local pero distribuida en Internet o ejecutar de forma remota. Proporcionar un entorno de ejecucin de cdigo que reduzca lo mximo posible la implementacin de software y los conflictos de versiones. Ofrecer un entorno de ejecucin de cdigo que fomente la ejecucin segura del mismo, incluso del creado por terceras personas desconocidas o que no son de plena confianza. Proporcionar un entorno de ejecucin de cdigo que elimine los problemas de rendimiento de los entornos en los que se utilizan secuencias de comandos o intrpretes de comandos. Ofrecer al programador una experiencia coherente entre tipos de aplicaciones muy diferentes, como las basadas en Windows o en el Web. Basar toda la comunicacin en estndares del sector para asegurar que el cdigo de .NET Framework se puede integrar con otros tipos de cdigo.
.NET Framework contiene dos componentes principales: Common Language Runtime y la biblioteca de clases de .NET Framework. a. Common Language Runtime CLR Es el fundamento de .NET Framework. El motor en tiempo de ejecucin se puede considerar como un agente que administra el cdigo en tiempo de ejecucin y proporciona servicios centrales, como la administracin de
CARRERAS PROFESIONALES
CIBERTEC
memoria, la administracin de subprocesos y la interaccin remota, al tiempo que aplica una seguridad estricta a los tipos y otras formas de especificacin del cdigo que fomentan su seguridad y solidez. De hecho, el concepto de administracin de cdigo es un principio bsico del motor en tiempo de ejecucin. El cdigo destinado al motor en tiempo de ejecucin se denomina cdigo administrado, a diferencia del resto de cdigo, que se conoce como cdigo no administrado Caractersticas de Common Language Runtime Common Language Runtime administra la memoria, ejecucin de subprocesos, ejecucin de cdigo, comprobacin de la seguridad del cdigo, compilacin y dems servicios del sistema. Estas caractersticas son intrnsecas del cdigo administrado que se ejecuta en Common Language Runtime. Con respecto a la seguridad, los componentes administrados reciben grados de confianza diferentes, en funcin de una serie de factores entre los que se incluye su origen (como Internet, red empresarial o equipo local). Esto significa que un componente administrado puede ser capaz o no de realizar operaciones de acceso a archivos, operaciones de acceso al Registro y otras funciones delicadas, incluso si se est utilizando en la misma aplicacin activa. Por ejemplo, los usuarios pueden confiar en que un archivo ejecutable incrustado en una pgina Web puede reproducir una animacin en la pantalla o entonar una cancin, pero no puede tener acceso a sus datos personales, sistema de archivos o red. Adems, ofrece la solidez del cdigo mediante la implementacin de una infraestructura estricta de comprobacin de tipos y cdigo denominada CTS (Common Type System, Sistema de tipos comn). CTS garantiza que todo el cdigo administrado es autodescriptivo. Los diferentes compiladores de lenguajes de Microsoft y de terceros generan cdigo administrado que se ajusta a CTS. Esto significa que el cdigo administrado puede usar otros tipos e instancias administrados, al tiempo que se aplica inflexiblemente la fidelidad y seguridad de los tipos. As mismo, el entorno administrado del motor en tiempo de ejecucin elimina muchos problemas de software comunes. Por ejemplo, el motor en tiempo de ejecucin controla automticamente la disposicin de los objetos, administra las referencias a stos y los libera cuando ya no se utilizan. Esta administracin automtica de la memoria soluciona los dos errores ms comunes de las aplicaciones: la prdida de memoria y las referencias no vlidas a la memoria. Finalmente, el motor en tiempo de ejecucin est diseado para mejorar el rendimiento. Aunque Common Language Runtime proporciona muchos servicios estndar de motor en tiempo de ejecucin, el cdigo administrado nunca se interpreta. Una caracterstica denominada compilacin JIT (Just-InTime) permite ejecutar todo el cdigo administrado en el lenguaje mquina nativo del sistema en el que se ejecuta. Mientras tanto, el administrador de memoria evita que la memoria se pueda fragmentar y aumenta la zona de referencia de la memoria para mejorar an ms el rendimiento.
CIBERTEC
CARRERAS PROFESIONALES
10
b.
La biblioteca de clases de .NET Framework es una coleccin de tipos reutilizables que se integran estrechamente con Common Language Runtime. La biblioteca de clases est orientada a objetos, lo que proporciona tipos de los que su propio cdigo administrado puede derivar funciones. Esto ocasiona que los tipos de .NET Framework sean sencillos de utilizar y reduce el tiempo asociado con el aprendizaje de las nuevas caractersticas de .NET Framework. Adems, los componentes de terceros se pueden integrar sin dificultades con las clases de .NET Framework. Como en cualquier biblioteca de clases orientada a objetos, los tipos de .NET Framework permiten realizar diversas tareas de programacin comunes, como son la administracin de cadenas, recoleccin de datos, conectividad de bases de datos y acceso a archivos. Adems de estas tareas habituales, la biblioteca de clases incluye tipos adecuados para diversos escenarios de desarrollo especializados. Por ejemplo, puede utilizar .NET Framework para desarrollar los siguientes tipos de aplicaciones y servicios:
Aplicaciones de consola Aplicaciones GUI de Windows (Windows Forms). Aplicaciones de Windows Presentation Foundation (WPF. Aplicaciones de ASP.NET Servicios web. Servicios de Windows Aplicaciones orientadas a servicios utilizando Windows Communication Foundation (WCF).
Aplicaciones habilitadas para el flujo de trabajo utilizando Windows Workflow Foundation (WF).
.NET Framework 2.0 Service Pack 1 y 2 de .NET Framework 2.0, que actualizan los ensamblados incluidos en .NET Framework 2.0.
CARRERAS PROFESIONALES
CIBERTEC
.NET Framework 3.0, que utiliza los ensamblados de .NET Framework 2.0 y sus Service Pack, e incluye los ensamblados necesarios para las tecnologas introducidas en .NET Framework 3.0. Por ejemplo, PresentationFramework.dll y PresentationCore.dll, que son necesarios para Windows Presentation Foundation (WPF), se instalan con .NET Framework 3.0. Service Pack 1 y 2 de .NET Framework 3.0, que actualizan los ensamblados que se introducen en .NET Framework 3.0. .NET Framework 3.5, que incluye nuevos ensamblados que proporcionan una funcionalidad adicional a .NET Framework 2.0 y 3.0. .NET Framework 3.5 Service Pack 1, que actualiza los ensamblados que se incluyen en .NET Framework 3.5.
Nota: Windows Vista no admite la instalacin independiente de las versiones 2.0 SP2 y 3.0 SP2 de .NET Framework. Windows 2000 no admite la versin 3.5 SP1 de .NET Framework ni la instalacin independiente de .NET Framework versin 3.0 SP 2.
Una aplicacin utiliza los mismos ensamblados sin tener en cuenta si tiene como destino la versin 2.0, 3.0 o 3.5 de .NET Framework o Client Profile, y sin tener en cuenta si los ensamblados se han actualizado en el equipo del usuario. Por ejemplo, una aplicacin que utiliza WPF y tiene como destino .NET Framework 3.0 utiliza la misma instancia del ensamblado mscorlib que una aplicacin que utiliza formularios Windows Forms y tiene como destino .NET Framework 2.0. Si un usuario ha instalado una versin posterior de.NET Framework o un Service Pack que actualiza su copia de mscorlib.dll, las dos aplicaciones utilizarn la versin actualizada del ensamblado. Nota: La relacin entre las versiones 2.0, 3.0 y 3.5 de .NET Framework es diferente a la relacin que existe entre las versiones 1.0, 1.1 y 2.0 de .NET Framework, que son totalmente independientes unas de otras, por lo que una versin puede estar en un equipo con independencia de si las otras versiones se encuentran o no en dicho equipo. Cuando las versiones 1.0, 1.1 y 2.0 estn en el mismo equipo, cada versin tiene su propio Common Language Runtime, sus propias bibliotecas de clases, su propio compilador, etc. Los programadores de las aplicaciones pueden elegir qu versin quieren utilizar como destino. Para obtener ms informacin, vea Ejecucin simultnea, Especificar una versin concreta de .NET Framework e Especificar versiones concretas de .NET Framework con MSBuild.
Caractersticas incluidas en .NET Framework 3.5 SP1 En esta seccin se resumen las tecnologas de .NET Framework versin 3.5 SP1 y cada una de las versiones de .NET Framework que contiene. Esta lista no es exhaustiva, solo incluye algunas de las principales tecnologas que se incluyen en .NET Framework.
CIBERTEC
CARRERAS PROFESIONALES
12
.NET Framework 3.5 .NET Framework 3.5 introduce nuevas caractersticas para las tecnologas de las versiones 2.0 y 3.0 e incorpora tecnologas adicionales en forma de nuevos ensamblados. Las tecnologas siguientes se introducen en .NET Framework 3.5:
Language Integrated Query (LINQ). Nuevos compiladores para C#, Visual Basic y C++. ASP.NET AJAX.
.NET Framework 3.5 Service Pack 1 actualiza varios ensamblados que se suministran con .NET Framework 3.5. Las actualizaciones incorporan cambios intrascendentes, nuevos elementos de API y una funcionalidad adicional para las tecnologas que se incluyen en .NET Framework 3.5. Las tecnologas siguientes se suministran con .NET Framework 3.5 SP1:
Datos dinmicos de ASP.NET. ADO.NET Entity Framework. Compatibilidad con el proveedor de datos de SQL Server 2008. Compatibilidad con .NET Framework Client Profile.
El proceso de ejecucin administrada incluye los pasos siguientes: 1. Elegir un compilador. Para obtener los beneficios que proporciona Common Language Runtime, se deben utilizar uno o ms compiladores de lenguaje orientados al tiempo de ejecucin. 2. Compilar el cdigo a Lenguaje intermedio de Microsoft (MSIL). La compilacin convierte el cdigo fuente en MSIL y genera los metadatos requeridos. 3. Compilar MSIL a cdigo nativo. En tiempo de ejecucin, un compilador Just-In-Time (JIT) convierte MSIL en cdigo nativo. Durante esta compilacin, el cdigo debe pasar un proceso de comprobacin que examina el MSIL y los metadatos para averiguar si el cdigo garantiza la seguridad de tipos.
CARRERAS PROFESIONALES
CIBERTEC
4. Ejecutar cdigo. Common Language Runtime proporciona la infraestructura que permite que la ejecucin tenga lugar, as como una amplia gama de servicios que se pueden utilizar durante la ejecucin.
CIBERTEC
CARRERAS PROFESIONALES
14
elementos. Estos contenedores permiten sacar partido del IDE mediante las siguientes tareas:
Administrar la configuracin de la solucin en su totalidad o dividida en proyectos individuales Utilizar el Explorador de soluciones para controlar los detalles de la administracin de archivos y centrarse al mismo tiempo en los elementos que constituyen la labor de desarrollo. Agregar elementos tiles a varios proyectos de la solucin o a la solucin sin tener que hacer referencia a dichos elementos en cada proyecto. Trabajar en diversos archivos, independientes de soluciones o proyectos
Elementos: archivos, referencias y conexiones de datos Los elementos pueden ser archivos y otras partes del proyecto como referencias, conexiones de datos o carpetas. En el Explorador de soluciones los elementos pueden organizarse de varias formas:
En forma de elementos del proyecto, es decir, elementos que componen el proyecto, tales como formularios, archivos de cdigo fuente y clases de un proyecto del Explorador de soluciones. La organizacin y la presentacin dependern de la plantilla de proyecto que se seleccione, as como de cualquier modificacin que se realice.
En forma de elementos de la solucin para archivos que se aplican a la solucin en su totalidad en la carpeta Elementos de la solucin del Explorador de soluciones.
En forma de varios archivos que no estn asociados a ningn proyecto ni a ninguna solucin y que pueden mostrarse en la carpeta Archivos varios.
Iniciando un Proyecto y Solucin en VStudio 2008 Despus de iniciar el IDE de Visual Stidoo 2008, presenta una ventana que nos permite crear un proyecto de solucin. 1. Ingresar al Menu File y Seleccionar la opcin New Project
CARRERAS PROFESIONALES
CIBERTEC
2. En la siguiente pantalla se debe elegir el lenguaje a utilizar Visual Basic y la plantilla de proyecto Windows Application
CIBERTEC
CARRERAS PROFESIONALES
16
3. Seleccionamos OK. y se muestra la pantalla para empezar a trabajar. Cuadro de Herramientas Barra de Men
Explorador de Soluciones
Formulario
Ventana de Propiedades
Detalle de la entorno de desarrollo. Ventana de Salida Cuadro de Herramientas Contiene los objetos y controles que se pueden aadir a los formularios para crear una aplicacin. Barra de Mens Contiene comandos que son usados por Visual Basic. Como es habitual Microsoft siempre muestra mens habituales como Archivo, Edicin, Ver, Insertar, etc. Sin embargo deber prestar atencin a los mens y comandos propios del entorno de desarrollo a los cuales permiten tener acceso a funciones especficas de programacin como los mens de Proyecto, Construir y Depuracin. Formulario El formulario es el principal espacio o repositorio en el cual se basan todas las aplicaciones Windows Aplicacin. Los formularios son las interfases de usuario de la aplicacin sobre las cules se colocarn los objetos y controles necesarios para construir la GUI. Ventana de Salida Muestra informacin relevante del proceso de compilacin o de Debug de una aplicacin Ventana de Propiedades Lista de valores de las propiedades del formulario o control seleccionado los cules podrn ser personalizados.
CARRERAS PROFESIONALES
CIBERTEC
Explorador de Soluciones Dentro de este espacio se lista los proyectos que la solucin contiene y asu vez los objetos que contiene cada proyecto.
LABORATORIO 1.1
Cree una aplicacin Windows que permita ingresar el Nombre de un usuario y muestre una ventana emergente de bienvenida con el nombre de usuario. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio1_1
4. Para la GUI considerar los siguientes objetos con sus propiedades tal como se indica en la siguiente tabla: Objeto Label Textbox Button Propiedad lblUsuario txtUsuario btnAceptar Valor Usuario Ninguno Aceptar
CIBERTEC
CARRERAS PROFESIONALES
18
CARRERAS PROFESIONALES
CIBERTEC
LABORATORIO 1.2
Cree una aplicacin Windows que permita ingresar dos nmeros enteros y muestre en una ventana la suma de los dos. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio1_2
4. Crear la GUI con los siguientes objetos segn lo indica la tabla adjunta. Objeto Label1 Label1 Textbox1 Textbox2 Button1 Button2 Text Text Name Name Text Name Propiedad Valor Numero 1 Numero 2 txtNumero1 txtNumero2 Calcular btnCalcular
CIBERTEC
CARRERAS PROFESIONALES
20
7. Evaluar la aplicacin ingresando primera los dos nmeros enteros positivos, luego un nmero negativo y el otro positivo, finalmente un nmero positivo y el otro negativo. Revisa los mensajes mostrados en cada caso.
CARRERAS PROFESIONALES
CIBERTEC
10.
Seleccionar
Save.
CIBERTEC
CARRERAS PROFESIONALES
22
Autoevaluacion
1. Qu es el CLR? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------2. Qu es .NET? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3. Qu es un Assembly? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------4. Qu es una solucin? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------5. Qu es un proyecto? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------6. Qu es diferencias hay entre las propiedades Name y Text de los objetos? --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------7. Qu es codificacin basada en eventos? ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
Microsoft .NET es una plataforma de desarrollo y ejecucin de aplicaciones Windows Forms, Aplicaciones de consola y Web. Componentes principales de la plataforma: Un entorno de ejecucin de aplicaciones, llamado Runtime Un conjunto de bibliotecas funcionales y controles reutilizables Un conjunto de lenguajes de programacin de alto nivel, junto con sus compiladores. Un conjunto de utilitarios y herramientas de desarrollo para simplificar las tareas ms comunes del proceso de desarrollo de aplicaciones. Documentacin y guas de arquitectura, que describen las mejores prcticas de diseo, organizacin, desarrollo, prueba e instalacin de aplicaciones de aplicaciones .NET Los Assemblies son reutilizables, versionables y auto-descriptivos, ya que no slo contienen el cdigo MSIL que representa la lgica de la aplicacin, sino que tambin incluyen informacin sobre s mismos y sobre todos los recursos externos de los que dependen para funcionar correctamente. Los principales namespaces de la biblioteca de clases .NET o System: Raz de todos los otros namespaces, y dentro del cual se puede encontrar la mayora de los namespaces correspondientes al Class Library. o System.Data y System.Xml: En conjunto, estos dos namespaces constituyen la tecnologa conocida como ADO.NET. o System.Web: Dentro de este namespace se encuentran todos los tipos necesarios para programar aplicaciones y servicios Web ASP.NET. o System.Windows.Forms: Dentro de este namespace se
encuentran todos los tipos necesarios para programar aplicaciones de escritorio basadas en formularios y ventanas Windows. Fuente Texto adaptado de la pgina web: http://msdn.microsoft.com/es-es/library
CIBERTEC
CARRERAS PROFESIONALES
24
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
1
SEMANA
TEMARIO Manejo de controles bsicos de los proyectos Windows Application Manejo de Herencia e Interface
ACTIVIDADES PROPUESTAS
Los alumnos desarrollan los laboratorios de esta semana. Los alumnos desarrollan aplicaciones con los controles bsicos. Los alumnos desarrollan clases y objetos.
CIBERTEC
CARRERAS PROFESIONALES
26
El espacio de nombres System.Windows.Forms contiene clases para crear aplicaciones para Windows que aprovechan todas las ventajas de las caractersticas de la interfaz de usuario disponibles en el sistema operativo Microsoft Windows. La mayora de las clases del espacio de nombres System.Windows.Forms derivan de la clase Control. La clase Control proporciona la funcionalidad base de todos los controles que se muestran en un objeto Form. La clase Form representa una ventana dentro de una aplicacin. Vista Diseo
Vista cdigo
CARRERAS PROFESIONALES
CIBERTEC
1.1.1. La clase Form Un formulario Form es una representacin de cualquier ventana mostrada en su aplicacin. La clase Form se puede utilizar para crear ventanas estndar, de herramientas, sin bordes y flotantes. Tambin puede utilizar la clase Form para crear las ventanas modales como un cuadro de dilogo. Un tipo especial de formulario, el formulario de interfaz de mltiples documentos (MDI), puede contener otros formularios denominados formularios MDI secundarios. Los formularios MDI se crean estableciendo la propiedad IsMdiContainer en true. Los formularios MDI secundarios se crean estableciendo la propiedad MdiParent en el formulario MDI principal que contendr el formulario secundario. Propiedades ms cmunes BackColor BackgroundImage Permite asignar color de fondo. Obtiene o establece la imagen de fondo que se muestra en el control. Obtiene o establece un valor que indica si se muestra un cuadro de control en la barra de ttulo del formulario. Obtiene o establece que los bordes del control se acoplarn a su control principal Obtiene o establece el estilo del borde del formulario. Obtiene o establece un valor que indica si el formulario es un contenedor para formularios MDI (interfaz de mltiples documentos) secundarios. Obtiene o establece un valor que indica si el formulario recibe los eventos clave antes de que pasen al control que tiene el foco. Obtiene o establece el formulario MDI (interfaz de mltiples documentos) principal actual de este formulario. Obtiene o establece el nombre del control. (Se hereda de Control). Obtiene o establece el nivel de opacidad del formulario. Obtiene o establece la posicin inicial del formulario en tiempo de ejecucin. Muestra texto en barra de ttulo.
ControlBox
Dock
FormBorderStyle
IsMdiContainer
KeyPreview
MdiParent
Name
Opacity
StartPosition
Text
CIBERTEC
CARRERAS PROFESIONALES
28
Eventos ms cmunes Closed Closing Disposed Tiene lugar cuando el formulario est cerrado. Tiene lugar cuando se cierra el formulario. Se produce cuando el componente se elimina mediante una llamada al mtodo Dispose. (Se hereda de Component). Se produce despus de haberse cerrado el formulario. Se produce antes de cerrar el formulario. Se produce antes de que se muestre un formulario por primera vez. Manejo de controles bsicos que se utilizan en formularios Windows Forms
A continuacin se ofrece una lista alfabtica de los controles y componentes que se pueden utilizar en formularios Windows Forms. Adems de los controles de formularios Windows Forms que se tratan en esta seccin, puede agregar controles ActiveX y controles personalizados a los formularios Windows Forms. Si no encuentra en esta lista el control que necesita, puede tambin crear uno propio Nota: En las tablas siguientes no se muestran todos los controles o componentes que puede utilizar en formularios Windows Forms; para una lista ms completa, vea Controles que se utilizan en formularios Windows Forms
Los controles Label de formularios Windows Forms se utilizan para mostrar texto o imgenes que el usuario no puede editar. Se utilizan para identificar objetos en un formulario; por ejemplo, para proporcionar una descripcin de lo que har cierto control si se hace clic en l o para mostrar informacin en respuesta a un evento o proceso en tiempo de ejecucin de la aplicacin. Por ejemplo, puede utilizar etiquetas para agregar ttulos descriptivos a cuadros de texto, cuadros de lista, cuadros combinados, etc. Tambin puede escribir cdigo que cambie el texto que muestra una etiqueta en respuesta a eventos en tiempo de ejecucin. Por ejemplo, si la aplicacin tarda varios minutos en procesar un cambio, puede mostrar en una etiqueta un mensaje que notifique el estado de procesamiento del cambio.
CARRERAS PROFESIONALES
CIBERTEC
Nombre AutoSize
Descripcin Obtiene o establece un valor que indica si el control cambia automticamente de tamao para mostrar todo su contenido. Obtiene o establece el color de fondo del control. Infraestructura. Obtiene o establece la imagen representada en el fondo del control. Obtiene o establece el estilo de borde del control. Obtiene o establece que los bordes del control se acoplarn a su control principal y determina cmo se cambia el tamao de un control con su elemento primario. Obtiene o establece un valor que indica si el control puede responder a la interaccin del usuario. Obtiene o establece la fuente del texto que muestra el control. Obtiene o establece el color de primer plano del control. Obtiene o establece la imagen que se muestra en un control Label. Obtiene o establece el nombre del control. Establece el texto a mostrar en la etiqueta Obtiene o establece un valor que indica si se muestran el control y todos sus controles primarios.
BackColor BackgroundImage
BorderStyle Dock
Enabled
Font
ForeColor Image
Los cuadros de texto de formularios Windows Forms se utilizan para obtener entradas del usuario o para mostrar texto. El control TextBox se utiliza generalmente para el texto que se puede editar, aunque tambin puede configurarse como control de slo lectura. Los cuadros de texto pueden mostrar varias lneas, ajustar el texto al tamao del control y agregar formato bsico. El control TextBox permite un nico formato para el texto que se muestra o escribe en el control.
CIBERTEC
CARRERAS PROFESIONALES
30
Descripcin
Obtiene o establece la fuente del texto que muestra el control. Sobrecargado. Obtiene o establece los caracteres utilizados para enmascarar caracteres de una contrasea en un control TextBox de una sola lnea. Obtiene o establece un valor que indica si el texto del cuadro de texto es de slo lectura. Obtiene o establece un valor que indica el texto seleccionado actualmente en el control. Sobrecargado. Obtiene o establece cmo se alinea el texto en un control TextBox. Obtiene la longitud del texto en el control.
Multiline PasswordChar
ReadOnly
SelectedText
Text TextAlign
TextLength
El control Button de los formularios Windows Forms permite al usuario hacer clic en l para ejecutar una accin. Cuando se hace clic en el botn, da la sensacin de que se ha presionado y soltado. Cada vez que el usuario hace clic en un botn, se invoca al controlador del evento Click. El cdigo se ubica en el controlador del evento Click para ejecutar la accin deseada. El texto que se muestra en el botn se almacena en la propiedad Text. Si este texto supera el ancho del botn, se ajustar en la lnea siguiente. No obstante, si el control no dispone del alto suficiente, el texto aparecer cortado El control Button tambin muestra imgenes mediante las propiedades Image y ImageList.
CARRERAS PROFESIONALES
CIBERTEC
Aqu detallamos algunas de sus propiedades ms comunes. Nombre BackColor BackgroundImage Descripcin Sobrecargado. Obtiene o establece la imagen de fondo que se muestra en el control. (Se hereda de Control). Obtiene el aspecto del borde y los colores utilizados para indicar el estado de comprobacin y el estado del mouse. (Se hereda de ButtonBase). Obtiene o establece la fuente del texto que muestra el control. (Se hereda de Control). Obtiene o establece el color de primer plano del control. (Se hereda de Control). Sobrecargado. Obtiene o establece la alineacin del texto en el control de botn. (Se hereda de ButtonBase).
FlatAppearance
Font
ForeColor
Text TextAlign
Un ComboBox muestra un campo de edicin de cuadro de texto combinado con un ListBox y permite al usuario seleccionar elementos de la lista o escribir texto nuevo. El comportamiento predeterminado de ComboBox es mostrar un campo de edicin con una lista desplegable oculta. Para agregar objetos a la lista en tiempo de ejecucin, asigne una matriz de referencias a objetos con el mtodo AddRange. De este modo la lista muestra el valor de cadena predeterminado para cada objeto. Puede agregar objetos individuales con el mtodo Add.
Nota: Si tiene un ListBox, ComboBox o CheckedListBox en un formulario de Windows de base y desea modificar las colecciones de cadenas de esos controles en un formulario de Windows derivado, las colecciones de cadenas de estos controles del formulario de Windows de base deben estar vacas. Si las colecciones de cadenas no estn vacas, se establecen como de slo lectura cuando se deriva otro formulario de Windows.
CIBERTEC
CARRERAS PROFESIONALES
32
Nombre DropDownStyle
Descripcin Obtiene o establece un valor que especifica el estilo del cuadro combinado. Obtiene un objeto que representa la coleccin de los elementos que contiene el ComboBox. Obtiene o establece el ndice que especifica el elemento seleccionado actualmente. Obtiene o establece el elemento seleccionado actualmente en el ComboBox. Obtiene o establece el texto que se selecciona en la parte de un ComboBox que se puede editar. Obtiene o establece el valor de la propiedad miembro especificada por la propiedad ValueMember. Obtiene o establece un valor que indica si los elementos del cuadro combinado estn ordenados. Obtiene o establece la propiedad que se utilizar como valor real para los elementos del ListControl.
Items
SelectedIndex
SelectedItem
SelectedText
SelectedValue
Sorted
ValueMember
El control ListBox permite mostrar una lista de elementos para que el usuario los seleccione haciendo clic en ellos. Un control ListBox puede proporcionar una o varias selecciones mediante la propiedad SelectionMode. ListBox tambin proporciona la propiedad MultiColumn para poder mostrar los elementos en columnas en lugar de mostrarlos en una lista vertical. Con esto, el control puede mostrar ms elementos visibles y el usuario ya no necesita desplazarse a un elemento. Las propiedades Items, SelectedItems y SelectedIndices proporcionan acceso a las tres colecciones que ListBox utiliza. En la tabla siguiente se presentan las tres colecciones que ListBox utiliza y se indica su uso dentro del control.
CARRERAS PROFESIONALES
CIBERTEC
Descripcin Obtiene los elementos del control ListBox. Obtiene o establece un valor que indica si el control ListBox admite varias columnas. Obtiene o establece el nombre del control. (Se hereda de Control). Obtiene o establece el ndice de base cero del elemento actualmente seleccionado en ListBox. Obtiene una coleccin que contiene los ndices de base cero de todos los elementos actualmente seleccionados en el control ListBox. Obtiene o establece el elemento actualmente seleccionado en el control ListBox. Obtiene una coleccin que contiene los elementos actualmente seleccionados en el control ListBox. Obtiene o establece el valor de la propiedad miembro especificada por la propiedad ValueMember. Obtiene o establece la propiedad que se utilizar como valor real para los elementos del ListControl.
Name
SelectedIndex
SelectedIndices
SelectedItem
SelectedItems
SelectedValue
ValueMember
Utilice un control CheckBox para dar al usuario una opcin del tipo verdadero/falso o s/no. El control CheckBox de casilla de verificacin puede mostrar una imagen o texto, o ambos. Los controles CheckBox y RadioButton tienen una funcin similar: ambos permiten al usuario elegir de una lista de opciones. Los controles CheckBox permiten al usuario elegir una combinacin de opciones. La propiedad Appearance determina si la casilla de verificacin CheckBox como un control CheckBox tpico o como un botn. Utilice la propiedad Checked para obtener o establecer el valor de un control CheckBox de casilla de verificacin de dos estados .
CIBERTEC
CARRERAS PROFESIONALES
34
Nota: Si se establece la propiedad ThreeState en true, la propiedad Checked devuelve true para los estados activado o indeterminado.
Descripcin Obtiene o establece un valor que indica si los valores de Checked o CheckState y la apariencia de CheckBox cambian automticamente al hacer clic en dicha casilla de verificacin CheckBox. Obtiene o establece un valor que indica si CheckBox est en el estado activado. Muestra un texto del control Obtiene o establece la alineacin del texto en el control CheckBox. (Invalida a ButtonBase..::.TextAlign).
Checked
Text TextAlign
El control RadioButton puede mostrar texto, Image o ambos. Cuando el usuario selecciona un botn de opcin dentro de un grupo, los otros se borran automticamente. Todos los controles RadioButton de un contenedor determinado, como Form, constituyen un grupo. Para crear varios grupos en un formulario, coloque cada grupo en su propio contenedor, como un control GroupBox o Panel. Los controles RadioButton y CheckBox tienen una funcin similar; es decir, ofrecen opciones que el usuario puede activar o desactivar. La diferencia consiste en que se pueden seleccionar mltiples controles CheckBox al mismo tiempo, mientras que los botones de opcin se excluyen mutuamente. Utilice la propiedad Checked para obtener o establecer el estado de un RadioButton. El aspecto de un botn de opcin se puede modificar para que aparezca como botn de alternar o como botn de opcin estndar al establecer la propiedad Appearance.
CARRERAS PROFESIONALES
CIBERTEC
Descripcin Obtiene o establece un valor que indica si el control est activado. Obtiene o establece la ubicacin de la parte de casilla del control RadioButton. Infraestructura. Obtiene o establece la alineacin del texto en el control RadioButton. Obtiene o establece un valor que indica si el valor de Checked y el aspecto del control cambian automticamente al hacer clic en el control. Muestra El texto del RadioButton
TextAlign
AutoCheck
Text
2.
2.1
Las palabras "clase" y "objeto" se usan con tanta frecuencia en la programacin orientada a objetos que es fcil confundir los trminos. En general, una class es una representacin abstracta de algo, mientras que un objeto es un ejemplo utilizable de lo que representa la clase. La nica excepcin a esta regla la constituyen los miembros de clases compartidas, que pueden utilizarse en instancias de una clase y en variables de objeto declaradas como tipo de la clase.
2.1.1 Campos, propiedades, mtodos y eventos Las clases se componen de campos, propiedades, mtodos y eventos. Los campos y propiedades representan informacin que contiene un objeto. Los campos se parecen a las variables ya que se pueden leer y establecer directamente. Por ejemplo, si tiene un objeto denominado "Car", podra almacenar su color en un campo denominado "Color". Las propiedades se recuperan y establecen como los campos, pero se implementan mediante los procedimientos propiedad Get y Set, que proporcionan ms control sobre la forma en que los valores se establecen o se devuelven. Los mtodos representan acciones que un objeto puede realizar. Por ejemplo, un objeto "Car" podra tener los mtodos "StartEngine", "Drive" y "Stop". Los mtodos se definen agregando procedimientos, ya sean rutinas o funciones Sub, a la clase. Los eventos son notificaciones que un objeto recibe de, o transmite a, otros objetos o aplicaciones. Los eventos permiten a los objetos realizar acciones siempre que se produce un acontecimiento especfico. Un ejemplo de evento para la clase "Car" sera un evento "Check_Engine". Puesto que Microsoft Windows es un sistema controlado
CIBERTEC
CARRERAS PROFESIONALES
36
por eventos, stos pueden proceder de otros objetos, aplicaciones o entradas de usuario realizadas al hacer clic con el mouse (ratn) o al presionar teclas.
La encapsulacin significa que un grupo de propiedades, mtodos y otros miembros relacionados se tratan como si de una sola unidad u objeto se tratase. Los objetos pueden controlar cmo se cambian propiedades o se ejecutan mtodos. Herencia describe la posibilidad de crear nuevas clases basadas en una clase existente. La nueva clase hereda todas las propiedades, mtodos y eventos de la clase base, y puede personalizarse con propiedades y mtodos adicionales.
Polimorfismo significa que puede tener mltiples clases que se pueden utilizar de
forma intercambiable, si bien cada clase implementa las mismas propiedades o los mismos mtodos de maneras diferentes. El polimorfismo es importante en la programacin orientada a objetos puesto que permite usar elementos que tienen el mismo nombre, independientemente del tipo de objeto que se est utilizando en ese momento
Los miembros sobrecargados se utilizan para proporcionar diferentes versiones de una propiedad o mtodo que tienen el mismo nombre, pero que aceptan un nmero diferente de parmetros, o parmetros con diferentes tipos de datos. Las propiedades y mtodos reemplazados se utilizan para reemplazar una propiedad o mtodo heredados que no son apropiados en una clase derivada. Los miembros reemplazados deben aceptar el mismo tipo de datos y nmero de argumentos. Las clases derivadas heredan los miembros reemplazados. Los miembros sombreados se utilizan para reemplazar localmente un miembro que tiene un mbito ms amplio. Cualquier tipo puede sombrear cualquier otro tipo. Por ejemplo, puede declarar un propiedad que sombree un mtodo heredado con el mismo nombre. Los miembros sombreados no se pueden heredar.
3.
Para definir una clase 1. Cree un proyecto haciendo clic en Nuevo proyecto en el men Archivo. Aparecer el cuadro de dilogo Nuevo proyecto. 2. Seleccione Aplicacin para Windows de la lista de plantillas del proyecto de Visual Basic para mostrar el nuevo proyecto. 3. Agregue una clase nueva al proyecto haciendo clic en Agregar clase en el men Proyecto. Aparecer el cuadro de dilogo Agregar nuevo elemento.
CARRERAS PROFESIONALES
CIBERTEC
4. Seleccione la plantilla Clase. 5. Asigne a la nueva clase el nombre UserNameInfo.vb y, a continuacin, haga clic en Agregar para mostrar el cdigo de la nueva clase. Public Class UserNameInfo End Class
6. Defina un campo privado para la clase; para ello, agregue el siguiente cdigo entre las instrucciones Class y End Class: Private _nombreUsuario As String
7. Declarar el campo como Private quiere decir que slo se puede utilizar dentro de la clase. Se pueden utilizar modificadores de acceso ms amplio, por ejemplo Public, para hacer que los campos estn disponibles desde fuera de la clase. 8. Defina una propiedad para la clase agregando el cdigo siguiente: Public Property nombreUsuario () As String Get ' Gets the property value. Return _nombreUsuario End Get Set(ByVal Value As String) ' Sets the property value. _ nombreUsuario = Value End Set End Property
9. Defina un mtodo para la clase agregando el cdigo siguiente: Public Sub AMayusculas() ' Convertir a maysculas el valor de la propiedad _ nombreUsuario = UCase(userNameValue) End Sub
10. Defina un constructor parametrizado para la clase nueva agregando un procedimiento denominado Sub New:
CIBERTEC
CARRERAS PROFESIONALES
38
Public Sub New(ByVal nomUsuario As String) ' Set the property value. Me._ nombreUsuario = nomUsuario End Sub
Cuando se crea un objeto basado en esta clase, se llama al constructor Sub New automticamente. Este constructor establece el valor del campo que contiene el nombre de usuario.
Laboratorio 2.1
Manejo de controles bsicos en formularios Windows 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio2_1. 4. Disee la GUI del formulario teniendo en cuenta los siguientes controles que se colocan en la tabla adjunta.
Objeto Label1 Label2 Label3 Label4 Textbox1 ComboBox1 ComboBox2 ComboBox3 RadioButton1 RadioButton1 RadioButton2
Propiedad Text Text Text Text Name Name Name Name Name Text Name
Valor Nombre de Alumno Turno Da Curso txtAlumno cboTurno Clodia cboCurso rbContado Contado rbCredito
CARRERAS PROFESIONALES
CIBERTEC
RadioButton2 RadioButton3 RadioButton3 ListbBox1 Button1 Button1 Button2 Button2 Button3 Button3 CheckBox1 CheckBox1
Text Name Text Name Name Text Name Text Name Text Name Text
Crdito rbCheque Cheque lstAlumnos btnAceptar Aceptar btnCancelar Cancelar btnCerrar Cerrar chkMayorDeEdad Mayor de Edad
4. Declarar el mtodo cargarCombos con el siguiente cdigo en la Vista Cdigo del formulario.
Public Class Form1 'mtodo sin retorno que carga los combos Sub cargarCombos() cboTurno.Items.Add("Maana") cboTurno.Items.Add("Tarde") cboTurno.Items.Add("Noche") cboTurno.SelectedIndex = 0 cboDia.Items.Add("LUNES") cboDia.Items.Add("MARTES") cboDia.Items.Add("MIERCOLES") cboDia.Items.Add("JUEVES") cboDia.Items.Add("VIERNES") cboDia.Items.Add("SABADO") cboDia.Items.Add("DOMINGO") cboDia.SelectedIndex = 0 CboCurso.Items.Add("Office Proefficient") CboCurso.Items.Add("Diseo FLASH") CboCurso.Items.Add(".NET 2008") CboCurso.Items.Add("SQL SERVER 2008") CboCurso.Items.Add("ASP .NET") CboCurso.SelectedIndex = 0 rbContado.Checked = True End Sub End Class
CIBERTEC
CARRERAS PROFESIONALES
40
6. Agregar las siguientes lneas de cdigo a nivel local en el mtodo de evento del botn Aceptar.
Private Sub btnAceptar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAceptar.Click 'variables locales Dim strNombre, strTurno, strCurso, _ strDia, strPago, strMayorEdad As String 'asignar valors strNombre = txtAlumno.Text.Trim strCurso = cboCurso.SelectedItem.ToString strDia = cboDia.SelectedItem.ToString strTurno = cboTurno.SelectedItem.ToString strDia = cboDia.SelectedItem.ToString 'verificar el tipo de pago elegido If rbContado.Checked = True Then strPago = "Contado" End If If rbCheque.Checked = True Then strPago = "Cheque" End If If rbCredito.Checked = True Then strPago = "Crdito" End If If chkMayorDeEdad.Checked = True Then strMayorEdad = InputBox("Ingrese nmero de DNI") Else strMayorEdad = "No tiene" End If MessageBox.Show(" Confirmaci de Registro " & vbCrLf & _ "Alumno:" & strNombre & vbCrLf & _ "Curso:" & strCurso & vbCrLf & _ "Turno:" & strCurso & vbCrLf & _ "Tipo de Pago:" & strPago & vbCrLf & _ "DNI:" & strMayorEdad, "Informacin del Sistema", _ MessageBoxButtons.OK, MessageBoxIcon.Information) 'Agregar registro a la lista lstAlumnos.Items.Add(strNombre & vbTab & strCurso & vbTab & strTurno) limpiar() End Sub Sub limpiar() cboCurso.Text = "Seleccione Curso" cboDia.Text = "Seleccione Curso" cboTurno.Text = "Seleccione Curso" txtAlumno.Text = String.Empty rbCheque.Checked = False rbContado.Checked = False rbCredito.Checked = False chkMayorDeEdad.Checked = False txtAlumno.Focus() End Sub End Class
CARRERAS PROFESIONALES
CIBERTEC
8. Ingresar nombres del Alumno, selecciona botn Aceptar y mostrar la siguiente ventana de entrada de datos
CIBERTEC
CARRERAS PROFESIONALES
42
11. Una vez ingresado el alumno sus datos quedan registrados y se visualizan en el listbox.
CARRERAS PROFESIONALES
CIBERTEC
Laboratorio 2.2
Manejo de clases y objetos
En este laboratorio se resolver el siguiente caso aplicando los conceptos de POO. Se debe crear una aplicacin que permita el registro de los datos del docente o del administrativo. En una empresa Educativa se desea controlar el registro de sus empleados, los cules han sido clasificados como Docentes o Administrativos. Para todo empleado se desea conocer su cdigo, nombres, apellidos, DNI, direccin, fecha de nacimiento y fecha de ingreso. Adems, se debera obtener su edad y tiempo de servicio. El Docente es un empleado, pero tambin tiene un curso y horas trabajadas. El sueldo de un docente es el producto de horas por tarifa, la cul depende del curso que se dicta. Curso VB.NET 2008 ORACLE WINDOWS 2003 SERVER SQL SERVER 2008 Tarifa($) 45 65 70 40
El Administrativo es un empleado, pero tambin tiene un rea de trabajo, sueldo bruto y AFP. AFP INTEGRA PRIMA PROFUTURO HORIZONTE % 12.3 12.6 11.9 12.4
El sueldo de un administrativo se calcula por la diferencia del sueldo bruto menos el monto de AFP. 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio3_2.
CIBERTEC
CARRERAS PROFESIONALES
44
4. Disee la GUI del formulario teniendo en cuenta los siguientes controles que se colocan en la tabla adjunta.
Objeto Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 ComboBox1 ComboBox2 ComboBox3 ComboBox4 TextBox1 TextBox1 TextBox2 TextBox2 TextBox3 TextBox3 TextBox4 TextBox4
Propiedad Text Text Text Text Text Text Text Text Text Text Text Text Name Name Name Name Name Text Name Text Name Text Name Text
Valor Tipo de empleado Cdigo Nombres Apellidos Direccin Fecha de Nacimiento Fecha de Ingreso Curso Horas Area Sueldo AFP cboEmpleado cboCurso cboArea cboAFP txtCodigo Vaco txtNombres Vaco txtApellidos Vaco txtDireccion Vaco
CARRERAS PROFESIONALES
CIBERTEC
TextBox5 TextBox5 TextBox6 TextBox6 GroupBox1 GroupBox2 GroupBox3 Button1 Button1 Button2 Button2 DateTimepicker1 DateTimepicker1 DateTimepicker2 DateTimepicker2
Name Text Name Text Name Name Name Name Text Name Text Name Format Name Format
txtHoras Vaco txtSueldoBruto Vaco grpDatosGenerales grpDocente grpEmpleado btnRegistrar Registrar btnLimpiar Limpiar DtpFecNac Short DtpFecIng Short
5. Primero se deben crear las clases necesarias para el desarrollo del caso. Click derecho a nivel del proyecto Add Class . Repetir este paso tres veces para crear las clases Emleado, Docente y Administrativo.
6. Luego se debe codificar la clase base o padre, es decir, Empleado. Aqu se crearn los atributos, propiedades, constructor y mtodos.
Public Class Empleado 'atributos Protected strCodigo As String Protected strNombres As String Protected strApellidos As String Protected strDireccion As String Protected strDNI As String Protected dtFechaNac As Date Protected dtFechaIng As Date
CIBERTEC
CARRERAS PROFESIONALES
46
'construtor Sub New() strCodigo = "" strNombres = "" strApellidos = "" strDireccion = "" strDNI = "" dtFechaNac = Now dtFechaIng = Now End Sub 'propiedades pblicas Public Property Codigo() As String Get Return strCodigo End Get Set(ByVal value As String) strCodigo = value End Set End Property Public Property Nombres() As String Get Return strNombres End Get Set(ByVal value As String) strNombres = value End Set End Property Public Property Apellidos() As String Get Return strApellidos End Get Set(ByVal value As String) strApellidos = value End Set End Property Public Property DNI() As String Get Return strDNI End Get Set(ByVal value As String) strDNI = value End Set End Property Public Property Direccion() As String Get Return strDireccion End Get Set(ByVal value As String) strDireccion = value End Set End Property Public Property FechaNacimiento() As Date Get Return dtFechaNac End Get Set(ByVal value As Date) dtFechaNac = value End Set End Property Public Property FechaIngreso() As Date
CARRERAS PROFESIONALES
CIBERTEC
Get Return dtFechaIng End Get Set(ByVal value As Date) dtFechaIng = value End Set End Property 'mtodo pblicos Public Function obtenerEdad() As Int16 Return DateDiff(DateInterval.Year, dtFechaNac.Date, Now.Date) End Function Public Function obtenerTiempoServicio() As Int16 Return DateDiff(DateInterval.Year, dtFechaIng.Date, Now.Date) End Function End Class
7. En la clase Docente se tendr este otro cdigo. Aqu aplicamos herencia a travs de la palabra inherits.
Public Class Docente Inherits Empleado 'atributo Private strCurso As String Private dbHoras As Double 'constructor Sub New() strCurso = "" dbHoras = 0 End Sub 'propiedades pblicas Public Property Curso() As String Get Return strCurso End Get Set(ByVal value As String) strCurso = value End Set End Property Public Property Horas() As Double Get Return dbHoras End Get Set(ByVal value As Double) dbHoras = value End Set End Property 'mtodos pblicos Public Function obtenerSueldo() As Double Select Case strCurso Case "VB.NET 2008" Return 45 * dbHoras Case "ORACLE" Return 65 * dbHoras Case "WINDOWS 2003 SERVER" Return 70 * dbHoras Case "SQL SERVER 2008" Return 40 * dbHoras End Select End Function
CIBERTEC
CARRERAS PROFESIONALES
48
End Class
9. En la vista cdigo del formulario Form1 Declarar el mtodo cargarCombo e invocarlo desde el evento Load del formulario.
Public Class Form1 Sub cargarCombos() 'Cursos cboCurso.Items.Add("VB.NET 2008") cboCurso.Items.Add("ORACLE") cboCurso.Items.Add("WINDOWS 2003 SERVER") cboCurso.Items.Add("SQL SERVER 2008") cboCurso.SelectedIndex = 0 'reas
CARRERAS PROFESIONALES
CIBERTEC
cboArea.Items.Add("SISTEMAS") cboArea.Items.Add("RRHH") cboArea.Items.Add("VENTAS") cboArea.Items.Add("LOGISTICA") cboArea.Items.Add("FINANZAS") cboArea.SelectedIndex = 0 'AFPs cboAFP.Items.Add("INTEGRA") cboAFP.Items.Add("PRIMA") cboAFP.Items.Add("PROFUTURO") cboAFP.Items.Add("HORIZONTE") cboAFP.SelectedIndex = 0 End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cargarCombos() End Sub End Class
10. A nivel del botn Registrar, declare un objeto Docente o Administrativo segn sea necesario.
Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click 'verificar que empleado se eligi If cboEmpleado.SelectedIndex = 0 Then Dim oDocente As New Docente With oDocente .Codigo = txtCodigo.Text.Trim .Nombres = txtNombres.Text.Trim .Apellidos = txtApellidos.Text.Trim .Direccion = txtDireccion.Text.Trim .DNI = txtDNI.Text.Trim .FechaNacimiento = dtpFecNac.Value .FechaIngreso = dtpFecIng.Value .Curso = cboCurso.SelectedItem.ToString .Horas = CDbl(txtHoras.Text.Trim) End With MessageBox.Show("Registro realizado correctamente" & vbCrLf & _ "Sueldo docente:" & oDocente.obtenerSueldo.ToString & _ vbCrLf & "Tiempo de servicio:" & oDocente.obtenerTiempoServicio.ToString) Else
Dim oAdmin As New Administrativo With oAdmin .Codigo = txtCodigo.Text.Trim .Nombres = txtNombres.Text.Trim .Apellidos = txtApellidos.Text.Trim .Direccion = txtDireccion.Text.Trim .DNI = txtDNI.Text.Trim .FechaNacimiento = dtpFecNac.Value .FechaIngreso = dtpFecIng.Value .Area = cboArea.SelectedItem.ToString .Sueldo = CDbl(txtSueldo.Text.Trim) End With MessageBox.Show("Registro realizado correctamente" & vbCrLf & _ "Sueldo administrativo:" & oAdmin.obtenerSueldo.ToString & _ vbCrLf & "Tiempo de servicio:" & oAdmin.obtenerTiempoServicio.ToString)
CIBERTEC
CARRERAS PROFESIONALES
50
11. A nivel del botn Limpiar, coloque este cdigo para borrar los datos del regsitro.
Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click 'limpiar todas las cajas de texto de un groupbox For Each c As Control In Me.grpDatosGenerales.Controls If TypeOf c Is TextBox Then CType(c, TextBox).Clear() End If Next txtHoras.Clear() txtSueldo.Clear() cboEmpleado.SelectedIndex = 0 cboAFP.SelectedIndex = 0 cboArea.SelectedIndex = 0 cboCurso.SelectedIndex = 0 cboEmpleado.Focus() grpDocente.Enabled = False grpAdministrativo.Enabled = True End Sub
12. A nivel del combo cboEmpleado en su evento SelectedIndexChanged, coloque este cdigo para habilitar el groupBox que corresponde por el tipo de empleado.
Private Sub cboEmpleado_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboEmpleado.SelectedIndexChanged If cboEmpleado.SelectedIndex = 0 Then grpDocente.Enabled = True grpAdministrativo.Enabled = False Else grpAdministrativo.Enabled = True grpDocente.Enabled = False End If End Sub
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacin
1.
Qu es una clase?
2.
Qu es un objeto?
3.
Qu es un formulario?
4.
CIBERTEC
CARRERAS PROFESIONALES
52
Para Recordar
Cuando se crea un proyecto de tipo Windows Application, lo primero que se presenta dentro del diseador es un formulario, el cual es la base para la base de aplicaciones Windows. Todo control u objeto presenta propiedades, eventos y mtodos los que se permiten manipular su comportamiento en la aplicacin. Una clase es una agrupacin de objetos que poseen caractersticas comunes y adems posee atributos y operaciones propias, las cuales pueden ser heredadas a sus miembros.
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
2
SEMANA
3
TIPOS DE DATOS Y COLECCIONES I
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaborarn operaciones eficientes de almacenamiento, bsqueda y consultas mediante el empleo de colecciones del namespace System.Collections apropiadas del .NET Framework 2.0.
TEMARIO
Conociendo los elementos de cdigo fuente de VB .NET: tipos de datos, variables, constantes, arreglos, estructuras, enumeraciones y los operadores arimeticos, logicos, matematicos y ternario. Colecciones en .NET Framework, definicin, mtodos y propiedades Trabajar con ArrayList,HashTable, Snack y Queue
ACTIVIDADES PROPUESTAS Los alumnos conocen las colecciones del .NET Framework Los alumnos desarrollan aplicaciones Windows utilizando colecciones para almacenar registros. Los alumnos desarrollan los laboratorios de esta semana
CIBERTEC
CARRERAS PROFESIONALES
54
1.
Tipos de Datos
Un tipo de dato determina la naturaleza de los valores que puede tomar una variable., las operaciones en las que puede participar y el espacio de memoria que necesita. Estructura de tipo Common Language Runtime Boolean
Byte Char
DateTime
8 bytes
0:00:00 (medianoche) del 1 de enero de 0001 a 11:59:59 p.m. del 31 de diciembre de 9999. 0 a +/79.228.162.514.264.337.593. 543.950.335 (+/-7,9... E+28) sin separador decimal; 0 a +/7,9228162514264337593543 950335 con 28 posiciones a la derecha del decimal; el nmero distinto de cero ms pequeo es +/0,0000000000000000000000 000001 (+/-1E-28) -1,79769313486231570E+308 a -4,94065645841246544E324 para los valores negativos; 4,94065645841246544E-324 a 1,79769313486231570E+308 para los valores positivos -2.147.483.648 a 2.147.483.647 (con signo) -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 (9,2...E+18 ) (con signo) Cualquier tipo puede almacenarse en una variable de tipo Object
Decimal
Decimal
16 bytes
Double
8 bytes
Int32 Int64
4 bytes 8 bytes
Object (clase)
CARRERAS PROFESIONALES
CIBERTEC
8 bytes en plataforma de 64 bits SByte Short (entero corto) Single (punto flotante de precisin simple) String (longitud variable)
SByte Int16
1 byte 2 bytes
Single
4 bytes
-3,4028235E+38 a 1,401298E-45 para los valores negativos; 1,401298E-45 a 3,4028235E+38 para los valores positivos 0 a 2.000 millones de caracteres Unicode aprox.
String (clase)
En la notacin cientfica, "E" hace referencia a una potencia de 10. Por lo tanto, 3,56E+2 significa 3.56 x
2
10 o 356, y
2.
A las variables no declaradas y a las variables declaradas sin un tipo de datos se les asigna el tipo de datos Object. Esto facilita la creacin ms rpida de programas, pero puede provocar que se ejecuten de una forma ms lenta. Establecimiento inflexible de tipos La especificacin de tipos de datos para todas las variables recibe el nombre de establecimiento inflexible de tipos. La utilizacin del establecimiento inflexible de tipos tiene diversas ventajas:
Habilita la compatibilidad con IntelliSense para las variables. Esto le permite ver las propiedades de las variables y otros miembros a medida que escribe el cdigo. Saca partido de la comprobacin de tipos del compilador. Permite detectar las instrucciones que pueden fallar en tiempo de ejecucin debido a errores tales como el desbordamiento. Tambin detecta llamadas a mtodos en objetos que no las admiten. Tiene como consecuencia una ejecucin ms rpida del cdigo.
Tipos de datos ms eficaces Para las variables que no contienen nunca valores decimales, los tipos de datos integrales son ms eficientes que los tipos no integrales. En Visual Basic, Integer y UInteger son los tipos numricos ms eficaces. Para los nmeros fraccionarios, Double es el ms eficaz de los tipos de datos, porque los procesadores de las plataformas actuales realizan las operaciones de punto flotante en precisin doble. Sin embargo, las operaciones con Double no son tan rpidas como con los tipos integrales como Integer.
CIBERTEC
CARRERAS PROFESIONALES
56
Variables Una variable tiene un nombre (la palabra que se usa para referirse al valor que contiene la variable). Una variable tambin tiene un tipo de datos, que determina el tipo de datos que puede almacenar la variable. Utilice Instruccin Dim (Visual Basic) para declarar una variable de un tipo especfico. Puede especificar su nivel de acceso simultneamente utilizando la palabra clave Public (Visual Basic), Protected (Visual Basic), Friend (Visual Basic) o Private (Visual Basic). Dim nombre_variable as Tipo Dim nombre_variable as Tipo = valor Visual Basic 2008 proporciona inferencia de tipo local, que le permite declarar las variables sin tener que indicar de forma explcita un tipo de datos. En lugar de ello, el compilador deduce el tipo de la variable a partir del tipo de la expresin de inicializacin. Public Sub inferenceExample() ' Usar el tipo explcitamente Dim num1 As Integer = 3 ' Usar un tipo local inferido Dim num2 = 3 End Sub Nota: La inferencia de tipo de variable local no se puede utilizar para declarar los campos de clase. Si num2, en el ejemplo anterior, fuese un campo en vez de una variable local, la declaracin provocara un error con la instruccin Option Strict activada y clasificara num2 como Object con la instruccin Option Strict desactivada.
Option Infer Una nueva opcin, Option Infer, permite especificar si la inferencia de tipo de variable local se permite en un archivo determinado. Para habilitar o bloquear la opcin, escriba una de las instrucciones siguientes al principio del archivo. Option Infer On Option Infer Off Si no especifica ningn valor para Option Infer en el cdigo, el valor predeterminado del compilador es Option Infer On para los proyectos creados en Visual Basic 2008 y Option Infer Off para los proyectos actualizados a partir de versiones anteriores. Para obtener ms informacin, consulte Option Infer (Instruccin) y /optioninfer.
CARRERAS PROFESIONALES
CIBERTEC
Matrices O Arreglos Una dimensin es una direccin en la que puede variar la especificacin de los elementos de una matriz. Una matriz que contiene el total de ventas de todos los das del mes tiene una dimensin (el da del mes). Una matriz que contiene el total de ventas por departamento de todos los das del mes tiene dos dimensiones (el nmero del departamento y el da del mes). El nmero de dimensiones que tiene una matriz se denomina rango. Trabajar con dimensiones Para especificar un elemento de una matriz, proporcione un ndice o un subndice para cada una de sus dimensiones. Los elementos son contiguos a lo largo de cada dimensin del ndice 0 al ndice ms alto para esa dimensin. Las ilustraciones siguientes muestran la estructura conceptual de matrices con rangos diferentes. Cada elemento de las ilustraciones muestra los valores de ndice que tienen acceso a l. Por ejemplo, puede tener acceso al primer elemento de la segunda fila de la matriz bidimensional especificando los ndices (1, 0). Matriz unidimensional
Matriz bidimensional
CIBERTEC
CARRERAS PROFESIONALES
58
Matriz tridimensional
Declaracin de una matriz unidimensional Dim nombre_matriz () as Tipo = new Tipo () {} Esta declaracin nos muestra un matriz de longitud cero. Utilice Instruccin ReDim (Visual Basic) no slo para crear una matriz sino para inicializar su longitud. ReDim nombre_matriz (Indice mximo) Nota: La clusula New debe especificar el nombre de tipo, seguido de parntesis y luego llaves, {}. Los parntesis no representan una llamada a un constructor de matriz. Indican que el tipo de objeto es un tipo de matriz. Las llaves proporcionan los valores de inicializacin. El compilador requiere las llaves aunque no proporcionen ningn valor. Por consiguiente, la clusula New debe incluir parntesis y llaves, aunque estn vacos.
Ejemplos de declaraciones de matrices Dim edades(10) As Int32 Dim contadores(20, 5) As Byte Dim temperaturaDeAire(10,10, 8) As Single
CARRERAS PROFESIONALES
CIBERTEC
Constantes de Visual Basic Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecucin de una aplicacin. Utilice las constantes de su cdigo para valores que se utilizan repetidamente o para facilitar la lectura del cdigo. Public Const DaysInYear = 365 Private Const WorkDays = 250 Public Const MyInteger As Integer = 42 Private Const DaysInWeek As Short = 7 Protected Friend Const Funday As String = "Sunday" Declaracin de varias constantes Public Const Four As Integer = 4, Five As Integer = 5, Six As Integer = 44 Enumeraciones de Visual Basic Una enumeracin se crea con la instruccin Enum en la seccin de declaraciones de una clase o mdulo. No puede declarar una enumeracin dentro de un mtodo. Para especificar el nivel adecuado de acceso, utilice Private, Protected, Friend o Public. Un tipo Enum tiene un nombre, un tipo subyacente y un conjunto de campos, cada uno de los cuales representa una constante. El nombre debe ser un calificador de Visual Basic 2005 vlido. El tipo subyacente debe ser uno de los tipos de enteros Byte, Short, Long o Integer. Integer es el valor predeterminado. Las enumeraciones tienen siempre establecimiento inflexible de tipos y no son intercambiables con los tipos de nmeros enteros. Las enumeraciones no pueden tener valores de punto flotante. Si se asigna un valor de punto flotante a una enumeracin con Option Strict On, se producir un error del compilador. Si Option Strict es Off, el valor se convierte automticamente en el tipo Enum. [Private] o [Public] o [Friend] o [Protected] Enum Enumeracion1 Miembros End Enum Ejemplo Public Enum Dias Sunday 'valor 0 Monday 'valor 1 Tuesday 'valor 2 Wednesday 'valor 3 Thursday 'valor 4 Friday 'valor 5 Saturday 'valor 6 End Enum
CIBERTEC
CARRERAS PROFESIONALES
60
'recorrer elementos de la enumeracin Dim items As Array items = System.Enum.GetValues(GetType(Dias)) Dim item As String For Each item In items Messagebox.show(item) Next Operadores de Visual Basic Visual Basic proporciona los tipos de operadores siguientes:
Operadores aritmticos, realizan los clculos familiares en valores numricos, incluido el desplazamiento de sus modelos de bits. Operador ^ * / Mod + \ Potencia Multiplicacin Divisin real Residuo Suma Resta Divisin entera Operacin
Operadores de comparacin, comparan dos expresiones y devuelven un valor Boolean que representa el resultado de la comparacin. Operador = <> < > >=,<= like Igual Diferente de Menor que Mayor que Mayor igual o Menor igual Compara dos cadenas. * Cero o ms caracteres ? Cualquier catacter Operacin
CARRERAS PROFESIONALES
CIBERTEC
Operadores de concatenacin, combinan varias cadenas en una sola. Operador & Operacin Concatena cadenas
Operadores lgicos en Visual Basic, combinan valores Boolean o numricos y devuelven un resultado del mismo tipo de datos que los valores. Operador And Or Xor Not Y lgico O lgico O exclusivo Negacin
Los elementos de valor que se combinan con un operador se denominan operandos de ese operador. Los operadores combinados con los elementos de valor forman expresiones, salvo el operador de asignacin, que forma una instruccin.
Operador ternario
En ingls: Ternary operator. Esto es algo que Visual Basic nunca ha tenido y muchos "pedamos", en C/C# es el operador ? : que se usa de esta forma: String s = 10>5? "10 es mayor que 5":"10 no es mayor que 5";
Es decir, se evala una expresin y si se cumple, se usa lo que hay despus de la interrogacin?, si no se cumple, se usa lo que haya despus de los dos puntos : En Visual Basic 9.0 se usa con el IF normal, pero en "modo funcin", y sera el equivalente a IIF, con la ventaja de que el tipo de datos devuelto no hay que "convertirlo", ya que si lo que se devuelve es una cadena, pues el tipo devuelto (o valor) es una cadena, que es un tipo Double, pues... es decir, est "mejorado" con respecto a lo que tenamos con el actual IIF. La forma de usar el operador ternario en Visual Basic 2008 es esta: Dim s As String = Iff(10 > 5, "10 es mayor que 5", "10 no es mayor que 5")
CIBERTEC
CARRERAS PROFESIONALES
62
1. System.Collections
El espacio de nombres System.Collections contiene interfaces y clases que definen varias colecciones de objetos, como listas, colas, matrices de bits, tablas hash y diccionarios. Clase ArrayList Descripcin Implementa la interfaz IList mediante una matriz cuyo tamao aumenta dinmicamente segn se requiera.
CollectionBase Proporciona la clase base abstract para colecciones con establecimiento inflexible de tipos. Comparer Compara dos objetos para ver si son iguales teniendo en cuenta la distincin entre maysculas y minsculas de las cadenas. Representa una coleccin de pares de clave y valor organizados en funcin del cdigo hash de la clave. Representa una coleccin de objetos de tipo "primero en entrar, primero en salir". Representa una coleccin de pares de clave y valor ordenados por claves a los que se puede tener acceso por clave y por ndice. Representa una coleccin sencilla de objetos no genricos LIFO ("ltimo en entrar, primero en salir").
Stack
1.1.
ArrayList (Clase)
Implementa la interfaz IList mediante una matriz cuyo tamao aumenta dinmicamente segn se requiera. No se garantiza que la matriz ArrayList est ordenada. Debe ordenar la matriz ArrayList antes de realizar operaciones (como BinarySearch) que requieren que la matriz ArrayList est ordenada. La capacidad de un objeto ArrayList es el nmero de elementos que puede contener el objeto ArrayList. A medida que se agregan elementos a ArrayList, la capacidad aumenta automticamente segn lo requiera la reasignacin. Se puede disminuir la capacidad llamando al mtodo TrimToSize o estableciendo explcitamente la propiedad Capacity. Se puede obtener acceso a los elementos de esta coleccin utilizando un ndice entero. Los ndices de esta coleccin estn basados en cero. El objeto ArrayList acepta Nothing como valor nulo y permite elementos duplicados.
CARRERAS PROFESIONALES
CIBERTEC
Public Class EjemplosArrayList Public Sub MostrarValues(ByVal myList As ArrayList) Dim obj As Object For Each obj In myList ListBox1.Items.Add(obj) Next End Sub Private Sub EjemplosArrayList_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' Crear e inicializar un ArrayList. Dim myAL As New ArrayList() myAL.Add("Hello") myAL.Add("World") myAL.Add("!") ' Mostrar datos ListBox1.Items.Add("ArrayList: myAL") ListBox1.Items.Add("Cantidad " & vbTab & myAL.Count) ListBox1.Items.Add("Capacidad" & vbTab & myAL.Capacity) ListBox1.Items.Add("Valores:") MostrarValues(myAL) End Sub End Class 1.2. Hashtable (Clase)
Representa una coleccin de pares de clave y valor organizados en funcin del cdigo hash de la clave. Cada elemento es un par de clave y valor almacenado en un objeto DictionaryEntry. Una clave no puede ser nullNothingnullptrreferencia null (Nothing en Visual Basic), pero un valor s puede serlo. Los objetos de claves deben permanecer inmutables mientras se utilicen como claves en Hashtable. Cuando se agrega un elemento a Hashtable, el elemento se coloca en un sector de almacenamiento en funcin del cdigo hash de la clave. Las bsquedas posteriores de la clave utilizarn su cdigo hash para buscar en un sector de almacenamiento determinado solamente; de este modo, se reducir considerablemente el nmero de comparaciones de clave necesarias para encontrar un elemento. 'crear elementos al HashTable Dim openWith As New Hashtable() 'agregar elementos al HashTable openWith.Add("txt", "notepad.exe") openWith.Add("bmp", "paint.exe") openWith.Add("dib", "paint.exe") openWith.Add("rtf", "wordpad.exe") 'se puede omitir el tipo de la variable Dim cadena = ""
CIBERTEC
CARRERAS PROFESIONALES
64
'recorrer elementos del HashTable For Each de As DictionaryEntry In openWith cadena &= de.Key & "-" & de.Value & vbCrLf Next MessageBox.Show(cadena) If Not openWith.ContainsKey("doc") Then MessageBox.Show("La clave ""doc"" no se encontr") End If 1.3. Queue (Clase)
Representa una coleccin de objetos de tipo "primero en entrar, primero en salir". Las colas son tiles para almacenar mensajes en el orden en el que fueron recibidos para el procesamiento secuencial. Esta clase implementa una cola como una matriz circular. Los objetos almacenados en Queue se insertan en un extremo y se quitan del otro. La capacidad de Queue es el nmero de elementos que Queue puede contener. A medida que se agregan elementos a Queue, la capacidad aumenta automticamente segn lo requiera la reasignacin. La capacidad se puede disminuir si se llama al mtodo TrimToSize. El factor de crecimiento es el nmero por el cual se multiplica la capacidad actual cuando se requiere una capacidad mayor. El factor de crecimiento se determina al construir la clase Queue. El factor de crecimiento predeterminado es 2,0. La capacidad de Queue siempre aumentar su capacidad en cuatro, como mnimo, con independencia del factor de crecimiento. Por ejemplo, un objeto Queue con un factor de crecimiento igual a 1,0 siempre aumentar su capacidad en cuatro cuando se requiera una capacidad mayor. Dim cola As New Queue Dim num1 = 10 Dim num2 = 20 Dim num3 = 35 'agrega objeto a la cola cola.Enqueue(num1) cola.Enqueue(num2) cola.Enqueue(num3) 'mostrar contenido eliminando elementos de cola While Not cola.Count > 0 MessageBox.Show("nmero:" & cola.Dequeue) End While MessageBox.Show("Cantidad de elementos:" & cola.Count) 1.4. Stack (Clase)
Representa una coleccin sencilla de objetos no genricos LIFO ("ltimo en entrar, primero en salir"). Stack se implementa como un bfer circular. La capacidad de Stack es el nmero de elementos que Stack puede contener. A medida que se agregan elementos a Stack, la capacidad aumenta automticamente segn lo requiera la reasignacin.
CARRERAS PROFESIONALES
CIBERTEC
Si Count es menor que la capacidad de la pila, Push es una operacin O(1). Si es necesario aumentar la capacidad para alojar el nuevo elemento, Push se convierte en una operacin O(n), en la que n es Count. Pop es una operacin O(1). Public class FrmEjemplo1 Dim myStack As New Stack 'agregar elementos a la pila myStack.Push("Hello") myStack.Push("World") myStack.Push("!") ' muestra cantidad de elementos MessageBox.Show("Stack : myStack" & vbCrLf & _ "Cantidad:" & myStack.Count) 'recorre los elementos de la pila MostrarValues(myStack) Public Sub MostrarValues(ByVal myCollection As Stack) While myCollection.Count > 0 MessageBox.Show(myCollection.Pop()) End While End Sub End class
CIBERTEC
CARRERAS PROFESIONALES
66
Laboratorio 3.1
Manejo de Colecciones desde la propiedad Items de los objetos Listbox y Combobox 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio3_1. 4. Disee la siguiente GUI del formulario
5. El control Listbox debe tener en su propiedad SelectionMode el valor MultiExtended. 6. En el evento click del btnAgregar coloque este cdigo: Private Sub btnAgregarG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarG.Click 'Agregar un elemento a la coleccin Items del Listbox 'validar que no est vaca la caja y que no se repita If lstGaseosas.FindStringExact(txtGaseosa.Text.Trim) Then If txtGaseosa.Text.Trim <> String.Empty Then lstGaseosas.Items.Add(txtGaseosa.Text.Trim.ToUpper) txtGaseosa.Clear() txtGaseosa.Focus() End If End If End Sub
CARRERAS PROFESIONALES
CIBERTEC
7. En el evento click del btnEliminar coloque este cdigo: Private Sub btnEliminarG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarG.Click 'validar si hay un elemento seleccionado If lstGaseosas.SelectedIndex <> -1 Then 'eliminar elemento seleccionado lstGaseosas.Items.RemoveAt(lstGaseosas.SelectedIndex) End If End Sub 8. En el evento click del btnEliminarxIndiceG coloque este cdigo Private Sub btnEliminarxIndiceG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarxIndiceG.Click Dim strIndice = InputBox("Ingrese ndice") If IsNumeric(strIndice) And Val(strIndice) < lstGaseosas.Items.Count Then lstGaseosas.Items.RemoveAt(CInt(strIndice)) End If End Sub 9. En el evento click del botn InsertarxIndice coloque este cdigo Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsertar.Click Dim strIndice = InputBox("Ingrese ndice") If IsNumeric(strIndice) And Val(strIndice) <= lstGaseosas.Items.Count Then lstGaseosas.Items.Insert(CInt(strIndice), txtGaseosa.Text.Trim) End If End Sub 10. En el evento click del botn Limpiar Todo coloque este cdigo Private Sub btnLimpiar2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar2.Click lstGaseosas.Items.Clear() End Sub 11. En el evento click del botn Agregar en la seccin del ComboBox. Coloque este cdigo Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click 'Agregar un elemento a la coleccin Items del ComboBox If cboDeportes.FindStringExact(txtDeporte.Text.Trim) = -1 Then If txtDeporte.Text.Trim <> String.Empty Then cboDeportes.Items.Add(txtDeporte.Text.Trim.ToUpper) End If End If txtDeporte.Clear() txtDeporte.Focus() End Sub
CIBERTEC
CARRERAS PROFESIONALES
68
12. En el evento click del botn Eliminar en la seccin del ComboBox. Coloque este cdigo Private Sub btnEliminarD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarD.Click 'validar si hay un elemento seleccionado If cboDeportes.SelectedIndex <> -1 Then 'eliminar elemento seleccionado cboDeportes.Items.RemoveAt(cboDeportes.SelectedIndex) End If End Sub 13. En el evento click del botn Limpiar en la seccin del ComboBox. Coloque este cdigo Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click cboDeportes.Items.Clear() End Sub 14. Ejecutar la aplicacin con F5, evaluar los resultados y luego cierre el formulario.
CARRERAS PROFESIONALES
CIBERTEC
Laboratorio 3.2
Manejo de Colecciones del namespace System.Collections 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio3_2. 4. Disee la siguiente GUI del formulario
5. Desde la vista cdigo del formulario Form1, digite el siguiente cdigo Public Class Form1 'declaracin de colecciones Dim miLista As New ArrayList Dim miTabla As New Hashtable Dim cola As New Queue Dim pila As New Stack Private Sub btnAgregarA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarA.Click 'verificar si elemento existe If miLista.Contains(txtGaseosa.Text.Trim) = False Then 'agregar elemento al ArrayList miLista.Add(txtGaseosa.Text) Else MessageBox.Show("Elemento repetido") End If
CIBERTEC
CARRERAS PROFESIONALES
70
txtGaseosa.Clear() txtGaseosa.Focus() End Sub Private Sub btnEliminarA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarA.Click 'buscar elemento para eliminar Dim eleBuscado = InputBox("Ingrese gaseosa a eliminar") For Each ele In miLista If ele = eleBuscado Then miLista.Remove(ele) 'elimina elemento encontrado Exit For 'abandona for End If Next End Sub Private Sub btnListarA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListarA.Click 'limpia listbox antes de listar lstElementos.Items.Clear() 'recorre elementos del ArrayList For Each ele In miLista lstElementos.Items.Add(ele) Next End Sub Private Sub btnAgregarH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarH.Click 'declara un componente que trabaja con clave y valor Dim eleH As DictionaryEntry eleH.Key = txtClave.Text eleH.Value = txtGaseosa2.Text 'verifica si el elemento existe en Hashtable If miTabla.Contains(eleH) = False Then 'agrega clave y valor como elemento del Hashtable miTabla.Add(txtClave.Text.Trim, txtGaseosa2.Text.Trim) Else MessageBox.Show("Elemento repetido") End If txtGaseosa2.Clear() txtClave.Clear() txtClave.Focus() End Sub Private Sub btnEliminarH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminarH.Click 'buscar elemento para eliminar Dim claveBuscada = InputBox("Ingrese clave de gaseosa a eliminar") 'verifica si clave existe If miTabla.ContainsKey(claveBuscada) = True Then miTabla.Remove(claveBuscada) 'elimina elemento Else MessageBox.Show("Clave no registrada") End If End Sub
CARRERAS PROFESIONALES
CIBERTEC
Private Sub btnListarH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListarH.Click 'borra elementos del listbox lstElementosH.Items.Clear() 'muestra el contenido actual del hashtable For Each ele As DictionaryEntry In miTabla lstElementosH.Items.Add(ele.Key & vbTab & ele.Value) Next End Sub Private Sub btnAgregarQ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarQ.Click 'verifica si elemento existe en cola If cola.Contains(txtCurso.Text) = False Then 'agrega elemento a la cola cola.Enqueue(txtCurso.Text.Trim) txtCurso.Clear() txtCurso.Focus() Else MessageBox.Show("Elemento repetido") End If End Sub
Private Sub btnListarQ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListarQ.Click 'borra elementos del listbox lstElementosQ.Items.Clear() 'recorre los elementos de la cola y los elimina luego de mostrarlos While cola.Count > 0 lstElementosQ.Items.Add(cola.Dequeue) End While End Sub Private Sub btnAgregarS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregarS.Click 'verifica si elemnto existe en pila If pila.Contains(txtDeporte.Text) = False Then 'agrega elemento a la pila pila.Push(txtDeporte.Text.Trim) txtDeporte.Clear() txtDeporte.Focus() Else MessageBox.Show("Elemento repetido") End If End Sub Private Sub btnListarS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListarS.Click 'borra elementos del listbox lstElementosS.Items.Clear() 'recorre los elementos de la pila y los elimina luego de mostrarlos While pila.Count > 0
CIBERTEC
CARRERAS PROFESIONALES
72
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacin
1. Qu propiedad del Listbox o combobox representa una coleccin? _____________________________________________________________________ _____________________________________________________________________ ____________________________________ 2. Qu colecciones pertenecen al namespace System.Collections? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ 3. Qu tipo de dato reciben estas colecciones? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ 4. Qu diferencia existe entre una coleccin Stack y una coleccin de tipo Queue? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
CIBERTEC
CARRERAS PROFESIONALES
74
Para Recordar
Visual Basic tambin proporciona una clase Collection, con la que puede definir y crear sus propias colecciones.
Las instancias de la clase Collection de Visual Basic permiten tener acceso a un elemento utilizando un ndice numrico o una clave String. Puede agregar elementos a los objetos Collection de Visual Basic especificando una clave o sin especificarla. Si agrega un elemento sin una clave, debe utilizar su ndice numrico para tener acceso a l.
Por contraste, las colecciones como System.Collections..::.ArrayList slo permiten un ndice numrico. No se pueden asociar claves con los elementos de estas colecciones, a menos que construya las suyas propias basadas en asignaciones, por ejemplo, en una matriz de String que contiene las claves.
Aunque el objeto Collection de Visual Basic tiene una funcionalidad idntica al objeto Collection de Visual Basic 6.0, estos objetos no pueden interoperar en un entorno COM.
El espacio de nombres System.Collections contiene interfaces y clases que definen varias colecciones de objetos, como listas, colas, matrices de bits, tablas hash y diccionarios.
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
2
SEMANA
4
Desarrollo de Aplicaciones con Colecciones II
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaborarn operaciones eficientes de almacenamiento, bsqueda y consultas mediante el empleo de colecciones genricas apropiadas del .NET Framework 2.0.
TEMARIO
Colecciones Genricas: List y Dictionary Manejo de errores: Try - Catch
ACTIVIDADES PROPUESTAS Los alumnos crean aplicaciones que almacenan informacin en colecciones genricas. Los alumnos crean aplicaciones que manejan errores con el bloque Try catch. Los alumnos desarrollan los laboratorios dirigidos de esta semana.
CIBERTEC
CARRERAS PROFESIONALES
76
1. Colecciones Genricas
El espacio de nombres System.Collections.Generic contiene interfaces y clases que definen colecciones genricas, permitiendo que los usuarios creen colecciones con establecimiento inflexible de tipos para proporcionar una mayor seguridad de tipos y un rendimiento mejor que los de las colecciones no genricas con establecimiento inflexible de tipos. 1.1. List(Of (T)) (Clase)
Representa una lista de objetos con establecimiento inflexible de tipos a la que se puede obtener acceso por ndice. Proporciona mtodos para buscar, ordenar y manipular listas. La clase List(Of (T)) es el equivalente genrico de la clase ArrayList. Implementa la interfaz genrica IList (Of (T)) mediante una matriz cuyo tamao aumenta dinmicamente segn se requiera. La clase List(Of (T)) utiliza un comparador de igualdad y un comparador de orden.
Los mtodos como Contains, IndexOf, LastIndexOf y Remove utilizan un comparador de igualdad para los elementos de lista. Los mtodos como BinarySearch y Sort utilizan un comparador de orden para los elementos de lista.
No se garantiza que el objeto List(Of (T)) est ordenado. Debe ordenar List(Of (T)) antes de realizar operaciones (como BinarySearch) que requieran que dicho objeto List(Of (T)) est ordenado. Se puede obtener acceso a los elementos de esta coleccin utilizando un ndice entero. Los ndices de esta coleccin estn basados en cero.
Public Sub Colecciones() Dim dinosaurs As New List (Of String) Messagebox.show("Capacity:" & dinosaurs.Capacity) dinosaurs.Add("Tyrannosaurus") dinosaurs.Add("Amargasaurus") dinosaurs.Add("Mamenchisaurus") dinosaurs.Add("Deinonychus") dinosaurs.Add("Compsognathus")
Mtodos Nombre Add BinarySearch Descripcin Agrega un objeto al final de List< (Of < (T)>). Sobrecargado. Utiliza un algoritmo de bsqueda binaria para localizar un elemento concreto en la List< (Of < (T)>) ordenada o en una parte de ella.
CARRERAS PROFESIONALES
CIBERTEC
Quita todos los elementos de List< (Of < (T>)>). Determina si un elemento se encuentra en List<(Of <(T>)>). Determina si el objeto Object especificado es igual al objeto Object actual. (Se hereda de Object). Determina si List< (Of < (T)>) contiene elementos que cumplen las condiciones definidas por el predicado especificado. Busca un elemento que cumpla las condiciones definidas por el predicado especificado y devuelve la primera aparicin en todo el objeto List< (Of < (T)>). Recupera todos los elementos que coinciden con las condiciones definidas por el predicado especificado. Sobrecargado. Busca un elemento que cumpla las condiciones definidas por un predicado especificado y devuelve el ndice de base cero de la primera aparicin en el objeto List<(Of < (T>)>) o en una parte de l. Busca un elemento que coincida con las condiciones definidas por el predicado especificado y devuelve la ltima aparicin en todo el objeto List< (Of <(T>)>). Sobrecargado. Busca un elemento que cumpla las condiciones definidas por un predicado especificado y devuelve el ndice de base cero de la ltima aparicin en el objeto List<(Of <(T>)>) o en una parte de l. Realiza la accin especificada en cada elemento de List< (Of <(T)>). Devuelve un enumerador que recorre en iteracin la coleccin List<(Of <(T>)>). Sobrecargado. Devuelve el ndice de base cero de la primera aparicin de un valor en la List<(Of <(T>)>) o en una parte de ella. Inserta un elemento en List<(Of <(T>)>), en el ndice especificado. Quita la primera aparicin de un objeto especfico de List<(Of <(T>)>). Quita todos los elementos que cumplen las condiciones definidas por el predicado especificado. Quita el elemento en el ndice especificado de List<(Of <(T>)>). Sobrecargado. Ordena los elementos en la List< (Of < (T>)>) o en una parte de ella. Devuelve una clase String que representa la clase Object actual. (Se hereda de Object).
FindAll FindIndex
FindLast
FindLastIndex
CIBERTEC
CARRERAS PROFESIONALES
78
1.2.
La clase genrica Dictionary (Of (TKey, TValue)) proporciona una asignacin de un conjunto de claves a un conjunto de valores. Cada elemento que se agrega al diccionario est compuesto de un valor y su clave asociada. Recuperar un valor utilizando su clave es muy rpido, cerca de O (1), porque la clase Dictionary (Of (TKey, TValue)) se implementa como una tabla hash. Nota: La velocidad de recuperacin depende de la calidad del algoritmo hash del tipo especificado para TKey. Mientras se utilice un objeto como clave en el diccionario Dictionary (Of (TKey, TValue)), dicho objeto no se debe modificar en modo alguno que afecte a su valor hash. Cada clave de un diccionario Dictionary(Of (TKey, TValue)) debe ser nica conforme al comparador de igualdad del diccionario. Una clave no puede ser nullNothingnullptrreferencia null (Nothing en Visual Basic), aunque un valor s puede serlo si el tipo de valor TValue es un tipo de referencia. Public Sub Colecciones2() Crear un objeto Diccionario que maneja clave y valor Dim openWith As New Dictionary(Of String, String) 'Agregar elementos al objeto Dictionary openWith.Add("txt", "notepad.exe") openWith.Add("bmp", "paint.exe") openWith.Add("dib", "paint.exe") openWith.Add("rtf", "wordpad.exe") 'validar que no se repita clave Try openWith.Add("txt", "winword.exe") Catch Messagebox.show ("An element with Key = ""txt"" already exists.") End Try ' Mostrar elemento por clave Messagebox.show(openWith("rtf"))
Try Mostrar el elemento cuya clave es tif Messagebox.show(openWith("tif"))) Catch Messagebox.show( ("Clave no fue encontrada") End Try End Sub
CARRERAS PROFESIONALES
CIBERTEC
Mtodos Nombre All Concat Contains Count Distinct ElementAt First FirstOrDefault Single SingleOrDefault ToArray ToList Descripcin Determina si todos los elementos de una secuencia satisfacen una condicin. (Definido por Enumerable). Concatena dos secuencias. (Definido por Enumerable). Sobrecargado. Sobrecargado. Sobrecargado. Devuelve el elemento situado en un ndice especificado de una secuencia. (Definido por Enumerable). Sobrecargado. Sobrecargado. Sobrecargado. Sobrecargado. Crea una matriz a partir de un objeto IEnumerable<(Of <(T>)>). (Definido por Enumerable). Crea un objeto List< (Of < (T>)>) a partir de un objeto IEnumerable<(Of <(T>)>). (Definido por Enumerable).
CIBERTEC
CARRERAS PROFESIONALES
80
Laboratorio 4.1
Manejo de Colecciones Genricas Se va desarrollar dos clases propias Registro y Comision 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio4_1. 4. Disee la siguiente GUI del formulario .
5. Debemos declarar dos clases propias : clase Comision Public Class Comision 'atributos privados Private factura As String Private vendedor As String Private monto As Single '(Real) 'constructor Sub New() factura = "" vendedor = "" monto = 0 End Sub 'propiedades de la clase
CARRERAS PROFESIONALES
CIBERTEC
Public Property p_factura() As String Get Return factura End Get Set(ByVal value As String) factura = value End Set End Property Public Property p_vendedor() As String Get Return vendedor End Get Set(ByVal value As String) vendedor = value End Set End Property Public Property p_monto() As Single Get Return monto End Get Set(ByVal value As Single) monto = value End Set End Property 'mtodo con retorno Public Function obtenerComision() As Single Return monto * 0.05 End Function End Class 6. Luego , declarar la clase Registro Public Class ClaseRegistro 'atributos privados Private codigo As String Private nombre As String Private he As Date Sub New() 'definir un constructor codigo = "" nombre = "" he = TimeOfDay 'hora actual End Sub Public Property p_codigo() As String Get Return codigo End Get Set(ByVal value As String) codigo = value End Set End Property
CIBERTEC
CARRERAS PROFESIONALES
82
Public Property p_nombre() As String Get Return nombre End Get Set(ByVal value As String) nombre = value End Set End Property Public ReadOnly Property p_hora() As Date Get Return he End Get End Property End Class 7. Finalmente, codificar el bloque para la coleccin List y luego la de la coleccin ArrayList Public Class frmColecciones 'DEFINES UN GENERICS LIST DE TIPO CLASECOMISION Private LCOMISION As New List(Of ClaseComision) Private Sub BTNAGREGAR_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTNAGREGAR.Click 'CREAR OBJETO DE TIPO CLASECOMISION Dim REG As New ClaseComision 'ASIGNAR VALORES A LAS PROPIEDADES DEL OBJETO REG.p_factura = TXTFACTURA.Text REG.p_vendedor = TXTVENDEDOR.Text REG.p_monto = Val(TXTMONTO.Text) 'AGREGAR OBJETO A LA COLECCION LIST LCOMISION.Add(REG) 'AGREGAR VALORES DEL OBJETO EN EL CONTROL LISTBOX ListBox1.Items.Add(REG.p_factura + vbTab + _ REG.p_vendedor + vbTab + REG.obtenerComision.ToString) End Sub Private Sub BTNQUITAR_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTNQUITAR.Click 'SI HAS SELECCIONADO: SELECTEDINDEX > -1 If ListBox1.SelectedIndex > -1 Then 'ELIMINAR DEL ARRAYLIST LCOMISION.RemoveAt(ListBox1.SelectedIndex) 'ELIMINA DEL CONTROL LISTBOX ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) End If End Sub Private Sub BTNCALCULAR_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTNCALCULAR.Click 'PARA CALCULAR SE VA A LEER LOS ELEMENTOS Dim REG As New ClaseComision 'VARIABLE PARA RECORRER COLECCION LCOMISION Dim COMISION As Single = 0 'ACUMULADOR 'POR CADA REG CONTENIDO EN EL GENERICS LCOMISION For Each REG In LCOMISION COMISION += REG.obtenerComision
CARRERAS PROFESIONALES
CIBERTEC
Next Me.TXTCOMISION.Text = COMISION End Sub 'DEFINIR AL DICTIONARY REGISTRO 'Dictionary(Of TipoDato de clave, TipoDato de elemento) Private DREGISTRO As New Dictionary(Of String, String) 'Private nombreObjeto As New 'Dictionary(Of Tipo de dato para clave, Tipo de dato para elemento Private Sub BTNAGREGAR2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNAGREGAR2.Click 'PREGUNTAR SI EXISTE EL CODIGO(clave) A INGRESAR 'ContainsKey(clave)-->Busca si existe la clave en el objeto Dictionary If DREGISTRO.ContainsKey(TXTCODIGO.Text) Then MessageBox.Show("YA EXISTE EL CODIGO") Else 'AGREGAR LOS ELEMENTOS AL objeto DICTIONARY 'objetoDictionary.Add(clave,elemento) DREGISTRO.Add(TXTCODIGO.Text, TXTNOMBRE.Text) MessageBox.Show("REGISTRADO") LISTADO() End If End Sub 'mtodo sin retorno Sub LISTADO() ListBox1.Items.Clear() 'LIMPIAR LA LISTA 'DEFINO EL KEYVALUEPAIR LLAMADO R ' Dim R As KeyValuePair(of TipoDato Clave,TipoDato de elemento) Dim R As KeyValuePair(Of String, String) 'POR CADA R DENTRO DE DREGISTRO(Dictionary) For Each R In DREGISTRO 'R.Key-->obtiene clave 'R.Value-->obtiene valor de elemento ListBox1.Items.Add(R.Key + vbTab + R.Value) Next End Sub Private Sub BTNQUITAR2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNQUITAR2.Click 'DEFINO UN INPUTBOX PARA INGRESAR EL CODIGO Dim COD As String = InputBox("INGRESE EL CODIGO") If DREGISTRO.ContainsKey(COD) = True Then 'ELIMINAR elemento por cdigo de dictionary DREGISTRO.Remove(COD) 'LISTAR LOS ELEMENTOS LISTADO() Else MessageBox.Show("CODIGO NO EXISTE") End If End Sub End Class
CIBERTEC
CARRERAS PROFESIONALES
84
Laboratorio 4.2
Manejo de Excepciones Se va desarrollar dos clases propias Registro y Comision 1. Ingrese a Visual Studio 2008 2. Seleccione men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio4_2. 4. Disee la siguiente GUI del formulario .
5. Coloca el cdigo fuente que le corresponde a cada botn Public Class Form1 'DECLARAR COLECCION DICTIONARY Dim MisAlumnos = New Dictionary(Of String, String) Private Sub btnProcesar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcesar.Click Try 'Aqui comienza el control de errores Dim dividendo As Int16 = Convert.ToInt16(txtNumero1.Text) 'Si hemos introducido cero como nmero2 Dim divisor As Int16 = Convert.ToInt16(txtNumero2.Text) Dim divisin As Int16 divisin = dividendo / divisor MessageBox.Show("Divisin:" & divisin.ToString) Catch ex As OverflowException 'Si se produce un error por divisin entre 0, se generar una excepcin
CARRERAS PROFESIONALES
CIBERTEC
'que se captura en este bloque de cdigo MessageBox.Show("Mensaje errror:Divisin por cero") Catch ex As Exception 'Si se produce un error e otro tipo, se generar una excepcin 'que se captura en este bloque de cdigo MessageBox.Show(ex.Message) MessageBox.Show("Origen error:" & ex.Source) Finally 'CODIGO QUE SIEMPRE SE EJECUTA End Try End Sub Private Sub btnIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIngresar.Click Try 'SI AGREGAMOS UNA CLAVE QUE EXISTA 'SE PRODUCE UN ERROR MisAlumnos.Add(txtCodigo.Text, txtAlumno.Text) lstAlumnos.Items.Add(txtCodigo.Text & txtAlumno.Text) txtAlumno.Clear() txtCodigo.Clear() txtCodigo.Focus() Catch ex As Exception 'SE CONTROLA ERROR INDICANDO EL MENSAJE MessageBox.Show("La clave es duplicada") End Try
End Sub Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click Try 'SI BUSCAMOS UNA CLAVE QUE NO EXISTE 'SE PRODUCE UN ERROR Dim clave = InputBox("Ingrese clave de alumno") MessageBox.Show("Alumno:" & MisAlumnos(clave)) Catch ex As Exception 'SE CONTROLA ERROR INDICANDO EL MENSAJE MessageBox.Show("Clave no existe") End Try End Sub End Class
Las excepciones se manejan con el uso de la palabra reservada Catch. La manera en la que .NET utiliza Catch es similar al uso de las sentencias condicionales Iff. Si dentro de un conjunto anidado de sent encias Catch se maneja una excepcin, el resto de instrucciones Catch no se ejecutan. Por lo tanto, el cdigo general del manejo de excepciones en un pequeo ejemplo de C# sera el siCuando se produce una excepcin, se preguntar por el primer Catch, y
CIBERTEC
CARRERAS PROFESIONALES
86
si se cumple, ya no se mirar otro Catch. Lo que se debe hacer, tal y como se indica en los ejemplos, es indicar las excepciones de manera que primero se gestione la excepcin ms concreta y precisa, y finalmente la excepcin ms general. La particularidad viene cuando modificamos en el entorno de desarrollo de Visual Studio 2005 la gestin de las excepciones, posicionando el manejo de excepciones general, antes o por delante del manejo de la excepcin concreta. La parte de cdigo escrito en C# correspondiente a la modificacin en la gestin de excepciones quedara de la siguiente manera: ... catch (Exception ex) { MessageBox.Show(ex.Message); } catch (DivideByZeroException) { MessageBox.Show("Divisin por cero"); } ...
El mismo cdigo equivalente pero en VB 2005, sera el sigiuente: ... Catch ex As Exception MessageBox.Show(ex.Message) Catch ex As OverflowException MessageBox.Show("Divisin por cero") End Try ...
Ahora bien, si utilizamos la modificacin de cdigo indicada anteriormente y acudimos al entorno de desarrollo, Visual Studio 2005 nos indicar un aviso para VB 2005 y un error para C#.
CARRERAS PROFESIONALES
CIBERTEC
La consecuencia es clara, mientras que VB 2005 nos permite ejecutar el cdigo, C# no. Esto nos lleva a una segunda consecuencia, y es que en el caso de VB 2005, el cdigo se ejecuta (el aviso no nos lo impide mientras que el error s), y por lo tanto, la gestin de excepciones no se realiza de forma satisfactoria, as que si trabajais a menudo con excepciones... cuidado con el uso de las mismas.
CIBERTEC
CARRERAS PROFESIONALES
88
Autoevaluacin
1. En que caso se requiere usar una coleccin Genrica? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ 2. Qu ventajas tiene usar una coleccin Genrica de una que no lo es? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ 3. Qu controla el bloque Try y el bloque Catch respectivamente? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
El espacio de nombres System.Collections.Generic contiene interfaces y clases que definen colecciones genricas, permitiendo que los usuarios creen colecciones con establecimiento inflexible de tipos para proporcionar una mayor seguridad de tipos y un rendimiento mejor que los de las colecciones no genricas con establecimiento inflexible de tipos. Dictionary<(Of <(TKey, TValue>)>) puede admitir varios sistemas de lectura a la vez, siempre y cuando no se modifique la coleccin La interfaz IDictionary<(Of <(TKey, TValue>)>) es la interfaz base para las colecciones genricas de pares de clave y valor. Cada elemento es un par de clave y valor almacenado en un objeto KeyValuePair<(Of <(TKey, TValue>)>). La interfaz genrica IList<(Of <(T>)>) es una descendiente de la interfaz genrica ICollection<(Of <(T>)>) y es la interfaz base de todas las listas genricas. Fuente Texto adaptado de las pginas web: http://msdn.microsoft.com/es-es/library/system.collections.generic.aspx http://geeks.ms/blogs/jorge/pages/Visual-Studio-2005-_3A003A00_-Diferencias-entiempo-de-dise_F100_o-de-C_2300_-y-VB-2005-en-el-uso-de-excepciones.aspx
CIBERTEC
CARRERAS PROFESIONALES
90
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
3
SEMANA
TEMARIO
Implementando un servicio de Windows desde vb .NET Configurar las propiedades de un servicio, manejo del Instalador de servicio Realizar consultas sobre los servicios de Windows
ACTIVIDADES PROPUESTAS Los alumnos desarrollan un servicio de Windows, lo instalan y lo ejecutan. Los alumnos desarrollan aplicaciones que consulten los servicios de Windows.
CIBERTEC
CARRERAS PROFESIONALES
92
1. Servicios Windows
Los Servicios de Windows son aplicaciones que funcionan sin interactuar directamente con el usuario y por regla general se inician junto con el sistema, sin que ningn usuario tenga que iniciarlo. 1. ServiceController (Clase)
Representa a un servicio de Windows y permite conectarse a un servicio en ejecucin o detenido, manipularlo u obtener informacin acerca del mismo. Se puede utilizar la clase ServiceController para conectarse y controlar el comportamiento de los servicios existentes. Al crear una instancia de la clase ServiceController, se pueden establecer las propiedades correspondientes de forma que interacten con un servicio de Windows especfico. De esta manera, se puede utilizar la clase para iniciar, detener o manipular el servicio. Probablemente, se utilizar el componente ServiceController para tareas administrativas. Por ejemplo, se puede crear una aplicacin para Windows o una aplicacin Web que enve los comandos personalizados a un servicio a travs de la instancia de ServiceController. Esto podra resultar de utilidad, porque el complemento Microsoft Management Console del Administrador de control de servicios (SCM, Service Control Manager) no admite comandos personalizados. Despus de crear una instancia de ServiceController, se deben establecer dos propiedades en ella para identificar el servicio con el que interacta: el nombre del equipo y el nombre del servicio que se desea controlar.
Definir el comportamiento del servicio En la clase de servicio, reemplace las funciones de clase base que determinan lo que ocurre cuando se cambia el estado del servicio en el Administrador de control de servicios. La clase ServiceBase expone los siguientes mtodos, que puede reemplazar para agregar comportamientos personalizados. Mtodo OnStart Reemplcelo para Indicar qu acciones deben ejecutarse cuando empieza a funcionar el servicio. Para que el servicio ejecute un trabajo til, deber escribir cdigo en este procedimiento. Indicar qu debe ocurrir cuando se pausa el servicio. Indicar qu debe ocurrir cuando se detenga la ejecucin del servicio. Indicar qu debe ocurrir cuando el servicio reanuda su funcionamiento normal tras una pausa. Indicar qu debe ocurrir justo antes de que el sistema se cierre, en caso de que se est ejecutando el servicio en ese momento. Indicar qu debe ocurrir cuando el servicio reciba un
OnCustomCommand
CARRERAS PROFESIONALES
CIBERTEC
comando personalizado. Para obtener ms informacin acerca de los comandos personalizados, consulte MSDN Online. OnPowerEvent Indicar cmo debe responder el servicio cuando se reciba un evento de administracin de energa, por ejemplo, una batera agotada o una operacin suspendida.
Imports System Imports System.ServiceProcess Imports System.Diagnostics Imports System.Threading Class Program Public Enum SimpleServiceCustomCommands StopWorker = 128 RestartWorker CheckWorker End Enum 'SimpleServiceCustomCommands Shared Sub Main(ByVal args() As String) Dim scServices() As ServiceController scServices = ServiceController.GetServices() Dim scTemp As ServiceController For Each scTemp In scServices If scTemp.ServiceName = "Simple Service" Then ' Display properties for the Simple Service sample ' from the ServiceBase example Dim sc As New ServiceController("Simple Service") Console.WriteLine("Status = " + sc.Status.ToString()) Console.WriteLine("Can Pause and Continue = " + _ sc.CanPauseAndContinue.ToString()) Console.WriteLine("Can ShutDown = " + sc.CanShutdown.ToString()) Console.WriteLine("Can Stop = " + sc.CanStop.ToString()) If sc.Status = ServiceControllerStatus.Stopped Then sc.Start() While sc.Status = ServiceControllerStatus.Stopped Thread.Sleep(1000)
CIBERTEC
CARRERAS PROFESIONALES
94
sc.Refresh() End While End If ' Issue custom commands to the service ' enum SimpleServiceCustomCommands ' { StopWorker = 128, RestartWorker, CheckWorker }; sc.ExecuteCommand(Fix(SimpleServiceCustomCommands.StopWorker)) sc.ExecuteCommand(Fix(SimpleServiceCustomCommands.RestartWorker)) sc.Pause() While sc.Status <> ServiceControllerStatus.Paused Thread.Sleep(1000) sc.Refresh() End While Console.WriteLine("Status = " + sc.Status.ToString()) sc.Continue() While sc.Status = ServiceControllerStatus.Paused Thread.Sleep(1000) sc.Refresh() End While Console.WriteLine("Status = " + sc.Status.ToString()) sc.Stop() While sc.Status <> ServiceControllerStatus.Stopped Thread.Sleep(1000) sc.Refresh () End While Console.WriteLine("Status = " + sc.Status.ToString()) Dim argArray() As String = _ {"ServiceController arg1", "ServiceController arg2"} sc.Start(argArray) While sc.Status = ServiceControllerStatus.Stopped Thread.Sleep(1000) sc.Refresh() End While Console.WriteLine ("Status = " + sc.Status.ToString()) ' Display the event log entries for the custom commands ' and the start arguments. Dim el As New EventLog("Application") Dim elec As EventLogEntryCollection = el.Entries Dim ele As EventLogEntry
CARRERAS PROFESIONALES
CIBERTEC
For Each ele in elec If ele.Source.IndexOf("SimpleService.OnCustomCommand") >= 0 Or ele.Source.IndexOf("SimpleService.Arguments") >= 0 Then Console.WriteLine (ele.Message) End If Next ele End If Next scTemp End Sub 'Main End Class 'Program This sample displays the following output if the Simple Service sample is running: 'Status = Running 'Can Pause and Continue = True 'Can ShutDown = True 'Can Stop = True 'Status = Paused 'Status = Running 'Status = Stopped 'Status = Running '4:14:49 PM - Custom command received: 128 '4:14:49 PM - Custom command received: 129 'ServiceController arg1 'ServiceController arg2
2.
ServiceBase (Clase)
Proporciona una clase base para un servicio que existir como parte de una aplicacin de servicio. Deber derivarse de ServiceBase cuando se cree una nueva clase de servicio. Derive de ServiceBase al definir la clase de servicio de una aplicacin de servicio. Cualquier servicio til reemplaza los mtodos OnStart y OnStop. Para obtener funcionalidad adicional, puede reemplazar OnPause y OnContinue por un comportamiento especfico en respuesta a cambios en el estado del servicio. Un servicio es un ejecutable de ejecucin larga que no admite una interfaz de usuario y que puede no ejecutarse en la cuenta de usuario que ha iniciado la sesin. El servicio puede ejecutarse sin que ningn usuario haya iniciado una sesin en el equipo. De forma predeterminada, los servicios se ejecutan en la cuenta de sistema, que no es igual que la cuenta de administrador. No puede cambiar los derechos de la cuenta de sistema. De modo alternativo, puede utilizar ServiceProcessInstaller para especificar una cuenta de usuario en la que se ejecutar el servicio.
CIBERTEC
CARRERAS PROFESIONALES
96
Un ejecutable puede contener ms de un servicio, pero tiene que contener un componente ServiceInstaller independiente para cada uno de los servicios. La instancia de ServiceInstaller registra el servicio en el sistema. Asimismo, el instalador asocia cada servicio a un registro de eventos que puede utilizar para registrar comandos de servicio. La funcin main() del ejecutable define qu servicios deben ejecutarse. El directorio de trabajo actual del servicio es el directorio del sistema, no el directorio en el que est situado el ejecutable. Cuando se inicia un servicio, el sistema busca el ejecutable y ejecuta el mtodo OnStart de ese servicio, contenido dentro del ejecutable. Sin embargo, ejecutar el servicio no equivale a ejecutar el ejecutable. El ejecutable solamente carga el servicio. Se obtiene acceso al servicio (por ejemplo, lo inicia y lo detiene) mediante el Administrador de control de servicios. El ejecutable llama al constructor de la clase derivada de ServiceBase la primera vez que se llama a Start para el servicio. Se llama al mtodo de control de comandos OnStart inmediatamente despus de que se ejecute el constructor. El constructor no se vuelve a ejecutar despus de la primera vez que se ha cargado el servicio, por lo que es necesario separar el procesamiento realizado por el constructor del realizado por OnStart. Cualquier recurso que OnStop pueda liberar tiene que crearse en OnStart. La creacin de recursos en el constructor impide que estos se creen adecuadamente si se inicia de nuevo el servicio una vez que OnStop ha liberado los recursos. El Administrador de control de servicios (SCM, Service Control Manager) permite la interaccin con el servicio. Puede utilizar el SCM para pasar comandos Iniciar, Detener, Pausar, Continuar o comandos personalizados al servicio. El SCM utiliza los valores de las propiedades CanStop y CanPauseAndContinue para determinar si el servicio acepta los comandos Detener, Pausar o Continuar. Detener, Pausar y Continuar slo estarn habilitados en los mens contextuales del SCM si la propiedad CanStop o CanPauseAndContinue correspondiente es true en la clase de servicio. Si est habilitado, el comando se pasa al servicio y se llama a OnStop, OnPause o OnContinue. Si la propiedad CanStop, CanShutdown o CanPauseAndContinue es false, no se procesar el mtodo de control de comandos correspondiente (como OnStop), aunque se haya implementado el mtodo. Puede utilizar la clase ServiceController para realizar mediante programacin lo que el SCM realiza mediante una interfaz de usuario. Es posible automatizar las tareas disponibles en la consola. Si la propiedad CanStop, CanShutdown o CanPauseAndContinue es true, pero no implement el mtodo de control de comandos correspondiente (como OnStop), el sistema produce una excepcin y omite el comando. No tiene que implementar el mtodo OnStart, OnStop ni ningn otro mtodo en ServiceBase. Sin embargo, el comportamiento del servicio se describe en OnStart, por lo que, como mnimo, tendr que reemplazarse este miembro. La funcin main() del ejecutable registra el servicio en el ejecutable con el Administrador de control de servicios; para ello, llama al mtodo Run. La propiedad ServiceName del objeto ServiceBase pasada al mtodo Run debe coincidir con la propiedad ServiceName del instalador de ese servicio. Puede utilizar InstallUtil.exe para instalar servicios en el sistema.
CARRERAS PROFESIONALES
CIBERTEC
LABORATORIO 5_1
Cree una aplicacin Windows que permita ingresar el estado de un servicio y luego a travs del botn Listar se liste todos los servicios que tienen el estado seleccionado 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio5_1 4. Desarrollar la siguiente GUI para la consulta de servicios por estado
5. Colocar el siguiente cdigo desde la vista cdigo del formulario 6. En la parte superior del cdigo fuente importar el namespace para el uso de servicios. Imports System.Serviceprocess Public Class frmServicios Private Sub btnListar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListar.Click 'Crear un arreglo de tipo ServiceController Dim arrServicios() As ServiceController ' ServiceController.GetServices()-->obtiene todos los ervicios locales arrServicios = ServiceController.GetServices() 'mostrar cantidad de elementos del arreglo MessageBox.Show("Elementos del arreglo:" & arrServicios.Length) 'limpiar el listview lvServicios.Items.Clear() 'crear un objeto que representa a un elemento del listview Dim ele As ListViewItem
CIBERTEC
CARRERAS PROFESIONALES
98
'recorrer arreglo de servicios For i As Int32 = 0 To arrServicios.Length - 1 'agregar primera columna al Listview ele = lvServicios.Items.Add(arrServicios(i).ServiceName) 'agregar segunda columna al listview ele.SubItems.Add(arrServicios(i).DisplayName) 'agregar tercera columna del listview ele.SubItems.Add(arrServicios(i).Status.ToString) 'agregar cuarta columna ele.SubItems.Add(arrServicios(i).ServiceType.ToString) Next End Sub Private Sub btnVerEstado_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerEstado.Click 'verificar que se haya seleccionado elemento en listview If lvServicios.SelectedItems.Count > 0 Then 'mostrar nombre del servicio seleccionado Dim strServicio As String strServicio = lvServicios.SelectedItems(0).Text MessageBox.Show(strServicio) 'Crear un objeto de tipo ServiceController Dim miServicio As New ServiceController(strServicio) 'consltar estado del servicio elegido If miServicio.Status = ServiceControllerStatus.Running Then MessageBox.Show("Inciado") ElseIf miServicio.Status = ServiceControllerStatus.Stopped Then MessageBox.Show("Detenido") End If Else MessageBox.Show("Debe seleccionar un registro") End If End Sub End Class 7. Ejecutar el formulario y comprobar consulta desarrollada.
LABORATORIO 5.2
Cree una aplicacin Windows que permita consultar el estado de un servicio , el cual ser elegido desde un listview. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio5_2 4. Disear la siguiente GUI para la consulta de servicios
CARRERAS PROFESIONALES
CIBERTEC
5. Colocar este cdigo en la vista diseo del formulario 6. Importar el namespace de Servicios en la parte superior del cdigo fuente. Imports System.ServiceProcess Public Class frmserviciosporEstado 'crear mtodo que retorne un arreglo de tipo ServiceController Function listarServicios _ (ByVal tipo As ServiceControllerStatus) As ServiceController() 'obtener cantidad de servicios de la pc 'Dim cantidad As Int32 = ServiceController.GetServices.Length 'crear un arreglo de solo una casilla Dim arrServicios(0) As ServiceController Dim i As Int16 = 0 For Each serv As ServiceController In ServiceController.GetServices 'verificar estado del servicio If serv.Status = tipo Then arrServicios(i) = New ServiceController arrServicios(i) = serv 'redimensionar arreglo i += 1 'aunmentar una casilla al arreglo ReDim Preserve arrServicios(i) End If Next Return arrServicios End Function 'botn listar Private Sub Button1_Click(ByVal sender As System.Object, ByVal System.EventArgs) Handles Button1.Click 'arreglo Dim misServicios() As ServiceController 'verificar que estado fue elegido If RadioButton1.Checked = True Then misServicios = listarServicios(ServiceControllerStatus.Running)
As
CIBERTEC
CARRERAS PROFESIONALES
100
ElseIf RadioButton2.Checked = True Then misServicios = listarServicios(ServiceControllerStatus.Stopped) Else misServicios = listarServicios(ServiceControllerStatus.Paused) End If 'mostrar cantidad de elementos del arreglo Label1.Text = "Q de Servicios por estado:" If misServicios.Length = 1 Then If misServicios(0) Is Nothing Then Label2.Text = 0 End If Else Label2.Text = misServicios.Length.ToString End If 'mostrar elementos del arreglo lvServicios.Items.Clear() Dim ele As ListViewItem For i As Int32 = 0 To misServicios.Length - 2 ele = lvServicios.Items.Add(misServicios(i).ServiceName) ele.SubItems.Add(misServicios(i).DisplayName) ele.SubItems.Add(misServicios(i).Status.ToString) Next End Sub End Class
LABORATORIO 5.3
Cree una aplicacin Windows que permita consultar el estado de un servicio , el cual ser elegido desde un listview. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Service y en Name escriba Laboratorio5_3 4. Nos aparecer directamente la clase Service1.vb que tambin podemos renombrar a algo ms intuitivo como ServicioAlerta.vb. 5. En la vista diseo de la clase que se nos ha creado hacemos clic con el botn derecho del ratn y seleccionamos la opcin Agregar instalador. Con esto se nos crear la clase ProjectInstaller.vb que contiene dos controles: ServiceInstaller1 y ServiceProcessInstaller1. 6. En el control ServiceInstaller modificamos las propiedades DisplayName y ServiceName para dejarlas ambas en ServicioAlertas. Modificamos tambin la propiedad StartType para dejarla en Automatic. Esto ltimo sirve para que despus cuando instalemos el servicio, ste quede puesto para que arranque automticamente al iniciarse el sistema operativo. DisplayName: ServicioAlertas ServiceName: ServicioAlertas StartType: Automatic 7. En el control ServiceProcessInstaller modificamos la propiedad Account para dejarla en LocalSystem. Esto indica qu tipo de cuenta se utilizar para ejecutar el servicio. Podemos dejarla en User, pero despus al instalar el
CARRERAS PROFESIONALES
CIBERTEC
servicio pedir cuenta de usuario y contrasea, as que se recomienda cambiarla a LocalSystem. 8. Accedemos al cdigo de la clase ServicioAlerta.vb y observamos que por defecto ya se nos han generado dos mtodos: OnStart y OnStop. 9. Se codifica en el mtodo OnStart y se usar un temporizador para que cada 5 segundos me escriba en un log la hora actual y en el mtodo OnStop se colocar un mensaje en el que se detuvo el servicio. Public Class ServicioAlerta Private DBTimer As System.Timers.Timer ' Iniciar service. '---------------------------------------------------------------Protected Overrides Sub OnStart(ByVal args() As String) Creando timer para cada 5 segundos DBTimer = New System.Timers.Timer(5000) DBTimer.Enabled = True AddHandler DBTimer.Elapsed, AddressOf Me.ShowAlert End Sub '---------------------------------------------------------------' Detener service. '---------------------------------------------------------------Protected Overrides Sub OnStop() Dim LogFile As New System.IO.StreamWriter("C:\log.txt", True) LogFile.WriteLine("Servicio Detenido - " & Date.Now) LogFile.Close() End Sub Private Sub ShowAlert(ByVal source As Object, _ ByVal e As System.Timers.ElapsedEventArgs) DBTimer.Enabled = False Dim LogFile As New System.IO.StreamWriter("C:\log.txt", True) LogFile.WriteLine("Alerta .NET - " & Date.Now) LogFile.Close() DBTimer.Enabled = True End Sub End Class
10. El archivo .exe (que encontramos en la carpeta bin/Release de nuestro proyecto ServicioAlertas) lo copiaremos en una ruta ms corta (C:\). Y los dos archivos .bat que necesitamos son los siguientes:
CIBERTEC
CARRERAS PROFESIONALES
102
Instalador.bat C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil "C:\ServicioAlertas.exe" pause Desinstalador.bat C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil /U "C:\ServicioAlertas.exe" pause 11. ejecutamos el archivo Instalador.bat y se nos abrir una ventana de lnea de comando con el proceso de la instalacin terminando exitosamente. Ahora nos vamos a Panel de control - Herramientas administrativas - Servicios y encontraremos nuestro servicio ServicioAlertas. Lo iniciamos y observaremos al cabo de pocos segundos que en la ruta C:\ se nos ha creado un archivo log.txt. Si dejamos el servicio un rato funcionando y despus lo detenemos veremos que este archivo ha quedado ms o menos as: Alerta .NET - 13/12/2008 11:12:18 Alerta .NET - 13/12/2008 11:12:18 Alerta .NET - 13/12/2008 11:12:18 Alerta .NET - 13/12/2008 11:12:18 Alerta .NET - 13/12/2008 11:12:18
12. Si en algn momento queremos desinstalar el servicio (si es tan poco til como ServicioAlertas seguro que querremos) solo debemos ejecutar Desinstalador.bat y el servicio quedar desinstalado (tendremos que refrescar la lista de servicios para ver que efectivamente as es).
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacin
1. Qu es un servicio windows?
_____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
3. Qu clase se utiliza para crear un nuevo servicio windows con Visual Basic .NET?
_____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
CIBERTEC
CARRERAS PROFESIONALES
104
Para Recordar
Al crear una instancia de la clase ServiceController, se pueden establecer las propiedades correspondientes de forma que interacten con un servicio de Windows especfico. De esta manera, se puede utilizar la clase para iniciar, detener o manipular el servicio. Se deber derivarse de ServiceBase cuando se cree una nueva clase de servicio. Cualquier servicio til reemplaza los mtodos OnStart y OnStop. Para obtener funcionalidad adicional, puede reemplazar OnPause y OnContinue por un comportamiento especfico en respuesta a cambios en el estado del servicio. Es fundamental que la propiedad ServiceName sea idntica a la propiedad ServiceBase.ServiceName de la clase que se deriv de ServiceBase. Normalmente, el valor de la propiedad ServiceBase.ServiceName del servicio est establecido en la funcin Main() del ejecutable de la aplicacin de servicio. Fuente: Texto adaptado de las pginas web: http://msdn.microsoft.com/es-es/library/system.serviceprocess.aspx http://www.albertmata.net/
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
3
SEMANA
6
Construir aplicaciones Windows que utilicen Threads y Configuraciones
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos crean aplicaciones personalizadas para la Administracin del Sistema Operativo utilizando algoritmos y libreras del Framework .NET 2.0 para el manejo de archivos, carpetas, servicios, procesos y diagnsticos.
TEMARIO
Definicin de un Thread, propiedades y mtodos Componente BackGroundWorker Manejo de Temporizadores Manejo de funciones de cadenas
ACTIVIDADES PROPUESTAS
Los alumnos crean aplicaciones Windows que utilizan temporizadores Los alumnos crean aplicaciones que utilzan BackgroundWorker Los alumnos crean aplicaciones que utilizan Threads para ejecutar procesos en paralelos los cuales utilizan funciones de cadenas.
CIBERTEC
CARRERAS PROFESIONALES
106
1. Thread
Un Thread se define como un camino posible de ejecucion a lo largo de un proceso. Cada proceso (programa) tiene uno o mas threads de ejecucion. Cuando se inicia una aplicacion se crea el proceso de la misma y consigo se ejecuta el thread principal a partir del entry point del mismo. La creacion y gestin de threads en .Net se halla enmascarada bajo el namespace Threading. En particular para crear un nuevo Thread en nuestra aplicacion el framework de .Net nos provee una clase que gestiona todos los pequeos detalles del mismo, la clase Threading.Thread.
MTA Multi Thread Apartment: Los Objetos se disean para correr en ambientes completamente asincronicos (las variables del objeto pueden cambiar en cualquier momento de la ejecucion del programa por lo que debe sincronizarse el acceso a las mismas) STA Single Thread Apartment: Estos objetos estan diseados para ejecutarse en threads unicos por lo que el acceso a sus datos debe de ser secuencial. En cada STA existira uno y solo un Thread. Las llamadas a los metodos de los objetos de un STA son sincronizados por una cola de Mensajes NA Neutral Apartments: Tiene la Particularidad de que los objetos que se ejecutan en este apartment pueden ser llamados Directamente desde cualquier otro apartment. Este apartment a la diferencia de MTA y STA no tienen ningn thread sino que los objetos son ejecutados en los threads desde los que son llamados
Nota: El concepto de tareas concurrentes en idioma ingls es deniminado Threading y a cada una de las tareas se las denomina simplemente Thread. En espaol las traducciones que he visto son hilo, hebray subproceso.
CARRERAS PROFESIONALES
CIBERTEC
Cmo determinar si un puerto est abierto? Para detectar si un puerto est abierto, basta con intentar conectar un Socket a dicho puerto. Imports System.Net.Sockets Public Function IsPortOpen(ByVal Host As String, ByVal Port As Integer) As Boolean Dim m_sck As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Try m_sck.Connect(Host, Port) Return True Catch ex As SocketException 'Cdigo para manejar error del socket (cerrado, conexin rechazada) Catch ex As Exception 'Cdigo para manejar otra excepcin End Try Return False End Function
Como se puede apreciar, solamente se crea el objeto de tipo Socket y se intenta conectarlo mediante la funcin sincrnica Connect. Esta funcin bloquear la ejecucin hasta obtener una respuesta (favorable o no). La llamada a la funcin Connect est dentro de un bloque Try-Catch puesto que esta funcin generar excepciones dependiendo del motivo por el cual no pudo abrir el socket hacia el puerto indicado. En este caso slo nos interesa saber si se pudo o no.
CIBERTEC
CARRERAS PROFESIONALES
108
AbortableThreadPool que brinda las mismas carctersticas de un ThreadPool pero adems permite la interrupcin de subprocesos. Pero est codificado en C#. Para los que no sean amigos de C# tambin adjunto la versin en VB.NET de esta clase (la clase AbortableThreadPool_VB) que un da, aburrido, la traduje y coment. A continuacin se muestra una forma de explotar la clase TCPPort con un Threadpool normal (no abortable), en este caso no tendremos control sobre los hilos y no ser necesaria la clase PortScanner. Simplemente encolamos las tareas y stas se ejecutan: Imports System.Threading Module Main_ThreadPool Private WithEvents TCP As New TCPPort Sub main() Dim datos As TCPPort.HostPortData, i As Integer datos.Host = "localhost" For i = 1 To 100 datos.Port = i 'Encolar la tarea ThreadPool.QueueUserWorkItem(AddressOf TCP.PortOpen, datos) Next Console.ReadKey() End Sub 'Interceptar los eventos generados e informar el estatus Private Sub TCP_PuertoProcesado(ByVal Host As String, ByVal Port As Integer, ByVal bAbierto As Boolean, _ ByVal sMensaje As String) Handles TCP.PuertoProcesado Console.WriteLine(Port & " : " & bAbierto.ToString) End Sub End Module
2. Hilos en VB.NET
La forma ms fcil de visualizar la implementacin de hilos es con un ejemplo. A continuacin se muestra un ejemplo bsico de la utilizacin de dos hilos (Thread) para ejecutar un mtodo (sub) con parmetros: Imports System.Threading Module PruebaHilo 'Sub que ejecutarn los hilos Public Sub MiSub(ByVal Parametro As Object) Try Randomize() Do Dim iDormir As Integer = CInt(3000 * Rnd()) 'Valor random entre 0 y 3000 Console.WriteLine("{0} sleep({1})", Parametro, iDormir)
CARRERAS PROFESIONALES
CIBERTEC
Thread.Sleep(iDormir) 'Me bloqueo entre 0 y 3 segundos Loop Catch ex As ThreadAbortException Console.WriteLine("{0} Abortado", Parametro) End Try End Sub 'Sub principal Sub Main() Dim hilo1 As New Thread(AddressOf MiSub) 'Crear el hilo 1 Dim hilo2 As New Thread(AddressOf MiSub) 'Crear el hilo 2 Console.WriteLine("Ejecutando hilos a abortar en 6 segudos...") hilo1.Start("hilo 1 ") 'Comenzar ejecucin de hilo 1 Thread.Sleep(500) 'Me Bloqueo 500 ms hilo2.Start(" hilo 2") 'Comenzar ejecucin de hilo 2 Thread.Sleep(6000) 'Me bloqueo 6 segundos hilo1.Abort() hilo2.Abort() 'Abortar al hilo 1 'Abortar al hilo 2
'Esperar a que realmente mueran los hilos While hilo1.IsAlive Or hilo2.IsAlive End While Console.WriteLine("Abortados") Console.ReadKey() End Sub End Module
System.Object,
ByVal
As
CIBERTEC
CARRERAS PROFESIONALES
110
End Sub 'Manejar al evento generado por los hilos Private Sub PS_PuertoScaneado(ByVal Port As Integer, ByVal bAbierto As Boolean, _ ByVal sMensaje As String) Handles PS.PuertoScaneado ImprimirEstatus(Port & " " & bAbierto.ToString) End Sub 'Imprimir el estatus del proceso en el caption del form y el ultimo estatus en un TextBox Private Sub ImprimirEstatus(ByVal Status As String) If Me.InvokeRequired Then 'Si es necesario utilizar Invoke, llamo al delegado Me.Invoke(New ImprimirEstatusCB(AddressOf ImprimirEstatus), New Object() {Status}) Else 'Aqu puedo modificar los controles de esta forma TextBox1.Text = Status Me.Text = TCPPort.m_CountThreads End If End Sub End Class
Lo interesante est en el sub ImprimirEstatus que al principio evala la propiedad InvokeRequired que indicar si es necesario utilizar el mtodo Invoke (then) o si es posible modificar los controles de Windows Forms directamente (else). En el caso de ser necesario el Invoke, se pasar a ste (al invoke) un nuevo delegado del sub ImprimirEstatusCB y un arreglo de Objects conteniendo los parmetros que el sub requiera. El delegado debe tener la misma firma que el sub al que invocar (y ser invocado). En este caso el delegado es llamado ImprimirEstatusCB y el sub es llamado ImprimirEstatus.
Nota El proyecto ScanWinForms (versin C) es otra versin del escaneador pero en este caso se utiliza una forma de Windows Forms y se utiliza la clase PortScanner para llevar a cabo el proceso.
CARRERAS PROFESIONALES
CIBERTEC
Laboratorio 6.1
1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005. 2. Crear un nuevo proyecto aplicacin de Windows de Visual Basic denominado ThreadWinApp. 3. Agregue un control botn al formulario. El botn se denominado Button1 de forma predeterminada. 4. Agregar un componente de ProgressBar al formulario. La barra de progreso se denomina ProgressBar1 de forma predeterminada. 5. Haga clic con el botn secundario del mouse en el formulario y, a continuacin, haga clic en Ver cdigo . 6. Agregar la siguiente instruccin al principio del archivo: Imports System.Threading 7. Agregar el siguiente controlador de eventos Click para Button1 :
Private Sub Button1_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click MessageBox.Show("This is the main thread") End Sub
8. Agregue la siguiente variable a la clase de Form1 :
Private Sub ThreadTask() Dim stp As Integer Dim newval As Integer Dim rnd As New Random() Do stp = ProgressBar1.Step * rnd.Next(-1, 2) newval = ProgressBar1.Value + stp If newval > ProgressBar1.Maximum Then newval = ProgressBar1.Maximum ElseIf newval < ProgressBar1.Minimum Then newval = ProgressBar1.Minimum End If ProgressBar1.Value = newval Thread.Sleep(100) Loop End Sub
CIBERTEC
CARRERAS PROFESIONALES
112
Nota : este es el cdigo subyacente del subproceso. Este cdigo est un infinito un bucle que aleatoriamente aumenta o disminuye el valor de ProgressBar1 y, a continuacin, espera 100 milisegundos antes de contine. 10. Agregar el siguiente controlador de evento Load para Form1 . Este cdigo crea un nuevo subproceso, hace que el subproceso de un subproceso en segundo plano y, a continuacin, inicia el subproceso.
Private Sub Form1_Load( _ ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load trd = New Thread(AddressOf ThreadTask) trd.IsBackground = True trd.Start()
End Sub
CARRERAS PROFESIONALES
CIBERTEC
Imports System.IO Imports System.Threading ' Namespace POOI.Clases Public Class cBuscarPalabrasEnFicheros ' La coleccin de palabras a manipular Private lasPalabras As PooI.Clases.cPalabras ' Necesitamos que este objeto produzca eventos Private mProcesarFic() As PooI.Clases.cProcesarFicheroThread Private WithEvents mProcesarFic2 As PooI.Clases.cProcesarFicheroThread ' Array para cada uno de los threads Private mThreadFic() As Thread ' Variable para controlar el nmero de Threads creados Private nThread As Integer = 0 ' Los eventos que producir esta clase Public Event ProcesandoFichero(ByVal sMsg As String) Public Event FicherosProcesados(ByVal sMsg As String) '
CIBERTEC
CARRERAS PROFESIONALES
114
' El constructor de la clase necesita la coleccin de palabras ' que se van a manipular por esta clase. Public Sub New(ByVal quePalabras As PooI.Clases.cPalabras) MyBase.New() ' lasPalabras = quePalabras mProcesarFic2 = New PooI.Clases.cProcesarFicheroThread(lasPalabras) End Sub ' Private Sub mProcesarFic2_ProcesandoFichero(ByVal sMsg As String) ' Este evento se produce cuando se est procesando un fichero por uno de los threads. ' Desde aqu producimos nuestro evento a la aplicacin RaiseEvent ProcesandoFichero(sMsg) End Sub ' Private Sub ProcesarSubDir(ByVal sDir As String, _ Optional ByVal sExt As String = "*.*") '----------------------------------------------------------------' Este procedimiento ser llamado de forma recursiva para procesar ' cada uno de los directorios. '----------------------------------------------------------------Dim tDir As Directory Dim tSubDirs() As Directory ' ' Asigna a tSubDirs los subdirectorios incluidos en sDir tSubDirs = tDir.GetDirectoriesInDirectory(sDir) ' Crear un thread para cada directorio a procesar nThread += 1 ReDim Preserve mThreadFic(nThread) ReDim Preserve mProcesarFic(nThread)
CARRERAS PROFESIONALES
CIBERTEC
mProcesarFic(nThread - 1) = New PooI.Clases.cProcesarFicheroThread(lasPalabras) mProcesarFic(nThread - 1).sDir = sDir mProcesarFic(nThread - 1).sExt = sExt ' Los procedimientos a usar no deben aceptar parmetros mThreadFic(nThread - 1) = New Thread(New ThreadStart(AddressOf mProcesarFic(nThread 1).ProcesarDir)) ' ' Iniciar el thread mThreadFic(nThread - 1).Start() ' Llamada recursiva a este procedimiento para procesar los subdirectorios ' de cada directorio For Each tDir In tSubDirs ' Procesar todos los directorios de cada subdirectorio ProcesarSubDir(tDir.FullName, sExt) Next End Sub ' Public Function Procesar(ByVal sDir As String, _ Optional ByVal sExt As String = "*.*", _ Optional ByVal conSubDir As Boolean = False _ ) As String ' Procesar los directorios del path indicado en sDir, ' buscando ficheros con la extensin sExt, ' y si se deben procesar los subdirectorios. '----------------------------------------------------------------' Dim totFiles As Integer = 0 Dim s As String ' ' Comprobar si se van a procesar los subdirectorios If conSubDir Then ProcesarSubDir(sDir, sExt) Else nThread += 1
CIBERTEC
CARRERAS PROFESIONALES
116
ReDim Preserve mThreadFic(nThread) ReDim Preserve mProcesarFic(nThread) mProcesarFic(nThread - 1) = New PooI.Clases.cProcesarFicheroThread(lasPalabras) mProcesarFic(nThread - 1).sDir = sDir mProcesarFic(nThread - 1).sExt = sExt mThreadFic(nThread - 1) = New Thread(New ThreadStart(AddressOf mProcesarFic(nThread 1).ProcesarDir)) ' mThreadFic(nThread - 1).Start() End If ' Aqu llegar incluso antes de terminar todos los threads 'Debug.WriteLine("Fin de Procesar todos los ficheros") ' Comprobar si han terminado los threads Dim i, j As Integer Do j = 0 For i = 0 To nThread - 1 ' Comprobar si alguno de los Threads est "vivo" ' si es as, indicarlo para que continue el bucle If mThreadFic(i).IsAlive() Then j = 1 End If Next ' Esto es necesario, para que todo siga funcionando System.WinForms.Application.DoEvents() Loop While j = 1 'Debug.WriteLine("Han finalizado los threads") ' Ahora podemos asignar el nmero de ficheros procesados totFiles = mProcesarFic2.TotalFicheros If totFiles = 1 Then s = " Procesado 1 fichero." Else s = " Procesados " & CStr(totFiles) & " ficheros." End If RaiseEvent FicherosProcesados(s) ' Asignamos a cero el valor de total ficheros por si se vuelve a usar, para que no siga acumulando.
CARRERAS PROFESIONALES
CIBERTEC
CIBERTEC
CARRERAS PROFESIONALES
118
Autoevaluacin
1. Qu es un Thread? ____________________________________________________________ ____________________________________________________________ ____________________________________________________________ 2. Qu namespace es el que utilizamos para acceder a un temporadizador? ____________________________________________________________ ____________________________________________________________ ____________________________________________________________ 3. Qu proporciona la clase ThreadPool? ____________________________________________________________ ____________________________________________________________ ____________________________________________________________
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
Todas las aplicaciones se ejecutan en un Thread (o hilo de ejecucin). Pero cada aplicacin puede tener ms de un Thread al mismo tiempo, es decir se pueden estar haciendo varias cosas a un mismo tiempo. En Visual Basic.Net, a diferencia de las versiones anteriores, se pueden crear Threads para que podamos realizar diferentes tareas a un mismo tiempo. Cuando un Thread se inicia, con Start, se contina ejecutando el cdigo que sigue y as podremos seguir usando nuestra aplicacin de forma paralela al Thread que est en ejecucin. As mismo, se pueden crear y ejecutar varios Threads a un mismo tiempo y cada uno de ellos har su trabajo de forma independiente. Puede ser que en algunas ocasiones necesitemos saber si un Thread an se est ejecutando, para ello se puede usar la propiedad IsAlive del objeto Thread: If mThreadFic.IsAlive() Then
CIBERTEC
CARRERAS PROFESIONALES
120
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
3
SEMANA
TEMARIO
Manejo del Log de eventos. Procesos del sistema, y manejo de clases y mtodos Informacin Administrativa (WMI)
ACTIVIDADES PROPUESTAS
Los alumnos se conectan al visor de eventos Los alumnos consultan las notificaciones de los logs de eventos Los alumnos consultan los procesos activos en la pc. Los alumnos realizan consultas sobre las herramientas del Sistema operativo Windows a travs de WMI.
CIBERTEC
CARRERAS PROFESIONALES
122
El nuevo origen de eventos deber crearse durante la instalacin de la aplicacin. De esta manera, el sistema operativo dispondr de tiempo para actualizar la lista de orgenes de eventos registrados y sus configuraciones. Si el sistema operativo an no ha actualizado la lista de orgenes de eventos y se intenta escribir un evento con el nuevo origen, se producir un error de la operacin de escritura. Para configurar un nuevo origen, puede utilizarse EventLogInstaller o el mtodo CreateEventSource. Es necesario contar con derechos administrativos en el equipo para crear un nuevo origen de eventos. Cuando una aplicacin escriba entradas usando tanto identificadores de recursos como valores de cadena, debern registrarse dos orgenes diferentes. Por ejemplo, puede configurarse un origen con archivos de recursos y usarlo en el mtodo WriteEvent para escribir entradas en el registro de eventos mediante identificadores de recursos. A continuacin, puede crearse otro origen sin archivos de recursos y usarlo en el mtodo WriteEntry para escribir cadenas directamente en el registro de eventos.
CARRERAS PROFESIONALES
CIBERTEC
Imports System Imports System.Diagnostics Imports System.Threading Class MySample Public Shared Sub Main() If Not EventLog.SourceExists("MySource") Then ' Crear origin si no existe EventLog.CreateEventSource("MySource", "MyNewLog") Console.WriteLine("CreatingEventSource") End If ' Crea una instancia de EventLog y le asigna el origin MySource Dim myLog As New EventLog() myLog.Source = "MySource" 'escribe la entrada en el EventLog instanciado myLog.WriteEntry("Escritura de un log") End Sub End Class
Propiedades Nombre Entries Events Log LogDisplayName MachineName MaximumKilobytes Source Mtodos Nombre Clear Descripcin Quita todas las entradas del registro de eventos. Descripcin Obtiene el contenido del registro de eventos. Obtiene la lista de controladores de eventos asociados a Component. (Se hereda de Component). Obtiene o establece el nombre del registro del que se lee o en el que se escribe. Obtiene el nombre descriptivo del registro de eventos. Obtiene o establece el nombre del equipo en el que se van a leer o en el que se van a escribir los eventos. Obtiene o establece el tamao mximo del registro de eventos, en kilobytes. Obtiene o establece el nombre de origen que se va a registrar y utilizar al escribir en el registro de eventos.
CreateEventSource Sobrecargado. Establece una aplicacin como capaz de escribir informacin de eventos en un determinado registro de actividad del sistema.
CIBERTEC
CARRERAS PROFESIONALES
124
Delete
DeleteEventSource Sobrecargado. Quita del registro de eventos un registro del origen de eventos de una aplicacin. Exists SourceExists WriteEntry WriteEvent Sobrecargado. especificado. Determina si existe el registro
Sobrecargado. Busca en un origen de eventos dado el Registro de un equipo. Sobrecargado. Escribe una entrada en el registro de eventos. Sobrecargado. Escribe una entrada de evento adaptada en el registro de eventos.
2. Process : System.Diagnostics
Un componente Process proporciona acceso a un proceso que se est ejecutando en un equipo. Un proceso, dicho de un modo sencillo, es una aplicacin en ejecucin. Un subproceso es la unidad bsica a la que el sistema operativo asigna tiempo de procesador. Un subproceso puede ejecutar cualquier parte del cdigo del proceso, incluidas las partes que otro subproceso est ejecutando en ese momento. El componente Process es una herramienta til para iniciar, detener, controlar y supervisar aplicaciones. Mediante el componente Process se puede obtener una lista de los procesos en ejecucin o se puede iniciar un nuevo proceso. Un componente Process se utiliza para obtener acceso a los procesos del sistema. Un componente Process, una vez inicializado, puede utilizarse para obtener informacin sobre el proceso en ejecucin. Entre la informacin proporcionada se incluye el conjunto de subprocesos, los mdulos cargados (archivos .dll y .exe) y la informacin de rendimiento, por ejemplo, la cantidad de memoria que est utilizando el proceso. Class MyProcess ' These are the Win32 error code for file not found or access denied. Private ERROR_FILE_NOT_FOUND As Integer = 2 Private ERROR_ACCESS_DENIED As Integer = 5
'/ <summary> '/ Prints a file with a .doc extension. '/ </summary> Sub PrintDoc() Dim myProcess As New Process() Try ' Get the path that stores user documents. Dim myDocumentsPath As String = _ Environment.GetFolderPath(Environment.SpecialFolder.Personal) myProcess.StartInfo.FileName = myDocumentsPath + "\MyFile.doc" myProcess.StartInfo.Verb = "Print" myProcess.StartInfo.CreateNoWindow = True myProcess.Start()
CARRERAS PROFESIONALES
CIBERTEC
Catch e As Win32Exception If e.NativeErrorCode = ERROR_FILE_NOT_FOUND Then Console.WriteLine((e.Message + ". Check the path.")) Else If e.NativeErrorCode = ERROR_ACCESS_DENIED Then ' Note that if your word processor might generate exceptions ' such as this, which are handled first. Console.WriteLine((e.Message + ". You do not have permission to this file.")) End If End If End Try End Sub 'PrintDoc
Public Shared Sub Main() Dim myProcess As New MyProcess() myProcess.PrintDoc() End Sub 'Main End Class 'MyProcess
3. WMI: System.Management
Proporciona acceso a un amplio conjunto de informacin y eventos de administracin relacionados con el sistema, dispositivos y aplicaciones instrumentadas para la infraestructura Windows Management Instrumentation (WMI). Las aplicaciones y los servicios pueden consultar informacin de inters sobre administracin (como por ejemplo cunto espacio libre queda en el disco, cul es el nivel actual de utilizacin de la CPU, a qu base de datos est conectada cierta aplicacin y mucho ms), por medio de clases derivadas de ManagementObjectSearcher y ManagementQuery, o suscribirse a diversos eventos de administracin por medio de la clase ManagementEventWatcher. El acceso a los datos es posible a travs de componentes administrados y no administrados en el entorno distribuido. Public Class Sample Public Overloads Shared Function _ Main(ByVal args() As String) As Integer Dim myScope As New ManagementScope("root\CIMV2") Dim q As New SelectQuery("Win32_LogicalDisk") Dim s As New ManagementObjectSearcher(myScope, q) For Each disk As ManagementObject In s.Get() 'show the disk instance Console.WriteLine(disk.ToString()) Next End Function 'Main End Class 'Sample
Imports System
CIBERTEC
CARRERAS PROFESIONALES
126
Imports System.Management
Public Class Sample Public Overloads Shared Function _ Main(ByVal args() As String) As Integer Dim s As New ManagementObjectSearcher( _ "root\MyApp", _ "SELECT * FROM Win32_Service", _ New EnumerationOptions( _ Nothing, System.TimeSpan.MaxValue, 1, _ True, False, True, True, False, _ True, True))
For Each service As ManagementObject In s.Get() 'show the instance Console.WriteLine(service.ToString()) Next
LABORATORIO 9.1
Consulta de los System.Diagnostics sucesos y notificaciones utilizando EventLog:
1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio9_1 4. Desarrolla la siguiente GUI.
CARRERAS PROFESIONALES
CIBERTEC
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Lista de Eventos Log de Application Dim ev As New EventLog("Application") For Each el As EventLogEntry In ev.Entries ListBox1.Items.Add(el.Index.ToString + vbTab + el.Source) Next End Sub Private Sub ListBox1_Click(ByVal sender As Object, ByVal System.EventArgs) Handles ListBox1.Click 'Al Seleccionar un Entry visualizamos sus detalles 'Capturamos un Entry, utilizando el SelectedIndex Dim ev As New EventLog("Application") Dim el As EventLogEntry = ev.Entries(ListBox1.SelectedIndex) 'con una Cadena almaceno su contenido Dim str As String = "Origen: " + el.Source + vbCrLf str += "Tiempo: " + el.TimeGenerated.ToString + vbCrLf str += "Tipo de Cuenta: " + el.EntryType.ToString + vbCrLf str += "Mensaje: " + el.Message Me.txtcontenido.Text = str ev.Close() End Sub Private Sub txtcontenido_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtcontenido.TextChanged End Sub End Class e As
CIBERTEC
CARRERAS PROFESIONALES
128
LABORATORIO 9.2
Cree una aplicacin Windows que permita visualizar la lista de procesos activos para luego eliminarlos una vez que se haya seleccionado un proceso. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio1_1 4. Disear la siguiente GUI del formulario
5. Colocar el siguiente cdigo en la vista cdigo del formulario. 6. Importar el namespace para utilizar la clase Process. Imports System.Diagnostics Public Class Form2 Private Sub BtnCurrencyProcess_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnCurrencyProcess.Click 'Visualice el Proceso Actual Dim pr As Process = Process.GetCurrentProcess ListBox2.Items.Clear() ListBox2.Items.Add("Proceso Actual") ListBox2.Items.Add("Id: " + pr.Id.ToString) ListBox2.Items.Add("Nombre: " + pr.ProcessName) ListBox2.Items.Add("Memoria: " + pr.VirtualMemorySize64.ToString) End Sub Private Sub BtnProcess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnProcess.Click 'Listado de Procesos ListBox1.Items.Clear() For Each p As Process In Process.GetProcesses 'Procesos por su ID, Memoria Virtual y el Nombre del Proceso ListBox1.Items.Add(p.Id.ToString + vbTab + _ p.VirtualMemorySize64.ToString _ + vbTab + p.ProcessName) Next End Sub
CARRERAS PROFESIONALES
CIBERTEC
Private Sub BtnByName_Click(ByVal sender As Object, ByVal e As EventArgs) Handles BtnByName.Click 'Proceso por su Name, Id 'Capturo el ID del Proceso seleccionado en el Listbox1 Dim id As Integer id = Val(ListBox1.Text.Substring(0, ListBox1.Text.IndexOf(vbTab))) 'pr recibe el Proceso segun el id seleccionado Dim pr As Process = Process.GetProcessById(id) ListBox2.Items.Clear() 'Visualizo los procesos por su nombre, que sean comunes For Each p As Process In Process.GetProcessesByName(pr.ProcessName) ListBox2.Items.Add(p.ProcessName + vbTab + p.Id.ToString) Next End Sub Private Sub BtnQuitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnQuitar.Click Dim id As Integer id = Val(ListBox1.Text.Substring(0, ListBox1.Text.IndexOf(vbTab))) 'pr recibe el Proceso segun el id seleccionado Dim p As Process = Process.GetProcessById(id) Dim rp As Integer rp = MessageBox.Show("Quitar", "KiLL", MessageBoxButtons.OKCancel) If rp = vbOK Then p.Kill() 'Cerrar un Proceso End If End Sub End Class
LABORATORIO 9.3
Cree una aplicacin Windows que permita realizar consulta de los procesos. Utilizando para ello la clase WMI. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio9_3 4. Disear la siguiente GUI.
CIBERTEC
CARRERAS PROFESIONALES
130
5. Colocar el siguiente cdigo dentro del cdigo fuente del formulario. Imports System.Management Public Class Form1 Private Sub BTNVER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNVER.Click ListView1.Items.Clear() Dim ITEM As New ListViewItem Dim sproceso As New ManagementObjectSearcher( "Select * From Win32_Process" ) For Each p As ManagementObject In sproceso.Get ITEM = ListView1.Items.Add(p("ProcessId")) ITEM.SubItems.Add(p("Name").ToString) Next End Sub
Private Sub ListView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged If ListView1.SelectedItems.Count > 0 Then Try Dim id As String = ListView1.SelectedItems (0).SubItems (1).Text Dim sproceso As New ManagementObjectSearcher ( _ "Select * From Win32_Process Where Name= + id + "'") _ Me.TextBox1.Text = Nothing For Each p As ManagementObject In sproceso.Get Me.TextBox1.Text = "Titulo: " + p("caption") + vbCrLf Me.TextBox1.Text += "Ruta: " + p("ExecutablePath") + vbCrLf Me.TextBox1.Text += "Name: " + p("Name") + vbCrLf Me.TextBox1.Text += "Status: " + p("Status") + vbCrLf Me.TextBox1.Text += "WindowsVersion: " + p("WindowsVersion") + vbCrLf Next Catch ex As ManagementException
CARRERAS PROFESIONALES
CIBERTEC
CIBERTEC
CARRERAS PROFESIONALES
132
Autoevaluacin
1. Qu es un EventLog?
__________________________________________________________________ __________________________________________________________________ ___________________________________________________
3. Qu es un proceso?
__________________________________________________________________ __________________________________________________________________ ___________________________________________________
4. Qu es WMI?
__________________________________________________________________ __________________________________________________________________ ___________________________________________________
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
El espacio de nombres System.Diagnostics proporciona tambin clases que permiten depurar la aplicacin y hacer un seguimiento de la ejecucin del cdigo. Para obtener ms informacin, vea las clases Trace y Debug. La clase Process proporciona funcionalidad para supervisar los procesos de sistema en toda la red y para iniciar y detener procesos del sistema local. El componente EventLog proporciona la funcionalidad para escribir en registros de eventos, leer las entradas de los registros de eventos y crear y eliminar registros de eventos y orgenes de eventos en la red. EntryWrittenEventHandler proporciona una forma para interactuar con los registros de eventos de manera asincrnica. El System.Management proporciona acceso a un amplio conjunto de informacin y eventos de administracin relacionados con el sistema, dispositivos y aplicaciones instrumentadas para la infraestructura Windows Management Instrumentation (WMI).
CIBERTEC
CARRERAS PROFESIONALES
134
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
4
SEMANA
10
TEMARIO
Administracin Serializacin y deserializacin de un objeto Serializacin con XML Serializacion Binaria Serializacin SOAP
ACTIVIDADES PROPUESTAS
Los alumnos crean aplicaciones que serializan un tipo de objeto. Los alumnos utilizan para sus aplicaciones los formatos XML y binario
CIBERTEC
CARRERAS PROFESIONALES
136
1.
Serializacion y Deserializacion
La serializacin es el proceso de convertir un objeto en una secuencia de bytes para conservarlo en memoria, una base de datos o un archivo. Su propsito principal es guardar el estado de un objeto para poder crearlo de nuevo cuando se necesita. El proceso inverso se denomina deserializacin. Cmo funciona la serializacin? Este ejemplo muestra el proceso total de serializacin.
El objeto se serializa en una secuencia que, adems de los datos, contiene informacin sobre el tipo de objeto, como la versin, referencia cultural y nombre de ensamblado. Esa secuencia se puede almacenar en una base de datos, un archivo o en memoria. Usos de la serializacin La serializacin permite al desarrollador guardar el estado de un objeto y volver a crearlo cuando es necesario, y proporcionar almacenamiento de objetos e intercambio de datos. A travs de la serializacin, un desarrollador puede realizar acciones como enviar un objeto a una aplicacin remota por medio de un servicio Web, pasar un objeto de un dominio a otro, pasar un objeto a travs de un firewall como una cadena XML o mantener la seguridad o informacin especfica del usuario entre aplicaciones. Crear un objeto serializable Para serializar un objeto, se necesita que el objeto est serializado, una secuencia que contenga el objeto serializado y un objeto Formatter. La enumeracin System.Runtime.Serialization contiene las clases necesarias para serializar y deserializar objetos. Aplique el atributo SerializableAttribute a un tipo para indicar que se pueden serializar las instancias de ese tipo. Se produce una excepcin SerializationException si se intenta serializar pero el tipo no tiene el atributo SerializableAttribute. Si no desea que un campo de su clase se pueda serializar, aplique el atributo NonSerializedAttribute. Si un campo de un tipo serializable contiene un puntero, controlador u otra estructura de datos especfica de un entorno determinado, y el significado del campo no se puede reconstruir en un entorno diferente, es conveniente que no sea serializable. Si una clase serializada contiene referencias a objetos de otras clases marcadas con el atributo SerializableAttribute, esos objetos tambin se serializarn.
CARRERAS PROFESIONALES
CIBERTEC
2.
Se puede utilizar serializacin binaria o XML. En la serializacin binaria, se serializan todos los miembros, incluso aquellos que son de slo lectura, y se mejora el rendimiento. La serializacin XML proporciona cdigo ms legible, as como mayor flexibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.
BinaryFormatter (Clase)
Serializa o deserializa un objeto o todo un grfico de objetos conectados, en formato binario. Espacio de nombres: System.Runtime.Serialization.Formatters.Binary Imports System.IO Imports System.Collections Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization
Module App Sub Main() Serialize() Deserialize() End Sub Sub Serialize() ' Create a hashtable of values that will eventually be serialized. Dim addresses As New Hashtable addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052") addresses.Add("Fred", "987 Pine Road, Phila., PA 19116") addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301") ' To serialize the hashtable (and its key/value pairs), ' you must first open a stream for writing. ' In this case, use a file stream. Dim fs As New FileStream("DataFile.dat", FileMode.Create) ' Construct a BinaryFormatter and use it to serialize the data to the stream. Dim formatter As New BinaryFormatter Try formatter.Serialize(fs, addresses) Catch e As SerializationException Console.WriteLine("Failed to serialize. Reason: " & e.Message) Throw Finally fs.Close() End Try
CIBERTEC
CARRERAS PROFESIONALES
138
End Sub Sub Deserialize() ' Declare the hashtable reference. Dim addresses As Hashtable = Nothing ' Open the file containing the data that you want to deserialize. Dim fs As New FileStream("DataFile.dat", FileMode.Open) Try Dim formatter As New BinaryFormatter ' Deserialize the hashtable from the file and ' assign the reference to the local variable. addresses = DirectCast(formatter.Deserialize(fs), Hashtable) Catch e As SerializationException Console.WriteLine("Failed to deserialize. Reason: " & e.Message) Throw Finally fs.Close() End Try ' To prove that the table deserialized correctly, ' display the key/value pairs. Dim de As DictionaryEntry For Each de In addresses Console.WriteLine("{0} lives at {1}.", de.Key, de.Value) Next End Sub End Module
CARRERAS PROFESIONALES
CIBERTEC
Serializar un objeto en XML 1. Cree el objeto y establezca sus campos pblicos y propiedades. 2. Construya un XmlSerializer utilizando el tipo de objeto. Para obtener ms informacin, vea los constructores de clase XmlSerializer . 3. Llame al mtodo Serialize para generar o una secuencia XML o una representacin del archivo de las propiedades pblicas del objeto y campos. En el ejemplo siguiente se crea un archivo. Cmo: Deserializar un objeto Al deserializar un objeto, el formato de transporte determina si crear una secuencia u objeto de archivo. Una vez determinado el formato de transporte, puede llamar Serialize o los mtodos Deserialize, como se requiera. Para deserializar un objeto en XML 1. Construya unXmlSerializer utilizando el tipo del objeto para deserializar. 2. Llame al mtodo Deserialize para generar una rplica del objeto. Al deserializar, debe convertir el objeto devuelto al tipo del original, como se muestra en el ejemplo siguiente, que deserializa el objeto en un archivo (aunque tambin se pudo deserializar en una secuencia). Para crear una secuencia XML con un nombre de elemento alternativo 1. Cree una instancia de la clase XmlElementAttribute. 2. Establece el ElementName de XmlElementAttribute a "BookID". 3. Cree una instancia de la clase XmlAttributes. 4. Agregue el objeto XmlElementAttribute a la coleccin a la que ha accedido mediante la propiedad XmlElements de XmlAttributes . 5. Cree una instancia de la clase XmlAttributeOverrides. 6. Agregue XmlAttributes a XmlAttributeOverrides, pasando el tipo del objeto para invalidarlo y el nombre de miembro invalidado. 7. Cree una instancia de la clase XmlSerializer con XmlAttributeOverrides. 8. Cree una instancia de la clase Book y serialice o deserialcela.
CIBERTEC
CARRERAS PROFESIONALES
140
System.Xml.Serialization. Vea la lista en "Atributos que controlan la serializacin SOAP codificada". 3. Cree XmlTypeMapping creando un nuevo SoapReflectionImportere
invocando el mtodo ImportTypeMapping con el tipo de la clase serializada. En el ejemplo de cdigo siguiente llama el mtodo ImportTypeMapping de la clase SoapReflectionImporter para crear unXmlTypeMapping.
3.
El espacio de nombres System.IO.Compression contiene clases que proporcionan servicios de compresin y descompresin bsica para las secuencias. Clases Clase DeflateStream GZipStream Descripcin Proporciona mtodos y propiedades para comprimir y descomprimir secuencias mediante el algoritmo Deflate. Proporciona los mtodos y propiedades que permiten comprimir y descomprimir secuencias
La clase DeflateStream no proporciona de forma inherente la funcionalidad para agregar o extraer archivos en archivos .zip. Para obtener un ejemplo de manipulacin de archivos comprimidos, vea Ejemplo de aplicacin de compresin. La clase GZipStream utiliza el formato de datos gzip, que incluye un valor de prueba cclica de redundancia para detectar daos en los datos. El formato de datos gzip utiliza el mismo algoritmo de compresin que la clase DeflateStream.
CARRERAS PROFESIONALES
CIBERTEC
La funcionalidad de compresin en DeflateStream y GZipStream se expone como una secuencia. Los datos se leen byte a byte, por lo que no es posible realizar varios pases a fin de determinar el mtodo ms adecuado para comprimir archivos enteros o grandes bloques de datos. Las clases DeflateStream y GZipStream se utilizan de forma ptima en orgenes de datos sin comprimir. Si los datos de origen ya estn comprimidos, el uso de estas clases puede aumentar el tamao de la secuencia.
LABORATORIO 10.1
Cree una aplicacin Windows que permita ingresar el Nombre de un usuario y muestre una ventana emergente de bienvenida con el nombre de usuario. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio10_1 4. Disear la GUI del formulario.
Clase Persona Imports System.Drawing Imports System.Runtime.Serialization '<Serializable()> : Este atributo indica que la clase 'ser serializada <Serializable()> Public Class Persona Implements IDeserializationCallback
CIBERTEC
CARRERAS PROFESIONALES
142
'Atributos privados Private mNombre As String Private mApellido As String 'Atributo pblico que no ser serializado <NonSerialized()> Public Edad As Int32 'Atributo pblico que guardar una imagen Public Foto As Bitmap 'constructor de la clase Sub New(ByVal Nombre As String, ByVal Apellido As String) 'Asignar valores a los atributos privados de la clase mNombre = Nombre mApellido = Apellido End Sub 'propiedades de slo lectura 'WriteOnly-->Atributo de slo escritura Public ReadOnly Property Nombre() As String Get Return mNombre End Get End Property Public ReadOnly Property Apellido() As String Get Return mApellido End Get End Property Public Sub OnDeserialization(ByVal sender As Object) Implements
CARRERAS PROFESIONALES
CIBERTEC
'Namespace para usar clase fileStream Imports System.IO 'Namespace para usar la clase BinaryFormatter Imports System.Runtime.Serialization.Formatters.Binary
System.EventArgs) Handles btnCargar.Click 'Utilizo una ventan OpenFileDialog Dim opDialog As New OpenFileDialog 'Establecer 2 filtros para esta ventana 'opDialog.Filter=Nombre a Mostrar|Filtro1;Filtro2 opDialog.Filter = _ "Picture files|*.jpg;*.gif;*.bmp|All files (*.*)|*.*" opDialog.FilterIndex = 1 If opDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then picFoto.Image = Image.FromFile(opDialog.FileName) End If End Sub
Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click txtApellido.Text = "" txtNombre.Text = "" txtEdad.Text = "" picFoto.Image = Nothing End Sub
Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click 'Creo una instancia de la clase Persona
CIBERTEC
CARRERAS PROFESIONALES
144
Dim oPersona As New Persona(txtNombre.Text, txtApellido.Text) 'establecer valores para los atributos pblicos oPersona.Edad = Convert.ToInt32(txtEdad.Text) 'Funcin de conversin:CType(Expresin,Tipo de dato a Convertir) oPersona.Foto = CType(picFoto.Image, Bitmap) 'Uso una ventana SaveFileDialog para definir el archivo a crear Dim svDialog As New SaveFileDialog() 'establecer filtro de archivos a crear svDialog.Filter = "Archivo Data(*.bin)|*.bin|All files (*.*)|*.*" 'Mostrar ventana SaveFileDialog y verificar 'que se dio click al botn Guardar If svDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then 'Crear el archivo con el nombre elegido 'en la ventana SaveFileDialog Dim fs As New FileStream _ (svDialog.FileName, FileMode.Create, FileAccess.Write) 'Serializo el objeto Dim objBF As New BinaryFormatter 'se ejecuta la serializacin y se guarda los datos 'serializados en un archivo fs objBF.Serialize(fs, oPersona) 'cerrar archivo fs.Close() MessageBox.Show("Se grab con xito.") End If
End Sub
Private Sub btnRecuperar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRecuperar.Click 'Uso un Common Dialog para localizar el archivo
CARRERAS PROFESIONALES
CIBERTEC
Dim oDialog As New OpenFileDialog() oDialog.Filter = "Archivo data(*.bin)|*.bin|All files (*.*)|*.*" 'Mostrar Ventana y verificar si presion botn Abrir If oDialog.ShowDialog = Windows.Forms.DialogResult.OK Then 'crear objeto FileStream para leer archivo que contiene la data serializada Dim fs As New FileStream(oDialog.FileName, FileMode.Open,
FileAccess.Read) 'Crear objeto BinaryFormatter para deserializar Dim objBF As New BinaryFormatter 'Deserializar el objeto convirtindolo al tipo Persona Dim oPersona As Persona = CType(objBF.Deserialize(fs), Persona) 'Muestro los valores deserializados txtNombre.Text = oPersona.Nombre txtApellido.Text = oPersona.Apellido picFoto.Image = oPersona.Foto 'cerrar archivo fs.Close() End If End Sub End Class
4.
LABORATORIO 10.2
Cree una aplicacin Windows que permita ingresar datos de un objeto Persona y luego se serialice esta informacin en formato XML. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio10_2 4. Disee la siguiente GUI.
CIBERTEC
CARRERAS PROFESIONALES
146
'Namespace para usar la clase fileStream Imports System.IO 'Namespace para usar la clase XMLSerializer Imports System.Xml.Serialization Public Class frmSerializacionXML Private Sub btnSerializacion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSerializar.Click Dim svDialog As New SaveFileDialog svDialog.Filter = "Archivos XML|*.xml" If svDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then 'crear archivo con el nombre indicado en la ventana 'SaveFileDialog Dim fs As New FileStream _ (svDialog.FileName, FileMode.Create, FileAccess.Write) 'Preparar los datos a serializar 'Crear un instancia de la clase profesor Dim objProfesor As New Profesor 'asignar valores a los atributos pblicos objProfesor.strCodigo = txtCodigo.Text objProfesor.strNombre = txtNombre.Text objProfesor.strApellidos = txtApellidos.Text objProfesor.fecFechaIngreso = dtFechaIngreso.Value.Date
CARRERAS PROFESIONALES
CIBERTEC
'Dim NombreArreglo(IndiceMaximo) as tipo Dim arrAsignaturas(lstAsignaturas.Items.Count - 1) As String 'Asignar valores al arreglo creado For i As Int16 = 0 To lstAsignaturas.Items.Count - 1 arrAsignaturas(i) = lstAsignaturas.Items.Item(i) Next 'Pasar el arreglo al atributo asignaturas del objeto profesor objProfesor.asignaturas = arrAsignaturas 'Crear variable para serializar en formato XML 'Dim xs As New XmlSerializer(Tipo de dato a serializar) Dim xs As New XmlSerializer(GetType(Profesor)) 'ejecutar la serializacin en formato XML xs.Serialize(fs, objProfesor) fs.Close() End If End Sub Private Sub cboAsignatura_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboAsignatura.SelectedIndexChanged 'IndexOf(Elemento):Busca el elemento elegido en el combo ' dentro de la lista.Si lo encuentra retorna su indice sino retorna -1 If lstAsignaturas.Items.IndexOf(cboAsignatura.SelectedItem) = -1 Then 'Agregar a la lista lo seleccionado en el combo lstAsignaturas.Items.Add(cboAsignatura.SelectedItem) End If End Sub Private Sub btnDeserializacion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeserializar.Click Dim opDialog As New OpenFileDialog opDialog.Filter = "Archivos XML |*.xml" If opDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
CIBERTEC
CARRERAS PROFESIONALES
148
Dim xs As XmlSerializer = New XmlSerializer(GetType(Profesor)) Dim fs As FileStream = New FileStream(opDialog.FileName, FileMode.Open, FileAccess.Read) Dim objProfesor As New Profesor objProfesor = CType(xs.Deserialize(fs), Profesor) Dim strReporte As String = "" strReporte &= "Cdigo:" & objProfesor.strCodigo & vbCrLf strReporte &= "Nombres:" & objProfesor.strNombre & vbCrLf strReporte &= "Apellidos:" & objProfesor.strApellidos & vbCrLf strReporte &= "Fecha:" & objProfesor.fecFechaIngreso & vbCrLf strReporte &= "Asignaturas:" For Each asig As String In objProfesor.asignaturas strReporte &= asig & vbCrLf Next MessageBox.Show(strReporte) fs.Close() End If End Sub End Class
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacin
1. Qu es la serializacin? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 2. Qu formatos proporciona el Framework .NET para serializar objetos?
__________________________________________________________________ __________________________________________________________________ __
CIBERTEC
CARRERAS PROFESIONALES
150
Para Recordar
El espacio de nombres System.Runtime.Serialization.Formatters.Binary contiene la clase BinaryFormatter, que se puede utilizar para serializar y deserializar los objetos en formato binario. BinaryFormatter serializa o deserializa un objeto o todo un grfico de objetos conectados, en formato binario. El espacio de nombres System.Xml.Serialization contiene clases que se utilizan para serializar objetos en secuencias o documentos con formato XML. XmlSerializer serializa y deserializa objetos en y desde documentos XML. Permite controlar el modo en que se codifican los objetos en XML.
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
4
SEMANA
11
Administracin de Sistemas de Archivos
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al Al trmino de la unidad, los alumnos utilizando algoritmos y libreras del Framework .NET 3.5, construyen aplicaciones Windows .NET para optimizar el manejo, control, almacenamiento y seguridad de los datos.
TEMARIO
Acceso a los archivos y directorios Manejo de datos utilizando los objetos Stream Compresin de datos
ACTIVIDADES PROPUESTAS
Los alumnos acceden a los archivos y carpetas usando la clase File System. Los alumnos manejan los datos de una aplicacion usando las clases Reader, Writer y Streams. Los alumnos comprenden la diferencia entre las clases DeflateStream y ZipStream para comprimir archivos
CIBERTEC
CARRERAS PROFESIONALES
152
El objeto My.Computer.FileSystem proporciona herramientas para trabajar con archivos y carpetas. Sus propiedades, mtodos y eventos permiten crear, copiar, mover, investigar y eliminar archivos y carpetas. My.Computer.FileSystem ofrece un mayor rendimiento que las funciones heredadas (FileOpen, FileClose, Input, InputString, LineInput, etc.) proporcionadas por Visual Basic para ofrecer compatibilidad con versiones anteriores. El mtodo ReadAllText del objeto My.Computer.FileSystem permite leer de un archivo de texto. Se puede especificar la codificacin del archivo si el contenido del mismo utiliza una codificacin como ASCII o UTF-8. Si est leyendo de un archivo que incluye caracteres extendidos, deber especificar la codificacin del archivo. Para leer de un archivo de texto Utilice el mtodo ReadAllText del objeto My.Computer.FileSystem para leer el contenido de un archivo de texto en una cadena, proporcionando la ruta de acceso. El ejemplo siguiente lee el contenido del archivo test.txt, lo coloca en una cadena y, a continuacin, lo muestra en un cuadro de mensaje. Dim fileReader As String fileReader = My.Computer.FileSystem.ReadAllText("C:\test.txt") Messagebox.show(fileReader) Para leer de un archivo de texto que est codificado Utilice el mtodo ReadAllText del objeto My.Computer.FileSytem para leer el contenido de un archivo de texto en una cadena, proporcionando la ruta de acceso y el tipo de codificacin del archivo. El ejemplo siguiente lee el contenido del archivo UTF32 test.txt, lo coloca en una cadena y, a continuacin, lo muestra en un cuadro de mensaje. Las condiciones siguientes pueden producir una excepcin:
La ruta de acceso no es vlida por una de las razones siguientes: es una cadena de longitud cero, slo contiene un espacio en blanco, contiene caracteres no vlidos o es una ruta de acceso de dispositivo (ArgumentException). La ruta de acceso no es vlida porque es Nothing (ArgumentNullException). El archivo no existe (FileNotFoundException). El archivo est en uso por otro proceso o hay un error de E/S (IOException). La ruta supera la longitud (PathTooLongException). mxima definida por el sistema
CARRERAS PROFESIONALES
CIBERTEC
Un nombre de archivo o de directorio de la ruta de acceso contiene un signo de dos puntos (:) o tiene un formato no vlido (NotSupportedException). No hay suficiente memoria (OutOfMemoryException). para escribir la cadena en el bfer
El usuario no tiene los permisos necesarios para ver la ruta de acceso (SecurityException).
Leer archivos de texto delimitado por comas en Visual Basic El objeto TextFieldParser proporciona un mtodo para analizar de forma sencilla y eficaz archivos de texto estructurados, como registros. La propiedad TextFieldType define si se trata de un archivo delimitado o uno con campos de ancho fijo de texto. Para analizar un archivo de texto delimitado por comas 1. Cree un nuevo objeto TextFieldParser. El cdigo siguiente crea el objeto TextFieldParser denominado MyReader y abre el archivo test.txt. Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser _ ("C:\TestFolder\test.txt") End Using 2. Defina el tipo de TextField y el delimitador. El cdigo siguiente define la propiedad TextFieldType como Delimited y el delimitador como ",". MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters (",") 3. Recorra los campos del archivo. Si alguna lnea est daada, cree un informe de error y contine el anlisis. El cdigo siguiente recorre el archivo para mostrar cada campo a la vez e indica los campos con formato incorrecto.
Dim currentRow As String() While Not MyReader.EndOfData Try currentRow = MyReader.ReadFields() Dim currentField As String For Each currentField In currentRow MsgBox(currentField) Next Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("Line " & ex.Message & _ "is not valid and will be skipped.") End Try End while
4. Cierre los bloques While y Using con End While y End Using. Ejemplo En este ejemplo se lee el archivo test.txt.
CIBERTEC
CARRERAS PROFESIONALES
154
Using MyReader As New _ Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt") MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters(",") Dim currentRow As String() While Not MyReader.EndOfData Try currentRow = MyReader.ReadFields() Dim currentField As String For Each currentField In currentRow MsgBox(currentField) Next Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("Line " & ex.Message & "is not valid and will be skipped.") End Try End While End Using Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("Line " & ex.Message & _ "is not valid and will be skipped.") End Try End While End Using Para eliminar archivos y carpetas Option Explicit On Public Class Form1 Private Sub Form1_Load( ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Try ' Eliminar el archivo, mostrando el cuadro 'de dilogo de eliminar de windows para confirmar Dim sdir As String = "c:\Nueva carpeta" Dim Spath As String = "c:\archivo.txt" ' Archivo My.Computer.FileSystem.DeleteFile(Spath, _
CARRERAS PROFESIONALES
CIBERTEC
My.Computer.FileSystem.DeleteDirectory( _ sdir, _ FileIO.UIOption.AllDialogs, _ FileIO.RecycleOption.SendToRecycleBin, _ FileIO.UICancelOption.DoNothing) ' errores Catch ex As Exception MsgBox(ex.Message.ToString, MsgBoxStyle.Critical) End Try End Sub End Class 1.2. System.IO (Espacio de nombres)
El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, as como tipos que proporcionan compatibilidad bsica con los archivos y directorios. Directory Expone mtodos estticos para crear, mover y enumerar archivos en directorios y subdirectorios. Esta clase no se puede heredar. DirectoryInfo Expone mtodos de instancia para crear, mover y enumerar archivos en directorios y subdirectorios. Esta clase no se puede heredar. DriveInfo Proporciona acceso a informacin sobre una unidad. DriveNotFoundException La excepcin que se produce al intentar obtener acceso a una unidad o un recurso compartido que no est disponible. File Proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creacin de objetos FileStream. FileInfo Proporciona mtodos de instancia para crear, copiar, eliminar, mover y abrir archivos y contribuye a la creacin de objetos FileStream. Esta clase no se puede heredar. FileNotFoundException Excepcin que se produce cuando se produce un error al intentar tener acceso a un archivo que no existe en el disco. FileStream Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincrnica y asincrnica. FileSystemInfo Proporciona la clase base para los objetos FileInfo y DirectoryInfo. FileSystemWatcher Escucha las notificaciones de cambio del sistema de archivos y provoca eventos cuando cambia un directorio o un archivo de un directorio. MemoryStream Crea una secuencia cuyo almacn de respaldo es la memoria. Stream Proporciona una vista genrica de una secuencia de bytes.
CIBERTEC
CARRERAS PROFESIONALES
156
Implementa un TextReader que lee los caracteres de una secuencia de bytes en una codificacin determinada. Implementa TextWriter para escribir los caracteres de una secuencia en una codificacin determinada. Implementa TextReader que lee en una cadena.
LABORATORIO 11.1
Manipular archivos y directorios en Visual Basic 1. En el men Archivo, haga clic en Nuevoproyecto. Aparecer el cuadro de dilogo Nuevo proyecto. 2. En el panel Tipos de proyecto, haga clic en Proyectos de Visual Basic y, a continuacin, elija Aplicacin para Windows en el panel Plantillas. 3. En el cuadro Nombre, escriba FileExplorer como nombre del proyecto. Visual Studio agregar el proyecto al Explorador de soluciones y se abrir el Diseador de Windows Forms. 4. Agregue los controles de la siguiente tabla al formulario y establezca los correspondientes valores para sus propiedades. Objeto TextBox Propiedades Name Text Button Name Text Buton Name Text ComboBox Name Text CheckBox Name Text Checked CheckBox Name Text Checked CheckBox Name Text Checked Valor txtDirectory Directorio btnSubmit Enviar btnExamine Exminar lstFilePick Seleccione Archivo chkFileLength Longitud de archivo True chkLastAccess Hora de ltimo acceso True chkSave Guardar resultados False
CARRERAS PROFESIONALES
CIBERTEC
Mostrar el directorio actual La aplicacin FileExplorer necesita un punto de inicio. En consecuencia, el control txtDirectoryTextBox utiliza la funcin My.Computer.FileSystem.CurrentDirectory para devolver y mostrar una cadena que representa la ruta de acceso actual. Para devolver el directorio actual 1. Haga doble clic en el formulario para crear un controlador de eventos para Form1_Load. Se abrir el Editor de cdigo. 2. Agregue el cdigo siguiente para que el control txtDirectoryTextBox muestre la ubicacin actual. txtDirectory.Text = My.Computer.FileSystem.CurrentDirectory
3. Ejecute el programa para comprobar que se devuelve la ruta de acceso correcta. El control txtDirectoryTextBox muestra el directorio actual. Cambiar directorios Dado que es posible que un usuario desee seleccionar archivos de un directorio diferente, la aplicacin utiliza la misma propiedad para cambiar de directorio. Para cambiar a un directorio diferente, el usuario escribe una nueva ruta de acceso en el control txtDirectoryTextBox. Para cambiar de directorio 1. Haga doble clic en el control del formulario para crear un controlador de eventos clic para btnSubmit. Se abrir el Editor de cdigo. 2. Agregue el cdigo siguiente al controlador de eventos clic. Dim NewPath As String ' NewPath holds the path the user has entered. NewPath = txtDirectory.Text ' Change the location to NewPath. My.Computer.FileSystem.CurrentDirectory = NewPath Comprobar si se escribi una ruta de acceso vlida Utilice una instruccin Try...Catch para detectar excepciones que surgen de escribir una ruta de acceso en blanco o no vlida. Para garantizar rutas de acceso vlidas 1. En el evento btnSubmit_Click, despus de la lnea de cdigo Dim NewPath As String, agregue Dim ErrorMessage As String en una nueva lnea. 2. Antes de la lnea de cdigo My.Computer.FileSystem.CurrentDirectory = NewPath, agregue una instruccin Try en su propia lnea, como se indica a
CIBERTEC
CARRERAS PROFESIONALES
158
continuacin. Si presiona la tecla de retorno, el Editor de cdigo insertar automticamente las instrucciones Catch ex As Exception y End Try. Qutelas, agregar las suyas propias en el paso siguiente. 3. Despus de la lnea de cdigo My.Computer.FileSystem.CurrentDirectory = NewPath, agregue lo siguiente: Try ' This checks to make sure the path is not blank. Catch ex As Exception When NewPath = "" ErrorMessage = "You must enter a path." ' This catches errors caused by a path that is not valid. Catch ErrorMessage = "You must enter a valid path. If trying " & _ "to access a different drive, remember to include the drive " & _ "letter." Finally ' Display the error message only if one exists. If ErrorMessage <> Nothing Then MsgBox(ErrorMessage) End If End Try Mostrar el contenido del directorio en un control ComboBox Para permitir que la aplicacin muestre el contenido del directorio actual, puede utilizar el mtodo My.Computer.FileSystem.GetFiles, que devuelve una coleccin de cadenas que representan los nombres de los archivos en el directorio. Puede utilizar comodines con GetFiles para seleccionar slo archivos de un modelo determinado. En este ejemplo, slo se devuelven los archivos que tienen la extensin .txt. Para mostrar el contenido del directorio 1. Al principio del evento btnSubmit_Click, inserte lo siguiente. Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String). 2. Despus de que la lnea End Try, inserte lo siguiente. fileList = My.Computer.FileSystem.GetFiles( _ My.Computer.FileSystem.CurrentDirectory, _ FileIO.SearchOption.SearchTopLevelOnly, "*.txt") For Each foundFile As String In fileList lstFilePick.Items.Add(foundFile) Next 3. La informacin recopilada aparece en el control lstFilePick ComboBox, en el que podr seleccionar un archivo especfico para examinarlo. Para probar la aplicacin, ejectela primero en un directorio que no contenga archivos .txt y, a continuacin, en uno que contenga ms de un archivo .txt. En el primer caso, la aplicacin muestra el mensaje de error correspondiente. En el segundo, la
CARRERAS PROFESIONALES
CIBERTEC
aplicacin crea, en el control ComboBox, una lista de todos los archivos .txt del directorio especificado en el control txtDirectoryTextBox. Permitir que el usuario seleccione un archivo para examinarlo Aunque el control lstFilePickComboBox muestra todos los archivos de un directorio, es probable que el usuario desee seleccionar y examinar un archivo especfico. Para habilitar la seleccin de un archivo concreto Cree un controlador de evento clic para btnExamine_Click y agregue el cdigo siguiente para confirmar la seleccin de un archivo. Permitir que el usuario determine la informacin que desea recopilar Una vez que se muestran los archivos en el control lstFilePickComboBox, el cdigo adicional permite que el usuario especifique la informacin de la que se informa. Por ejemplo, es posible que un usuario slo desee saber la fecha en la que se tuvo acceso al archivo por ltima vez. Es posible que otro usuario desee conocer tambin el tamao de un archivo. Los usuarios pueden activar o desactivar las casillas de verificacin (chkLastAccess, chkFileLength) para personalizar los resultados. Para mostrar informacin especfica 1. Declare estas variables al principio del evento btnExamine_Click despus de (lstFilePick.SelectedItem): Dim stringlength As String stringLength = "The file's length, in bytes, is: " Dim stringLastAccess As String stringLastAccess = "The file was last accessed on: " Dim LastAccess As Date Dim Length As Long Dim FirstLine As String = "" Dim FinalString As String = "" Dim NewName As String NewName = CType(lstFilePick.SelectedItem, String) If NewName = Nothing Then MsgBox("You must select a file to examine.") Exit Sub End If 2. El mtodo My.Computer.FileSystem.GetFileInfo devuelve un objeto FileInfo que se puede consultar para obtener informacin sobre un archivo. 3. Agregue el cdigo siguiente al final del evento btnExamine_Click. ' Check last access time. If chkLastAccess.Checked = True Then LastAccess = thisFile.LastAccessTime End If La propiedad LastAccessTime determina la hora del ltimo acceso al archivo. El valor Date devuelto indica la fecha y la hora en que se cre un archivo o en que fue modificado por ltima vez. 1. Agregue el cdigo siguiente al final del evento btnExamine_Click.
CIBERTEC
CARRERAS PROFESIONALES
160
' Check Length. If chkFileLength.Checked = True Then Length = thisFile.Length End If La propiedad Length, que determina la longitud del archivo, devuelve un valor de tipo Long que especifica la longitud del archivo en bytes. Mostrar los resultados Para completar la funcionalidad de la aplicacin, un MsgBox informa de la informacin recopilada. Para mostrar los resultados 1. Al final de la instruccin If que determina si se ha activado o no el control chkLastAccessCheckBox, agregue lo siguiente antes de la instruccin End If final. ' Add to the messagebox. FinalString = FinalString & stringLastAccess & LastAccess & "." _ & vbCrLf 2. Al final de la instruccin If que determina si se ha activado o no el control chkFileLengthCheckBox, agregue lo siguiente antes de la instruccin End If final. ' Add to the messagebox. FinalString = FinalString & stringlength & CStr(Length) & "." & vbCrLf 3. Al final de la instruccin If que determina si se ha activado o no el control chkFirstLineCheckBox, agregue lo siguiente antes de la instruccin End If final. ' Add to the messagebox. FinalString &= FirstLine & vbCrLf Guardar los resultados Es posible que el usuario desee guardar los resultados de examinar un archivo. En consecuencia, debe agregar cdigo que compruebe si existe un archivo de registro, cree uno si es necesario y, a continuacin, escriba los resultados en el archivo de registro. Para crear un archivo de registro: Agregue lo siguiente al final del evento btnExamine_Click. ' Check to see if results should be saved. If chkSave.Checked = True And FinalString <> "" Then My.Computer.FileSystem.WriteAllText("log.txt", FinalString, True) End If
CARRERAS PROFESIONALES
CIBERTEC
Para probar la aplicacin 1. En el directorio de su eleccin, cree un archivo de texto denominado test.txt con la primera lnea siguiente: "sta es la primera lnea del primer archivo. La aplicacin FileExplorer slo examina archivos de texto." 2. En el mismo directorio, cree un segundo archivo de texto denominado test2.txt con la primera lnea siguiente: "sta es la primera lnea del segundo archivo. La aplicacin FileExplorer slo examina archivos de texto." 3. Inicie la aplicacin. 4. Escriba una ruta de acceso no vlida y haga clic en Enviar. Aparecer el siguiente mensaje: "You must enter a valid path. If trying to access a different drive, remember to include the drive letter." 5. Escriba la ruta de acceso al directorio que almacena test.txt y haga clic en Enviar. El control lstFilePickComboBox mostrar los archivos de texto. 6. Seleccione test.txt en el control lstFilePickComboBox. Asegrese de que estn activadas todas las casillas de verificacin y, a continuacin, haga clic en Examinar. El formulario de resultados incluye la fecha del ltimo acceso y la longitud. 7. Seleccione test2.txt en el control lstFilePickComboBox, desactive todas las casillas de verificacin y, a continuacin, haga clic en Examinar. Aparecer el siguiente mensaje de error : "No file attribute checkboxes selected." 8. Seleccione Hora del ltimo acceso y Guardar resultados, y haga clic en Examinar. El formulario de resultados muestra slo la hora del ltimo acceso. 9. Cierre FileExplorer. Dado que activ la opcin Guardar resultados, FileExplorer gener un archivo de registro denominado log.txt en el mismo directorio que los archivos de texto. Para comprobar el registro En el directorio actual, abra log.txt y confirme que FileExplorer registr la informacin correcta.
CIBERTEC
CARRERAS PROFESIONALES
162
LABORATORIO 11.2
Cree una aplicacin Windows que permita ingresar visualizar un miniexplorador para archivos y directorios.
1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows
Application y en Name escriba Laboratorio11_2
CARRERAS PROFESIONALES
CIBERTEC
Private Sub frm_Ejemplo1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load mostrarUnidades() End Sub Sub MostrarDirectios() 'recuperar la unidad seleccionada Dim unidadSeleccionada As String = lstUnidades.SelectedItem 'Obtener los directorios referentes a una unidad Dim misDirectorios As DirectoryInfo = _ New DirectoryInfo(unidadSeleccionada) Try lvDirectorios.Items.Clear() 'variable q representa a un elemento del Listview Dim ele As ListViewItem 'recorrer la coleccin de directorios For Each Dir As DirectoryInfo In misDirectorios.GetDirectories ele = lvDirectorios.Items.Add(Dir.Name) ele.ImageKey = "Cube.ico" Next Catch ex As IOException MessageBox.Show(ex.Message) End Try End Sub Sub MostrarArchivos() 'recuperar la unidad seleccionada Dim unidadSelect As String = lstUnidades.SelectedItem 'recuperar directorio seleccionado Dim directorioSelect As String = lvDirectorios.SelectedItems.Item(0).Text 'Obtener los archivos referentes al directorio Dim misArchivos As DirectoryInfo = _ New DirectoryInfo(unidadSelect & directorioSelect) Try lstArchivos.Items.Clear() 'recorrer la coleccin de archivos For Each archivo As FileInfo In misArchivos.GetFiles lstArchivos.Items.Add(archivo) Next Catch ex As IOException MessageBox.Show(ex.Message) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Private Sub lstUnidades_SelectedIndexChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstUnidades.SelectedIndexChanged MostrarDirectios() End Sub Private Sub PropiedadesToolStripMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PropiedadesToolStripMenuItem.Click Dim unidad As String = lstUnidades.SelectedItem
CIBERTEC
CARRERAS PROFESIONALES
164
Dim u As New DriveInfo (unidad) MessageBox.Show ("Tipo Unidad:" & u.DriveType.ToString & vbCrLf _ & "Espacio Libre:" & Math.Round(u.TotalFreeSpace / 1024 / 1024 / 1024, _ 2) & "GB" & vbCrLf & "Capacidad Total:" & Math.Round(u.TotalSize / 1024 / 1024 / 1024, 2) & "GB" , "Informacin de Unidad" , _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub Private Sub lvDirectorios_SelectedIndexChanged(ByVal System.Object, ByVal e As System.EventArgs) Handles lvDirectorios.SelectedIndexChanged If lvDirectorios.SelectedItems.Count > 0 Then MostrarArchivos() End If End Sub End Class sender As
LABORATORIO 11.3
1. Cree una nueva aplicacin de consola llamada ComprimiendoArchivos 2. Agregue una clase llamada CompresionArchivos y declarare dos mtodos ComprimirArchivo y DescomprimirArchivo los cuales recibirn dos parmetros archivoEntrada y archivoSalida de tipo string. 3. Implemente el mtodo ComprimirArchivos, en dnde utilizar dos objetos de tipo FileStream que serviran para leer el archivo origen y guardar el archivo comprimido. La clase GZipStream, la cual en su constructor recibe como argumentos el Stream de salida y un modo de Compresion para indicar si vamos a comprimir o des-comprimir datos. Utilice el mtodo Write para escribir la informacin al stream de salida.
4. Implemente el mtodo DescomprimirArchivo, a continuacin la forma de implementacin es la misma, con la unica diferencia en la forma en que inicializamos el objeto tipo GZipStream, tambin aqui no se puede hacer uso de la instruccin compStream.Lenght por que nos genera una excepcin indicando que esta funcionalidad no esta implementada. Para leer los datos utilice un ciclo while para ir leyendo la informacin. Veamos como queda este mtodo:
Como vemos los nicos cambios realizados fueron los siguientes: El constructor de la clase GZipStream ahora utiliza el modo Decompress para indicar que vamos a descomprimir la informacin de un archivo. Luego leemos toda la informacin del archivo haciendo uso de la instruccin compStream.ReadByte().
CARRERAS PROFESIONALES
CIBERTEC
5. Para hacer uso de la clase solo invoque a los dos metodos desde Sub Main(). Si desea usar el algoritmo DEFLATE, lo unico que debe modificar en la clase que se ha desarrollado es el uso de la Clase GzipStream por DeflateStream, incluso el constructor de la clase DeflateStream utiliza los mismos argumentos que la clase GzipStream. Cundo utilizar GZipStream y cundo utilizar DeflateStream ?, ambas clases utilizan el mismo algoritmo de compresin, la nica diferencia es que el formato GZip agrega informacin en el header para que pueda ser interpretada por programas como winzip. Mientras que Deflate no agrega esta informacin, por lo que si no van a utilizar los archivos con aplicaciones comerciales, es ms recomendable utilizar deflate.
CIBERTEC
CARRERAS PROFESIONALES
166
Autoevaluacin
1. Qu namespace y clases son requeridos para leer archivos de texto?
__________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ___
2. Si se desea ver los archivos que existen en un directorio que clase se debe utilizar del System.IO?
__________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ___
3. En qu se diferencian las clases DeflateStream y Gzipstyream ?. Cules son los usos que se les da? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, as como tipos que proporcionan compatibilidad bsica con los archivos y directorios. El objeto My.Computer.FileSystem proporciona herramientas para trabajar con archivos y carpetas. Para abrir y leer el archivo, se utilizan tambin objetos del nombre de espacio System.IO, especficamente la clase System.IO.StreamReader. En el .net Framework 2.0 se utilizan dos nuevas clases incluidas en el NameSpace System.IO.Compression se trata de: GZipStream y DeflateStream. La clase MemoryStream crea secuencias que utilizan como almacn de respaldo la memoria en lugar de un disco o una conexin de red. MemoryStream encapsula los datos almacenados como una matriz de bytes sin signo que se inicializa al crear un objeto MemoryStream; tambin se puede crear una matriz vaca. Es posible obtener acceso directamente a los datos encapsulados en la memoria. Las secuencias de memoria pueden reducir la necesidad de archivos y bferes temporales en una aplicacin.
CIBERTEC
CARRERAS PROFESIONALES
168
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
5
SEMANA
12
Seguridad en Aplicaciones Windows
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaborarn aplicaciones de mejor rendimiento y acceso asignando recursos, permisos, componentes, cultura y una adecuada distribucin de la misma para su implementacin.
TEMARIO
Control, permisos y privilegios a recursos Acceso y modificacin de la informacin de usuarios
ACTIVIDADES PROPUESTAS Los alumnos se crearn aplicaciones para encriptar informacin, utilizando algunos de los algoritmos simtricos o asimtricos de encriptacin.
CIBERTEC
CARRERAS PROFESIONALES
170
El cdigo administrado puede descubrir la identidad o la funcin de un principal a travs de un objeto Principal, que contiene una referencia a un objeto Identity. Puede ser til la comparacin de objetos de identidad y principales con conceptos familiares, como las cuentas de grupo y usuario. En la mayora de los entornos de red, las cuentas de usuario representan a personas o programas, mientras que las cuentas de grupo representan a ciertas categoras de usuarios y los derechos que poseen. De forma similar, los objetos de identidad de .NET Framework representan a usuarios, mientras que las funciones representan pertenencias y contextos de seguridad. En .NET Framework, el objeto principal encapsula un objeto de identidad y una funcin. Las aplicaciones .NET Framework conceden derechos al principal basndose en su identidad o, lo que es ms normal, en su pertenencia a una funcin. Objetos Identity El objeto de identidad encapsula informacin relativa al usuario o la entidad que se van a validar. En su nivel ms bsico, los objetos de identidad contienen un nombre y un tipo de autenticacin. El nombre puede ser un nombre de usuario o el nombre de una cuenta de Windows, mientras que el tipo de autenticacin puede ser un protocolo de inicio de admisin admitido, como Kerberos V5, o un valor personalizado. .NET Framework define un objeto GenericIdentity que se puede utilizar para la mayora de los escenarios de inicio de sesin personalizados y un objeto WindowsIdentity ms especializado que se puede utilizar cuando se desea que la aplicacin se base en una autenticacin de Windows. Adems, se puede definir la clase de identidad propia que encapsula la informacin personalizada del usuario. La interfaz IIdentity define propiedades para el acceso a un nombre y un tipo de autenticacin, como Kerberos V5 o NTLM. Todas las clases Identity implementan la interfaz IIdentity. No hay una relacin necesaria entre un objeto Identity y el smbolo (token) de proceso de Windows NT bajo el cual se est ejecutando actualmente un subproceso. No obstante, si el objeto Identity es un objeto WindowsIdentity, se supone que la identidad representa un smbolo de seguridad de Windows NT.
CARRERAS PROFESIONALES
CIBERTEC
Objetos Principal El objeto principal representa el contexto de seguridad bajo el cual se ejecuta cdigo. Las aplicaciones que implementan seguridad basada en funciones conceden derechos tomando como base la funcin asociada a un objeto principal. De forma similar a los objetos de identidad, .NET Framework proporciona un objeto GenericPrincipal y un objeto WindowsPrincipal. Tambin se pueden definir clases principales personalizadas propias. La interfaz IPrincipal define una propiedad para el acceso a un objeto Identity asociado, as como un mtodo para determinar si el usuario identificado por el objeto Principal es miembro de una funcin dada. Todas las clases Principal implementan la interfaz IPrincipal, as como las propiedades y mtodos adicionales necesarios. Por ejemplo, Common Language Runtime proporciona la clase WindowsPrincipal, que implementa funcionalidad adicional para asignar a funciones la pertenencia a un grupo de Windows NT o Windows 2000. Un objeto Principal se enlaza a un objeto de contexto de llamada (CallContext) dentro de un dominio de aplicacin (AppDomain). Un contexto de llamada predeterminado se crea siempre con cada dominio AppDomain nuevo, por lo que siempre hay un contexto de llamada disponible para aceptar el objeto Principal. Cuando se crea un subproceso nuevo, tambin se crea un objeto CallContext para el subproceso. La referencia del objeto Principal se copia automticamente desde el subproceso creador en el objeto CallContext del subproceso nuevo. Si el motor en tiempo de ejecucin no puede determinar qu objeto Principal pertenece al creador del subproceso, sigue la directiva predeterminada para la creacin de objetos Principal e Identity. Una directiva especfica de dominio de aplicacin configurable define las reglas para decidir qu tipo de objeto Principal se ha de asociar a un dominio de aplicacin nuevo. Cuando la directiva de seguridad lo permite, el motor en tiempo de ejecucin puede crear objetos Principal e Identity que reflejan el smbolo (token) de sistema operativo asociado al subproceso actual de ejecucin. De forma predeterminada, el motor en tiempo de ejecucin utiliza objetos Principal e Identity que representan a usuarios no autenticados, pero no los crea hasta que el cdigo intenta el acceso a ellos. El cdigo de confianza que crea un dominio de aplicacin puede establecer la directiva de dominio de aplicacin que controla la construccin de los objetos Principal e Identity predeterminados. Esta directiva especfica de dominio de aplicacin se aplica a todos los subprocesos de ejecucin de dicho dominio. Un host de confianza no administrado tiene la capacidad inherente de establecer esta directiva, pero el cdigo administrado que la establece debe tener el permiso System.Security.Permissions para controlar la directiva de dominio. Cuando se transmite un objeto Principal a travs de dominios de aplicacin, pero dentro del mismo proceso (y, por tanto, en el mismo equipo), la infraestructura de interaccin remota copia una referencia en el objeto Principal asociado al contexto de quien efecta una llamada en el contexto de quien la recibe. Comprobaciones de seguridad basada en funciones Una vez definidos los objetos de identidad y principal, se pueden realizar comprobaciones de seguridad frente a ellos mediante uno de los mtodos siguientes:
Utilizacin de comprobaciones de seguridad imperativa. Utilizacin de comprobaciones de seguridad declarativa. Acceso directo al objeto Principal.
CIBERTEC
CARRERAS PROFESIONALES
172
El cdigo administrado puede utilizar comprobaciones de seguridad imperativa o declarativa para determinar si un objeto principal concreto es miembro de una funcin conocida, tiene una identidad conocida o representa una identidad conocida que acta en una funcin. Para que la comprobacin de seguridad se realice utilizando seguridad imperativa o declarativa, se debe efectuar una demanda de seguridad para un objeto PrincipalPermission correctamente creado. Durante la comprobacin de seguridad, Common Language Runtime examina el objeto principal de quien efecta una llamada para determinar si su identidad y su funcin coinciden con las representadas por el objeto PrincipalPermission que se demanda. Si el objeto de entidad de seguridad no coincide, se produce una excepcin SecurityException. Slo se examina el objeto principal del subproceso actual; la clase PrincipalPermission no produce un recorrido de pila con permiso de acceso a cdigo. Adems, se puede tener acceso directo a los valores del objeto principal y realizar comprobaciones sin un objeto PrincipalPermission. En este caso, basta con leer los valores del principal del subproceso actual o utilizar la autorizacin de ejecucin del mtodo IsInRole. Realizar comprobaciones de seguridad imperativas En el caso de una demanda imperativa, se puede llamar al mtodo Demand del objeto PrincipalPermission para determinar si el objeto de entidad de seguridad actual representa la identidad especificada, la funcin especificada o ambas. Suponiendo que se ha creado apropiadamente un objeto PrincipalPermission denomnado MyPrincipalPermission, se puede llamar a una demanda imperativa con el cdigo siguiente. En el ejemplo de cdigo siguiente se utiliza una comprobacin imperativa para garantizar que un objeto GenericPrincipal coincide con el objeto PrincipalPermission. Una comprobacin imperativa es til cuando muchos mtodos u otros ensamblados del dominio de aplicacin deben tomar determinaciones basadas en funciones. Aunque este ejemplo es sumamente simple, ilustra el comportamiento asociado a una peticin basada en funciones. Imports System.Security.Permissions Imports System.Security.Principal Imports System.Security Imports System.Threading Imports System.Security.Cryptography Public Class MainClass Public Overloads Shared Function Main() As Integer Console.WriteLine("Enter '1' to use the proper identity or " _ & "any other character to use the improper identity.") If Console.ReadLine() = "1" Then ' Create a generic identity. Dim MyIdentity As New GenericIdentity("MyUser") ' Create a generic principal. Dim MyString As [String]() = {"Administrator", "User"} Dim MyPrincipal As New GenericPrincipal( _ MyIdentity, MyString)
CARRERAS PROFESIONALES
CIBERTEC
Thread.CurrentPrincipal = MyPrincipal End If PrivateInfo() Return 0 End Function Public Shared Sub PrivateInfo() Try ' Create a PrincipalPermission object. Dim MyPermission As New PrincipalPermission( _ "MyUser", "Administrator") ' Demand this permission. MyPermission.Demand() ' Print secret data. Console.WriteLine(ControlChars.Cr & ControlChars.Cr & _ "You have access to the private data!") Catch e As SecurityException Console.WriteLine(e.Message) End Try End Sub End Class Realizar comprobaciones de seguridad declarativa Las demandas declarativas de permisos PrincipalPermission funcionan de la misma manera que las demandas declarativas de permisos de acceso a cdigo. Las demandas se pueden colocar en el nivel de clase as como sobre eventos, propiedades y mtodos individuales. Si una demanda declarativa se coloca en el nivel de clase y de miembro, la demanda declarativa sobre el miembro reemplaza la demanda en el nivel de clase. El ejemplo de cdigo siguiente muestra una versin modificada del mtodo PrivateInfo a partir del ejemplo de la seccin anterior. Esta versin utiliza seguridad declarativa. PrincipalPermissionAttribute define la entidad de seguridad que el subproceso actual debe tener para invocar el mtodo. Basta con pasar la clase SecurityAction.Demand con el nombre y la funcin que se requieren. Public Shared Sub _ <PrincipalPermissionAttribute(SecurityAction.Demand, Name := "MyUser", Role := "User")> _ PrivateInfo() 'Print secret data. Console.WriteLine(ControlChars.CrLf + "You have access to the private data!") End Sub
CIBERTEC
CARRERAS PROFESIONALES
174
5.
Se puede utilizar la clase GenericIdentity conjuntamente con la clase GenericPrincipal para crear un esquema de autorizacin que sea independiente del dominio de Windows NT o Windows 2000. Para crear un objeto GenericPrincipal 1. Cree una instancia nueva de la clase de identidad e inicialcela con el nombre que desee que contenga. El cdigo siguiente crea un objeto GenericIdentity nuevo y lo inicializa con el nombre MyUser. Dim MyIdentity As New GenericIdentity("MyUser") 2. Cree una instancia nueva de la clase GenericPrincipal e inicialcela con el objeto GenericIdentity creado anteriormente y una matriz de cadenas que representen las funciones que desee asociar a este principal. En el siguiente ejemplo de cdigo se especifica una matriz de cadenas que representan una funcin de administrador y una funcin de usuario. A continuacin, la clase GenericPrincipal se inicializa con el objeto GenericIdentity anterior y la matriz de cadenas. Dim MyStringArray As String() = {"Manager", "Teller"} DIm MyPrincipal As New GenericPrincipal(MyIdentity, MyStringArray 3. Utilice el cdigo siguiente para asociar el principal al subproceso actual. Este mtodo es muy til en situaciones en que la entidad de seguridad debe validarse varias veces, debe validarse en otro cdigo que se ejecuta en la aplicacin o debe validarse mediante un objeto PrincipalPermission. Se puede seguir realizando la validacin basada en funciones en el objeto principal sin asociarlo al subproceso. Thread.CurrentPrincipal = MyPrincipal Imports System Imports System.Security.Principal Imports System.Threading Public Class Class1 Public Shared Sub Main() ' Crear generic identity. Dim MyIdentity As New GenericIdentity("MyIdentity") ' Crear generic principal. Dim MyStringArray As String() = {"Manager", "Teller"} Dim MyPrincipal As New GenericPrincipal(MyIdentity, MyStringArray) Enlazar principal al thread actual Esto no es requerido a menos que deba haber una validacin repetida ' otro cdigo debera validarlo o el objeto PrincipalPermisson object sea usado. Thread.CurrentPrincipal = MyPrincipal ' Mostrar valores en la consola Dim Name As String = MyPrincipal.Identity.Name
CARRERAS PROFESIONALES
CIBERTEC
Dim Auth As Boolean = MyPrincipal.Identity.IsAuthenticated Dim IsInRole As Boolean = MyPrincipal.IsInRole("Manager") Console.WriteLine("The Name is: {0}", Name) Console.WriteLine("The IsAuthenticated is: {0}", Auth) Console.WriteLine("Is this a Manager? {0}", IsInRole) End Sub End Class
3. Servicios criptogrficos
Las redes pblicas como Internet no proporcionan un medio de comunicacin segura entre entidades. La comunicacin en esas redes es susceptible de que terceras personas, sin autorizacin, tengan acceso a ella o la modifiquen. Adems de permitir el cifrado de los archivos de los discos locales, la criptografa ayuda a crear medios de comunicacin seguros sobre canales que, de otro modo, seran inseguros, proporcionando a su vez integridad de datos y autenticacin. La criptografa ayuda a proteger los datos para que no puedan ser vistos, proporciona mecanismos para la deteccin de datos modificados y facilita un medio de comunicacin seguro en canales que, de otra forma, no seran seguros. Por ejemplo, los datos pueden cifrarse con un algoritmo criptogrfico y transmitirse en un estado cifrado a una tercera persona, que posteriormente los descifrar. Si un tercero intercepta los datos cifrados, le resultar difcil descifrarlos. Para alcanzar estos objetivos, se puede usar una combinacin de algoritmos y prcticas conocidas como primitivas criptogrficas para crear un esquema criptogrfico. En la tabla siguiente se enumeran las primitivas criptogrficas y su uso. Primitiva criptogrfica Cifrado de clave secreta (criptografa simtrica) Uso Realiza la transformacin de los datos para impedir que terceros los lean. Este tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los datos. Realiza la transformacin de los datos para impedir que terceros los lean. Este tipo de cifrado utiliza un par de claves pblica y privada para cifrar y descifrar los datos. Ayuda a comprobar que los datos se originan en una parte especfica mediante la creacin de una firma digital nica para esa parte. En este proceso tambin se usan funciones hash. Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija. Los valores hash son nicos estadsticamente; el valor hash de una secuencia de dos bytes distinta no ser el mismo.
Firmas criptogrficas
CIBERTEC
CARRERAS PROFESIONALES
176
.NET Framework proporciona las siguientes clases que implementan algoritmos de cifrado de clave pblica:
DSACryptoServiceProvider RSACryptoServiceProvider ECDiffieHellman (clase base) ECDiffieHellmanCng ECDiffieHellmanCngPublicKey (clase base) ECDiffieHellmanKeyDerivationFunction (clase base)) ECDsaCng
.NET Framework proporciona las siguientes clases que implementan algoritmos de firma digital:
.NET Framework proporciona las siguientes clases que implementan algoritmos de firma digital:
.NET Framework proporciona las siguientes clases que implementan algoritmos de firma digital:
HMACSHA1. MACTripleDES. MD5CryptoServiceProvider. RIPEMD160. SHA1Managed. SHA256Managed. SHA384Managed. SHA512Managed. Variaciones HMAC de todos los algoritmos SHA (algoritmo hash seguro),
CARRERAS PROFESIONALES
CIBERTEC
Claves simtricas Las clases de cifrado simtrico que proporciona .NET Framework requieren una clave y un nuevo vector de inicializacin (IV) para cifrar y descifrar datos. En el ejemplo siguiente se muestra la creacin de una nueva instancia de la clase TripleDESCryptoServiceProvider que implementa el algoritmo TripleDES. Dim TDES as TripleDESCryptoServiceProvider = new _ TripleDESCryptoServiceProvider () Cuando se ejecuta el cdigo anterior, se genera una nueva clave y un IV, y se colocan en las propiedades Key e IV, respectivamente. En ocasiones tendr que generar varias claves. En este caso, puede crear una nueva instancia de una clase que implemente un algoritmo simtrico y despus crear una nueva clave e IV mediante una llamada a los mtodos GenerateKey y GenerateIV. En el ejemplo de cdigo siguiente se ilustra cmo crear nuevas claves y vectores de inicializacin una vez creada una nueva instancia de la clase criptogrfica asimtrica. Dim TDES As TripleDESCryptoServiceProvider = new _ TripleDESCryptoServiceProvider() TDES.GenerateIV () TDES.GenerateKey () Cuando se ejecuta el cdigo anterior, se generan una clave y un IV al crear la nueva instancia de TripleDESCryptoServiceProvider. Se crean otra clave e IV cuando se llama a los mtodos GenerateKey y GenerateIV. Claves asimtricas .NET Framework proporciona las clases RSACryptoServiceProvider y DSACryptoServiceProvider para el cifrado asimtrico. Estas clases crean un par de claves pblica y privada cuando utiliza el constructor predeterminado para crear una nueva instancia. Las claves asimtricas pueden almacenarse para utilizarse en sesiones mltiples o bien generarse para una sesin nicamente. Aunque la clave pblica puede ponerse a disposicin general, la clave privada debe guardarse bien. En el ejemplo de cdigo siguiente se crea una nueva instancia de la clase RSACryptoServiceProvider, se crea un par de claves pblica y privada, y se guarda la informacin de la clave pblica en una estructura RSAParameters. 'Generar un par de calves public/private Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider() 'Guardar la clave public key de informacin en una estructura RSAParameters Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)
CIBERTEC
CARRERAS PROFESIONALES
178
4.
AppDomain (Clase)
Representa un dominio de aplicacin, que es un entorno aislado donde se ejecutan las aplicaciones. Esta clase no se puede heredar. Los dominios de aplicacin, representados por los objetos AppDomain, ayudan a proporcionar aislamiento, descarga y lmites de seguridad para ejecutar el cdigo administrado.
Utilice los dominios de aplicacin para aislar tareas que podran derrumbar un proceso. Si el estado del objeto AppDomain que est ejecutando una tarea se vuelve inestable, el objeto AppDomain se puede descargar sin afectar al proceso. Es importante cuando un proceso debe ejecutarse durante largos perodos sin reiniciar. Tambin puede utilizar los dominios de aplicacin para aislar tareas que no deberan compartir datos. Si se carga un ensamblado en el dominio de aplicacin predeterminado, no se podr descargar de la memoria mientras el proceso se est ejecutando. Sin embargo, si se abre un segundo dominio de aplicacin para cargar y ejecutar el ensamblado, ste se descarga cuando se descarga ese dominio de aplicacin. Utilice esta tcnica para minimizar el espacio de trabajo de los procesos de ejecucin larga que en ocasiones utilizan grandes archivos DLL.
Los dominios de aplicacin se crean mediante el mtodo CreateDomain. Las instancias de AppDomain se utilizan para cargar y ejecutar ensamblados (Assembly). Cuando un AppDomain deja de utilizarse, puede descargarse. La clase AppDomain implementa un conjunto de eventos que permiten a las aplicaciones responder cuando se cargue un ensamblado, se descargue un dominio de aplicacin o se produce una excepcin no controlada. En el siguiente cdigo, se carga un ensamblado denominado "example.exe" o "example.dll" en el dominio de aplicacin actual, se obtiene un tipo denominado Example del ensamblado, se obtiene un mtodo sin parmetros denominado MethodA para ese tipo y se ejecuta el mtodo. Si desea una descripcin completa de cmo obtener informacin de un ensamblado cargado, vea Cargar y utilizar tipos dinmicamente.
LABORATORIO 12.1
Cree una aplicacin Windows que permita consultar los permisos y roles del usuario actual. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio12_1 4. Disee la siguiente GUI.
CARRERAS PROFESIONALES
CIBERTEC
5. Agregue el cdigo fuente que corresponde a cada botn. Imports System.Security.Principal Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click 'windowsIdentity: representa a un usuario de windows. Se obtiene el usuario actual Dim objidentidadActual As WindowsIdentity objidentidadActual = WindowsIdentity.GetCurrent() 'se muestra informacion del ususario MessageBox.Show( "Nombre de usuario: " + objidentidadActual.Name) MessageBox.Show( "ID Token del Usuario: " +
objidentidadActual.AuthenticationType) 'Se muestra informacion basada en valores boleanos If objidentidadActual.IsAnonymous = True Then MessageBox.Show (Es un usuario annimo) End If If objidentidadActual.IsAuthenticated = True Then MessageBox.Show (Es un usuario autenticado)
CIBERTEC
CARRERAS PROFESIONALES
180
End If If objidentidadActual.IsSystem = True Then MessageBox.Show("Es parte del sistema") End If If objidentidadActual.IsGuest = True Then MessageBox.Show("Es un invitado Guest") End If End Sub Private Sub btnRoles_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnRoles.Click 'Se obtiene el usuario actual Dim objUserActual As WindowsIdentity = WindowsIdentity.GetCurrent () 'WindowsPrincipal: Permite que se compruebe la condicion 'de pretenencia de un usuario de windows a un grupo de windows Dim currentPrincipal As WindowsPrincipal = New
WindowsPrincipal(objUserActual) MessageBox.Show("El usuario actual ed un miembro de los siguientes grupos: " ) 'se verifica los 3 grupos a los que pertenece If currentPrincipal.IsInRole(WindowsBuiltInRole.Administrator) Then MessageBox.Show(WindowsBuiltInRole.Administrator.ToString) End If If currentPrincipal.IsInRole(WindowsBuiltInRole.PowerUser) Then MessageBox.Show(WindowsBuiltInRole.PowerUser.ToString) End If If currentPrincipal.IsInRole(WindowsBuiltInRole.User) Then MessageBox.Show(WindowsBuiltInRole.User.ToString) End If End Sub End Class
CARRERAS PROFESIONALES
CIBERTEC
LABORATORIO 12.2
Cree una aplicacin windows para evaluar el resultado de encriptar un archivo de texto. El Algoritmo a utilizar ser SymmetricAlgorithm 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio12_2 4. Disee la siguiente GUI.
5. Complete el cdigo fuente en el botn que le corresponde Imports System.Security.Cryptography Imports System.IO Public Class Form1 Private Sub btnEncriptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncriptar.Click Dim ingreso As String = "C:\Persona.txt" Dim salida As String = "C:\Persona.enc" Paso 1: se crea el Objeto Stream Dim inFile As FileStream = New FileStream (ingreso, FileMode.Open,
FileAccess.Read)
CIBERTEC
CARRERAS PROFESIONALES
182
Dim outFile As FileStream = New FileStream(salida, FileMode.OpenOrCreate, FileAccess.Write) 'se crea un password Dim password As String = "clave" 'Paso 2: crea el objeto SymnetricAlgorithm y llamas al administardor del algoritmo 'de encriptacion ' crea un objeto cifrador rhijndaqel simetrico Dim myAlg As SymmetricAlgorithm = New RijndaelManaged() 'Paso 3: Especificamos la llave Dim salt As Byte() = System.Text.Encoding.ASCII.GetBytes("This is my sa1t") Dim key As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(password, salt) myAlg.Key = key.GetBytes(myAlg.KeySize / 8) myAlg.IV = key.GetBytes(myAlg.BlockSize / 8) 'Lea el arhivo no encriptado dentro de fileData Dim fileData(inFile.Length - 1) As Byte inFile.Read(fileData, 0, CType(inFile.Length, Integer)) 'Paso 4: crea el objeto ICryptoTransform 'define las operaciones basicas de las transformaiones cryptograficas Dim encryptor As ICryptoTransform = myAlg.CreateEncryptor 'Paso 5:crea el objeto CryptoStream Dim encryptStream As CryptoStream = _ New CryptoStream(outFile, encryptor, CryptoStreamMode.Write) 'Paso 6: Escribe el contenido dentro del CryptoStream encryptStream.Write(fileData, 0, fileData.Length) 'cierra el archivo encryptStream.Close() inFile.Close() outFile.Close() MessageBox.Show("MensajeTerminado") End Sub
CARRERAS PROFESIONALES
CIBERTEC
Private Sub btnDesencriptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDesencriptar.Click Dim lectura As String = "C:\Persona.enc" Dim nuevo As String = "C:\NuevaPersona.txt" Dim password As String = "clave" Dim saltValueBytes As Byte() = System.Text.Encoding.ASCII.GetBytes( "This is my sa1t" ) Dim passwordKey As Rfc2898DeriveBytes = New
Rfc2898DeriveBytes(password, saltValueBytes) ' Crear el algoritmo y especificar la clave y el IV Dim myAlg As RijndaelManaged = New RijndaelManaged myAlg.Key = passwordKey.GetBytes(myAlg.KeySize / 8) myAlg.IV = passwordKey.GetBytes(myAlg.BlockSize / 8) ' Leer el archive encriptado dentro de fileData Dim decryptor As ICryptoTransform = myAlg.CreateDecryptor Dim inFile As FileStream = New FileStream(lectura, FileMode.Open,
FileAccess.Read) Dim decryptStream As CryptoStream = New CryptoStream(inFile, decryptor, CryptoStreamMode.Read) Dim fileData(inFile.Length) As Byte decryptStream.Read(fileData, 0, inFile.Length) ' Escribir el contenido del archive desencriptado Dim outFile As FileStream = New FileStream(nuevo, FileMode.OpenOrCreate, FileAccess.Write) outFile.Write(fileData, 0, fileData.Length) ' Cerrar objetos que intervienen en la desencriptacin decryptStream.Close() inFile.Close() outFile.Close() MessageBox.Show("Mensaje Decodificado") End Sub End Class
CIBERTEC
CARRERAS PROFESIONALES
184
LABORATORIO 12.3
Cree una aplicacin Windows que permita encriptar datos de un archivo para luego desencriptarlo. El Algoritmo a utilizar ser DESCryptoServiceProvider 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio12_3 4. Disee la siguiente GUI.
5. Complete el cdigo fuente para cada botn y defina las variables globales correspondientes. Imports System.IO Imports System.Security.Cryptography
Public Class Form2 'Proveedor para encriptar, su llave y vector inicial Dim DES As New DESCryptoServiceProvider Dim key() As Byte = DES.Key Dim v() As Byte = DES.IV Private Sub btnLimpiar_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click Me.TextBox1.Text = ""
CARRERAS PROFESIONALES
CIBERTEC
System.EventArgs) Handles btnAbrir.Click 'abrir un archivo y leer su contenido Dim op As New OpenFileDialog op.Filter = "Archivo de Texto|*.txt" If op.ShowDialog = Windows.Forms.DialogResult.OK Then 'definir un Lector Dim SR As New StreamReader(op.FileName) 'leer su contenido Me.TextBox1.Text = SR.ReadToEnd 'cerrar el Reader SR.Close() End If End Sub Private Sub btnCodificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCodificar.Click Dim sv As New SaveFileDialog sv.Filter = "Archivo de Texto|*.txt" If sv.ShowDialog = Windows.Forms.DialogResult.OK Then '1.convertir el texto en una secuencia de bytes Dim Ms As New MemoryStream Dim SW As New StreamWriter(Ms) SW.Write(TextBox1.Text) 'escribir SW.Flush() 'liberar el escritor, el Memory leera contenido 'convertir los datos almacenados en secuencia de bytes Dim data() As Byte = Ms.ToArray '2.Codificar y almacenar Dim F As New FileStream(sv.FileName, FileMode.Create) 'definir el CryptoStream para codificar
CIBERTEC
CARRERAS PROFESIONALES
186
Dim
CS
As
New
CryptoStream(F,
DES.CreateEncryptor(key,
v),
CryptoStreamMode.Write) 'codificar CS.Write(data, 0, data.Length) F.Close() 'cerrar el archivo End If End Sub
Private Sub btnDecodificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecodificar.Click 'Abrir el archivo encriptado Dim op As New OpenFileDialog op.Filter = "Archivo de Texto|*.txt" If op.ShowDialog = Windows.Forms.DialogResult.OK Then '1.Abrir el Archivo y convertirlo en secuencia de bytes Dim F As New FileStream(op.FileName, FileMode.Open) Dim data(F.Length) As Byte F.Read(data, 0, data.Length) F.Close() '2.Decodificar almacenando en un MemoryStream Dim Ms As New MemoryStream 'definir el crypto para decodificar Dim CS As New CryptoStream(Ms, _ DES.CreateDecryptor(key, v), CryptoStreamMode.Write) 'escribir para decodificar data CS.Write(data, 0, data.Length) 'Mostrar el contenido decodificado Ms.Position = 0 'ubicar en la posicion inicial Dim SR As New StreamReader(Ms) 'lector al Ms 'mostrar el contenido MessageBox.Show (SR.ReadToEnd) SR.Close() 'cerrar End If End Sub End Class
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacin
1. Qu tipos de seguridad se pueden utilizar para aplicaciones windows? ____________________________________________________________ ____________________________________________________________
CIBERTEC
CARRERAS PROFESIONALES
188
Resumen
La seguridad basada en funciones de .NET Framework admite la autorizacin poniendo a disposicin del subproceso actual informacin relativa al principal, que se crea a partir de una identidad asociada. La identidad (y el principal que ayuda a definir) puede estar basada en una cuenta de Windows o puede ser una identidad personalizada no relacionada con una cuenta de Windows.
El objeto de identidad encapsula informacin relativa al usuario o la entidad que se van a validar.
El objeto principal representa el contexto de seguridad bajo el cual se ejecuta cdigo. Las aplicaciones que implementan seguridad basada en funciones conceden derechos tomando como base la funcin asociada a un objeto principal.
La criptografa ayuda a proteger los datos para que no puedan ser vistos, proporciona mecanismos para la deteccin de datos modificados y facilita un medio de comunicacin seguro en canales que, de otra forma, no seran seguros.
.NET Framework proporciona implementaciones de numerosos algoritmos criptogrficos estndar. Estos algoritmos son fciles de utilizar y disponen de las propiedades predeterminadas ms seguras. Adems, el modelo de criptografa de .NET Framework de la herencia de objetos, el diseo de las secuencias y la configuracin son muy extensibles.
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
5
SEMANA
13
Interoperabilidad y Reflection
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaborarn aplicaciones de mejor rendimiento y acceso asignando recursos, permisos, componentes, cultura y una adecuada distribucin de la misma para su implementacin.
TEMARIO
Exposicin de componentes COM al .NET Framework Invocacin de funciones Dlls no manejadas Manejo de Reflection
ACTIVIDADES PROPUESTAS
Los alumnos crean clases que pueden interoperar en aplicaciones COM Los alumnos crear aplicaciones que usan reflection.
CIBERTEC
CARRERAS PROFESIONALES
190
1.
1.1. Interoperar con cdigo no administrado .NET Framework promueve la interaccin con los componentes COM, los Servicios COM+, las bibliotecas de tipos externas y muchos servicios del sistema operativo. Los tipos de datos, los prototipos de los mtodos y los mecanismos de control de errores no son iguales en los modelos de objetos administrados y no administrados. Para simplificar la interoperacin entre los componentes de .NET Framework y el cdigo no administrado y facilitar la ruta de acceso de migracin, Common Language Runtime oculta las diferencias que existen entre estos modelos de objetos a los clientes y a los servidores. El cdigo que se ejecuta bajo el control del motor en tiempo de ejecucin se denomina cdigo administrado. Por el contrario, el cdigo que se ejecuta fuera del motor en tiempo de ejecucin se denomina cdigo no administrado. Los componentes COM, las interfaces ActiveX y las funciones de la API Win32 son ejemplos de cdigo no administrado. 1.2. Aplicar atributos de interoperabilidad El espacio de nombres System.Runtime.InteropServices proporciona tres categoras de atributos especficos de la interoperabilidad: los que el usuario aplica en tiempo de diseo, los que las API y las herramientas de interoperabilidad COM aplican durante el proceso de conversin y los que aplica el usuario o la interoperabilidad COM. Si no est familiarizado con la tarea de aplicar atributos al cdigo administrado, vea Extender metadatos mediante atributos. Del mismo modo que se aplican otros atributos personalizados, los atributos especficos de la interoperabilidad pueden aplicarse a tipos, mtodos, propiedades, parmetros, campos y otros miembros. Atributos en tiempo de diseo Se puede ajustar el resultado del proceso de conversin realizado por las API y las herramientas de interoperabilidad COM utilizando atributos en tiempo de diseo. En la siguiente tabla se describen los atributos que se pueden aplicar al cdigo fuente administrado. En alguna ocasin, las herramientas de interoperabilidad COM podran aplicar tambin los atributos descritos en esta tabla.
Atributo AutomationProxyAttribute
Descripcin Especifica si las referencias del tipo deben calcularse utilizando el contador de referencias de automatizacin o un proxy y un cdigo auxiliar personalizados. Controla el tipo de interfaz generada para una clase. Identifica el CLSID de la coclase original importada de una biblioteca de tipos. Las herramientas de interoperabilidad COM aplican normalmente este atributo. Indica que una definicin de interfaz o coclase se import desde una biblioteca de tipos COM. El motor en tiempo de ejecucin utiliza este indicador para conocer la forma de activar el tipo y de calcular sus referencias. Este atributo impide que el tipo vuelva a exportarse a la biblioteca de tipos. Las herramientas de interoperabilidad COM aplican normalmente este atributo.
ClassInterfaceAttribute ComClassAttribute
ComImportAttribute
CARRERAS PROFESIONALES
CIBERTEC
ComRegisterFunctionAttribute
Indica que debe llamarse a un mtodo cuando el ensamblado se registra para su uso desde COM, de modo que el cdigo escrito por el usuario pueda ejecutarse durante el proceso de registro. ComSourceInterfacesAttribute Identifica las interfaces que son orgenes de eventos para la clase. Las herramientas de interoperabilidad COM pueden aplicar este atributo. ComUnregisterFunctionAttribute Indica que debe llamarse a un mtodo cuando se anula el registro del ensamblado desde COM, de modo que el cdigo escrito por el usuario pueda ejecutarse durante el proceso. ComVisibleAttribute Hace que los tipos no sean visibles para COM cuando el valor del atributo es false. Este atributo puede aplicarse a un tipo individual o a todo un ensamblado para controlar la visibilidad de COM. De forma predeterminada, todos los tipos pblicos administrados son visibles; este atributo no es necesario para hacerlos visibles. InAttribute Indica que el clculo de referencias de los datos debe realizarse en el llamador. Puede utilizarse en parmetros de atributo. InterfaceTypeAttribute Controla la forma en que una interfaz administrada se expone en los clientes COM (dual, derivada de Iunknown o slo IDispatch). Las herramientas de interoperabilidad COM pueden aplicar este atributo. OptionalAttribute Indica que un parmetro es opcional. Las herramientas de interoperabilidad COM pueden aplicar este atributo. 1.3. System.Runtime.InteropServices.ComTypes (Espacio de nombres)
El espacio de nombres System.Runtime.InteropServices.ComTypes contiene mtodos que son definiciones de funciones COM para el cdigo administrado. Estas funciones reemplazan a los mtodos UCOM*, ahora obsoletos, del espacio de nombres
2.
El espacio de nombres System.Reflection contiene clases e interfaces que proporcionan una vista administrada de los campos, los mtodos y los tipos cargados, con la posibilidad de crear e invocar tipos dinmicamente. Adems contiene tipos que recuperan informacin sobre los ensamblados, mdulos, miembros, parmetros y otras entidades del cdigo administrado examinando sus metadatos. Estos tipos tambin se pueden utilizar para manipular instancias de tipos cargados, por ejemplo, para enlazar eventos o llamar a mtodos. Para crear tipos dinmicamente, utilice el espacio de nombres System.Reflection.Emit.
CIBERTEC
CARRERAS PROFESIONALES
192
Se recomienda cargar los ensamblados utilizando el mtodo Load, que identifica el ensamblado que se va a cargar mediante su nombre para mostrar (por ejemplo, "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"). La bsqueda del ensamblado se rige por las normas descritas en Cmo el motor en tiempo de ejecucin ubica ensamblados. Los mtodos ReflectionOnlyLoad y ReflectionOnlyLoadFrom permiten cargar un ensamblado para su reflexin, pero no para su ejecucin. Por ejemplo, un ensamblado que tiene como destino una plataforma de 64 bits puede ser examinado por el cdigo que se ejecuta en una plataforma de 32 bits. Los mtodos LoadFile y LoadFrom se proporcionan para aquellas situaciones poco habituales en que un ensamblado debe identificarse mediante una ruta de acceso.
Si desea obtener un objeto Assembly para el ensamblado que se encuentra actualmente en ejecucin, utilice el mtodo GetExecutingAssembly. Muchos miembros de la clase Assembly proporcionan informacin sobre un ensamblado. Por ejemplo:
El mtodo GetName devuelve un objeto AssemblyName que proporciona acceso a las partes del nombre para mostrar del ensamblado. El mtodo GetCustomAttributes muestra los atributos que se aplican al ensamblado. El mtodo GetFiles proporciona acceso a los archivos del manifiesto del ensamblado. El mtodo GetManifestResourceNames proporciona los nombres de los recursos del manifiesto del ensamblado.
El mtodo GetTypes muestra todos los tipos del ensamblado. El mtodo GetExportedTypes indica los tipos que los llamadores pueden ver desde fuera del ensamblado. El mtodo GetType se puede utilizar para buscar un tipo determinado en el ensamblado. El mtodo CreateInstance se puede utilizar para buscar y crear instancias de tipos en el ensamblado.
CARRERAS PROFESIONALES
CIBERTEC
Imports System Imports System.Reflection Imports System.Security.Permissions <assembly: AssemblyVersionAttribute("1.0.2000.0")> Public Class Example Private factor As Integer Public Sub New(ByVal f As Integer) factor = f End Sub Public Function SampleMethod(ByVal x As Integer) As Integer Console.WriteLine(vbCrLf & "Example.SampleMethod({0}) executes.", x) Return x * factor End Function Public Shared Sub Main() Dim assem As [Assembly] = [Assembly].GetExecutingAssembly() Console.WriteLine("Assembly Full Name:") Console.WriteLine(assem.FullName) ' The AssemblyName type can be used to parse the full name. Dim assemName As AssemblyName = assem.GetName() Console.WriteLine(vbLf + "Name: {0}", assemName.Name) Console.WriteLine("Version: {0}.{1}", assemName.Version.Major, _ assemName.Version.Minor) Console.WriteLine(vbLf + "Assembly CodeBase:") Console.WriteLine(assem.CodeBase) ' Create an object from the assembly, passing in the correct number ' and type of arguments for the constructor. Dim o As Object = assem.CreateInstance("Example", False, _ BindingFlags.ExactBinding, Nothing, _ New Object() { 2 }, Nothing, Nothing) ' Make a late-bound call to an instance method of the object. Dim m As MethodInfo = assem.GetType("Example").GetMethod("SampleMethod") Dim ret As Object = m.Invoke(o, New Object() { 42 }) Console.WriteLine("SampleMethod returned {0}.", ret) Console.WriteLine(vbCrLf & "Assembly entry point:") Console.WriteLine(assem.EntryPoint) End Sub End Class
CIBERTEC
CARRERAS PROFESIONALES
194
' Este cdigo produce una salida similar a lo siguiente: ' 'Assembly Full Name: 'source, Version=1.0.2000.0, Culture=neutral, PublicKeyToken=null ' 'Name: source 'Version: 1.0 ' 'Assembly CodeBase: 'file: C:/sdtree/AssemblyClass/vb/source.exe ' Example.SampleMethod (42) executes. 'SampleMethod returned 84. ' 'Assembly entry point: 'Void Main()
LABORATORIO 13.1
Cree una aplicacin Windows que permita ingresar datos de un objeto Persona y luego se serialice esta informacin en formato XML. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Class Library y en Name escriba InteropFunciones 4. Agregar el siguiente cdigo en el archivo de la clase Operacin. 'Namespace para manejar la interoperabilidad de la clase Operacion Imports System.Runtime.InteropServices 'crear una interfase Public Interface IOperacion Function Sumar(ByVal a As Integer, ByVal b As Integer) As Integer Function Restar(ByVal a As Integer, ByVal b As Integer) As Integer Function CalcularUltimoDiaMes(ByVal mes As String, ByVal anho As String) As Integer <ComVisible(False)> _ Function Multiplicar(ByVal a As Integer, ByVal b As Integer) As Integer End Interface
CARRERAS PROFESIONALES
CIBERTEC
<ClassInterface(ClassInterfaceType.None)> _ Public Class Operacion Implements IOperacion Public Function Multiplicar(ByVal a As Integer, ByVal b As Integer) As Integer Implements IOperacion.Multiplicar Return a * b End Function Public Function Restar(ByVal a As Integer, ByVal b As Integer) As Integer Implements IOperacion.Restar Return a - b End Function Public Function Sumar(ByVal a As Integer, ByVal b As Integer) As Integer Implements IOperacion.Sumar Return a + b End Function Public Function CalcularUltimoDiaMes(ByVal mes As String, ByVal anho As String) As Integer Implements IOperacion.CalcularUltimoDiaMes Dim strFecha As String Dim dtFecha As DateTime strFecha = "01/" + mes + "/" + anho dtFecha = CDate(strFecha) dtFecha = DateAdd(DateInterval.Month, 1, dtFecha) dtFecha = DateAdd(DateInterval.Day, -1, dtFecha) Return dtFecha.Day End Function End Class
CIBERTEC
CARRERAS PROFESIONALES
196
Autoevaluacin
1. Qu es Interoperabilidad COM?
2.
Qu es Reflection?
3.
CARRERAS PROFESIONALES
CIBERTEC
Para Recordar
Assembly Representa un ensamblado, que es un bloque de creacin reutilizable, versionable y autodescriptivo de una aplicacin de Common Language Runtime. El espacio de nombres System.Runtime.InteropServices proporciona una gran variedad de miembros que admiten la interoperabilidad COM y los servicios de invocacin de plataforma. La clase ComVisibleAttribute controla la accesibilidad a COM de un tipo o miembro administrado individual o de todos los tipos de un ensamblado.
Nota:
CIBERTEC
CARRERAS PROFESIONALES
198
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
5
SEMANA
14
TEMARIO
Manejo de globalizacin y cultura Foramas de efectuar la globalizacin. Introduccin a WPF
ACTIVIDADES PROPUESTAS
Los alumnos crean aplicaciones con etiquetas segn la cultura que utiliza la pc. Los alumnos crean aplicacones WPF para mejorar las interfaces de usuario.
CIBERTEC
CARRERAS PROFESIONALES
200
CARRERAS PROFESIONALES
CIBERTEC
Thread.CurrentCulture (Propiedad) Obtiene o establece la referencia cultural del subproceso actual. CultureInfo (Clase) Proporciona informacin de una referencia cultural concreta, como los nombres de la referencia cultural, el sistema de escritura, el calendario utilizado y cmo se da formato a las fechas y se ordenan las cadenas. CultureInfo (Propiedades) Nombre Calendar CompareInfo CultureTypes CurrentCulture CurrentUICulture Descripcin Obtiene el calendario predeterminado utilizado por la referencia cultural. Obtiene el CompareInfo que define el modo en que se comparan las cadenas para la referencia cultural. Obtiene los tipos de referencia cultural que pertenecen al objeto CultureInfo actual. Obtiene el CultureInfo que representa la referencia cultural utilizada por el subproceso actual. Obtiene el CultureInfo que representa la referencia cultural actual utilizada por el administrador de recursos que busca recursos especficos de la referencia cultural en tiempo de ejecucin. Obtiene o establece un DateTimeFormatInfo que define el formato de presentacin de fechas y horas culturalmente apropiado. Obtiene el nombre de la referencia cultural en el formato "<idiomacompleto> (<pas/regincompletos>)" en el idioma de la versin traducida de .NET Framework. Obtiene el nombre de la referencia cultural en el formato "<idiomacompleto> (<pas/regincompletos>)" en ingls. Obtiene la identificacin del estndar RFC 3066 (bis) para un idioma. Obtiene el CultureInfo que representa la referencia cultural instalada con el sistema operativo. Obtiene el CultureInfo que es independiente de la referencia cultural (invariable). Obtiene un valor que indica si el CultureInfo actual representa una referencia cultural neutra. Obtiene un valor que indica si el CultureInfo actual es de slo lectura. Obtiene el identificador de configuracin regional de entrada activo. Obtiene el identificador de referencia cultural del CultureInfo actual. Obtiene el nombre de la referencia cultural en el formato "<cdigoidioma2>-<cdigopas/regin2>". Obtiene el nombre de la referencia cultural en el formato "<idiomacompleto> (<pas/regincompletos>)" en el
DateTimeFormat
DisplayName
EnglishName IetfLanguageTag InstalledUICulture InvariantCulture IsNeutralCulture IsReadOnly KeyboardLayoutId LCID Name NativeName
CIBERTEC
CARRERAS PROFESIONALES
202
NumberFormat
TextInfo
idioma de presentacin en el que est establecida la referencia cultural. Obtiene o establece un NumberFormatInfo que define el formato de presentacin de nmeros, moneda y porcentaje culturalmente apropiado. Obtiene el TextInfo que define el sistema de escritura asociado a la referencia cultural.
A diferencia de CultureInfo, RegionInfo no representa las preferencias del usuario y no depende del idioma ni de la referencia cultural del usuario. El nombre de RegionInfo es uno de los cdigos de dos letras definidos en ISO 3166 para el pas o la regin. La distincin entre maysculas y minsculas no es relevante; Name, TwoLetterISORegionName y sin embargo, las propiedades ThreeLetterISORegionName devuelven el cdigo correspondiente en maysculas.
LABORATORIO 14.1
Cree una aplicacin Windows que permita ingresar datos en un formulario que muestra sus etiquetas de acuerdo al lenguaje elegido desde un combobox. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio10_2 4. Disee la siguiente GUI.
CARRERAS PROFESIONALES
CIBERTEC
Imports System.Globalization 'Namespace para usar archivos de recursos Imports System.Resources 'Namespace para usar threads Imports System.Threading Public Class Form1 'Declarar variable de tipo ResourceManager para usar archivo de recursos Dim rm As ResourceManager 'Declarar variable CultureInfo para trabajar con una cultura especifica Dim cult As CultureInfo Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Cargar los archivos de recursos rm = ResourceManager.CreateFileBasedResourceManager _ ("Strings", "C:\", Nothing) End Sub Private Sub btnRegisrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click lblTitulo.Visible = True lblNombres.Visible = True lblApellidos.Visible = True lblTitulo.Text = rm.GetString("Sal", cult) lblNombres.Text = rm.GetString("SalNom", cult) + " " + txtNombre.Text.Trim lblApellidos.Text = rm.GetString("SalApe", cult) + " " + txtApellido.Text End Sub Private Sub cboCulturas_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboCulturas.SelectedIndexChanged 'Instanciar una nueva cultura de acuerdo a lo 'seleccionado en el combo cult = New CultureInfo(cboCulturas.Text.Trim) 'cambiar la cultura actual por la seleccionada en el Combobox
CIBERTEC
CARRERAS PROFESIONALES
204
Thread.CurrentThread.CurrentCulture = cult Thread.CurrentThread.CurrentUICulture = cult 'Mostrar el atributo Nom que se encuentra en el archivo 'de recursos de la cultura elegida lblPregunta1.Text = rm.GetString("Nom", cult) lblPregunta2.Text = rm.GetString("Ape", cult) lblTitulo.Visible = False lblNombres.Visible = False lblApellidos.Visible = False End Sub End Class
LABORATORIO 14.2
Cree una aplicacin Windows que permita ingresar datos como fecha y moneda, de esta manera seleccionando una cutura especifica se cambiaran estos datos al formato fecha y moneda de la cultura seleccionada. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija Windows Application y en Name escriba Laboratorio14_2 4. Disee la siguiente GUI.
CARRERAS PROFESIONALES
CIBERTEC
'Namespace para trabajar con la clase CultereInfo Imports System.Globalization Public Class Form2 'crear mtodo q cargue las culturas actuales Sub MostrarCulturas() For Each cultura As CultureInfo In _ CultureInfo.GetCultures(CultureTypes.SpecificCultures) 'listar cada nombre de cultura en el listbox ListBox1.Items.Add(cultura.Name) Next End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load MostrarCulturas() End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged 'recuperar la cultura seleccionada Dim oCulture As String = ListBox1.SelectedItem.ToString 'crear un objeto CultureInfo con la cultura seleccionada Dim cu As New CultureInfo(oCulture) Dim nValor As Double = 7814.86 'aplicar el formato correspondiente en base a la cultura 'para la fecha txtFormatoFecha.Text = Now.ToString("d", cu) 'y para la moneda txtFormatoMoneda.Text = nValor.ToString("c", cu) 'mostramos el nombre en espaol de la cultura. lblCultura.Text = cu.DisplayName 'mostrar pais de la cultura
CIBERTEC
CARRERAS PROFESIONALES
206
Dim region As New RegionInfo(oCulture) lblPais.text = region.DisplayName End Sub End Class
2.
Introduccin a WPF
Windows Presentation Foundation (WPF) proporciona a los programadores un modelo de programacin unificado con el que generar experiencias de cliente inteligentes de Windows, en las que se incorpora la interfaz de usuario, multimedia y documentos. La plataforma de desarrollo WPF se ha generado sobre un sistema de programacin bsico, que se extiende para admitir un amplio conjunto de caractersticas de desarrollo de aplicaciones que incluyen el propio modelo de aplicacin, recursos, controles, grficos, diseo, enlace de datos, documentos y seguridad. Windows Presentation Foundation (WPF) es un sistema de presentacin de la prxima generacin, para crear aplicaciones cliente de Windows que proporcionen una experiencia impactante para el usuario desde el punto de vista visual. Con WPF, puede crear una amplia gama de aplicaciones independientes y hospedadas en explorador. Algunos ejemplos de ello son Yahoo! Messenger y New York Times Reader, as como la aplicacin de ejemplo para atencin sanitaria, Contoso Healthcare Sample Application que se muestra en la ilustracin siguiente.
El ncleo de WPF es un motor de representacin independiente de la resolucin y basado en vectores construido para aprovechar al mximo el hardware de grficos moderno. WPF ampla el ncleo con un completo conjunto de caractersticas de
CARRERAS PROFESIONALES
CIBERTEC
programacin de aplicaciones, entre las que se incluyen Lenguaje de marcado de aplicaciones extensible (XAML), controles, enlace de datos, diseo, grficos 2D y 3D, animacin, estilos, plantillas, documentos, multimedia, texto y tipografa. WPF se incluye en Microsoft .NET Framework, lo que permite crear aplicaciones que incorporen otros elementos de la biblioteca de clases de .NET Framework.
Una mejora evidente de WPF es la capacidad para programar una aplicacin mediante cdigo de lenguaje marcado y subyacente, una experiencia con la que resultar familiar a los programadores de ASP.NET. En general, se utiliza el lenguaje marcado Lenguaje de marcado de aplicaciones extensible (XAML) para implementar la apariencia de una aplicacin, y los lenguajes de programacin administrados (subyacentes) para implementar su comportamiento. Esta separacin entre la apariencia y el comportamiento aporta las ventajas siguientes:
Se reducen los costos de programacin y mantenimiento, al no estar el marcado especfico de la apariencia estrechamente relacionado con el cdigo especfico del comportamiento.
La programacin es ms eficaz porque los diseadores pueden implementar la apariencia de una aplicacin al mismo tiempo que los programadores implementan su comportamiento.
Se pueden utilizar varias herramientas de diseo para implementar y compartir el lenguaje marcado XAML.
Marcado XAML es un lenguaje de marcado basado en XML que se utiliza para implementar la apariencia de una aplicacin mediante declaracin. Se suele utilizar para crear ventanas, cuadros de dilogo, pginas y controles de usuario, as como para rellenarlos con controles, formas y grficos. En el ejemplo siguiente se utiliza XAML para implementar la apariencia de una ventana que contiene un solo botn. <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SDKSample.AWindow"
CIBERTEC
CARRERAS PROFESIONALES
208
Title="Window with Button" Width="250" Height="100"> <!-- Add button to window --> <Button Name="button" Click="button_Click">Click Me!</Button> </Window>
El cdigo en visual Basic. Namespace SDKSample Partial Public Class AWindow Inherits System.Windows.Window Public Sub New() ' InitializeComponent call is required to merge the UI ' that is defined in markup with this class, including ' setting properties and registering event handlers InitializeComponent() End Sub Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) ' Muestra mensaje MessageBox.Show("Hello, Windows Presentation Foundation!") End Sub End Class End Namespace En este ejemplo, el cdigo subyacente implementa una clase que se deriva de la clase Window. El atributo x:Class se utiliza para asociar el marcado a la clase de cdigo subyacente. Se llama a InitializeComponent desde el constructor de la clase de cdigo subyacente para combinar la interfaz de usuario definida en el marcado con la clase de cdigo subyacente.
CARRERAS PROFESIONALES
CIBERTEC
La combinacin de x: Class e InitializeComponent garantiza que la implementacin se inicializa correctamente cada vez que se crea. En la ilustracin siguiente se muestra el resultado de hacer clic en el botn.
Grficos WPF presenta un conjunto extenso, escalable y flexible de caractersticas de grficos que aportan las ventajas siguientes:
Grficos pxel
independientes del
de
la
resolucin que
e es
independientes 1/96 de
del
dispositivo. La unidad de medida bsica del sistema de grficos de WPF es el independiente dispositivo, pulgada, independientemente de la resolucin de pantalla real, y que proporciona la base para la representacin independiente de la resolucin y del dispositivo. Cada pxel independiente del dispositivo se escala automticamente para coincidir con el valor de puntos por pulgada (ppp) del sistema en que se representa.
Precisin mejorada. El sistema de coordenadas de WPF se mide con nmeros de punto flotante de precisin doble, en lugar de precisin simple. Las transformaciones y los valores de opacidad tambin se expresan como doble precisin. WPF admite tambin una amplia gama de colores (scRGB) y proporciona compatibilidad integrada para administrar las entradas desde espacios de color diferentes.
Compatibilidad con grficos avanzados y animacin. WPF simplifica la programacin de grficos administrando automticamente las escenas de animacin; no tendr que preocuparse por el procesamiento de escenas, los bucles de representacin ni la interpolacin bilineal. Adems, WPF admite la comprobacin de clics y proporciona compatibilidad plena con la composicin alfa.
CIBERTEC
CARRERAS PROFESIONALES
210
Aceleracin de hardware. El sistema de grficos de WPF saca partido del hardware de grficos para minimizar el uso de la CPU.
Formas 2D WPF proporciona una biblioteca de formas 2D comunes dibujadas mediante vectores, como los rectngulos y las elipses que se muestran en la ilustracin siguiente.
Geometras 2D Las formas 2D proporcionadas por WPF abarcan el conjunto estndar de formas bsicas. Sin embargo, puede que sea preciso crear formas personalizadas para facilitar el diseo de una interfaz de usuario personalizada. Para este fin, WPF proporciona las geometras. En la ilustracin siguiente se muestra el uso de geometras para crear una forma personalizada que se puede dibujar directamente, utilizar como un pincel o utilizar para recortar otras formas y controles. Los objetos Path se pueden utilizar para dibujar formas cerradas o abiertas, varias formas o incluso formas curvas. Los objetos Geometry se pueden utilizar para el recorte, la comprobacin de visitas y la representacin de datos de grficos 2D.
CARRERAS PROFESIONALES
CIBERTEC
Botones: Button y RepeatButton. Cuadros de dilogo: OpenFileDialog, PrintDialog y SaveFileDialog. Entradas manuscritas digitales: InkCanvas y InkPresenter. Documentos: DocumentViewer, FlowDocumentPageViewer,
Entrada: TextBox, RichTextBox y PasswordBox. Diseo: Border, BulletDecorator, Canvas, DockPanel, Expander, Grid, GridView, GridSplitter, GroupBox, Panel, ResizeGrip, Separator, ScrollBar, ScrollViewer, StackPanel, Thumb, Viewbox, VirtualizingStackPanel, Window y WrapPanel.
Multimedia: Image, MediaElement y SoundPlayerAction. Mens: ContextMenu, Menu y ToolBar. Navegacin: Frame, Hyperlink, Page, NavigationWindow y TabControl. Seleccin: CheckBox, ComboBox, ListBox, TreeView y RadioButton, Slider. Informacin para el usuario: AccessText, Label, Popup, ProgressBar, StatusBar, TextBlock y ToolTip.
Laboratorio14 TIPOS DE CONTENEDORES EN WPF Cree una aplicacin Windows que permita ingresar dos nmeros enteros y muestre en una ventana la suma de los dos. 1. Ingrese a Visual Studio 2008 2. Seleccione Men File -> New Project 3. En Projects Types elegir Visual Basic y en Templates elija WPF Application y en Name escriba Laboratorio14_2
CIBERTEC
CARRERAS PROFESIONALES
212
Laboratorio14_2
A continuacin se trabajarn con los cinco tipos de canvas en una misma ventana.
CARRERAS PROFESIONALES
CIBERTEC
Agregar el siguiente cdigo en cdigo XAML <StackPanel Orientation=Horizontal> <Button Width=100 Height=50 Background =AliceBlue FontFamily=Arial FontSize=20 FontWeight=Bold> Aceptar </Button> <Button Width=100 Height=50 Background =AliceBlue FontFamily=Arial FontSize=20 FontWeight=Bold> Cancelar </Button> <Button Width=100 Height=50 Background =AliceBlue FontFamily=Arial FontSize=20 FontWeight=Bold> Omitir </Button> </StackPanel>
CIBERTEC
CARRERAS PROFESIONALES
214
El contenedor agrupa varios objetos, y los ubica de forma horizontal porque asi se ha especificado con la propiedad Orientation=Horizontal, cambiando el atributo a Vertical, los elementos automaticamente se distribuirian verticalmente. Agregar un Panel DockPanel Llamado Panel de acoplamiento, y es que este panel lo que hace es ubicar a los elementos hacia donde queremos que se mantenga, por ejemplo si decimos a la derecha, el elemento especificado se mantendr a la derecha.
Agregar el siguiente cdigo XAML <DockPanel LastChildFill=True Background=AliceBlue> <Button DockPanel.Dock=Left Width=50 Height=50 Background =CornflowerBlue FontFamily=Webdings FontSize=20 FontWeight=Bold Foreground=White Margin=10,0,0,0> 9 </Button>
<Button DockPanel.Dock=Right Width=50 Height=50 Background =CornflowerBlue FontFamily=Webdings FontSize=20 FontWeight=Bold Foreground=White Margin=0,0,10,0> : </Button>
CARRERAS PROFESIONALES
CIBERTEC
</DockPanel> Se pueden observar varias ubicaciones en este panel, la primera es que estamos aplicando lo que mencionamos anteriormente, estamos ubicando los elementos hacia donde queremos que se mantengan constantes, en el primer caso del botn, estamos aplicando <Button DockPanel.Dock=Left; lo cual indica que el primer botn va a ser ubicado a la izquierda, note que estamos dando un ancho y un alto, con lo cual mantendr esos valores constantes. De igual forma pasa con el botn <Button DockPanel.Dock=Right. Algo distinto sucede con la imagen del final: <Image Source=Foto.jpg Margin=10></Image>; note como no se le est asignando ni un anchor, ni caracteristicas de ancho y alto, entonces, esta imagen pasa a ocupar todo el espacio que queda libre. Pero esto sucede gracias al atributo LastChildFill=True. Agregando un panel grid para disear una calculadora:
Esta calculadora ha sido desarrollada a partir de las definiciones de filas y columnas de un panel GRID y cada botn ha sido agregado en cada una de las celdas.
CIBERTEC
CARRERAS PROFESIONALES
216
CARRERAS PROFESIONALES
CIBERTEC
CIBERTEC
CARRERAS PROFESIONALES
218
CARRERAS PROFESIONALES
CIBERTEC
CIBERTEC
CARRERAS PROFESIONALES
220
Agregar el panel Wrappanel que permite agrupar los elementos de forma ordenada y que sean siempre visible.Es decir, reacomodan los objetos si es necesario. Slider con valor 50
CARRERAS PROFESIONALES
CIBERTEC
Finalmente el panel CANVAS que permite ubicar los elementos segn la ubicacin que especifiquemos.
CIBERTEC
CARRERAS PROFESIONALES
222
CARRERAS PROFESIONALES
CIBERTEC
Autoevaluacion
1.
Qu es globalizacin? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ Que representa la clase CultureInfo y RegionInfo? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________ Cul es el objetivo de WPF? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
2.
3.
4. Los controles en las aplicaciones WPF, no pueden tener eventos? _____________________________________________________________________ _____________________________________________________________________ ___________________________________________________
CIBERTEC
CARRERAS PROFESIONALES
224
Para Recordar
El espacio de nombres System.Globalization contiene clases que definen informacin relativa a la referencia cultural, incluido el idioma, el pas o regin, los calendarios utilizados, los modelos de formato para las fechas, la moneda y los nmeros y el criterio de ordenacin de las cadenas. La clase CultureInfo proporciona informacin sobre una referencia cultural concreta (lo que se denomina "configuracin regional" en desarrollo de cdigo no administrado). La clase CultureInfo especifica un nombre nico para cada referencia cultural, basndose en RFC 4646 (Windows Vista y posterior). Este nombre est formado por un cdigo ISO 639 para la referencia cultural que est asociado a un idioma y se compone de dos letras minsculas y por un cdigo ISO 3166 para la referencia cultural secundaria que est asociado a un pas o regin y est compuesto de dos letras. WPF permite suministrar interfaces de usuario mejoradas muy interactivas y estticamente atractivas. Los elementos visuales ofrecen transparencia, brillo, efectos 3d, animaciones, transformaciones, etc.
CARRERAS PROFESIONALES
CIBERTEC