.Net

En complementos de aprendizaje Presentaciones – Videos – Ejercicios Felipe Ramírez es Master en Informática Abogado, IT

Views 1,900 Downloads 114 File size 4MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

En complementos de aprendizaje Presentaciones – Videos – Ejercicios

Felipe Ramírez es Master en Informática Abogado, ITIL Certified Trainer, Desarrollador CAP-Dev 2005 e Instructor Aprenda Practicando Nivel 3

Aprenda a utilizar Visual Studio como los profesionales, obteniendo en el menor tiempo y con la mínima codificación las aplicaciones más robustas y eficientes.

Aprenda la estructura general del lenguaje Visual Basic.NET; aprenda el uso de variables, operadores, estructuras de control, funciones, manejo estructurado de excepciones, clases generics, y el uso de la biblioteca de clases de .NET Framework, aprovechando al máximo las herramientas gráficas de desarrollo de Visual Studio 2005.

Aprenda los elementos de la programación orientada a objetos y diseño de forma gráfica clases con herencia y polimorfismo.

Descargas de la web Presentaciones profesionales para exposición Videos explicativos que apoyan el aprendizaje de los temas Código fuente de los ejercicios del libro, y archivos complementarios

.NET Framework 2.0 Visual Studio 2005 SQL Server 2000 / 2005 Cursos / Certificaciones Este libro apoya el estudio de los siguientes cursos de certificación:

MICROSOFT MCAD 70-305, 70-306, 70-310, 2364B. Aprenda el uso de los controles gráficos para el desarrollo de interfaces gráficas basadas en Windows y en Web usando las Windows Forms mejoradas y ASP.NET 2.0, y aprenda a diseñar y consumir Servicios Web XML

Aprenda el modelo de objetos ADO.NET y sepa establecer conexiones a SQL Server desde Visual Studio, genere y depure Stored Procedures desde Visual Studio y desarrolle aplicaciones para actualización de datos desde Consola, Windows y Web, de forma conectada y desconectada, con el mínimo de codificación.

Visítenos en: www.pearsoneducacion.net

Aprenda practicando CAP-Dev 2005: 2015

- PRESENTACIONES - VIDEOS - EJERCICIOS - SOPORTE ON LINE -

Visual Basic 2005 Visual Studio 2005 ASP.NET 2.0 ADO.NET 2.0 POO Actualizadores

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005 Mtro. José Felipe Ramírez Ramírez Master en Informática Administrativa ITIL Certified Trainer Instructor CAP-DEV Nivel 3 Facultad de Contaduría Pública y Administración Facultad de Ingeniería Mecánica y Eléctrica Universidad Autónoma de Nuevo León, México

REVISIÓN TÉCNICA Mtro. Francisco Salazar Universidad Autónoma de Nuevo León, México Mtro. César Tello Univesidad Autónoma de Nuevo León, México

Datos de catalogación bibliográfica RAMÍREZ, JOSÉ FELIPE. Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005 PEARSON EDUCACIÓN, México, 2007 Área: Ingeniería y Computación ISBN: 978-970-26-0912-4 Formato: 18.5 × 23.5 cm

Páginas: 648

Editor: Pablo Miguel Guerrero Rosas e-mail: [email protected] Editor de Desarrollo: Bernardino Gutiérrez Hernández Supervisor de Producción: José D. Hernández Garduño PRIMERA EDICIÓN, 2007 D.R. © 2007 por Pearson Educación de México, S.A. de C.V. Atlacomulco 500-5to. piso Col. Industrial Atoto 53519, Naucalpan de Juárez, Edo. de México E-mail: [email protected] Cámara Nacional de la Industria Editorial Mexicana. Reg. Núm. 1031. Prentice Hall es una marca registrada de Pearson Educación de México, S.A. de C.V. Reservados todos los derechos. Ni la totalidad ni parte de esta publicación pueden reproducirse, registrarse o transmitirse, por un sistema de recuperación de información, en ninguna forma ni por ningún medio, sea electrónico, mecánico, fotoquímico, magnético o electroóptico, por fotocopia, grabación o cualquier otro, sin permiso previo por escrito del editor. El préstamo, alquiler o cualquier otra forma de cesión de uso de este ejemplar requerirá también la autorización del editor o de sus representantes. ISBN 10: 970-26-0912-7 ISBN 13: 978-970-26-0912-4 Impreso en México. Printed in Mexico 1 2 3 4 5 6 7 8 9 0 - 10 09 08 07

CONTENIDO Prólogo Agradecimientos Como utilizar este libro Parte 1 Plataforma .NET versión 2005

vii xv xvii 1

Capítulo 1 Arquitectura de la plataforma .NET Definición de la plataforma .NET Capas principales de la plataforma .NET Capa de lenguajes de .NET Lenguajes .NET .NET Framework Impacto de .NET Framework en los sistemas operativos Ventajas que brinda la infraestructura de .NET Convivencia de .NET y COM Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

3 5 7 9 10 11 27 28 29 31 32 33 34

Capítulo 2 .NET como multiplataforma de desarrollo Determinación de la plataforma .NET requerida Productos de plataforma .NET Desarrollo de aplicaciones en .NET usando SDK Tecnologías cubiertas en este libro

35 37 39 49 53

vi

Contenido

Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Capítulo 3 Técnicas de desarrollo con Visual Studio 2005 Fundamentos de desarrollo con Visual Studio Elementos de sintaxis en Visual Basic Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Parte 2 Fundamentos de programación en Visual Basic

55 56 56 58 59 61 67 92 93 93 94 95

Capítulo 4 Variables, arreglos y tipos de datos Variables Conversión de datos Acceso a datos Value type y Reference type Strong Typing Manejo elemental de variables Estructuras y enumeraciones Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

97 99 105 107 109 112 133 135 136 136 138

Capítulo 5 Espacios de nombres y desarrollo de librerías Espacios de nombres (namespaces) Uso de espacios de nombres Creación de namespaces propios Alias para los espacios de nombres Independencia de los ensamblados Referencias Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

139 141 148 149 150 151 151 170 171 171 173

Capítulo 6 Manejo de operadores Operadores aritméticos Operadores de asignación

175 177 178

Contenido

Operadores comparativos Operadores lógicos Prioridad entre operadores Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

vii

180 185 189 200 201 201 203

Capítulo 7 Estructuras de decisión y control Estructuras de decisión Estructuras de control Estructuras envolventes y anidadas Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

205 207 211 215 227 228 228 230

Capítulo 8 Manejo estructurado de excepciones Errores y Excepciones Manejo estructurado de excepciones Try...Catch...Finally Filtrado de excepciones Lanzamiento de excepciones propias Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

231 233 234 235 241 246 249 250 250 252

Parte 3 Programación orientada a objetos Capítulo 9 Fundamentos de la programación orientada a objetos Términos básicos de POO Elementos esenciales de los objetos que permiten su programación Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Capítulo 10 Clases, métodos y propiedades Definición de una clase Definición de propiedades

253 255 257 265 275 276 276 278 279 281 281

viii

Contenido

Creación de bibliotecas de clases (librerías) Condiciones para la utilización de las bibliotecas de clases Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Capítulo 11 Herencia y polimorfismo Herencia Estatutos auxiliares para el manejo de herencia y polimorfismo Polimorfismo Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Parte 4 Interfaces Windows/Web y Servicios Web XML

283 284 307 308 308 310 311 313 323 325 335 336 336 338 339

Capítulo 12 Desarrollo de aplicaciones Windows Interfaz de usuario Desarrollo de interfaces basadas en objetos Jerarquía de clases relacionadas con controles Clasificación de los controles Enfoque (Focus) Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

341 344 345 349 355 363 392 393 394 396

Capítulo 13 Desarrollo de aplicaciones Web con ASP.NET Motivos del auge de las aplicaciones Web Requerimientos para el desarrollo de ASP.NET Procesamiento de páginas Web en .NET Características de ASP.NET Elementos de una página Web ASP.NET Controles comunes en aplicaciones Web Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

397 399 400 402 403 410 419 439 440 441 443

Contenido

Capítulo 14 Servicios Web XML Servicios Web XML Infraestructura de operación de los Servicios Web Elementos para la creación de un Servicio Web XML Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo Parte 5 Manejo de bases de datos con ADO.NET

ix

445 447 453 454 463 464 464 466 467

Capítulo 15 Manejo de bases de datos con ADO.NET ADO.NET Historia del acceso a los almacenes de datos Formas de trabajo con bases de datos en .NET Proveedores de datos de .NET Framework Modelo de objetos de ADO.NET Cómo realizar la conexión Command DataReader Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

469 471 472 477 481 491 496 503 506 521 522 523 525

Capítulo 16 Manejo de bases de datos desde aplicaciones Windows Modelo de objetos DataSet Alternativas para poblar de datos un DataSet DataAdapter DataSet Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

527 529 534 535 538 562 563 564 566

Capítulo 17 Manejo de bases de datos desde aplicaciones Web Data Source Controls y Data Bound Controls Mapa mental del capítulo Terminología

567 569 596 597

x

Contenido

Preguntas Examen rápido del capítulo

597 599

Capítulo 18 Colecciones genéricas (generics)

601

Generics Bloques de código usando generics Colecciones genéricas List Queue Stack Dictionary Mapa mental del capítulo Terminología Preguntas Examen rápido del capítulo

603 604 607 607 610 613 616 619 620 620 622

A mi hermano Gil, Quien verdaderamente sabe escribir.

PRÓLOGO Este libro está compuesto por partes seleccionadas del curso de certificación Aprenda Practicando CAP-Dev 2005, código 2015: Aprenda Practicando Visual Basic 2005 y Visual Studio 2005 (www.aprendapracticando.com). Originalmente el curso se llamaba Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005, pero Visual Studio 2005 resultó ser un invitado con ganas de protagonizar. La herramienta es tan poderosa que muchas de las prácticas no requerían codificación por parte del desarrollador, de tal forma que daba lo mismo que el programa estuviera en Visual Basic, C# o J#; al final, el desarrollador ni se enteraba de la programación tras bambalinas. Entonces ya no era Visual Basic usando Visual Studio, sino Visual Studio usando Visual Basic; de ahí el cambio de nombre. El libro está dirigido a dos tipos de profesionales: (a) para el codificador minucioso que quiere entender los pormenores del lenguaje, las clases, sus miembros, las palabras reservadas y las estructuras que permiten la creación casi artesanal de los programas; es decir, el profesional cuya curiosidad lo ha convertido en conocedor profundo del funcionamiento de las cosas, y (b) para el desarrollador profesional de alto rendimiento que casi siempre dispone de menos tiempo del que necesita para generar los resultados que las empresas le exigen, que no puede detenerse en los pormenores del lenguaje y que prefiere el uso de herramientas visuales y poderosas para crear soluciones efectivas en el menor tiempo posible. El objetivo de este libro es formar codificadores minuciosos y convertirlos en desarrolladores profesionales de alto rendimiento. Se buscan individuos que representen lo mejor de los dos mundos. Pero el propósito del libro no es tan simple como la frase “formar desarrolladores minuciosos pero efectivos”. Sería algo demasiado simple. Vamos más allá. Creo firmemente que el mundo en que crecemos encuentra muchas maneras sutiles de volverse más complejo conforme se globaliza. Queremos hacer de nuestra vida un cortometraje feliz en donde todo transcurre tan rápido que nos olvidamos de que los planes de vida a largo plazo también existen. Al oír las noticias del día me lamento al darme cuenta de que la violencia y la deshonestidad forman un conjunto de aproximaciones sucesivas hacia un futuro que no quiero. Creo que el origen de todos los problemas es la gente que anhela mucho y actúa poco; creo que entre el anhelo personal y la acción que produce resultados hay abismos enormes, y la gente quiere tender puentes rápidos y cómodos para ir de un punto a otro. A veces la materia

xiv

Prólogo

prima para esos puentes son acciones delictivas y prácticas ilegales, siempre disponibles y a la mano, que lo enrarecen todo y terminan quitando más de lo que dan. Si no eres de las personas fáciles de seducir por el lado oscuro de la fuerza, sino que buscas caminos lícitos y honestos para tender los puentes, te daráss cuenta de que resulta difícil, costoso, complejo y cansado. Este libro es mi pequeña contribución para quien desea dedicarse profesionalmente a la lícita y honesta actividad del desarrollo de aplicaciones. A quien desee llenar su cabeza de conocimientos para después comercializar sus habilidades y construir sus propios puentes, este libro lo iniciará de manera perfecta en el camino profesional del desarrollo en Visual Basic, utilizando la herramienta líder en la construcción de aplicaciones empresariales, así como la más demandada por los empleadores: Visual Studio. Dominar todos los temas de este libro garantiza la capacidad para el trabajo productivo con tecnologías Microsoft, cosa que ya ha sido un puente para tantos. Como dice Mario Benedetti: Para cruzarlo o para no cruzarlo, ahí está el puente.

AGRADECIMIENTOS Los agradecimientos van, como siempre, para los indispensables en mi vida. Para Adriana, mi compañera vital, y para Sara, por ser la lucecita que ilumina mis senderos. A toda mi familia en general, por estar ahí generación tras generación, demostrando que se puede ser lícito y honesto, y obtener los anhelos, uno a la vez. A mis compañeros Verónica López, Delia Briones, Rolando Martínez, Gustavo Valdés y Rey Manuel, por transformar algo simplemente soportable en algo disfrutable; a Paco Salazar, Jorge Hernández, Magda Garza, Paco Guevara, Heriberto González y todos los que creen que Aprenda Practicando está avanzando gracias a la calidad de los productos y su filosofía. A Víctor Manuel Ortega, que seguro llegará a mucho en su vida: gracias por la revisión línea a línea de los programas. Como siempre, mi agradecimiento especial a Isela Martínez por el delicado esmero que hace de un texto opaco un texto con algo de brillo. Siempre es bueno que los libros tengan un ángel de la guarda. Monterrey, Nuevo León, 2006.

Cómo utilizar este libro Descargue nuevos capítulos prácticas adicionales y archivos complementarios desde nuestro sitio AprendaPracticando.com

Este libro es una herramienta de aprendizaje dirigida a profesionales con especialidad en computación e informática, de ahí que analice desde elementos de programación hasta el manejo de bases de datos. El contenido está diseñado para que el lector, en un periodo de cuatro a seis meses, aprenda a programar en Visual Basic y utilizar Visual Studio 2005 en forma intensiva. Se espera que, al final, el lector sea capaz de implementar sistemas de información con manejo de bases de datos utilizando SQL Server y en interfaz de consola, Windows y Web. De forma autodidacta y con una dedicación de tiempo completo a la realización de los ejercicios del libro se puede aprender todo en dos meses. La configuración ideal de hardware para lograr las metas de aprendizaje de este libro es la siguiente: a) Un equipo de última generación con Windows XP Professional (o superior) con Service Pack 2 instalado, b) Internet Information Server 5.5 o superior instalado y funcionando, c) .NET Framework 2.0 Redistributable Package, d) .NET Framework SDK 2.0, e) Visual Studio 2005 Standard Edition en inglés y f) SQL Server 2000/2005 o superior. Los números sugieren la secuencia de instalación. Se recomienda que la cuenta con la que ingrese al sistema tenga privilegios de administrador y que forme parte del grupo de usuarios Debugger Users. También puede cubrirse la totalidad de los temas tomando el curso 2015 Programación en Microsoft Visual Basic 2005 y Visual Studio 2005, y 2016 Acceso a datos usando Microsoft Visual Basic 2005 y Visual Studio 2005, en algún centro autorizado Aprenda Practi-

xviii

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

cando. En el curso contará con un equipo personal especialmente configurado para el aprendizaje de los temas y con la guía de un instructor certificado CAP-Dev, quien le asesorará en temas del curso además de orientarle con respecto a la forma en que puede emplear los conocimientos en casos reales que se encuentre desarrollando.

¿Cómo están compuestos los capítulos? Los capítulos del presente libro tienen los siguientes elementos que fomentan el aprendizaje:

apvbvsxx.ppt

❑ Presentación profesional en Power Point. Si utiliza el presente libro para la exposición de cátedra, la buena noticia es que no tendrá que desarrollar material de apoyo. Desde el sitio Web AprendaPracticando.com podrá descargar de manera gratuita las presentaciones profesionales en Power Point que hemos desarrollado. Estas presentaciones están sujetas a condiciones de uso. ❑ Objetivo general y objetivos particulares. Cada capítulo tiene en su primera página un objetivo general, que representa la nueva habilidad que el lector habrá de adquirir al concluir el estudio del capítulo; además señalará los objetivos particulares, que representan en secuencia lógica los focos de atención para alcanzar el objetivo general. ❑ Índice por capítulo. Cada capítulo contiene su propio índice, por lo que ubicar la información dentro de un capítulo resulta más fácil; además, el índice diferencia visualmente los temas de los ejercicios, a fin de que se puedan localizar estos últimos de manera más fácil. ❑ Notas informativas. Cada capítulo contiene notas adicionales que proporcionan información que, en general, no está disponible en la documentación del producto. Además, se ofrecen referencias históricas de los productos, así como consejos y advertencias que pueden reducir la curva de aprendizaje. ❑ Videos explicativos. Cada capítulo puede hacer referencia a videos explicativos que abordan temas que es más fácil tratar de manera visual y dinámica. Tanto las presentaciones profesionales en Power Point como el libro señalan el momento adecuado de su exposición. Estos videos están disponibles en línea en el sitio Web AprendaPracticando.com.

Cómo utilizar este libro

xix

❑ Figuras. Cada capítulo contiene figuras que complementan gráficamente los temas tratados; a veces una imagen dice más que mil palabras. ❑ Lo nuevo en Visual Studio 2005. Visual Studio 2005 presenta nuevas capacidades y herramientas de productividad. La sección Lo nuevo explica detalladamente cada una de estas adiciones. ❑ Ejercicios detallados, con explicaciones línea por línea y ejecución guiada. La mayoría de los capítulos presenta ejercicios que permiten comprobar la teoría estudiada. Los ejercicios se desarrollan paso a paso y se complementan con código. Se incluye también una ejecución guiada, que explica lo que cada línea de código hace y los resultados que se obtienen. ❑ Mapa mental. Cada capítulo incluye un mapa mental que actúa como resumen de los temas del capítulo. También es útil en el aprendizaje en grupo, para que aquellos que se atrasen en el seguimiento de los temas puedan ponerse al día. Generalmente basta con analizar el mapa mental y repasar en el capítulo los términos clave que contiene. ❑ Terminología. .NET introduce muchos conceptos nuevos que es necesario tener en mente. Cada capítulo tiene su propio índice de términos, lo que permite su rápida localización en el texto del capítulo. ❑ Preguntas. Al final de cada capítulo se incluye una serie de preguntas; si el lector las contesta correctamente, podrá tener la certeza de haber aprendido los conocimientos presentados en el capítulo. Algunas preguntas requieren análisis, más allá de la simple consulta, lo que despierta el razonamiento de la técnica que se está aprendiendo. ❑ Examen rápido. Es la evaluación rápida que se debe resolver después de haber estudiado los temas y resuelto los ejercicios. Si entendió los objetivos de estudio y la terminología, llevó a cabo los ejercicios y las prácticas individuales, y respondió a las preguntas, es seguro que resuelva la evaluación correctamente, con conocimiento de causa respecto a todo. Partimos del concepto de que las personas son diferentes: cada individuo tiene su forma particular de aprender: algunos leyendo un resumen, otros por medio de un video, algunos leyendo, otros contestando preguntas, otros con la práctica, algunos más siendo cuestiona-

xx

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

dos... Tratamos de brindar la mayor gama de herramientas con el fin de que cada quien aprenda como quiera; lo importante es que lo haga.

Estrategias de uso Para el autodidacta… La persona autodidacta es la que toma el aprendizaje en sus manos; no depende de las explicaciones de nadie y por lo tanto tiene control total de su propio proceso de aprendizaje. A ese tipo de lector le sugerimos esto: 1.

2.

3.

Si desea aprender sólo algunos temas, considere las partes del libro como temas. No caiga en la tentación de tomar en cuenta sólo algunos de los capítulos de una parte, dado que están estructurados en una secuencia funcional. Si ya conoce .NET, puede saltarse capítulos dentro de un tema si ya los domina. Una manera de evaluar si está en condiciones que le permitan saltar capítulos es la siguiente: trate de contestar las evaluaciones rápidas del capítulo. Si responde correctamente a la mayoría de las preguntas, puede omitir la lectura del capítulo. Decididos los temas que le interesan, lea de manera secuencial cada capítulo del tema: a) Lea con detenimiento los objetivos del capítulo para que tenga presente que eso es lo que hay que dominar al concluirlo. b) Si interrumpe la lectura de un capítulo, cada vez que reinicie la lectura lea de nuevo los objetivos. Es muy importante que los tenga presentes. c) Revise los videos en el momento en que los señale el texto. d) Realice los ejercicios en el momento en que los encuentra en el texto. e) Responda el examen rápidamente; si no contesta correctamente la mayoría de las preguntas, vuelva a revisar el capítulo hasta que quede satisfecho.

4.

5.

Si aprueba satisfactoriamente el examen rápido, intente desarrollar las prácticas individuales. Si ya entendió el contenido del capítulo, sólo es cuestión de tiempo y dedicación. Le sugerimos que pruebe los cuestionarios y juegos en línea que se encuentran en www. aprendapracticando.com para comprobar el grado de experiencia que ha adquirido.

Para el uso con grupos… Si utiliza el libro para la capacitación de grupos, le sugerimos que tome en cuenta las siguientes consideraciones para alcanzar los objetivos (suponemos que usted es el instructor/facilitador):

Cómo utilizar este libro

xxi

Al iniciar un tema… 1.

2. 3.

4. 5.

El instructor/facilitador deberá dominar el tema a instruir; previo a la instrucción, deberá responder a las preguntas, realizar los ejercicios, realizar las prácticas individuales y responder a la perfección el examen rápido. Los equipos en los que se pretendan demostrar los ejercicios deberán estar configurados con los requerimientos mínimos que aparecen en la primera parte de esta sección. Las presentaciones profesionales en Power Point están disponibles en el sitio Web de Aprenda Practicando; descargue las versiones más actualizadas antes de cada curso. Antes de revisar una parte del libro, explique la importancia del aprendizaje del tema y genere interés por él; sin interés no hay aprendizaje. Lo ideal, para demostrar que la tecnología estudiada es útil, es citar su experiencia personal en el uso de estas herramientas de desarrollo. También esto contribuye a aumentar el interés en su exposición.

Para revisar cada capítulo… 1.

2. 3.

4.

5. 6. 7.

8.

Solicite, antes de la sesión de instrucción, que los miembros del grupo contesten las preguntas de cada capítulo. Puede pedirlo como tarea escrita (de preferencia a mano, para evitar las operaciones irreflexivas de copiar y pegar), para garantizar que los participantes la lean. Al iniciar cada sesión recuérdeles los objetivos del capítulo que se estudiará. En cada inicio de capítulo, después de ver los objetivos, solicite a los miembros del grupo que lean las respuestas a las preguntas (punto 6); de preferencia ceda la palabra de tal forma que todas las personas participen. Proyecte la presentación profesional que acompaña a cada capítulo. Para un mejor aprovechamiento recomendamos que para su uso personal imprima la presentación como página de notas, y lea las notas de cada una de las diapositivas, le ayudarán los consejos y anotaciones relevantes. En caso de que se encuentre con un icono de video en la presentación proyéctelo en ese momento. En una exposición, solicite a los miembros del grupo que realicen los ejercicios hasta el final, cuando ya se haya expuesto toda la presentación. Los miembros del grupo deberán realizar los ejercicios que el instructor/facilitador les pida. Éste deberá especificar con claridad cuál es el tiempo máximo de realización; es importante que los tiempos marcados se respeten. El instructor/facilitador, en caso de detectar dificultades en la realización de los ejercicios, deberá apoyar a los miembros del grupo, pero sin hacer los programas por ellos.

xxii

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. 10.

11.

12.

13.

En caso de detectar un problema común, es importante comentar con el grupo el problema y la solución. Al concluir la realización de los ejercicios, el instructor/facilitador comentará las experiencias más relevantes que haya notado; repasará por última vez los objetivos del capítulo y comentará cómo fue que se cubrieron. Al finalizar los ejercicios, el instructor/facilitador pedirá al grupo que conteste el examen lo más rápido posible, de manera individual. Se darán tres minutos para contestar; después, en voz alta planteará cada una de las preguntas y revisará qué contestó el grupo. Después de escuchar las diferentes posturas, ofrecerá la respuesta correcta y dará sus razones. Los exámenes son una herramienta de aprendizaje más, no una oportunidad para el premio o el castigo. El instructor/facilitador podrá encargar las prácticas individuales como trabajo de refuerzo del conocimiento, ya sea para su desarrollo en sesión, o para que las personas desarrollen las prácticas en casa. De ser posible, motive a los participantes a comprobar sus conocimientos en los diferentes cuestionarios y juegos en línea que se encuentran en: www.aprendapracticando.com.

Certificación CAP-Dev Aprenda Practicando ha desarrollado la primera certificación en castellano relacionada con la tecnología Microsoft .NET. El objetivo es que el personal certificado sea capaz de desarrollar aplicaciones multicapa, orientadas a objetos, con pleno acceso a bases de datos de alto rendimiento, utilizando para ello la herramienta Visual Studio a nivel profesional. CAP-Dev 2005 (Certificación Aprenda Practicando – .NET Developer) se compone de los siguientes cursos:

Cómo utilizar este libro

xxiii

Solicite sus cursos en los centros autorizados Aprenda Practicando o regístrese a ellos en la página www.AprendaPracticando.com Conforme las versiones de los productos de Microsoft van evolucionando, la certificación y los cursos se actualizan de inmediato.

Capítulos: 1 Arquitectura de la plataforma .NET 2 .NET como multiplataforma de desarrollo 3 Técnicas de desarrollo con Visual Studio 2005

Herramientas de Visual Studio revisadas: 1. 2. 3. 4. 5. 6.

Solution Explorer Document Window Text Editor Form Designer Toolbox Properties

Otras herramientas: 1. 2. 3. 4. 5.

.NET Framework 2.0 Configuration SDK Command Prompt ILDASM.EXE VBC.EXE IIS Services

Parte 1 Plataforma .NET versión 2005 En esta parte del libro se estudian los componentes y particularidades de la plataforma de desarrollo Microsoft .NET, en su versión 2005. Desde la perspectiva teórica se analizan los conceptos que permiten entender a profunidad cómo funciona la plataforma Microsoft .NET. Además, se describen las características de los productos .NET; este conocimiento es necesario para afrontar las responsabilidades del desarrollador, pues le ayuda a responder la pregunta ¿Qué compro y qué instalo? En el aspecto práctico, se trata de forma general lo que Visual Studio 2005 y los lenguajes soportados por .NET Framework versión 2.0 pueden hacer. Esta obra tiene como finalidad el desarrollo profesional del lector, quien a través del aprendizaje sólido de .NET podrá aplicar estos conocimientos y crecer gracias a las capacidades que obtendrá. Las posibilidades de productividad son muchas, así como las oportunidades de desarrollo utilizando .NET; lo único que falta es que el lector se decida a aprovechar las posibilidades y recoger el fruto de su trabajo profesional basado en el conocimiento sólido.

CAPÍTULO

1

Arquitectura de la plataforma .NET Objetivos: Conocer los elementos y el funcionamiento de la plataforma .NET, desde la codificación del programa fuente hasta la ejecución del programa resultante. 1. Conocerá las capas más importantes de .NET Framework. 2. Distinguirá los requisitos que los lenguajes deben cumplir para ser reconocidos como lenguajes .NET. 3. Comprenderá la forma en que .NET interpreta, compila y ejecuta los programas. 4. Aprenderá las particularidades de la biblioteca de clases de .NET y su organización lógica y física. 5. Se enterará de las ventajas que la plataforma .NET brinda a los desarrolladores. 6. Entenderá la forma en que .NET puede coexistir con aplicaciones anteriores basadas en tecnología COM.

3

4

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Definición de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capas principales de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capa de lenguajes de .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLS (Common Language Specification) . . . . . . . . . . . . . . . . . . . . . . . . . Lenguajes .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capa de servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Biblioteca de clases base de .NET Framework (BCL) . . . . . . . . . . . . . . . Independencia de la biblioteca de clases y los lenguajes . . . . . . . . . . . CLR (Common Language Runtime) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compilador para generar código intermedio . . . . . . . . . . . . . . . . . . . . Global Assembly Cache (GAC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Análisis de las entradas del Caché global para ensamblado (GAC, Global Assembly Cache) . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET PE (.NET Portable Executable) versus PE/COFF . . . . . . . . . . . . . . . Identificación de diferencias en programas ejecutables, usando el desensamblador de .NET (ildasm.exe) . . . . . . . . . . . . Compiladores JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Impacto de .NET Framework en los sistemas operativos . . . . . . . . . . . . . . . . Modificación al cargador de ejecutables . . . . . . . . . . . . . . . . . . . . . . . Registro de biblioteca de clases base . . . . . . . . . . . . . . . . . . . . . . . . . . Prerrequisitos del sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . Ventajas que brinda la infraestructura de .NET . . . . . . . . . . . . . . . . . . . . . . . Convivencia de .NET y COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 7 9 9 10 11 11 12 15 16 17 19 20 21 23 24 27 27 27 28 28 29 31 32 33 34

Capítulo 1. Arquitectura de la plataforma .NET

5

Bienvenidos a otro libro de la serie Aprenda practicando. Como es costumbre, esta obra se vale del análisis teórico profundo y el uso intensivo de ejercicios para enseñarle, en este caso concreto, a desarrollar aplicaciones en esquemas Cliente/Servidor con acceso a bases de datos corporativas, mediante el lenguaje Visual Basic.NET en ambientes de Consola, Windows y Web. Este libro se concentra en las tecnologías .NET Framework 2.0, Visual Studio 2005 y SQL Server 2005. El objetivo de la obra es dotar al profesional de sistemas con los conocimientos y la práctica necesarios para enfrentar responsabilidades de desarrollo en las tecnologías anteriormente citadas. Estamos seguros de que al concluir la lectura y los ejercicios del presente libro el objetivo se habrá cumplido.

NOTA Ésta es la versión profesional del libro Aprenda Practicando Visual Basic.NET; los archivos complementarios mencionados en el mismo se encuentran en la página www.Aprenda Practicando.com. El temario de este texto es cubierto en su totalidad en el curso 2015 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005, perteneciente a la única certificación .NET en español, CAP-DEV (Certificación Aprenda Practicando .NET Developer).

Definición de la plataforma .NET La plataforma .NET es un componente de los sistemas operativos Windows, que permite el desarrollo, la liberación y la ejecución de aplicaciones. La plataforma posee un conjunto de herramientas de desarrollo y lenguajes de programación (de propósito general, orientados a objetos, de tercera generación, de alto nivel y compilación a código intermedio), que nos permiten utilizar todos los recursos disponibles en la computadora a través de una librería de clases común, con la que se pueden desarrollar aplicaciones de Consola, basadas en Windows, y para la Web, que utilizan protocolos abiertos para la interacción entre los elementos que las componen. .NET no es sólo un conjunto de lenguajes o un producto de Microsoft metido en una caja; es toda una plataforma de desarrollo orientada a objetos que resuelve muchos de los problemas que se presentan hoy en día al desarrollar aplicaciones empresariales.

1

6

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Problemas que elimina .NET

Algunos de los inconvenientes que se eliminan con .NET son:

❑ El infierno de los DLL. ❑ Falta de interoperabilidad con otras plataformas. ❑ Incapacidad para el manejo de esquema orientado a objetos. ❑ Manejo deficiente de errores. ❑ Incapacidad para utilizar Internet como medio eficiente de comunicación. ❑ Desaprovechamiento de la experiencia ganada como consecuencia del manejo de

otros lenguajes. ❑ Incapacidad para el desarrollo de aplicaciones que aprovechen arquitecturas

de 64 bits. Beneficios que proporciona .NET produce los siguientes beneficios:

En resumen, trabajar con la plataforma .NET

❑ Integración de aplicaciones multi-lenguaje. ❑ Homologación de las capacidades de los lenguajes. ❑ Disponibilidad de una biblioteca de clases común para los lenguajes. ❑ Arquitectura abierta a nuevos lenguajes. ❑ Desarrollo simplificado. ❑ Implementación simple. ❑ Mejor soporte de componentes. ❑ Interoperación con Internet. ❑ Interoperación con dispositivos móviles. ❑ Rentabilidad. ❑ Seguridad. ❑ Fácil implementación (Copy Deployment). ❑ Permite el desarrollo de aplicaciones de 64 bits.

Uno de los mayores retos implicados en el aprendizaje de cualquier lenguaje .NET es entender la forma en que esta plataforma trabaja. Por otro lado, existen muchos tecnicismos ligados a esta tecnología que es necesario conocer. Es recomendable entonces consultar el glosario de términos de .NET disponible en el sitio Web de Microsoft: eso puede ayudarle a reconocer los términos; para entenderlos cabalmente, lea este libro.

Capítulo 1. Arquitectura de la plataforma .NET

7

Capas principales de la plataforma .NET Las capas que componen la plataforma .NET son: ❑ Capa de lenguajes. Composición de la plataforma .NET









La capa de lenguajes está integrada por la CLS (Especificación común para lenguajes, Common Language Specification) y los lenguajes de programación compatibles con ella. La CLS es una especificación abierta de Microsoft que los lenguajes deben cumplir para ser considerados .NET. A la fecha Microsoft ha publicado cinco lenguajes y sus compiladores: Visual Basic, C#, C++, Visual J# y JScript. Otros fabricantes pueden implementar sus propios lenguajes .NET siempre y cuando respeten los lineamientos CLS y proporcionen los compiladores para generar el código intermedio reconocido por .NET. . NET Framework (Infraestructura y servicios). .NET Framework es la capa compuesta por el núcleo de servicios y recursos de .NET, que incluye los compiladores, la biblioteca de clases común para todos los lenguajes y los servicios que convierten el código fuente en código máquina para los diversos sistemas operativos a través del uso de código intermedio. .NET Framework se compone de los siguientes elementos: capa de servicios, BCL y CLR. Capa de servicios (Services). La capa de servicios se compone de aquellos servicios que permiten la intercomunicación entre los programas desarrollados en un lenguaje .NET y el resto de los elementos de .NET Framework, con el fin de generar comportamientos a través del diálogo con el sistema operativo. Existen dos principales: a) Windows Application Services, que dan soporte a las aplicaciones de interfaz gráfica estilo Windows y a las de consola en su diálogo con .NET Framework y el sistema operativo; b) ASP.NET Application Services, que apoya a las aplicaciones de interfaz gráfica basadas en la Web, servicios Web XML y aplicaciones de cómputo móvil en su diálogo con .NET Framework y el sistema operativo, a través del motor de servicios Web. En plataforma Microsoft este motor de servicios Web se llama Internet Information Server (IIS). Biblioteca de clases base (BCL/Base Class Library). La Biblioteca de clases base (BCL/Base Class Library) está constituida por un conjunto de bibliotecas de clase que ponen a disposición de los programas un conjunto de funciones jerárquicamente organizadas, que podrán ser utilizadas como funciones nativas de manera no dedicada por todos los lenguajes de .NET. Motor común de ejecución (CLR/Common Language Runtime). El Motor común de ejecución (CLR/ Common Language Runtime) es la plataforma común de ejecución de los programas desarrollados en cualquier lenguaje .NET. CLR agrupa compiladores de línea de comando que permiten la creación de código intermedio, libre de ambigüedades, al que se conoce como ensamblado (assembly); contiene además los compiladores JIT, Just in Time Compilers, que se encargan de generar código máquina a partir de los en-

1

8

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

samblados. CLR se encarga de la gestión de errores, la administración de recursos y el diálogo con el sistema operativo en tiempo de ejecución. A todo lo que requiere de la intervención de CLR para funcionar se le da el calificativo de administrado (managed). ❑ Soporte operativo. La capa de soporte operativo es la compuesta por las herramientas que se integran al sistema operativo al momento de instalar .NET Framework en un equipo. Con esta operación, el sistema operativo se modifica para poder interpretar y ejecutar aplicaciones .NET de forma nativa. Esta capa permite que el sistema operativo responda a indicaciones de acción emitidas por CLR en tiempo de ejecución.

NOTA Microsoft ha denominado de diferentes formas a los productos y lenguajes que componen la tecnología .NET: en la versión 1.0 de .NET Framework los lenguajes eran Visual Basic.NET, Visual C#.NET y Managed C++, mientras que el entorno integrado de desarrollo se conocía como Visual Studio.NET 2002. Por ser productos nuevos, existía la necesidad de diferenciarlos de las propuestas anteriores; incluso internamente en la compañía se penalizaba a quien osara referirse a Visual Basic.NET como Visual Basic 7. En la versión 1.1 de .NET Framework, los lenguajes pasaron a ser Visual Basic.NET, Visual C# y Managed C++, y se trabajaba con Visual Studio.NET 2003. Ahora, en la versión 2.0 de .NET Framework, las versiones anteriores de los lenguajes resultan anacrónicas, por lo que se conocen como Visual Basic, C# y C++. Se elimina también el “.NET” en Visual Studio; el nombre de la última versión queda entones como Visual Studio 2005.

FIGURA 1.1 Estructura de la plataforma .NET

Capítulo 1. Arquitectura de la plataforma .NET

9

Capa de lenguajes de .NET CLS (Especificación común para lenguajes, Common Language Specification) No siempre prestamos atención a lo que una herramienta de desarrollo hace tras bambalinas, dado que como programadores nos concentramos en que nuestra codificación produzca la respuesta esperada. En .NET, sin embargo, es importante conocer lo que sucede desde la codificación hasta la intervención del sistema operativo en la atención de las peticiones. Para saber cómo funciona .NET debemos partir de un concepto denominado CLS (Especificación común para lenguajes, Common Language Specification). La CLS es el subconjunto de capacidades mínimas soportadas por el motor de ejecución de .NET (CLR). Todas las herramientas y componentes de .NET, por ejemplo, conviven y utilizan las clases de BCL, además de ser orientadas a objetos; esto porque CLS lo determina como condición para formar parte de la tecnología .NET. El cumplimiento de estas reglas garantiza un comportamiento homogéneo de todos los componentes y herramientas de desarrollo .NET. Todos los lenguajes .NET liberados por Microsoft cumplen con la CLS; esto convierte a Microsoft .NET en un ambiente multi-lenguaje; es decir, un entorno donde todos los lenguajes permiten hacer prácticamente lo mismo dado que cumplen con un mismo marco original de trabajo y funcionamiento (CLS).

NOTA C# se lee “C Sharp” o “C Gato”; el signo “#” corresponde al de las partituras musicales.

Cualquier desarrollador experimentado puede aventurarse a desarrollar su propio lenguaje de programación basado en .NET y proponerlo al mercado. Basta con desarrollar las herramientas necesarias para el trabajo con el lenguaje, incluyendo el compilador y el analizador (parser) del mismo. El único requisito es que debe cumplir con todas las reglas definidas en la CLS. Capacidades multi-lenguaje de .NET. Dado que todos los lenguajes de .NET cumplen con CLS, su programación es bastante similar. A continuación ejemplificamos los efectos de esta especificación mediante el típico programa HolaMundo que muestra un mensaje. El programa HolaMundo en C# sería el siguiente:

1

10

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

HolaMundo.cs 1 2 3 4 5 6 8 9

using system; class HolaMundo { static void Main() { Console.WriteLine(“Hola Mundo”); } }

Y éste sería el código en Visual Basic: HolaMundo.vb 1 2 3 4 5 6

Imports System Class HolaMundo Sub Main() Console.WriteLine(“Hola Mundo”) End Sub End Class

Vea cómo el código es sorprendentemente parecido. Todos los lenguajes en .NET comparten el mismo origen (CLS), y difieren solamente en la forma estructural de la codificación, determinada por el estilo particular del lenguaje.

NOTA La empresa japonesa Fujitsu enfrentó un problema común para muchas empresas grandes: gran parte de sus desarrollos están en COBOL. ¿Cómo cambiar a la plataforma .NET sin sacrificar la inversión en desarrollo que ya se tiene? La solución que adoptaron fue generar un COBOL que cumple con CLS; una especie de COBOL.NET. Este antecedente muestra que las posibilidades son inmensas y la oportunidad de implementar nuevos lenguajes nunca había sido tan atractiva. Lo ideal para mucha gente sería disponer de poderosos lenguajes de programación en su lengua nativa, por ejemplo, en español. ¿Alguien se anima?

Además de proponer una arquitectura que facilita la creación de lenguajes, la CLS proporciona interoperabilidad entre los mismos. En virtud de que todos los lenguajes .NET cumplen con una misma especificación, en una solución o aplicación pueden coexistir programas desarrollados en diferentes lenguajes sin crear problemas de compatibilidad entre ellos.

Lenguajes .NET La definición de lenguaje .NET es simple: todo aquel lenguaje de programación y sus herramientas de análisis y compilación que cumplan con la CLS.

Capítulo 1. Arquitectura de la plataforma .NET

11

Los lenguajes .NET requieren someterse a un proceso de compilación, y el resultado de la compilación debe ser un programa intermedio, que llamamos ensamblado (assembly); los ensamblados pueden ejecutarse sólo en colaboración con el motor de ejecución de .NET (CLR). A todo programa que se ejecuta en colaboración con el Motor común de ejecución (CLR) se le da el calificativo de administrado (managed), por lo cual, a los lenguajes de .NET también se les conoce como lenguajes administrados (managed languages). En esencia, son administrados aquellos elementos ejecutados por el motor común de ejecución (en lugar de ser ejecutados directamente por el sistema operativo). Al ser administrados, los elementos disponen de servicios propios del motor común de ejecución como la recolección de basura (garbage collection), verificación de tipos en tiempo de ejecución (runtime type checking), administración de la memoria (memory management) y soporte de seguridad (security support), entre otros.

.NET Framework Capa de servicios La capa de servicios se encarga de proporcionar los medios de comunicación de datos entre lenguajes y herramientas de desarrollo, y los elementos internos de .NET que se encargan de transformar los desarrollos en aprovechamiento de recursos a través de lenguaje máquina, es decir, el .NET Framework. La capa de servicios está integrada por dos tipos fundamentales: ASP.NET Application Services y Windows Application Services. Estos servicios son en realidad modelos de programación que permiten la intercomunicación entre la interfaz y el núcleo de la plataforma .NET. Cualquier lenguaje es útil para programar y darse a entender para cualquiera de los servicios; la diferencia estriba en que ASP.NET Application Services está dirigido a los desarrollos en ambiente Web (Internet, Intranet y Computación móvil), mientras que Windows Application Services está dirigido a los desarrollos en ambiente Windows (aplicaciones de escritorio y Cliente/Servidor).

1

12

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Biblioteca de clases base de .NET Framework (BCL) Para entender la Biblioteca de clases de .NET Framework (BCL/Base Class Library), debemos considerar primero que todo en .NET es un objeto, pues los lenguajes .NET son completamente orientados a objetos. Aunque después se analizará a fondo la programación orientada a objetos, es necesario precisar muy brevemente algunas definiciones a efecto de explicar en qué consiste la BCL: ❑ Un objeto es un conjunto de datos y procedimientos que proporcionan una funcionali-

dad determinada. ❑ Otra definición clásica indica que un objeto es una instancia de una clase. ❑ Una clase es la definición formal de un objeto; es como una “plantilla “que especifica

❑ ❑ ❑



los datos que un objeto puede manejar para identificarse, definirse y producir resultados; la clase también especifica los procesos que es capaz de realizar un objeto (comportamiento) y los resultados que proporciona. Al proceso de derivar un objeto a partir de una clase se conoce como instanciación. Los objetos tienen propiedades, métodos y eventos. Los métodos son las acciones predefinidas que es posible llevar a cabo a través de un objeto. Para utilizar un método es necesario instanciar un objeto —generarlo a partir de una clase—; un método siempre es referido a través de un objeto. Existen clases, interfaces y tipos de valor que cumplen con CLS y permiten el acceso a la funcionalidad de BCL sin necesidad de ser instanciados previamente; para diferenciarlos de los que sí requieren instanciación, se conocen como types.

Con esto en mente, es fácil concluir que los programas desarrollados en .NET tienen como finalidad poner a trabajar, por medio de las estructuras del lenguaje, a los types y a los objetos generados a partir de clases. La biblioteca de clases base de .NET Framework integra una gran cantidad de clases, y cada una de ellas ofrece una determinada funcionalidad que puede ser integrada a las aplicaciones: algunas permiten crear objetos que desarrollan cálculos matemáticos o trigonométricos, otras permiten definir objetos que permiten la realización de gráficos, otras más permiten crear objetos a través de los cuales es posible manipular bases de datos, etcétera.

Composición de la plataforma .NET

Es muy difícil manejar y clasificar una cantidad tal de clases. Generalmente, las clases se almacenan en librerías de vínculos dinámicos (DLL) que agrupan clases afines. La BCL se compone de más de 150 archivos DLL, en los cuales se encuentran diseminadas las clases que componen la biblioteca de clases base. Espacios de nombres (Namespaces). Tratar de encontrar librerías por nombre de archivo físico es bastante problemático. Las clases, como son tantas, se han categorizado y

Capítulo 1. Arquitectura de la plataforma .NET

13

agrupado de manera lógica y jerárquica de acuerdo con su funcionalidad. A dichos grupos de clases se les conoce como Espacios de nombres (Namespaces).

NOTA La forma más fácil de explorar la jerarquía de clases de .NET Framework es mediante la ayuda electrónica del producto. También está disponible una versión impresa, a través de Microsoft Press, a un precio no muy accesible para todos. Recomendamos el uso de los medios electrónicos, ya que ahorran árboles, son más rápidos y van incluidos en el precio del producto.

Un programa puede contener objetos y emplear types; tanto los objetos como los types derivan de clases que indistintamente están contenidas en librerías (DLL) de .NET, o bien en clases desarrolladas por el usuario. Las clases que dan origen a los objetos y types utilizadas en un programa en .NET no necesariamente están contenidas en los mismos archivos de librerías, pero al momento de programar eso es irrelevante para el desarrollador. Disponibilidad de las clases: referencia y declaración de librerías. Para poder hacer uso de una clase, es necesario especificar previamente en qué librería debe buscarse. Esto implica referir el recurso físico y referir el recurso lógico. En otras palabras, hay que definir qué librería se requiere (referencia física) y qué espacio de nombre la refiere (referencia lógica). Para la referencia física es necesario que, al compilar, se establezca la referencia a la librería (DLL) requerida. Para la referencia lógica, dependiendo del lenguaje en el que se esté codificando, se emplean instrucciones declarativas de espacios de nombre, tales como import, using, include, etcétera, para que el programa pueda navegar sin problemas en la jerarquía de clases contenidas en la librería. La instrucción a utilizar varía en función al lenguaje que se esté utilizando. Instanciación de objetos. Una vez declaradas las librerías se dispone de las clases contenidas en ellas. A partir de las clases, es posible generar objetos (instanciar), y una vez que se cuenta con los objetos, es posible hacer uso de sus métodos para realizar alguna tarea determinada. Código type safe. Cuando los métodos de los objetos y los types utilizados por el programa son reconocidos por la plataforma .NET (como consecuencia de que todas las librerías están correctamente referidas) se dice que el programa es type safe. Un programa no es type safe cuando en él se utilizan clases contenidas en la biblioteca de clases de .NET Framework, pero no se ha referido la librería específica en la cual se debe buscar la clase, o bien, cuando no se han declarado los espacios de nombres que faciliten la ubicación de la clase buscada dentro de la jerarquía.

1

14

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Jerarquías de clases superiores. Existen dos grandes espacios de nombres, System y Microsoft, que a su vez tienen subdivisiones tales que las clases se organizan de manera jerárquica con base en su funcionalidad. En virtud de que casi todas las clases de .NET Framework pertenecen de una u otra forma a cualquiera de estas dos jerarquías, se les llama jerarquías de clases superiores. La organización de clases a través de espacios de nombres es lógica; .NET Framework se encarga de saber en todo momento qué librería o componente físico está asociado con un determinado espacio de nombres. Realmente, especificar el espacio de nombres System implica tener acceso a una librería que físicamente se llama Mscorlib.dll, y que se encuentra en algún lugar de su equipo. Como puede ver, es más sencillo hacer referencia a la librería a través del espacio de nombres que mediante una ruta de archivo físico. Con los anteriores elementos es posible definir a la biblioteca de clases de .NET Framework como una colección de clases incluidas en el ambiente de desarrollo .NET, disponibles para todos los lenguajes .NET y organizadas en espacios de nombres que permiten realizar tareas diversas a través del uso de objetos y types. .NET Framework proporciona un sinfín de recursos para desarrollar aplicaciones; basta con encontrar dónde están esos recursos. Al desarrollar en .NET es indispensable saber qué métodos y types utilizar, en qué clase se encuentran y qué espacios de nombres permiten disponer de dichas clases. Si la funcionalidad requerida no está en ninguna de las clases de BCL, entonces será necesario desarrollar las propias.

FIGURA 1.2 Organización de clases en BCL

Capítulo 1. Arquitectura de la plataforma .NET

15

Independencia de la biblioteca de clases y los lenguajes Ninguno de los lenguajes tiene uso exclusivo de la librería de objetos de .NET; por el contrario, está disponible para todos. Este hecho es bastante significativo ya que todos los lenguajes pueden hacer uso de las mismas clases, y, por tanto, podrán servir para lo mismo. Anteriormente, los programadores de C++ presumían de conocer un lenguaje que les permitía manejar los recursos de la computadora de una manera más profunda, y subestimaban a los programadores de Visual Basic por utilizar una herramienta “tan limitada”. Si un programador de Visual Basic 6.0 deseaba desarrollar programas con la misma funcionalidad que C++, era necesario que aprendiera el manejo de API (Interfaz para la programación de aplicaciones, Application Programming Interface) de Windows, y dicha opción podía ser bastante compleja. Ahora eso ha cambiado, ya que con todos los lenguajes en .NET es posible hacer las mismas cosas. Uno de los mayores beneficios que se obtienen al disponer de una biblioteca de clases para su uso en varios lenguajes, es que el programador aprende un solo lenguaje y al mismo tiempo aprende todos, en términos generales. Compare los códigos HolaMundo.cs (C#) y HolaMundo.vb (Visual Basic), que se encuentran en este mismo capítulo; aun codificados en distintos lenguajes, ambos utilizan un mismo espacio de nombres System, una misma clase Console y un mismo type WriteLine( ). La forma de invocar a las clases y los types en todos los lenguajes .NET es uniforme, y obedece a una sintaxis de separación punteada (dotted) que diferencia espacios de nombres, clases y types (estos últimos, opcionales en algunos casos): Namespace.Class[.Type]

Además, todos los lenguajes tienen el soporte de un mismo entorno integrado de desarrollo, llamado Visual Studio, con el cual es posible codificar al mismo tiempo múltiples proyectos en varios lenguajes. Realizar esto antes de .NET era impensable. El desarrollador debía aprender las palabras reservadas de cada uno de los lenguajes que aprendiera. Cada lenguaje poseía su propia biblioteca de clases (Class Foundation), sus propias jerarquías y su propia sintaxis de invocación. La experiencia que se ganaba con un lenguaje no servía de mucho al intentar desarrollar en otro; además, cada lenguaje tenía su propia herramienta de desarrollo: el programador consumía todo su tiempo en aprender a usar las herramientas de desarrollo y las diferencias en los lenguajes, y le quedaba muy poco tiempo para ocuparse de los problemas reales de programación, como entender la lógica de negocios. La plataforma .NET reduce la curva de aprendizaje y favorece el desempeño de los equipos de desarrollo, ya que la especialización puede darse ahora en la solución de los proble-

1

16

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mas específicos mismos, y no en las herramientas de desarrollo para resolverlos; con ello se aumenta la rentabilidad de los programadores y el retorno de la inversión en programas y capacitación.

CLR (Motor común de ejecución, Common Language Runtime) Motor común de ejecución. Una de las características más interesantes que aporta .NET es la modificación en la forma de compilar y ejecutar los programas.

Clases y objetos

Compilación en dos fases en .NET. La plataforma .NET compila los programas en dos tiempos, separando la fase de análisis de la compilación, de la de síntesis. Para ello, juega un papel muy importante el CLR. El CLR (Motor común de ejecución, Common Language Runtime) es el motor de ejecución de código administrado, que se encarga de proporcionar al programa en ejecución servicios de alto nivel, tales como la integración de módulos multi-lenguaje, seguridad y acceso a módulos de código, administración del ciclo de vida de los objetos, administración de memoria, recuperación de recursos, pistas de depuración, etcétera. El CLR trabaja en dos tiempos: 1. Tiempo de compilación. Se inicia cuando el programador utiliza cualquier compilador de lenguaje .NET para compilar un código fuente, y termina cuando se obtiene un código intermedio a partir del código fuente compilado. 2. Tiempo de ejecución. Se inicia cuando se llama a ejecución un código intermedio y el CLR se encarga de someterlo a la acción de compiladores Justo a tiempo que producen código nativo, para luego producir los efectos esperados del programa.

NOTA Los tiempos en los que se compilan y ejecutan los programas en .NET constituyen el rasgo más característico de la nueva plataforma, pues representan una enorme diferencia con respecto a las versiones anteriores del producto, por lo cual se analizan con mayor detalle más adelante.

A partir de los anterior, podemos definir al CLR como el motor de ejecución de código administrado que provee una infraestructura de compilación y ejecución que abstrae y coloca en un plano subyacente las diferencias de plataformas de hardware en donde un programa es ejecutado. La definición anterior es compleja; el concepto mismo del CLR lo es. De manera simplificada podemos decir que el CLR se encarga de administrar la compilación y ejecución de

Capítulo 1. Arquitectura de la plataforma .NET

17

los programas en .NET, con el fin de que puedan aprovechar la biblioteca de clases y los servicios de .NET Framework. NOTA No se sienta mal si tarda un poco en entender cómo trabaja el CLR: Piense que es el núcleo de la nueva plataforma de desarrollo de Microsoft y que dicha compañía tardó años en diseñarlo.

Compilador para generar código intermedio CLR en tiempo de compilación. El trabajo de CLR comienza con un código redactado en algún lenguaje .NET; dicho programa es un archivo de texto simple, que bien pudo haber sido editado en el Bloc de Notas (Notepad.exe). Este programa se conoce como código fuente (source code). El código fuente no es ejecutable. Para poder ejecutar un programa es necesario hacerlo pasar por un proceso de compilación que consiste en revisar su sintaxis y estructura para generar, si no tiene errores, un archivo que permita ser llamado a ejecución (ejecutable). El software que se encarga de convertir un programa fuente en ejecutable recibe el nombre de compilador; por ejemplo, el compilador específico de Visual Basic se llama vb.exe. Ensamblado | assembly. Al compilar un programa en .NET se genera un ejecutable reconocido solamente por la plataforma .NET, al cual se le da el nombre de ensamblado (assembly). Un ensamblado es un conjunto de uno o más archivos implementados como una sola unidad de ejecución sobre la cual se determina la accesibilidad y los permisos. Los ensamblados son la unidad básica, mínima, de ejecución en .NET. La compilación en .NET puede generar archivos de diversos tipos: exe, win exe, library o module, con diferentes extensiones de archivo, como EXE o DLL. Independientemente de lo que se genere, siempre será un ensamblado. Usted puede determinar qué tipo de ejecutable desea obtener del proceso de compilación; si al compilar no se especifica el tipo de ejecutable que se desea generar, por omisión se creará un archivo EXE. Metadatos. No obstante que tienen la misma extensión de archivo, no son iguales un ejecutable común y corriente, y uno generado por un compilador de .NET. El ejecutable creado por alguno de los compiladores de .NET está compuesto por dos elementos: código y metadatos (este último componente no existe en los ejecutables comunes). El código es el conjunto de instrucciones que forman el programa; los metadatos describen cada elemento que ha de ser administrado en tiempo de ejecución por el CLR; es informa-

1

18

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ción relativa al programa y su entorno como tipos de datos, versión del programa, referencias externas a librerías, etcétera. La diferencia entre un ejecutable .NET y uno que no lo es radica en la existencia del metadatos. Cuando un ejecutable se compila para plataforma .NET, y por tanto posee metadatos, se considera un programa con código administrado (managed code). Código administrado/managed code. Es importante mencionar que si su computadora no tiene instalado el .NET Framework no podrá llamar a ejecución a los ejecutables de .NET, pues en tal caso no tienen instalado el CLR, y éste es indispensable para acceder a metadatos. Puede decirse que existe un contrato de cooperación entre el ejecutable y el CLR. El calificativo “administrado” (managed) puede aplicarse a todo lo que se ejecuta bajo un contrato de cooperación con el CLR, y que sin éste, no funciona. Diversos nombres de los ensamblados. Los ejecutables que se obtienen después de compilar el código fuente son conocidos de varias formas: el código administrado también se conoce como ensamblado (assembly), MSIL (Microsoft Intermediate Language), IL (Intermediate Language) o código ntermedio. El código intermedio es aquel que no es código nativo aún, ya que sólo ha sido sometido a la fase de análisis del proceso de compilación. El código intermedio es independiente de la plataforma en la que se ejecute y del lenguaje en el cual fue escrito el código fuente que le dio origen; eso garantiza la portabilidad de las aplicaciones, haciéndolas universales y multiplataforma. El término que más se está utilizando es el de ensamblado. Por definición, un ensamblado es una colección de funcionalidad, control de versiones e implementación que actúa como la unidad básica de ejecución para el .NET Framework. FIGURA 1.3 Tiempos de compilación en .NET

Capítulo 1. Arquitectura de la plataforma .NET

19

Manifiesto. Por poseer metadatos, los ensamblados siempre son autodescriptivos. Cada ensamblado posee un manifiesto (assembly manifest), que es donde se almacenan los metadatos. El manifiesto es parte integral del ensamblado mismo, y en él se almacena la siguiente información: ❑ ❑ ❑ ❑ ❑

Identidad del ensamblado (Public Key Token). Referencia de los archivos que el ensamblado requiere para ser implementado. Types y otros recursos utilizados por el ensamblado. Dependencias con otros ensamblados. Permisos requeridos para ejecutar el ensamblado.

Gracias a la existencia de los manifiestos se hace innecesario guardar información en el registro de Windows, pues todo lo que se necesita saber se encuentra en el manifiesto del ensamblado. Copy deployment. Todo lo que necesita un ejecutable para trabajar se encuentra declarado en el ensamblado; es por ello que un programa ejecutable en .NET trabajará con solo ser copiado a otro equipo .NET. No hay que hacer instalaciones complejas o instalar componentes; sólo se copia el ensamblado. A esto se le ha dado el nombre de implementación por copia (Copy Deployment). Esto, por supuesto, si el equipo donde se copia posee la plataforma .NET, y en consecuencia, el CLR.

Caché global para ensamblado (GAC, Global Assembly Cache) Entre otras cosas, los ensamblados pueden ser librerías; en caso de que lo sean, existe la posibilidad de utilizarlas en diferentes escenarios y aplicaciones, dado su carácter compartido (shared). También es posible que existan otros desarrolladores en la misma organización que desarrollen sus propias librerías. Aunque remota, existe la probabilidad de que dos desarrolladores distintos generen, para utilizar en una misma aplicación, una librería compartida con el mismo nombre. De permitirlo .NET, se caería en la misma situación caótica de los DLL que tanto quisimos evitar en Windows DNA. Afortunadamente, en el caso de las librerías .NET compartidas, éstas deben registrarse en un recurso llamado Caché global para ensamblados (GAC, Global Assembly Cache). Este recurso almacena las entradas de los componentes y librerías .NET, registrando para cada uno diferentes especificaciones, de entre las cuales destaca PublicKeyToken, que constituye un identificador único del componente.

1

20

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En el GAC se encuentran las referencias lógicas de los componentes que, junto con la referencia física que especificamos al momento de compilar, evita la utilización accidental de un recurso. Puede haber dos componentes compartidos del mismo nombre físico, pero un programa sabrá siempre cuál es el que debe utilizar. Administrador de GAC. Existe una herramienta de .NET Framework, llamada gacutil. exe, que permite administrar el registro de componentes compartidos en el GAC. Dependiendo de lo que se quiera hacer, gacutil.exe permite listar los componentes registrados en GAC, registrar un nuevo componente compartido o eliminar uno previamente registrado.

Ejercicio 1.1 Análisis de las entradas del Caché global para ensamblado (GAC, Global Assembly Cache)

Se utilizará el administrador de GAC para conocer cuáles son los componentes .NET disponibles. Esta práctica asume que se tiene instalado .NET Framework 2.0 SDK, English version. 1. Abra el Panel de control y seleccione Herramientas administrativas – .NET Framework 2.0 Configuration. Se despliega la herramienta de configuración de .NET Framework 2.0. 2. En el panel de la izquierda haga clic en el nodo My Computer; en el panel de la derecha aparecerá el vínculo Manage the Assembly Cache (Global Assembly Cache).

Capítulo 1. Arquitectura de la plataforma .NET

21

3. Haga clic en el vínculo View List of Assemblies in the Assembly Cache. 4. Existe una columna llamada Locale, y no todos los ensamblados tienen el mismo valor en dicha columna, ¿qué cree que signifique eso?

5. Existe una columna llamada Public Key Token, que contiene una clave GUID (Identificador global único, Global Unique Identifier), ¿para qué cree que sirva dicha clave?

6. Cierre el programa de configuración de .NET Framework 2.0.

.NET PE (.NET Portable Executable) versus PE/COFF Si tanto usted como la empresa en que trabaja se están iniciando en la experiencia llamada .NET, es probable que desee conocer cuáles son las diferencias entre los ejecutables generados en versiones anteriores de Visual Basic 6.0 y los generados en .NET. Es muy probable que al tratar de implementar proyectos en .NET surjan cuestiones del porqué hay que instalar .NET Framework en las máquinas para poder ejecutar los programas .NET. Esto genera suspicacias y dudas: ¿seguirán trabajando mis aplicaciones existentes?¿comenzará a fallar mi equipo?, ¿tengo que pagar algo para poder ejecutar aplicaciones .NET? Para ejecutar aplicaciones .NET es necesario instalar .NET Framework en los equipos, pero no la versión de desarrollo, sino el núcleo del producto, que es gratuito e independiente de la instalación que un equipo tenga, por lo que no modifica las aplicaciones existentes.

1

22

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Lo que sí se modifica es el cargador de programas (program loader); es decir, la parte del sistema operativo que se encarga de reconocer a un programa ejecutable y de ejecutar las acciones. Archivo PE. Un ejecutable de Windows (Windows executable), sea EXE o DLL, debe poseer un formato llamado PE Format (Portable Executable Format), que es un derivado del Microsoft Common Object File Format (COFF). A los programas ejecutables, por cumplir con la especificación PE, se les ha dado a llamar también Archivos PE. Tanto PE como COFF están claramente especificados y disponibles públicamente, de tal forma que todos los desarrolladores cuyas aplicaciones generen ejecutables puedan utilizarlos para incluir en ellas los elementos que permitirán a los programas generados ser reconocidos como tales. Cualquier compilador o aplicación que desee generar ejecutables de Windows debe cumplir con la especificación PE/COFF. Un programa ejecutable contiene dos secciones: la sección de encabezados PE/COFF (PE/COFF Headers) y la sección de imagen nativa del programa (Native Image Section). La sección de encabezados PE/COFF indica al sistema operativo cómo está compuesto el programa y cómo debe ser ejecutado; la sección de imagen nativa se encarga de contener al programa en sí, así como los recursos que lo componen, usando para ello subsecciones bastante conocidas para los que han desarrollado compiladores, como lo son .data, .rdata, .rsrc, y .text.

Tiempos de compilación de CLR

Archivo .NET PE. Un archivo PE de .NET es más complejo pues contiene dos secciones más: la sección de encabezados CLR (CLR Header Section) y la sección de datos CLR (CLR Data Section). El encabezado CLR almacena información que identifica al programa como ejecutable de .NET para que como tal sea tratado por el cargador de programas. Por otro lado, la sección de datos CLR contiene metadatos y el código intermedio, lo que determina la forma en que el programa será ejecutado. Como puede ver, las secciones del archivo PE permanecen. Si usted no tiene instalado .NET Framework, el cargador de programas de Windows encontrará secciones no reconocidas (encabezado CLR y datos CLR), y no sabrá qué hacer con ellas. Como no fueron reconocidas dichas secciones y el código ejecutable de .NET no es código nativo, el programa generará un error. Sólo teniendo .NET Framework instalado será posible reconocer las nuevas secciones del ejecutable, que ordenarán la compilación JIT de la información contenida en datos CLR.

Capítulo 1. Arquitectura de la plataforma .NET

23

FIGURA 1.4 Diferencia de ejecutables .NET

1

Desensamblador de ensamblados. .NET Framework posee una herramienta de línea de comando para desensamblar los archivos ejecutables, llamada ildasm.exe. Con ella es posible comprobar si un programa es o no .NET, mediante la ejecución del siguiente comando: ildasm/TEXT

NombreEjecutable/HEADER

Donde NombreEjecutable es el nombre del ejecutable a analizar. La especificación /TEXT provoca que la salida sea a consola, y /HEADER provoca que aparezcan en el resultado todos los encabezados del ejecutable. Sólo si las definiciones muestran que el programa posee encabezados CLR, el programa es .NET.

Ejercicio 1.2 Identificación de diferencias en programas ejecutables, usando el desensamblador de .NET (ildasm.exe)

Desensamblará dos ejecutables para determinar cuál de los dos es un ejecutable .NET. 1. Abra el directorio APVBNETVS\Cap01; ése será su directorio de trabajo. 2. En ese directorio hay dos programas: HolaMundoA.exe y HolaMundoB.exe. Los dos hacen lo mismo, pero sólo uno de ellos es un .NET PE. 3. Ejecute el desensamblador de .NET Framework (ILDASM.EXE), que se encuentra en el directorio base de .NET (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). 4. Seleccione Inicio – Todos los programas – Microsoft .NET Framework SDK v2.0 – SDK Command Prompt.

24

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5. Vaya al directorio de trabajo. En la línea de comandos escriba lo siguiente: cd c:\APVBNETVS\Cap01 ildasm /TEXT HolaMundoA.exe /HEADER >a.txt ildasm /TEXT HolaMundoB.exe /HEADER >b.txt

6. Es muy evidente cuál de los dos archivos no contiene un ejecutable .NET, dado que no puede ser desensamblado. 7. Edite el archivo b.txt y busque la sección Metadata Version. ¿Qué ensambles externos se mandan llamar desde este programa?

8. Cierre la sesión de línea de comandos. FIN DEL EJERCICIO*

Compiladores JIT CLR en tiempo de ejecución. El ejecutable generado por los compiladores de .NET no está en código nativo, y, por tanto, su ejecución no implica que el equipo en el que es ejecutado realice alguna acción. Al correr un ejecutable en un equipo con .NET Framework, el cargador de programas del sistema operativo busca en el programa el encabezado CLR y los datos CLR; si estas secciones existen quiere decir que se trata de un ensamblado (.NET PE), y procede a darle un tratamiento considerado consecuente. De no ser así, procede a ejecutar el programa considerándolo como archivo PE de Windows. Si se trata de un .NET PE, el CLR identifica si ya ha sido ejecutado previamente en dicho equipo. En caso de que sea la primera vez que se ejecuta en el equipo, el CLR detecta que el ensamblado no es código nativo, y procede a generar código nativo a través de compiladores que actúan en tiempo de ejecución, a los cuales se les llama compiladores Justo a tiempo (compilador JIT / Just In Time Compiler). Sólo para aclarar el punto: los compiladores JIT trabajan sobre ensamblados, no sobre código fuente.

Capítulo 1. Arquitectura de la plataforma .NET

25

El compilador JIT evalúa el ensamblado, la disponibilidad de los types utilizados por el ensamblado y los recursos disponibles del sistema en que se está ejecutando el ensamblado. A partir de ese análisis, genera el código nativo aplicable al equipo y procede a ejecutarlo. Los compiladores JIT son los que realizan la fase de síntesis de la compilación, transformando el código intermedio que se encuentra en la sección de datos CLR en su equivalente a código nativo de la máquina, considerando la plataforma de la misma y la disponibilidad de recursos. NOTA El hecho de que se realice la compilación JIT la primera vez que se ejecuta un programa ejecutable en .NET, hace que el proceso sea más lento. Algunos programadores se decepcionan con .NET, pues argumentan que es más lento que las plataformas de desarrollo anteriores; quizá sea más lento la primera vez, pero la segunda vez que lo ejecute, el CLR detecta que ya existe código nativo creado, por lo que no procede a la compilación JIT, y por tanto se puede ver la velocidad real a la que el programa se ejecutará.

Gracias al CLR los programas ejecutables de .NET son altamente portables. Quien determina la diferencia del código nativo que ha de ejecutarse en una determinada plataforma es el CLR y no el ejecutable. Si un mismo ensamblado es ejecutado en dos equipos distintos, uno con mucha memoria y varios procesadores, y otro con poca memoria y un solo procesador, el CLR a través del compilador JIT generará el código nativo apropiado para tomar ventaja de todos los recursos disponibles. Vea las posibilidades: se puede tener una versión de .NET Framework en un equipo basado en UNIX, otro en Linux y una versión compacta de .NET Framework en un teléfono celular o en un PDA como la Palm Pilot. El mismo ensamblado puede ser ejecutado en todas las plataformas, y es el CLR a través del compilador JIT el que genera el código nativo y la funcionalidad disponible para cada una de las plataformas mencionadas. Poco importa también en qué lenguaje estaba desarrollado el código fuente que dio origen al ejecutable: después de compilarlo, todo es IL.

NOTA Resulta adecuado el nombre que se le da al ejecutable que generan los compiladores de .NET, “código intermedio” (IL), ya que lo generado es un código entre el código fuente y el código nativo. Los programadores de Java encontrarán la semejanza rápidamente: el IL sería como el Bytecode, mientras que el CLR sería como el Java Virtual Machine. Sólo un lenguaje de .NET permite (por el momento) la compilación directa a “casi” código nativo: C++.

1

26

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

No tener instalado el .NET Framework en una máquina también afecta al momento de ejecución, ya que el equipo no sabrá cómo interpretar el ejecutable, además de no ser posible transformar el IL en código nativo, por la ausencia de CLR. En ese contexto y dicho de otra forma, su programa nunca podría producir a partir del ensamblado la secuencia de números binarios que provoquen una respuesta en su computadora. NOTA En octubre de 2000, Microsoft propuso a la ECMA (Asociación Europea de Fabricantes de Computadoras, European Computer Manufacturers Association), encargada de la estandarización de sistemas de información y comunicación, un subconjunto funcional del CLR, denominado CLI (Infraestructura de lenguaje común, Common Language Infraestructure) para que fuera aprobado como estándar de desarrollo junto con el lenguaje C#. En diciembre de 2001 se ratificó por ECMA (ECMA-335), por lo cual cualquier plataforma de sistema operativo que así lo desee podrá disponer de su propio subconjunto de CLR, haciendo posible que las aplicaciones desarrolladas en .NET puedan ser ejecutadas en dichas plataformas sin modificar el código.

Microsoft ha puesto a disposición de todos un producto base denominado .NET Framework Redistributable Package en su sitio Web corporativo. Al instalarlo en su equipo ya es posible ejecutar aplicaciones desarrolladas en plataforma .NET. También lo está incluyendo en los Service Pack de sus sistemas operativos, y seguramente todos los sistemas operativos con versiones OEM lo incluirán. FIGURA 1.5 Proceso de ejecución .NET

Inicio

Se solicita ejecución de ensamblado

Se busca en Assembly Cache una imagen nativa del Assembly

No Compilador JIT realiza la fase de síntesis de compilación

¿Se encontró imagen?

No

Si

¿Es imagen vigente?

Si Se envía imagen nativa a Assembly Cache

Se carga imagen nativa en RAM

Se ejecuta la imagen nativa

Fin

Capítulo 1. Arquitectura de la plataforma .NET

27

Ensamblador de .NET. Existen también herramientas de .NET Framework que permiten realizar la fase de síntesis de la compilación, además del compilador JIT. El programa ilasm.exe es el ensamblador de .NET Framework; su función consiste en transformar un programa en código intermedio (MSIL) en archivo .NET PE. Para aquellos que deseen desarrollar un lenguaje .NET, esta herramienta es muy importante. Sólo tendrán que preocuparse por generar un compilador que traduzca el código fuente a MSIL; es decir, que se encargue de realizar la fase de análisis. La fase de síntesis podrá ser desarrollada por el ensamblador de .NET. También es posible desensamblar un archivo .NET PE, a través de la herramienta de .NET Framework llamada ildasm.exe. Tanto ilasm.exe como ildasm.exe están disponibles desde la línea de comandos del sistema operativo.

Impacto de .NET Framework en los sistemas operativos Los sistemas operativos son, a fin de cuentas, los que reciben las instrucciones de bajo nivel para producir los efectos buscados en los programas, por lo cual no pueden sustraerse a los cambios que .NET requiere para funcionar.

Modificación al cargador de ejecutables Ya se indicó que los ejecutables de .NET no son iguales a los ejecutables PE/COFF; el sistema operativo se ve modificado en este aspecto, ya que debe ser capaz de reconocer los nuevos encabezados de las secciones que poseen los .NET PE. Después de instalar .NET Framework en su equipo, el cargador de ejecutables será capaz de reconocer tanto a los ejecutables de .NET como a los ejecutables PE/COFF.

Registro de biblioteca de clases base Se instalan en su equipo todas las librerías de .NET Framework, y se registran a fin de que pueda disponer de todas las clases de .NET. No se confunda: el hecho de que usted no requiera registrar sus componentes en .NET en el Registro de Windows, no quiere decir que las librerías de .NET no se registran de alguna forma.

1

28

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

.NET sigue teniendo entradas en el Registro de Windows, ya que es el mecanismo optimizado que los sistemas operativos Windows entienden mejor; sin embargo, los desarrollos en .NET que usted realice no estarán basados en componentes, sino en ensamblados. De esa forma, el núcleo de .NET puede mantener manejo binario y registrado en los equipos locales a través de componentes, mientras que las aplicaciones que usted desarrolle en .NET ya no serán basadas en componentes, y se comunicarán a través de protocolos abiertos; en cierta forma, se aprovecha lo mejor de la tecnología disponible. A medida que los sistemas operativos comiencen a reconocer elementos .NET, la tecnología basada en componentes desaparecerá, aunque eso puede llevar tiempo.

Prerrequisitos del sistema operativo El sistema operativo debe disponer de un mínimo de actualización; por ejemplo, se asume que cuenta con una versión mínima de Internet Explorer, que tiene una amplia integración con los sistemas operativos Windows. También se requiere una versión actualizada de MDAC (Microsoft Data Access Components), que permita desarrollar algunas asignaciones de base de datos internas del modelo .NET.

Ventajas que brinda la infraestructura de .NET Algunos de los cambios que se vislumbran con la infraestructura que propone .NET son los siguientes: ❑ Será posible implementar soluciones Windows DNA sin las complicaciones de COM,

ya que los ensamblados, en coordinación con el CLR, se encargan del manejo inteligente de los componentes de una aplicación. La capa de presentación y la de reglas de negocio que propone DNA pueden modificarse drásticamente, ya que el procesamiento y la interfaz de usuario pueden dividirse la carga de trabajo entre servidor y cliente de manera flexible. ❑ Se podrán generar programas portables (IL) que facilitarán el desarrollo de aplicaciones empresariales distribuidas en diversas plataformas de sistema operativo con sólo instalar el CLI en ellas. ❑ El desarrollo de aplicaciones nunca había sido tan diverso: se pueden desarrollar aplicaciones de escritorio y Cliente/Servidor a través de formularios de Windows (Windows Forms). También es posible desarrollar aplicaciones de consola (Console Applications), y

Capítulo 1. Arquitectura de la plataforma .NET

❑ ❑







29

aplicaciones Web (Web Forms) que tendrán una interfaz más rica y funcional, además de ser más fáciles de elaborar para el desarrollador porque tendrán una lógica más depurada. Podrán desarrollarse servicios para los nuevos sistemas operativos de Windows, incluyendo las versiones de 64 bits, con lo que se puede fortalecer la plataforma BackEnd. Con la introducción de los Servicios Web XML (XML Web Services), ya no se venderá software, sino que se venderá el servicio que el software preste, mediante un esquema de suscripciones. Disponer de la funcionalidad de un programa será tan fácil como enlazarnos a una liga en Internet; no se requerirán inversiones fuertes por compra de software, sino el pago bajo y periódico por el acceso a un servicio. La piratería se reducirá, como efecto secundario. Los equipos de desarrolladores que estaban divididos por su especialidad en determinadas herramientas de desarrollo podrán colaborar de manera coordinada. Los programadores de C++, C#, Visual Basic y Java podrán contribuir con partes de una misma solución, con la certeza de que el trabajo que realicen coexistirá con el trabajo del otro sin incompatibilidades. Cada programador aprovecha la experiencia que ya tiene, y escoge de .NET el lenguaje que más le favorezca. .NET coexiste con aplicaciones pasadas. Toda la inversión realizada en desarrollo de aplicaciones basadas en COM sigue siendo útil; se puede convertir un componente COM en uno .NET, y viceversa. Se desarrollará computación móvil como nunca antes, como consecuencia de las facilidades proporcionadas por el CLR, que gestionará por nosotros las características de cada dispositivo.

En el capítulo siguiente podrá instalar todo lo que necesita para desarrollar en plataforma .NET, y comprobar a través de aplicaciones de consola gran parte de lo que se explica en este capítulo. NOTA Si conoce la estructura de un lenguaje .NET y el uso de las clases de .NET Framework, ya puede desarrollar aplicaciones. Visual Studio no es necesario para desarrollar. Por supuesto, ayuda enormemente, pero en caso de que no disponga de dicho software, puede editar el código en cualquier editor de textos, como el Bloc de Notas (NotePad.exe), compilar su programa y ejecutarlo.

Convivencia de .NET y COM Seguramente las organizaciones tienen desarrollos basados en componentes COM; cambiar de inmediato a .NET puede no ser posible, e incluso, puede no ser deseable. En ese sentido, .NET puede convivir con componentes COM, y para ello utiliza dos herramientas de .NET Framework: el exportador de librerías y el importador de librerías.

1

30

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El exportador de librerías (Type Library Exporter) está representado por el programa tlbexp.exe, que se encarga de generar, a partir de un ensamblado, una librería con la cual los componentes COM puedan interactuar. El importador de librerías (Type Library Importer) es la contraparte, ya que a partir de un componente COM, se genera un componente con el cual .NET pueda interactuar. Está representado por el programa tlbimp.exe.

Capítulo 1. Arquitectura de la plataforma .NET

MAPA

31

MENTAL DEL CAPÍTULO

1

32

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Administración de la memoria, 11 Administrado, 8, 11, 18 Administrador de GAC, 20 Application Programming Interface, 15 Archivo(s) .NET PE, 22 PE, 22 ASP.NET Application Services, 7, 11 Assembly, 7, 11, 17 manifest, 19 Base Class Library (BCL), 7, 12 BCL, 7, 12 Biblioteca de clases base (BCL), 7, 12 C#, 9 Caché global para ensamblado, 19 Capa de lenguajes, 7 de servicios, 7, 11 de soporte operativo, 8 Cargador de programas, 22 Clase, 12 CLR, 7, 16 Data Section, 22 Header Section, 22 CLS, 7, 9 Código, 17 administrado, 18 fuente, 17

COFF, 22 Common Language Runtime, 7, 16 Specification (CLS), 7, 9 Compilación, 17 en dos fases, 16 Compilador(es), 17 JIT, 7, 24 Copy Development, 6, 19 Desensamblador de ensamblados, 23 DLL, 12 DNA, Windows, 28 Ejecutable, 17 de Windows, 22 Ensamblado, 7, 11, 17 Espacios de nombres, 12-3 Especificación común para lenguajes, 7, 9 Eventos, 12 Exportador de librerías, 30 GAC, 19 gacutil.exe, 20 Garbage collection, 11 Global Assembly Cache, 19 IIS, 7 IL, 18 ilasm.exe, 27 ildasm.exe, 23, 27 Implementación por copia, 19

Importador de librerías, 30 Instanciación (de objetos), 12, 13 Instrucciones declarativas de espacios de nombre, 13 Interfaces, 12 Intermediate Language, 18 Intermedio, 18 Internet Information Server (IIS), 7 Jerarquías de clases superiores, 14 JIT, compiladores, 7, 24 Just in Time Compilers, 7, 24 Lenguaje(s) administrados, 11 .NET, 10 Librerías de vínculos dinámicos (DLL), 12 Managed, 8, 11, 18 code, 18 languages, 11 Manifiesto, 19 Memory management, 11 Metadatos, 17 Métodos, 12 Microsoft Common Object File Format

(COFF), 22 Intermediate Language (MSIL), 18 Motor común de ejecución (CLR), 7, 16 MSIL, 18 Multilenguaje, ambiente, 9 Namespaces, 12-3 Native Image Section, 22 .NET lenguaje, 10 proceso de ejecución, 26 .NET Framework, 7 Redistributable Package, 26 .NET PE (Portable Executable), 21 archivo, 22 Objeto, 12 PE /COFF Headers, 22 archivos, 22 format, 22 Plataforma .NET, 5 Portable Executable Format, 22 Proceso de ejecución .NET, 26 Program loader, 22 Propiedades, 12 Public Key Token, 19 Recolección de basura, 11

Capítulo 1. Arquitectura de la plataforma .NET

Referencia física, 13 lógica, 13 y declaración de librerías, 13 Runtime type checking, 11 Sección de datos CLR, 22 de encabezados CLR, 22

PE/COFF, 22 de imagen nativa del programa, 22 Security support, 11 Servicios Web XML, 29 Soporte de seguridad, 11 Source code, 17 Tiempo

de compilación, 16 de ejecución, 16 Tipos de valor, 12 tlbexp.exe, 30 tlbimp.exe, 30 Type Library Exporter, 30 Importer, 30 Types, 12, 19 safe code, 13

33

vbc.exe, 17 Verificación de tipos en tiempo de ejecución, 11 Windows Application Services, 7, 11 DNA, 28 executable, 22 XML Web Service, 29

PREGUNTAS 1.1 ¿Cuáles son las capas principales de la plataforma .NET y qué función cumple cada una? 1.2 ¿Cómo es el proceso de compilación de las aplicaciones desarrolladas en .NET y cuáles son los momentos en los que se desarrolla? 1.3 ¿Cuáles son las diferencias entre los ejecutables de .NET y los ejecutables Windows comunes? 1.4 ¿Cuáles son las ventajas que aporta .NET a los ambientes de desarrollo? 1.5 ¿De qué forma se da la convivencia de .NET con los antiguos esquemas basados en COM?

1

34

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Es el conjunto de reglas mínimas que debe cumplir un lenguaje para ser considerado lenguaje .NET: a) .NET Framework b) CLR c) CLS 2. Proporcionan los medios de comunicación de datos entre los lenguajes y las herramientas de desarrollo, y los elementos de .NET: a) ASP.NET Application Services y Windows Application Services b) XML Web Services c) CLR 3. Es el conjunto de clases disponibles en .NET: a) CLS b) CLR c) BCL 4. Es la información relativa al programa y su entorno, incluida dentro del mismo programa: a) Metadatos b) Ensamblado c) Código administrado 5. Es el compilador que se encarga de la fase de síntesis de compilación, en el caso de programas .NET: a) .NET PE b) Compiladores JIT c) csc

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Si .NET Framework no está instalado en un equipo, no se pueden ejecutar los programas .NET PE.

7.

Las clases de .NET Framework están disponibles para todos los lenguajes de .NET.

8.

Es imposible que los componentes compartidos en .NET entren en conflicto, gracias al GAC.

9. 10.

Los ensamblados de extensión EXE son código máquina ejecutable. .NET Framework no está basado en COM, y no convive con dicha tecnología.

CAPÍTULO

2

.NET como multiplataforma de desarrollo Objetivos: Conocer las generalidades de los diversos productos que componen la plataforma de desarrollo .NET y comprobar la posibilidad de desarrollar aplicaciones de consola, Windows y Web con el mismo lenguaje de programación. 1. Aprenderá a decidir qué producto instalar —.NET Framework 2.0 Redistributable Package, .NET Framework 2.0 SDK o Visual Studio 2005— considerando sus necesidades de uso y desarrollo. 2. Conocerá los requerimientos de instalación de los productos de .NET. 3. Aprenderá qué tipos de aplicaciones es posible desarrollar en .NET y los requisitos para hacerlo.

35

36

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Determinación de la plataforma .NET requerida . . . . . . . . . . . . . . . . . . . . . . Propósito de usar .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de aplicaciones posibles en .NET . . . . . . . . . . . . . . . . . . . . . . . . . Interacción con bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alcance operativo de la plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . Tecnología de bus y procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Productos de plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Framework 2.0 Redistributable Package . . . . . . . . . . . . . . . . . . . . .NET Framework 2.0 SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .NET Compact Framework 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visual Studio 2005 Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Selección del producto adecuado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consideraciones respecto del idioma de los productos . . . . . . . . . . . . . Comprobación del funcionamiento de la plataforma .NET . . . . . . . . . Determinación de los productos .NET a instalar en un escenario de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo de aplicaciones en .NET usando SDK . . . . . . . . . . . . . . . . . . . . . . Compilación de programas desde línea de comandos . . . . . . . . . . . . . Aplicaciones de consola (Console Applications) . . . . . . . . . . . . . . . . . . Aplicaciones Windows (Windows Applications) . . . . . . . . . . . . . . . . . . Aplicaciones Web (Web Applications) . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo y compilación de un programa desde la línea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tecnologías cubiertas en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37 37 37 38 38 39 39 40 41 42 44 45 45 46 46 47 49 49 49 50 50 51 53 55 56 56 58

Capítulo 2. .NET como multiplataforma de desarrollo

37

El capítulo anterior incluyó una gran cantidad de términos nuevos relacionados con el nuevo entorno de desarrollo .NET; éste trata de comprobar si todo aquello es cierto. Para pasar de las palabras a los hechos, usted comprobará la forma en que funciona la plataforma de desarrollo .NET a través de programas sencillos escritos en Visual Basic.NET. Este capítulo es particularmente importante para quienes tienen bajo su responsabilidad decidir la migración a .NET de entornos de desarrollo anteriores, pues se aclaran cuáles son los nuevos productos que .NET coloca en el mercado, sus requerimientos de hardware y software, así como lo que es necesario hacer para ejecutar aplicaciones desarrolladas en esta plataforma. Veremos que .NET es una multiplataforma de desarrollo, ya que proporciona herramientas de desarrollo para crear varios tipos de aplicaciones en distintos lenguajes y para diferentes tipos de dispositivos.

Determinación de la plataforma .NET requerida La primera pregunta a plantear es: ¿Para qué queremos tener la plataforma .NET en nuestros equipos? .NET cubre una gama sorprendente de aplicaciones. El producto .NET a instalar, los requerimientos de hardware y software correspondientes, y el precio a pagar dependen de lo que se desee hacer.

Propósito de usar .NET Hay dos propósitos principales que determinan las primeras decisiones: 1. Propósito de ejecución. Se refiere a sólo ejecutar aplicaciones .NET. 2. Propósito de desarrollo. Se aplica cuando se desea ejecutar y desarrollar aplicaciones .NET.

Tipos de aplicaciones posibles en .NET Si el objetivo es el desarrollo, será necesario determinar el tipo específico. Puede tratarse de alguna de las siguientes aplicaciones:

2

38

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

1. Aplicaciones de consola (Console Applications). Son aquellas aplicaciones textuales que reciben y muestran datos en el intérprete de comandos. 2. Aplicaciones Windows (Windows Applications/Windows Forms). Son las aplicaciones que tienen interfaz gráfica basada en Windows. 3. Aplicaciones Web (Web Applications/Web Forms / XML Web Services). Son aquellas que utilizan para su ejecución un navegador Web como Internet Explorer. La interfaz Web puede tener interacción con el usuario en un modelo petición-respuesta, basado en Cliente/Servidor. 4. Servicios Web XML (XML Web Services). Son módulos de funcionalidad distribuida de aplicación a aplicación que utilizan como transporte protocolos estándares de Internet, como HTTP y SOAP. 5. Aplicaciones de cómputo móvil (Mobile Applications). Son aplicaciones que se ejecutarán en dispositivos de cómputo móvil, como los PDA (Personal Data Assistant) y otros dispositivos inteligentes (smart devices). Funcionan en coordinación con .NET Compact Framework, y son codificados mediante lenguajes de marcación.

Interacción con bases de datos Considerando el uso de bases de datos que tendrán nuestras aplicaciones, la clasificación es la siguiente: 1. Aplicaciones sin bases de datos. Son aquellas que no utilizarán bases de datos. No realizan conexión con ningún motor de base de datos. 2. Aplicaciones con acceso a bases de datos soportadas de manera nativa. Son aplicaciones que tienen acceso a bases de datos que cuentan con proveedores de datos .NET nativos (Managed Providers) optimizados para el manejo de una base de datos específica. 3. Aplicaciones con acceso a base de datos soportadas de manera no nativa. Son aquellas aplicaciones que tienen acceso a bases de datos a través de proveedores de datos genéricos ODBC u OLEDB, que no están optimizados para el manejo de bases de datos específicas.

Alcance operativo de la plataforma De acuerdo con el alcance operativo de la plataforma, la clasificación es la siguiente: 1. Cliente. Es cuando la plataforma .NET se utilizará para aplicaciones de escritorio, generalmente de Windows, con manejadores de bases de datos de escritorio, como Access, y de orientación monousuario.

Capítulo 2. .NET como multiplataforma de desarrollo

39

2. Servidor. Es cuando la plataforma .NET se utilizará para aplicaciones compartidas o distribuidas, generalmente aplicaciones Windows y Web, con manejo de base de datos basadas en servidor, como SQL Server y Oracle, de orientación multiusuario.

Tecnología de bus y procesador Considerando la tecnología de CPU (procesador y bus) que se va a emplear: 1. 32 bits (x86). Cuando el equipo de desarrollo a utilizar será un equipo basado en plataformas x86 a 32 bits. 2. 64 bits (x64). Es cuando el equipo de producción a utilizar será un equipo basado en plataformas x64 a 64 bits. Considerando estas características, es posible determinar la plataforma .NET adecuada.

Productos de plataforma .NET Para cada combinación de necesidades existe un producto de plataforma .NET adecuado. Actualmente los siguientes son los principales productos: 1. .NET Framework 2.0 Redistributable Package a. x86 b. x64 2. .NET Framework 2.0 SDK a. x86 b. x64 3. Visual Studio 2005 a. Visual Studio 2005 Standard Edition b. Visual Studio 2005 Tools for the Microsoft Office System c. Visual Studio 2005 Professional Edition d. Visual Studio 2005 Team System 4. .NET Compact Framework (.NET Framework compacto) 5. Visual Studio 2005 Express Edition a. Desarrollo Web: i. Visual Web Developer 2005 Express Edition b. Bases de datos i. SQL Server 2005 Express Edition c. Desarrollo de aplicaciones Windows i. Visual Basic 2005 Express Edition

2

40

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ii. Visual C# 2005 Express Edition iii. Visual C++ Express Edition iv. Visual J# 2005 Express Edition Cada uno de ellos tiene distintos requerimientos, capacidades y, desde luego, costos.

.NET Framework 2.0 Redistributable Package Paquete de distribución .NET. .NET Framework 2.0 Redistributable Package. Es el producto de plataforma .NET Framework que se debe instalar en caso de que únicamente se desee ejecutar aplicaciones .NET. En términos generales, SDK habilita en los equipos el motor de ejecución de la plataforma (CLR) y la biblioteca de clases base (BCL). .NET Framework 2.0 Redistributable Package se recomienda para ambientes de producción, tanto de aplicaciones de escritorio como Web. Un ambiente de producción se compone de un equipo, generalmente un servidor, en donde se ejecutan las aplicaciones liberadas de forma definitiva en operación real. Un ambiente de producción no debe ser ambiente de desarrollo, para garantizar el máximo de disponibilidad de las aplicaciones para los usuarios. .NET Framework 2.0 Redistributable Package provee a los equipos el motor de ejecución (CLR) y la biblioteca de clases base (BCL), necesarios para ejecutar aplicaciones. Este producto es indispensable para la ejecución de aplicaciones desarrolladas en .NET, pero con él no se podrán desarrollar dichas aplicaciones. En aplicaciones de escritorio (Windows y Consola), deberá instalarse .NET Framework 2.0 Redistributable Package tanto en los servidores como en los clientes. En el caso de los desarrollos Web (Web Applications y Web Services), se deberá instalar sólo .NET Framework 2.0 Redistributable Package en el servidor, dado que es ahí donde se requiere el motor de ejecución y la biblioteca de clases. Requerimientos. Para conocer los requerimientos de hardware y software de este producto, lo ideal es consultar la página Web de Microsoft, que se mantiene actualizada conforme se liberan productos. Para disponer de la versión 2.0 de .NET Framework Redistributable Package en su versión para 32 bits, deberá descargar de la Web el archivo dotnetfx.exe. Lo podrá instalar en Windows 2000 con Service Pack 3 o superior; Windows 98; Windows 98 Second Edition; Windows ME; Windows Server 2003 y Windows XP con Service Pack 2 o superior. Ésta es la versión que se recomienda para los equipos de producción (operación real). En producción generalmente se tienen servidores; se recomienda en esos casos contar con Microsoft Data Access Components 2.8 o superior. También se recomienda Internet Informa-

Capítulo 2. .NET como multiplataforma de desarrollo

41

tion Services (IIS) version 5.0 o posterior. Para proporcionar las capacidades de ASP.NET se sugiere IIS con los últimos parches de seguridad, antes de instalar .NET Framework. ASP.NET sólo es aceptado por las siguientes plataformas: Microsoft Windows 2000 Professional (Service Pack 3 o superior recomendado), Microsoft Windows 2000 Server (Service Pack 3 o superior recomendado), Microsoft Windows XP Professional y Microsoft Windows Server 2003. En su versión para 64 bits, se deberá descargar el archivo NetFx64.exe e instalar en Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition; Windows Server 2003, Standard x64 Edition; o Windows XP 64-bit. A medida que las versiones se actualicen, seguramente los requerimientos serán mayores.

.NET Framework 2.0 SDK Kit de Desarrollo de Software de .NET Framework. .NET Framework Software Development Kit. Es el producto de plataforma .NET que se debe instalar si además de ejecutar aplicaciones se desea desarrollarlas. .NET Framework 2.0 SDK provee la funcionalidad de .NET Framework 2.0 Redistributable Package, pero además cuenta con todas las herramientas para escribir, construir, probar e implementar aplicaciones. .NET Framework contiene documentación, ejemplos y herramientas de línea de comando para compilar y analizar los programas desarrollados. Es importante mantener la congruencia de versiones; si desarrolla en .NET Framework SDK, el .NET Framework Redistributable Package debe ser de una versión igual o posterior, a fin de garantizar que todo funcionará. Por lo general, las versiones más nuevas de .NET Framework Redistributable Package ejecutarán sin problemas los programas desarrollados con .NET Framework SDK de versiones anteriores. Sólo verifique que las nuevas versiones no dejen obsoletas clases que usted haya utilizado, para evitar problemas. .NET Framework 2.0 SDK se recomienda para ambientes de desarrollo, tanto de aplicaciones de escritorio como Web. Un ambiente de desarrollo se compone de un equipo que generalmente emula a las capacidades de los equipos utilizados en producción, en donde se codifican, diseñan y prueban las aplicaciones en desarrollo. Recuerde: Un ambiente de desarrollo no debe ser utilizado como ambiente de producción, para garantizar el máximo de disponibilidad de las aplicaciones para los usuarios. .NET Framework 2.0 SDK debe utilizarse cuando se pretende desarrollar y ejecutar programas en .NET, sin generar costos por la adquisición en herramientas de desarrollo, o bien cuando se tiene un equipo de desarrollo de capacidades modestas; la desventaja es que las herramientas de soporte al desarrollador son muy rudimentarias por lo que el tiempo de de-

2

42

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

sarrollo con SDK es mucho mayor que utilizando herramientas gráficas de desarrollo. Opte por SDK sólo si no quiere gastar y dispone de mucho tiempo. Requerimientos. Para disponer de la versión 2.0 de .NET Framework SDK, en su versión para 32 bits, deberá descargar de la Web el archivo setup.exe (354 MB). Lo podrá instalar en Windows 2000 con Service Pack 3 o posterior, Windows Server 2003 y Windows XP con Service Pack 2 o posterior. En su versión para 64 bits, se deberá descargar el archivo setup.exe (337.8 MB) e instalar en Windows Server 2003, Datacenter x64 Edition; Windows Server 2003, Enterprise x64 Edition; Windows Server 2003, Standard x64 Edition y Windows XP 64-bit. Aunque el archivo a descargar tiene el mismo nombre, debe descargarse la versión adecuada a la plataforma operativa. Es necesaria la instalación de .NET Framework 2.0 Redistributable Package, para poder instalar .NET Framework 2.0 SDK. NOTA Por el momento .NET Framework SDK es gratuito y probablemente siga así. La razón es muy sencilla: por sus características particulares, la competencia directa de la plataforma .NET es Java. Para desarrollar en Java, desde hace mucho tiempo usted puede descargar el JDK (Java Development Kit) de forma gratuita; por tanto, ponerle precio a .NET Framework SDK sería darle ventaja a la competencia, por el momento Microsoft no puede darse ese lujo.

Visual Studio 2005 FIGURA 2.1 Visual Studio 2005 IDE

Capítulo 2. .NET como multiplataforma de desarrollo

43

Entorno Integrado de Desarrollo .NET. IDE / Integrated Development Environment. Es el producto de plataforma .NET que permite desarrollar en un ambiente gráfico e integrado totalmente a .NET Framework; Visual Studio 2005 es la herramienta de desarrollo asistido más sofisticada de la historia: incluye editores con ayuda contextual, diseñadores gráficos de aplicaciones, asistentes de desarrollo, generadores de código, etcétera. Visual Studio 2005 instala automáticamente .NET Framework 2.0 Redistributable Package y .NET Fremework 2.0 SDK, por lo que no es necesario instalarlas previamente. En Visual Studio 2005 puede desarrollarse de manera visual cualquier tipo de aplicación admitida por .NET, incluyendo las aplicaciones de computación móvil. Se puede elegir, desde la misma plataforma, múltiples lenguajes .NET para desarrollar módulos que coexistan dentro de una misma aplicación. Además, Visual Studio 2005 se integra con SQL Server 2005 para facilitar el acceso de datos desde las aplicaciones .NET que se desarrollan. La utilización de Visual Studio 2005 se recomienda cuando se dispone de un equipo robusto para el desarrollo, cuando se tiene la necesidad de desarrollar de forma rápida y efectiva varios tipos de aplicaciones, cuando existe la posibilidad de interacción multi-lenguaje para el desarrollo de aplicaciones profesionales con acceso a recursos de bases de datos. La desventaja es el costo de la herramienta (el caso de desarrolladores profesionales, se justifica). Existen varias versiones de Visual Studio 2005. La más elemental es la Standard Edition, que está orientada a los desarrolladores individuales profesionales; el kit Tools for the Microsoft Office System es la versión de Visual Studio 2005 para la integración de aplicaciones con la suite Microsoft Office; la Professional Edition permite los desarrollos individuales profesionales de alto desempeño, con funcionamiento multicapa; el más especializado de los productos es Team System, que incluye herramientas para el desarrollo de aplicaciones de alto desempeño. Ésta es ideal para equipos de desarrollo profesionales. Obviamente, entre más especializada la edición, mayor es su costo. Requerimientos de Visual Studio 2005. Si tiene la versión 2005 de Visual Studio Standard Edition, que fue la que utilizamos para este libro, deberá disponer de 2 GB de espacio en el disco duro, lo cual es un requerimiento importante. Se requiere tener instalado el MDAC 9 o posterior, básicamente porque es el que permite los accesos a SQL Server 2005. Los sistemas operativos en los que podrá instalar Visual Studio 2005 son Windows 2000 con Service Pack 4 o posterior, Windows XP con Service Pack 2 o posterior y Windows 2003 Server o posterior. En caso de querer desarrollar en plataforma Web, se debe tener la versión profesional de Windows 2000 y XP, ya que son los que proveen IIS. Se debe contar, además, con Internet Explorer 6.0 o posterior.

2

44

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Para otras versiones de Visual Studio 2005, consulte las especificaciones técnicas en el sitio de Microsoft.

> Lo nuevo En Visual Studio 2005 se tienen varias configuraciones predefinidas. Al iniciar por primera vez el uso de la herramienta se solicita el tipo de configuración que el desarrollador prefiere utilizar. En caso de este libro seleccionamos las preferencias para un desarrollador en Visual Studio (General Development Settings). Esto determina las herramientas activas y visibles por omisión, las teclas de atajo y la distribución de los menús. Todas las modificaciones que hagamos pueden ser guardadas a través de la opción Tools Import and Export Settings. En otras palabras, si tenemos que desarrollar en un equipo distinto al que utilizamos regularmente, podemos llevarnos la configuración de nuestras preferencias.

.NET Compact Framework 2.0 .NET Framework compacto. .NET Compact Framework. Es el producto de plataforma .NET que permite integrar a los dispositivos inteligentes con un conjunto compacto de funciones disponibles en .NET Framework, a fin de que se puedan ejecutar aplicaciones .NET, principalmente en Pocket PC (ahora Windows Mobile) y equipos con Windows CE. Lo que pretende Microsoft es extender su plataforma de desarrollo para atender cualquier tipo de dispositivo de cómputo, desde PDA hasta teléfonos celulares. Por su parte, los controles de computación móvil atienden a todo tipo de dispositivos que tienen capacidad de enlazarse a una página en Internet, mientras que .NET Compact Framework se encarga de aquellos dispositivos que poseen sus características de operación independientes de una conexión a Internet. .NET Compact Framework 2.0 debe instalarse en aquellos dispositivos inteligentes en donde se pretendan ejecutar aplicaciones .NET; es muy similar en concepto a .NET Redistributable Package, con las limitaciones obvias que se aplican a los dispositivos móviles, pues instala versiones reducidas de CLR y de BCL aplicables a los ambientes de cómputo móvil. En sí, .NET Compact Framework es un subconjunto de .NET Framework; consiste en una librería de clases base, además de librerías específicas para dispositivos móviles. .NET Compact Framework ejecuta una versión avanzada del compilador JIT que forma parte de un depurado CLR capaz de manejar eficientemente la escasez de recursos de los dispositivos móviles, cuidando el espacio de memoria y el consumo de batería. Visual Studio 2005 y .NET Framework 2.0 SDK contienen los elementos de .NET Compact Framework, para que el desarrollador pueda producir aplicaciones de cómputo móvil.

Capítulo 2. .NET como multiplataforma de desarrollo

45

Los dispositivos que han de ejecutar aplicaciones basadas en el .NET Compact Framework deben aceptar el .NET Compact Framework runtime (Motor de ejecución de .NET Compact Framework). El motor de ejecución requiere como mínimo Windows CE .NET o Windows Mobile 2003 software for Pocket PCs. Los dispositivos deberán contar con Windows Mobile Software for Pocket PC 2003, Windows Mobile 5.0 for Pocket PC and Smartphone, Windows CE .NET 5.0 o superiores.

Visual Studio 2005 Express Visual Studio 2005 Express Edition. Para favorecer el aprendizaje de las tecnologías .NET en un ambiente gráfico, Microsoft ha liberado lo que denomina versiones express. Las versiones express son subconjuntos de las herramientas de desarrollo gráfico para plataforma .NET, específicamente Visual Studio 2005. Las versiones express se orientan a tipos de desarrollo y lenguajes utilizados; es decir, se puede disponer de productos para desarrollo Web o para desarrollo Windows, pero no ambas. También se puede optar por un lenguaje: Visual Basic.NET, Visual C#, Managed C++ o Visual J#, pero no de todos de manera conjunta. Las versiones express permiten el desarrollo de aplicaciones, robustas, pero no poseen toda la funcionalidad y herramientas de Visual Studio 2005, especialmente el soporte de trabajo colaborativo. Para disponer de toda la funcionalidad multi-lenguaje de .NET, será necesario adquirir Visual Studio 2005. Dentro de las ventajas de las versiones express es que son gratuitas el primer año, exigen menos recursos que Visual Studio 2005 y permiten experimentar el ambiente gráfico de Visual Studio 2005 sin hacer una inversión inicial. Ciertamente, las versiones express no se recomiendan para ambientes profesionales de desarrollo dadas sus limitaciones.

Selección del producto adecuado La versión 2.0/2005 de los productos que componen la tecnología Microsoft .NET pueden seleccionarse atendiendo los siguientes parámetros:

2

46

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 2.2 Selección de producto

Consideraciones respecto al idioma de los productos Algunos recomiendan que instale los productos en su idioma nativo, es decir, el inglés, ya que contará con el soporte más actual, corrección de errores, ayuda y documentos técnicos actualizados todo el tiempo. El resto de los lenguajes siempre estarán rezagados. Aunque Microsoft no es ajeno a la globalización y progresivamente se desarrollan los productos en diversos idiomas, nuestra recomendación es instalar los productos en inglés, a fin de que cuente con lo más reciente todo el tiempo. Como desarrollador, seguramente tendrá que consultar foros en Internet, así como MSDN, en inglés. Entre más se haga a la idea que debe dominar dicho lenguaje, es mejor. Al instalar Visual Studio 2005, sobre todo en equipos cuyo sistema operativo no es muy actual, se requiere la instalación de prerrequisitos, que incluyen modificaciones al sistema operativo y al navegador. Para ambientes de desarrollo se recomienda instalar Visual Studio 2005 en el idioma del sistema operativo del equipo, ya que de otra forma es posible que la instalación de los prerrequisitos reemplace elementos del sistema operativo. Si se mezclan idiomas es probable que comience a ver las opciones de los menús de Windows en dos idiomas, así como los mensajes del sistema. Se recomienda, por tanto, instalar en los equipos de desarrollo un sistema operativo en inglés. De esa forma tanto el sistema operativo como Visual Studio 2005 estarán en inglés, lo que garantiza la máxima actualización de herramientas, service packs, parches de seguridad, entre otros.

Comprobación del funcionamiento de la plataforma .NET Es sencillo comprobar la instalación, tanto de Visual Studio 2005 como de .NET Framework 2.0 SDK, ya que ambos agregan entradas al menú principal de Windows.

Capítulo 2. .NET como multiplataforma de desarrollo

47

Lo verdaderamente importante que debemos comprobar es si ya disponemos de un nuevo entorno de desarrollo de aplicaciones basadas en .NET, con toda la funcionalidad del .NET Framework y CLR. Para hacerlo es necesario que haya instalado cualquiera de los productos de desarrollo; es decir, que haya instalado el .NET Framework 2.0 SDK o Visual Studio 2005. NOTA

2

En su equipo ya debe estar instalado el software que requiere para trabajar. Se trabajará desde línea de comandos para mejorar el entendimiento de la plataforma; posteriormente se trabajará con Visual Studio 2005 para mayor rapidez. Se debe tener instalado en su equipo Microsoft .NET Framework 2.0 SDK y además Visual Studio 2005. El uso de una u otra plataforma se determinará por la didáctica del tema que se esté tratando.

Ejercicio 2.1 Determinación de los productos .NET a instalar en un escenario de trabajo En el presente ejercicio aprenderá a determinar la cantidad y los tipos de productos que es necesario instalar en un escenario real. Se tiene un escenario compuesto como sigue:

Las aplicaciones de una empresa se encuentran en una distribución multicapa, de la siguiente manera. Se tienen tres servidores; uno de ellos es el servidor de bases de datos que da servicio de almacenamiento de datos a las aplicaciones y objetos de negocios y trabaja

48

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

sobre Windows Server 2003, Datacenter x64 Edition. Otro de los servidores es de aplicaciones y hospeda todos los objetos de lógica de negocio, así como las aplicaciones de escritorio basadas en interfaz Windows; trabaja sobre Windows Server 2003, Enterprise x64 Edition. El último es el servidor Web, que consume datos y funcionalidad de los otros dos servidores; trabaja en un equipo Windows 2003 Server. Se tienen dos aplicaciones principales, construidas en casa, SIO (Sistema Integral de Operaciones), que proporciona todo el control de los procesos de producción. Por lo complejo de las interfases, se decidió que fuera una aplicación Windows Forms. La otra aplicación importante es SICOM (Sistema de Comercialización), que proporciona información y pronósticos de ventas, así como información relevante para la administración financiera del negocio. Como la información puede ser consultada tanto dentro como fuera de la empresa, se decidió que fuera un desarrollo Web. Esta aplicación está desarrollándose como prueba de concepto, por lo que fue instalada en el servidor menos fuerte; por el momento, se ha dado un plazo de cuatro meses de prueba y, si es útil, se desarrollará con mayor calidad y potencia. Por el momento sólo tres usuarios utilizan SIO. Por otro lado, dos personas utilizan SICOM; uno de ellos es el director general, que puede enlazarse desde su equipo, cuando está en la empresa, o desde su PDA, cuando anda fuera de ella. Se tienen dos desarrolladores en la empresa: uno que se encarga del desarrollo y mantenimiento de SIO, y otro que se ocupa del desarrollo y mantenimiento de SICOM. Los tiempos de desarrollo asignados son muy estrechos, pues SIO es crítica y compleja, mientras que SICOM es un poco más sencilla, y como se dijo, es prueba de concepto. ¿Qué cantidad de cada producto es necesaria para dar soporte a la operación de la empresa? Cuide el mayor aprovechamiento de los recursos de cómputo y el menor costo. Producto .NET Framework 2.0 Redistributable Package (x86) .NET Framework 2.0 Redistributable Package (x64) .NET Framework 2.0 SDK (x86) .NET Framework 2.0 SDK (x64) Visual Studio 2005 Visual Web Developer 2005 Express Edition Visual Basic 2005 Express Edition .NET Compact Framework 2.0 FIN DEL EJERCICIO*

Cantidad

Capítulo 2. .NET como multiplataforma de desarrollo

49

Desarrollo de aplicaciones en .NET usando SDK Compilación de programas desde línea de comandos En esta sección se compilarán programas desde línea de comandos, por lo que es importante saber cómo hacerlo. La forma más sencilla de compilar un programa de Visual Basic.NET es la siguiente: vbc NombreCódigoFuente.vb

El programa vbc.exe es el compilador de Visual Basic.NET. Al someter a compilación al programa NombreCódigoFuente.vb, se generará de inmediato un ensamblado de nombre NombreCódigoFuente.exe. Observe cómo es necesario especificar la extensión del archivo que contiene el código fuente. Hay ocasiones en que los programas hacen uso de clases que pertenecen a la biblioteca de clases de .NET Framework, por lo que es necesario establecer referencias que permitan a los programas saber en qué archivos se encuentran las clases que utilizamos. Para ello recurrimos a la especificación “/r:”. Suponga que un programa requiere clases que se encuentran en una librería de nombre System.dll. La sintaxis sería la siguiente: vbc NombreCódigoFuente.vb /r:System.dll

Si se requieren varias librerías, podemos separarlas por comas (sin dejar espacio entre una y otra) o repetir la especificación “/r:”. Si además de System.dll, requerimos System. Drawing.dll, ésta sería la sintaxis: vbc

NombreCódigoFuente.vb /r:System.dll,System.Drawing.dll

o vbc

NombreCódigoFuente.vb /r:System.dll /r:System.Drawing.dll

Las diferentes especificaciones que se utilizan para compilar archivos en Visual Basic.NET se irán revisando conforme los ejemplos lo vayan requiriendo.

Aplicaciones de consola (Console Applications) Las aplicaciones de consola son aquellas aplicaciones textuales que reciben y muestran datos en el intérprete de comandos.

2

50

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La secuencia de desarrollo de este tipo de aplicaciones es la siguiente: 1. Se abre una sesión de comando (MS-DOS). 2. Con un editor de texto se edita el programa (con extensión vb). 3. Se compila el programa sin olvidar establecer las referencias con las librerías de .NET que se requieren para la funcionalidad propuesta por el mismo. 4. Se ejecuta el programa.

Aplicaciones Windows (Windows Applications) Son aquellas que tienen interfaz gráfica basada en Windows. La secuencia de desarrollo de este tipo de aplicaciones es la siguiente: 1. Se abre una sesión de comando (MS-DOS). 2. Con un editor de texto se edita el programa (con extensión vb). 3. Se compila el programa, sin olvidar establecer las referencias con las librerías de .NET requerida para la funcionalidad propuesta por el mismo. Son indispensables, al menos, las librerías System.dll, System.Drawing.dll y System.Windows.Forms.dll. 4. Se ejecuta el programa.

Aplicaciones Web (Web Applications) Son aquellas aplicaciones que utilizan para su ejecución un navegador Web como Internet Explorer. Éstas son especiales en el sentido de que no se compilan como las aplicaciones de consola o Windows. Trabajan en combinación con el motor de Servicios Web XML de Microsoft; es decir, el Internet Information Services (IIS), que debe estar instalado en la máquina donde se alojará el programa. Para comprobar que se tiene instalado IIS, se ingresa al Panel de control, y en Agregar y quitar programas, Agregar o quitar componentes de Windows; deberá aparecer Internet Information Server marcado en la lista. Otra forma es ingresar al Internet Explorer e ir al URL http://localhost si se trata de nuestro equipo; si no es nuestro equipo el que posee IIS, deberá sustituirse localhost por el nombre del equipo que lo posea. Si aparece contenido en el navegador, es que está funcionando IIS.

Capítulo 2. .NET como multiplataforma de desarrollo

51

Otra forma, aunque no definitiva, es comprobar la existencia del directorio \inetpub, en la unidad donde se aloja el sistema operativo. Dicho directorio es el directorio de Servicios Web. No es definitiva porque puede existir el directorio pero no disponerse de los Servicios Web XML. Dentro del directorio de Servicios Web XML se encuentra el directorio raíz de aplicaciones Web, llamado \inetpub\wwwroot; todo lo que se encuentre en dicho directorio o en algún directorio contenido en él será tratado como sitio Web, y, por tanto, .NET Framework aplicará los procesos de compilación y ejecución de aplicaciones Web de manera automática. Estos temas se tratan a mayor detalle cuando se estudia ASP.NET. La secuencia de desarrollo de aplicaciones Web es la siguiente: 1. Se abre una sesión de comando (MS-DOS). 2. Con un editor de texto, se edita el programa (extensión aspx). 3. Se copia el archivo a un directorio que de manera física o virtual se encuentre dentro del directorio de Servicios Web. 4. Se ejecuta el programa abriéndolo desde el navegador (Internet Explorer, por ejemplo), utilizando el protocolo http. Como pudo comprobar, Visual Basic.NET es el mismo lenguaje para todos los programas; lo que difiere es la interfaz, la forma de compilar y la plataforma de ejecución. Aprenda Visual Basic.NET para todos los tipos de aplicaciones.

Ejercicio 2.2 Desarrollo y compilación de un programa desde la línea de comandos En el presente ejercicio aprenderá a desarrollar un programa de consola utilizando SDK y comprobará el funcionamiento de .NET Framework en su equipo. 1. Con cualquier editor de texto simple, edite el programa HolaMundo.vb (que reside en el directorio C:\APVBNETVS\Cap02, que será nuestro directorio de trabajo).

2

52

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de HolaMundo.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Imports Imports Imports Imports

System System.Drawing System.Windows.Forms Microsoft.VisualBasic

Module HolaMundoB Dim frmHola As New Form() Dim lblMensaje As New Label() Dim WithEvents btnAceptar As New Button() Sub Estado() frmHola.ClientSize = New Size(200, 100) frmHola.Name = "frmHola" frmHola.StartPosition = FormStartPosition.CenterScreen frmHola.Text = "Hola Mundo" lblMensaje.Location = New Point(16, 16) lblMensaje.BorderStyle = BorderStyle.Fixed3D lblMensaje.Name = "lblMensaje" lblMensaje.Size = New Size(150, 20) lblMensaje.Text = "" btnAceptar.Location = New Point(16, 50) btnAceptar.Name = "btnAceptar" btnAceptar.Size = New Size(150, 32) btnAceptar.Text = "Haz clic" frmHola.Controls.Add(lblMensaje) frmHola.Controls.Add(btnAceptar) End Sub

Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click lblMensaje.Text = "Hola Mundo" End Sub Sub Main() Estado() frmHola.ShowDialog() End sub End Module

Capítulo 2. .NET como multiplataforma de desarrollo

53

2. Seleccione Inicio – Todos los programas - Microsoft .NET Framework SDK v2.0 – SDK Command Prompt. 3. En la ventana de comandos, traslade el control al directorio de trabajo. cd \APVBNETVS\Cap02

4. Compile el programa desde línea de comandos. vbc HolaMundo.vb

5. Ejecute el programa. HolaMundo

6. Si el programa funciona, habrá comprobado que puede desarrollar aplicaciones Windows sin contar con una herramienta de desarrollo gráfico. FIN DEL EJERCICIO *

Tecnologías cubiertas en este libro Como ya aprendió, existen múltiples opciones de productos en tecnología .NET, y este libro tiene que decidirse por una configuración que permita demostrar todos los tópicos que lo componen. Además, esta opción debe ser razonable en cuanto a la cantidad de requerimientos de hardware y software. Se considera un escenario de trabajo en español y se asume que usted cuenta con un equipo en plataforma de 32 bits con el siguiente software básico instalado: ❑ Sistema operativo Windows XP Professional en español, con Service Pack 2, instalado. ❑ Internet Information Server 5.0 (IIS), instalado y operando. ❑ Internet Explorer 6.0, en español. ❑ MDAC (Microsoft Data Access Components) 2.8. ❑ SQL Server 2005, en inglés. ❑ .NET Framework 2.0 Redistributable Package, en inglés. ❑ .NET Framework 2.0 SDK, en inglés. ❑ Visual Studio 2005, Standard Edition, en inglés.

Son útiles otras versiones, superiores o más robustas, del sistema operativo, de Internet Explorer, Internet Information Server y MDAC.

2

54

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se puede comprobar si IIS está instalado y funcionando, si desde el Internet Explorer se obtiene respuesta al abrir la página http://localhost. Para simplificar el texto, se tienen las siguientes equivalencias: Si se hace referencia a:

Estamos hablando de:

Windows / Sistema Operativo

Windows XP Professional, con Service Pack 2 en español.

Internet Explorer

Internet Explorer 6.0 o posterior, en español.

MDAC

MDAC 2.8 o posterior.

.NET Framework

Plataforma .NET Framework, compuesta por .NET Framework 2.0 Redistributable Package y .NET Framework 2.0 SDK, en sus versiones en español.

SQL Server

SQL Server 2005, en inglés.

Visual Studio

Visual Studio 2005, en inglés.

Visual Basic

Visual Basic.NET 2005

C#

Visual C# 2005

C++

Managed C++ 2005

ASP.NET

ASP.NET 2.0

ADO.NET

ADO.NET 2.0

Capítulo 2. .NET como multiplataforma de desarrollo

MAPA

55

MENTAL DEL CAPÍTULO

2

56

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Ambiente de producción, 40 Aplicaciones de cómputo móvil, 38 de consola, 38, 49 Web, 38, 50 Windows, 38, 50 Cliente, 38 Console Applications, 38 Controles de computación móvil, 44 Dispositivos inteligentes, 38 dotnetfx.exe, 40 IDE, 43

Integrated Development Environment (IDE), 43 Kit de desarrollo de software de .NET Framework, 41 Managed Providers, 38 Mobile Applications, 38 .NET Compact Framework, 38, 44 .NET Framework 2.0 Redistributable Package, 40 Software

Development Kit, 41 NetFx64.exe, 41 ODBC, 38 OLEDB, 38 PDA, 38 Personal Data Assistant (PDA), 38 Proveedores de datos genéricos ODBC u OLEDB, 38 .NET nativos, 38 Servicios Web XML, 38 Servidor, 39 setup.exe (32 bits), 42

setup.exe (64 bits), 42 Smart devices, 38 vbc.exe, 49 Visual Studio 2005, 43 Express Edition, 45 Web Applications, 38, 50 Web Forms, 38 Windows Applications, 38, 50 Forms, 38 XML Web Services, 38

PREGUNTAS 2.1 ¿Cuáles son los factores a determinar antes de seleccionar un producto de desarrollo .NET? 2.2 ¿En qué casos se recomienda utilizar Visual Studio 2005? 2.3 Suponiendo que su trabajo consista en desarrollar, ¿cuál es el producto .NET que mejor satisface sus necesidades?

Capítulo 2. .NET como multiplataforma de desarrollo

57

Notas:

2

58

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es el producto de plataforma .NET ideal cuando se desea sólo ejecutar aplicaciones: a) .NET Framework 2.0 Redistributable Package b) Visual Studio 2005 c) .NET Framework 2.0 SDK 2.

Es el producto de plataforma .NET ideal para desarrollar aplicaciones sin usar herramientas gráficas: a) .NET Framework 2.0 Redistributable Package b) .NET Compact Framework c) .NET Framework 2.0 SDK

3. Permite la ejecución de aplicaciones .NET en dispositivos inteligentes: a) Visual Studio 2005 b) .NET Framework 2.0 SDK c) .NET Compact Framework 4. No es un tipo de aplicación .NET: a) Aplicación de consola b) Aplicación Web c) Aplicación batch 5. Es el compilador de Visual Basic: a) VB b) VBC c) JITVB

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Visual Studio Standard puede instalarse en Windows 98.

7.

Los programas desarrollados en .NET no se pueden ejecutar en Windows 95.

8.

Es necesario instalar .NET Framework Redistributable Package para poder instalar Visual Studio 2005.

9.

Ejecutar ASP requiere que los programas se encuentren en la raíz de aplicaciones Web, o alguno de sus directorios.

10.

Es posible desarrollar aplicaciones robustas utilizando las versiones Express de Visual Studio 2005.

CAPÍTULO

3

Técnicas de desarrollo con Visual Studio 2005 Objetivos: Familiarizarse con las generalidades del trabajo con Visual Studio para el desarrollo de aplicaciones de Consola, Windows y Web. 1. Entenderá el concepto de organización de trabajo de Visual Studio, basado en soluciones y proyectos. 2. Conocerá la mecánica de creación de aplicaciones mediante Visual Studio. 3. Se familiarizará con el uso de las herramientas Solution Explorer, Toolbox y Text Editor. 4. Aprenderá a distribuir el espacio de trabajo en Visual Studio. 5. Conocerá la forma de construir y depurar aplicaciones en Visual Studio. 6. Aprenderá a realizar configuraciones generales básicas de Visual Studio.

59

60

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Fundamentos de desarrollo con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . Soluciones y proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recomendaciones para la creación de proyectos y soluciones en desarrollos colaborativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de aplicaciones en Visual Studio . . . . . . . . . . . . . . . . . . . . . . Elementos de sintaxis en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de una aplicación de Consola en Visual Basic usando Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Creación de una solución en blanco . . . . . . . . . . . . . . . . ➤ Adición de un proyecto a una solución . . . . . . . . . . . . . ➤ Herramientas de Text Editor . . . . . . . . . . . . . . . . . . . . . . ➤ Colocación de números de línea en Text Editor . . . . . . . ➤ Intellisense y detección dinámica de errores . . . . . . . . . ➤ Modificación de código usando Text Editor . . . . . . . . . . ➤ Generación de una solución en Visual Studio . . . . . . . . ➤ Depuración de una solución . . . . . . . . . . . . . . . . . . . . . . Creación de una aplicación Windows en Visual Basic con Visual Studio, trabajando varios proyectos en una solución . . . ➤ Generación de una aplicación Windows . . . . . . . . . . . . . ➤ Fijación de una herramienta en el espacio de trabajo . . ➤ Adición de objetos de interfaz en tiempo de diseño . . . ➤ Navegación entre documentos de una solución . . . . . . . ➤ Cómo guardar documentos en una solución . . . . . . . . . ➤ Establecimiento del proyecto de inicio para una solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de una aplicación Web en Visual Basic con Visual Studio, trabajando varios proyectos en una solución . . . . . . . . . ➤ Creación de un directorio virtual para un sitio Web . . . ➤ Creación de una aplicación Web ASP.NET . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61 61 63 65 67 68 68 69 72 73 74 77 78 78 78 79 80 81 83 84 84 86 86 88 92 93 93 94

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

61

Fundamentos de desarrollo con Visual Studio Soluciones y proyectos En .NET, desarrollar en SDK es igual que hacerlo en Visual Studio; sin embargo, la organización del trabajo de desarrollo tiene importantes diferencias. Si se utiliza Visual Studio, todo el trabajo se organiza en soluciones y proyectos. Una solución es el nivel más alto o global de organización en Visual Studio, y consiste en una colección de proyectos administrados en una sola estructura. Las soluciones almacenan información respecto de los proyectos que agrupan las dependencias entre éstos y el orden de construcción (compilación y generación de ensamblados) que deben guardar entre sí. Las soluciones tienen la extensión sln y presentan algunas limitaciones: la primera es que sólo se puede tener una solución abierta en una instancia de Visual Studio; la segunda es que una solución no puede contener a otra. Los proyectos son colecciones de archivos fuente, compilados conjuntamente como un archivo de salida .NET (ensamblado). Cada proyecto puede componerse por interfaces de usuario (Windows Forms, Web Forms, Mobile), archivos de código (vb), referencias a clases de .NET Framework o a bibliotecas creadas por el usuario, archivos XML, HTML, y en fin, todo lo necesario para generar un ensamblado. Visual Studio posee más de 90 tipos de proyectos. La ventaja de utilizarlos es que seleccionando el tipo de proyecto adecuado, Visual Studio se encarga de crear los archivos mínimos para el tipo de aplicación correspondiente, y además establece de forma automática las referencias a clases de .NET Framework usualmente requeridas.

3

62

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 3.1 Organización de soluciones y proyectos

Es importante mencionar que algunos proyectos muy especiales no generan ensamblados, como los de setup, pero constituyen una minoría. Un proyecto puede formar parte de varias soluciones, por lo que es posible organizar por módulos una aplicación y, al mismo tiempo, se puede tener una solución maestra que englobe a todos los proyectos. Subdividir es una práctica recomendable, ya que al momento de estar desarrollando y solicitar la compilación de los programas, se compilarán todos los proyectos de la solución. Esto puede convertirse en un problema en el caso de aplicaciones grandes: en primera instancia, porque pueden ser muchos los proyectos a compilar, lo que tomará mucho tiempo; en segunda, porque en los proyectos grandes intervienen varios programadores, y es posible tener que lidiar con proyectos que ya funcionaban pero que ahora están presentando errores, que se tendrán que corregir antes de que el programa pueda ser compilado correctamente. Las soluciones deben planearse cuidadosamente con todo el equipo de desarrolladores. Que una solución integre a todos los proyectos de otra solución no implica que una solución está dentro de otra. Eso permite que cada persona cree las soluciones que requiera sin afectar el trabajo de otros ni perjudicar la integración de software que se da por la unión de proyectos. Es importante notar que en una misma solución pueden coexistir proyectos escritos en diferentes lenguajes .NET; sin embargo, un proyecto puede tener código fuente en un solo lenguaje.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

63

> Lo nuevo En Visual Studio 2005 se tienen las siguientes prestaciones relativas a los proyectos y las soluciones. Es posible crear proyectos temporales (temporary projects) que no requieren guardarse con el fin de hacer pruebas sin necesidad de crear proyectos y soluciones. También es posible crear proyectos autónomos (stand-alone projects): cuando una solución sólo se compone de un proyecto, no es necesario hacer la gestión de la solución, aunque de todas formas se genere. Para la organización del trabajo ya es posible crear directorios o carpetas de solución, en los cuales es posible clasificar los archivos involucrados en la solución. También podemos administrar todos los recursos de un proyecto a través de Project Designer, y es posible referir archivos EXE como orígenes de clases, y no sólo archivos DLL.

Recomendaciones para la creación de proyectos y soluciones en desarrollos colaborativos Se conoce como desarrollos colaborativos a las iniciativas de desarrollo que son tan grandes que el trabajo debe distribuirse en varios equipos de desarrollo. Piense en proyectos de desarrollo de la magnitud de Microsoft Excel. Es impensable que un solo equipo de desarrolladores haya estado a cargo de todas y cada una de las funciones del paquete. Seguramente un equipo de desarrolladores se ocupó de la interfaz gráfica, otro del Solver, otro más de las capacidades de graficación, etcétera. Imagine, por otro lado, que alguien deseara compilar su parte y que ello implicará compilar todos los programas de todos los equipos de trabajo. En términos de tiempo y procesamiento, eso sería inadmisible. Se parte del supuesto que mantener las cosas simples es lo mejor. Trabajar con el mínimo de elementos, los suficientes y necesarios para obtener los resultados calculados, permite una mejor concentración en el trabajo. Cuando se trabaja en ambientes colaborativos se recomiendan las siguientes prácticas relacionadas con los proyectos y las soluciones: 1. Se debe dividir la aplicación en módulos, e incluso en submódulos. Cada módulo y submódulo es una unidad de labores de desarrollo que contará con un responsable. De esa forma se trabaja sólo con los archivos del módulo; la compilación y depuración se realizará sólo sobre ellos sin necesidad de manipular el trabajo de otros. 2. Se recomienda que el trabajo de desarrollo de módulos y submódulos se haga en un equipo local, y nunca en un ambiente de producción.

3

64

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

3. Se debe tener una solución por cada módulo y una solución por cada submódulo, si fuera pertinente. 4. Cada solución debe tener un responsable. 5. Los desarrollos de los submódulos se agregan al módulo sólo después de ser probados. 6. Todas las librerías de uso común deben ser administradas por un responsable, aun cuando no sea quien las desarrolle. Debe haber una solución para el manejo de las librerías de uso común. 7. Sólo el responsable de la solución que contiene las librerías de uso común puede autorizar las modificaciones a las librerías; al autorizar una modificación deberá comunicar la actualización a todos los equipos de trabajo. 8. Se debe tener una solución que integre todos los recursos y programas que componen la aplicación, pero no se trabaja sobre ella. En esta solución sólo se integran los recursos que ya han sido probados a nivel módulo. 9. La solución que integra toda la aplicación es la que se compilará finalmente para generar una versión para entregar.

FIGURA 3.2 Trabajo colaborativo

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

65

Creación de aplicaciones en Visual Studio El procedimiento más sencillo para la creación de una solución es ejecutar Visual Studio. Aparecerá la página principal de la herramienta, denominada Start Page (Página de inicio), desde la cual se pueden abrir proyectos nuevos o existentes, así como consultar información de Visual Studio y la plataforma .NET.

> Lo nuevo En Visual Studio 2005 la página de inicio fue rediseñada totalmente. Ahora las cuatro secciones (Open an existing project, Getting Started, Headlines y News) aparecen en una sola página.

3 FIGURA 3.3 Start Page

En Start Page se selecciona File – New – Project (o se oprime la combinación de teclas Control-Mayús-N). Aparecerá la ventana New Project, que permite seleccionar el lenguaje a utilizar, así como el tipo de proyecto que se desea construir.

66

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 3.4 New Proyect

Al proporcionar los datos del proyecto a agregar, automáticamente se crea una solución con el mismo nombre. La desventaja de esta modalidad es que en aplicaciones grandes nunca un proyecto y una solución se denominan de la misma forma, ya que la solución es un concepto global mientras que un proyecto es específico. Cuando la creación de un proyecto motiva la creación automática de una solución homónima, Visual Studio entiende que la solución se compone de un solo proyecto, a lo que se llama proyecto autónomo (stand-alone project); en este tipo de proyecto no se da mucha relevancia al concepto de solución dentro del entorno integrado de desarrollo. Es indispensable saber qué lenguaje .NET se utilizará para el desarrollo (Project Type); decidido esto, es necesario conocer el tipo de aplicación deseada (Templates). Las plantillas o templates permiten predeterminar los recursos iniciales de la aplicación. Visual Studio preguntará dónde se desea guardar la aplicación (Location) y con qué nombre (Name). Los archivos fuente que usted genere se encontrarán en el directorio que especifique. Se generará un archivo que mantendrá la referencia de todos los archivos involucrados en la solución y tendrá la extensión sln. Es posible que la solución tenga un nombre distinto al del proyecto, por lo que se podrá denominar específicamente (Solution Name).

> Lo nuevo En Visual Studio 2005 la organización es más eficiente, dado que todos los recursos de una solución están en la misma ubicación. La versión 2003 almacenaba los archivos del proyecto en el directorio que nosotros especificábamos, pero colocaba el archivo de solución (SLN) en Mis documentos/Proyectos de Visual Studio, lo que creaba problemas en equipos en donde trabajaban diversos usuarios. Ahora la solución y los proyectos se almacenan en el mismo directorio.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

67

Elementos de sintaxis en Visual Basic Visual Basic es el heredero de la tradicional sintaxis del lenguaje Visual Basic 6.0. Para no comenzar a desarrollar programas sin un conocimiento básico de la sintaxis del lenguaje, enumeramos algunas características esenciales: 1. Visual Basic no es sensible al uso de mayúsculas y minúsculas (non case sensitive). 2. Las líneas de código terminan al encontrarse un salto de línea (CR/LF). 3. El continuador de línea es un guión bajo (_) y no debe interrumpir expresiones; antes de él debe haber un espacio en blanco y después de él no debe escribirse nada. 4. Un bloque de código es el conjunto de líneas que deben ser tratadas como unidad de ejecución. Los bloques de código generalmente se delimitan por estructuras con inicio y fin (Module – End Module, Sub – End Sub, etcétera). 5. Todo bloque de código que se inicie debe cerrarse. 6. El último bloque de código en abrirse debe ser el primero en cerrarse. 7. Las bibliotecas a utilizarse en un programa se declaran al inicio del mismo, utilizando la palabra reservada Imports. 8. Se utilizan paréntesis para delimitar expresiones que deban resolverse, o para delimitar argumentos. 9. Las variables que se utilicen en un programa deben estar definidas de manera explícita. 10. Aunque no es relevante para el compilador, evite la codificación de todo mayúsculas o todo minúsculas. Procure iniciar las palabras reservadas con mayúsculas. Éste es un ejemplo típico de un programa en Visual Basic: 1 2 3 4 5 6 7 8 9 10

Imports System Imports System.Console Module MiPrograma Sub Main() Write(“Pulse INTRO”) ReadLine() WriteLine(“Hola mundo”) End Sub End Module

3

68

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 3.1 Creación de una aplicación de Consola en Visual Basic usando Visual Studio Desarrollará una aplicación de consola, que al presionar INTRO muestre un mensaje “Hola Mundo”.

➤ Creación de una solución en blanco 1. Ejecute Visual Studio. 2. En la barra de menús seleccione File – New (CTRL-MAYÚS-N) para desplegar el cuadro de diálogo New Project.

3. En la sección Project Type seleccione Other Project Types – Visual Studio Solutions, porque trabajará con soluciones de Visual Studio. 4. En la sección Templates seleccione Blank Solution. Al seleccionar el tipo de proyecto, Visual Studio se encargará de generar un contenedor de proyectos que podrá ser compilado para producir una aplicación. 5. En el cuadro de texto Name coloque el nombre de la solución, Ejercicios; en el cuadro de lista Location especifique la ruta en la que se han de almacenar los archivos físicos

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

69

que componen la solución. Escriba la ruta del directorio de trabajo del libro, que es C:\APVBNETVS.

6. Vea cómo la casilla de verificación Create directory for solution está marcada de forma predeterminada. Esto es recomendable para que la solución se organice mejor dentro del medio de almacenamiento. Haga clic en Ok para que se genere la solución llamada Ejercicios. 7. Al aceptar los cambios, se generará un directorio llamado Ejercicios en el directorio de trabajo. En dicho directorio existirá un archivo denominado Ejercicios.sln, que almacenará las referencias a los proyectos que componen la aplicación.

➤ Adición de un proyecto a una solución 8. La herramienta Solution Explorer permite ver todos los elementos que componen una solución; mediante una interfaz de árbol de nodos, es posible ver todos los proyectos y componentes almacenados en archivos físicos que se tienen en una solución. Para disponer de forma visual de Solution Explorer, en la barra de menús seleccione View – Solution Explorer (Ctrl-Alt-L). 9. Aparecerá sólo un nodo, correspondiente a la solución Ejercicios. En el nodo se hace referencia a que actualmente la solución tiene cero proyectos asociados.

10. Seleccione en Solution Explorer el nodo Solution “Ejercicios” y despliegue el menú contextual (haga clic en el botón derecho del ratón). Seleccione la opción Add – New Project. 11. Aparecerá la ventana New Project.

3

70

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. En la sección Project Type seleccione Visual Basic - Windows, porque desarrollará una aplicación de consola utilizando Visual Basic; recuerde que los proyectos de consola se ejecutan utilizando el servicio Windows Application Services, aunque no sean interfaces gráficas; de ahí que se traten como aplicaciones Windows. 13. En la sección Templates seleccione Console Application. Al seleccionar el tipo de proyecto, Visual Studio se encargará de proporcionar de forma automática todos los elementos típicos de una aplicación de consola, incluyendo archivos de código fuente, datos y configuraciones pertinentes. 14. En el cuadro de texto Name coloque el nombre del proyecto, que debe ser HolaMundoCon; en el cuadro de lista Location especifique la ruta en la que se han de almacenar los archivos físicos a desarrollar. Escriba la ruta del directorio de trabajo de la solución, que es C:\APVBNETVS\Ejercicios.

15. Haga clic en Ok, con lo cual se generará dentro del directorio de trabajo de la solución un directorio llamado HolaMundoCon. En dicho directorio se encontrará el archivo de código fuente del programa de Consola (.VB) y el archivo del proyecto (.VBPROJ) que concentrará las referencias de los archivos físicos involucrados en este último. Se generan también directorios de trabajo: en \Bin se colocarán los ensamblados que se generen cuando se realice la compilación del proyecto; en \My Project se almacenarán archivos de configuración y especificaciones útiles para la compilación del proyecto, y en \obj se colocarán archivos temporales involucrados en el proceso de compilación y depuración.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

71

16. Al haber especificado como Template una Console Application, Visual Studio genera de forma automática los archivos y referencias comunes para una aplicación de consola. El componente principal será un programa de código fuente llamado Module1.vb, que es un módulo en Visual Basic. 17. Document Window es el espacio principal de trabajo en Visual Studio, en donde la mayoría de las herramientas se ubicarán en tiempo de diseño. En Document Window aparecerá Text Editor, que es el editor de texto simple donde se podrá modificar el código de Module1.vb. 18. En este momento Solution Explorer debe mostrar todos los elementos físicos que componen la solución, y en Document Window se tendrá a Text Editor modificando el código de Module1.vb.

3

72

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Herramientas de Text Editor 19. Text Editor tiene los siguientes elementos: FIGURA 3.5 Elementos de Text Editor

20. Text Editor es una fascinante herramienta de edición de código, dadas todas las prestaciones que ofrece, como las siguientes: a) Barra de selección de documentos. En la parte superior de Text Editor aparecerá una barra que mostrará las pestañas (Tabs) para seleccionar el documento con el que deseemos trabajar. b) Tabs. Llamadas también pestañas de selección, identifican y permiten seleccionar los documentos abiertos con los que se puede trabajar. A los documentos que se encuentran abiertos y en la barra de selección de documentos, se les llama documentos activos. c) Selector de documentos activos. Dado que se pueden tener tantos documentos activos que se llene la barra de selección de documentos, hacer clic en el Selector de documentos activos (flecha ▼) permite ver los documentos activos en forma de menú para seleccionarlos. d) Cerrado de documentos. Si se desea quitar un documento de los documentos activos, simplemente se debe seleccionar el documento a cerrar y hacer clic en el icono de cerrado de documentos. e) Delimitadores de branching. Es la capacidad de Text Editor de mostrar de forma visible los alcances de los bloques principales de código (branching). Como se puede observar, al inicio de un procedimiento, módulo o clase, en las líneas delimitadoras de branching aparecen símbolos (–) y (+); éstos permiten visualizar y

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

73

ocultar el código delimitado, con lo que podemos hacer más clara la codificación mostrando sólo aquellas partes del código que realmente nos interesa observar. f) Complementación automática de código. Es la capacidad de Text Editor de agregar de forma automática líneas de código que por regla de lenguaje deben escribirse. Esto simplifica el proceso de codificación, además de que evita errores por omisión de código. g) Coloring. Es la capacidad de Text Editor de diferenciar por colores los elementos del código. Generalmente las palabras reservadas estarán en azul, los identificadores y operadores en negro, y los comentarios en verde. Esto es útil sobre todo cuando no estamos seguros de estar escribiendo correctamente las palabras reservadas. Si no aparecen en azul, es porque no están bien escritas. h) Divisores de procedimientos. los procedimientos en el código.

Son las delimitaciones horizontales que separan

i) Divisor de paneles de edición. Si se arrastra el icono Divisor de paneles de edición, podrá dividirse el espacio de edición de Text Editor en mitades. En cada una de ellas podrá desplazarse, ver y editar diferentes partes del código. Esto es especialmente útil en programas muy extensos, donde a veces es necesario comparar porciones de código ubicadas en distintas partes del archivo. j) Selector de elementos. Se trata de un combo que muestra los diferentes módulos y elementos globales de una aplicación. En caso de que el programa posea muchos elementos globales, este combo permite ir directamente a la parte de código que interesa, sin tener que navegar entre las líneas de código para buscar. k) Selector de miembros. Trabaja de la misma forma que Selector de elementos, sólo que a un nivel más bajo. Permite seleccionar un miembro de un elemento global. l) Intellisense. Capacidad a través de la cual Text Editor propone los objetos y miembros más comunes conforme se escribe el código.

➤ Colocación de números de línea en Text Editor 21. Los números de línea son muy útiles para identificar partes del código. Muy probablemente, si se presentan problemas al momento de la compilación o ejecución, Visual Studio referirá el número de línea que presenta problemas. Lo ideal es conocer el número de línea que corresponde a cada parte del código. 22. Si los números de línea no aparecen en su editor de textos, puede desplegarlos de la siguiente manera: en la barra de menús seleccione Tool – Options para desplegar la ven-

3

74

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

tana Options. Seleccione el nodo Text Editor – Basic – General, en la sección Display marque la casilla de verificación Line Numbers y haga clic en Ok.

➤ Intellisense y detección dinámica de errores 23. Dentro del procedimiento Main() introduzca la siguiente línea: Console.WriteLine(“Presione INTRO”)

Esto se deberá escribir en varios tiempos. Primero escriba “Console.”. Al llegar al punto, aparecerá un menú dinámico que propone los elementos del lenguaje que concuerdan con el código que se comenzó a escribir para que el desarrollador complete el enunciado con la ayuda de Visual Studio. Esto simplifica el proceso de codificación y evita errores de sintaxis. A esta funcionalidad se le llama Intellisense. En la parte baja del menú dinámico Intellisense hay dos pestañas: Common y All. Dado que los elementos de un objeto pueden ser muchos, Visual Studio permite ver los más comunes, o bien todos. De manera predeterminada muestra los más comunes, lo cual es muy práctico. De la lista de elementos que aparece, es posible seleccionar con el ratón, con las flechas de dirección o por concordancia con lo escrito. Sólo en caso de que lo que busque no se encuentre en Common, recurra a All.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

75

3 Siga escribiendo hasta “Console.WriteL”. La información que hemos escrito permite una concordancia exacta con un elemento del menú, mismo que se selecciona.

Para ahorrarnos esfuerzo y dado que ya está seleccionado el código que pretendemos escribir, basta con poner el carácter que seguiría, en caso de escribir nosotros el código. En este caso sería un paréntesis “(“ . Escriba un paréntesis derecho y vea cómo Intellisense complementa el código de forma automática, desapareciendo el menú correspondiente.

76

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se recomienda ampliamente el uso de Intellisense, dado que se ha demostrado que reduce en gran medida los errores de sintaxis. Siga escribiendo la línea de código, y vea cómo aparece una ayuda interactiva de llenado de los elementos. En este caso, la ayuda indica que si se escribe “WriteLine()”, lo que obtendríamos sería un terminador de línea. La ayuda interactiva indica 18 formas de utilizar WriteLine, dado el polimorfismo con que el objeto fue programado. Utilizando los iconos ▲▼ de la ayuda interactiva, busque la alternativa 14 de 18, para que vea la forma en que se utiliza WriteLine con un String.

En este punto ya debió haber escrito la línea de ejemplo por completo. 24. Modifique la línea, de tal forma que escriba “Console” con doble “s”, a fin de causar un error. Vea cómo al introducir una línea que presenta errores de sintaxis, Visual Studio le señala la falta al estilo de Microsoft Word, subrayando el error en color azul. Si se colo-

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

77

ca sobre la parte del código que presenta el error, podrá darse cuenta que Visual Studio le informa el mensaje del error que se está provocando. Esto ayuda a reducir el tiempo de desarrollo, dado que no hace falta compilar y probar para saber que algo fallará.

3 25. Corrija la línea para que ya no genere errores.

➤ Modificación de código por medio de Text Editor 26. Como todo programa Hola Mundo, se espera que el usuario interactúe con el programa y que éste despliegue el mensaje “Hola Mundo”. Para hacer esto, nuestro programa enviará un mensaje, esperará el uso del teclado y finalmente desplegará el mensaje “Hola Mundo”. Modifique el procedimiento Main(). El código deberá quedar de la siguiente forma:

Codificación de HolaMundoCon 1 2 3 4 5 6 7 8 9

Module Module1 Sub Main() Console.Write(“Presione INTRO”) Console.ReadLine() Console.WriteLine(“Hola mundo.”) End Sub End Module

27. Realmente usted sólo tuvo que agregar las líneas 4, 5 y 6, que muestran un mensaje, esperan que se oprima una tecla y muestran otro mensaje, respectivamente.

78

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Generación de una solución en Visual Studio 28. Generar una solución consiste en tratar de compilar todos los programas y elementos de todos los proyectos asociados a una solución. Al realizarse la compilación se generan los ensamblados correspondientes a cada uno de los proyectos, quedando listos para su ejecución. 29. Vaya al menú Build – Build Solution (Ctrl-Mayús-B) para generar la solución. 30. En la parte inferior de Visual Studio se abrirá la ventana Output, que es la encargada de mostrar el resultado de los procesos que Visual Studio realiza en el plano subyacente, al ponerse en contacto con las herramientas de línea de comandos de .NET Framework, así como con otros elementos de la plataforma. Si al final de la generación aparece el siguiente mensaje, su programa es correcto, dado que se tuvo éxito en la construcción de un proyecto.

➤ Depuración de una solución 31. En la barra de menús seleccione Debug – Start Debugging (u oprima la tecla F5) para depurar la aplicación. En esta operación se comprueba que el programa esté correcto sintácticamente y al mismo tiempo se ejecuta la aplicación para verificar que no cause problemas en tiempo de ejecución. Para efectos prácticos, depurar es ejecutar en ambiente de desarrollo. 32. Con ello aparecerá la aplicación de consola ejecutando. Al hacer clic se mostrará muy rápidamente el mensaje «Hola Mundo». FIN DEL EJERCICIO *

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

79

Ejercicio 3.2 Creación de una aplicación Windows en Visual Basic con Visual Studio, trabajando varios proyectos en una solución

Desarrollará una aplicación Windows tal que al hacer clic en un botón muestre un mensaje «Hola Mundo». 1. En este ejercicio trabajará con la solución creada en el ejercicio anterior.

➤ Generación de una aplicación Windows 2. En el Solution Explorer seleccione el nodo Ejercicios (Solution “Ejercicios”). 3. Despliegue el menú contextual y seleccione Add – New Project.

4. En Project Types seleccione el nodo Visual Basic - Windows. En Templates seleccione Windows Applications. En Name especifique el nombre del proyecto, que será HolaMundoWin, y se almacenará en el directorio de trabajo de la solución. Haga clic en Ok. 5. En Document Window aparecerá una herramienta llamada Form Designer, que permite el diseño de interfaces de forma gráfica y dinámica. 6. En la barra de menús seleccione View – Toolbox (Ctrl-Alt-X). Aparecerá la herramienta Toolbox, que muestra de forma clasificada los controles gráficos disponibles para una aplicación Windows.

3

80

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7. Los controles son enlaces gráficos que permiten acceder a las clases de .NET Framework para la elaboración de interfaces gráficas; a través de los controles es posible agregar objetos de interacción en una interfaz. Visual Studio se encarga de agregar el código necesario para la integración en los programas. 8. Observe cómo Toolbox no permanece en su lugar por mucho tiempo.

➤ Fijación de una herramienta en el espacio de trabajo 9. Cuando una herramienta de Visual Studio se encuentra en modo de ocultación automática, al no hacer uso de dicha herramienta, ésta se contrae, liberando espacio de trabajo en Document Window. Se dice que una herramienta está en modo fijo cuando permanece en el espacio de trabajo de Document Window independientemente de si se está haciendo uso de ella o no. Hay ocasiones en que preferimos que la ocultación automática no esté disponible, por lo que procedemos a colocar la herramienta en modo fijo. 10. Teniendo visible el Toolbox, haga clic en el Icono de ocultación automática que se encuentra en la esquina superior derecha de la herramienta (barra de título del Toolbox). Después de haber hecho clic en el icono, debe lucir de la siguiente forma.

Modo fijo

Modo ocultación automática

Si el Icono de ocultación automática aparece en modo fijo, hacer clic sobre él pondrá a la herramienta en modo de ocultación automática; si aparece en modo ocultación automática, hacer clic sobre él pondrá a la herramienta en modo fijo. 11. En caso de que Toolbox esté en modo de ocultación automática, cambie su estado a modo fijo. La interfaz deberá quedar de la siguiente manera:

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

81

3

➤ Adición de objetos de interfaz en tiempo de diseño 12. En Form Designer se pueden agregar objetos de interfaz de tres maneras: Modo inserción, haciendo doble clic sobre alguno de los controles; Modo arrastre, arrastrando un control desde el Toolbox hacia el Form Designer, y Modo trazo, haciendo un solo clic sobre un control y trazando en Form Designer el espacio donde el control debe aparecer. 13. En Toolbox aparecen categorías de controles que pueden ser incluidos en una interfaz. Expanda en Toolbox la categoría Common Control, haciendo clic en (+). 14. Haga doble clic sobre el control Button, que se encuentra en Toolbox – Common Control.

15. Arrastre el control Label, que se encuentra en el Toolbox, y colóquelo debajo del botón que acaba de agregar en el punto anterior.

82

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. En los puntos anteriores se agregó un objeto en modo inserción y uno en modo arrastre. 17. Acomódelos de tal forma que queden distribuidos de la siguiente manera (sólo arrástrelos; no haga doble clic sobre ellos):

18. Seleccione el objeto Label1 que se agregó a la interfaz. Para ello, haga un clic sobre él una vez. 19. Cada elemento en la interfaz es un objeto y, en tal carácter, posee propiedades que determinan su apariencia y sus capacidades de comportamiento. La herramienta Properties permite modificar los valores de las propiedades de los objetos. En la barra de menús seleccione View - Properties Windows (u oprima la tecla F4) para ver las propiedades del objeto seleccionado.

20. Como tenía seleccionado el objeto sus propiedades.

Label1,

Visual Studio permite la modificación de

21. En la ventana Propiedades, en el combo superior aparecerá el nombre del objeto que se modificará, así como la clase en la que está basada. Busque la propiedad (Name) y cam-

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

83

bie el nombre Label1 por lblResultado. Presione Intro. El nombre habrá cambiado en el combo superior de la ventana Properties, lo que indica que el cambio ha sido aceptado. 22. Para agregar funcionalidad al programa es necesario especificarle el comportamiento que deseamos tenga como respuesta a la interacción con el usuario. Para ello debemos codificar procedimientos de evento, que son bloques de código que se ejecutarán cuando el usuario o el programa interactúen de cierta manera con la aplicación. 23. Deseamos que al hacer clic en el botón se coloque el texto Hola Mundo en el objeto lblResultado. Para ello debemos codificar el procedimiento que responda al evento Click del botón. 24. Haga doble clic en el botón que agregó a la interfaz. Automáticamente aparece el procedimiento precodificado que se ha de ejecutar al momento de hacer clic (Click) en el botón (Button1) (de ahí que el procedimiento se llame Button1_Click). Vea cómo el editor queda listo para codificar lo que debe suceder cuando se haga clic en el botón en tiempo de ejecución. 25. Dentro del procedimiento deberá agregar una línea que especifique que al hacer clic en el botón, se cambiará la propiedad Text del objeto lblRespuesta a Hola Mundo. El código debe lucir como sigue:

Codificación de HolaMundoWin

➤ Navegación entre documentos de una solución 26. En la parte superior de Document Window aparece la Barra de selección de documentos, en la cual se muestran todos los elementos de la solución abiertos al momento. Cada elemento posee su propia pestaña de selección (o Tab).

27. En este ejemplo aparecen cuatro documentos o herramientas que pueden ser seleccionadas en la Barra de selección de documentos. Cada documento se activa, al hacer clic sobre la pestaña correspondiente, en Document Window, la herramienta utilizada por el documento para su edición. Form1.vb y Module1.vb, por ser código fuente, aparecerán utilizando Text Editor, mientras que Form1.vb [Design] se mostrará usando Form Designer. Por otro lado, Start Page aparecerá como un navegador de páginas Web intrínseco de Visual Studio, dado que es una página Web.

3

84

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

28. Seleccione alternativamente las distintas pestañas y vea el comportamiento de Visual Studio. Si desea cerrar alguno de los documentos abiertos, basta hacer clic en el Tab y posteriormente en la cruz que aparece en el extremo izquierdo de la Barra de selección de documentos.

➤ Cómo guardar documentos en una solución 29. Si el Tab de un documento muestra un asterisco (*), eso indica que el documento posee modificaciones que no han sido guardadas. 30. Guarde todos los cambios. Para ello, en la barra de menús seleccione File – Save All u oprima Ctrl-Mayús-S.

➤ Establecimiento del proyecto de inicio para una solución 31. Cada proyecto tiene un objeto de inicio (startup object) que puede ser una página Web o un programa que permita su ejecución. Al ejecutar el ensamblado generado a partir de un proyecto, el objeto inicial será el objeto a mostrar primero. 32. De la misma forma, cada solución en Visual Studio puede tener uno o más proyectos, pero todas deben tener un proyecto de inicio (startup project). Cuando ejecutemos una solución desde Visual Studio, lo que veremos como resultado será la ejecución del objeto inicial del proyecto seleccionado como proyecto de inicio. 33. Vea la ventana del Solution Explorer. En la solución Ejercicios hay dos proyectos registrados: el programa de consola del ejercicio anterior (HolaMundoCon) y el proyecto Windows que estamos trabajando (HolaMundoWin). Si observa bien, el proyecto HolaMundoCon aparece en negritas, lo que indica que es el proyecto de inicio de la solución. Si depura (oprimiendo la tecla F5) se ejecutará la aplicación de consola, y no la de Windows que estamos trabajando.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

85

34. Para hacer que nuestro nuevo proyecto de aplicación Windows sea el proyecto de inicio, seleccione el nodo HolaMundoWin en el Solution Explorer. Invoque el menú de contexto y seleccione Set as StartUp Project. De esa forma el proyecto de Windows será nuestro proyecto de inicio. 35. En nuestro caso, como la aplicación Windows contiene sólo un formulario Windows, establecer nuestro proyecto como proyecto de inicio provoca que el único formulario sea el objeto de inicio. Si nuestra aplicación tuviera más de un formulario Windows sería necesario especificar cuál de ellos es el objeto de inicio. 36. Un objeto de inicio es el elemento de un proyecto que será el primero en mostrarse en la interfaz.

3

37. Generar una solución permite que los elementos de todos los proyectos de una solución sean compilados, generando los ensamblados correspondientes. En este caso, generar la solución implicaría la compilación de los dos proyectos que hemos desarrollado. 38. Guarde la solución y genérela, para comprobar que no haya problemas con el trabajo realizado. Si aparece el siguiente resultado es que todo fue bien (vea cómo se han construido dos ensamblados (EXE) uno por cada proyecto de la solución):

86

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

39. Si no hubo problemas, depure la aplicación (tecla F5). Se depurará el proyecto de inicio; es decir, la aplicación Windows. 40. Al aparecer la interfaz en tiempo de ejecución, haga clic en el botón, y vea cómo el texto de la etiqueta cambia. En ese caso, la aplicación funcionó adecuadamente. 41. Guarde su aplicación y ciérrela. FIN DEL EJERCICIO*

Ejercicio 3.3 Creación de una aplicación Web en Visual Basic con Visual Studio, trabajando varios proyectos en una solución Desarrollará una aplicación Web tal que, al hacer clic en un botón, muestre el mensaje “Hola Mundo”.

➤ Creación de un directorio virtual para un sitio Web 1. Una aplicación ASP.NET funciona con base en la colaboración de .NET Framework e Internet Information Server. Si creamos una aplicación ASP.NET, Visual Studio intentará almacenarla como un sitio dependiente del sitio Web predeterminado; es decir, http://localhost/, que equivale a crear un directorio en la ruta C:\inetpub\wwwroot y darle permisos de ejecución Web. 2. No siempre deseamos que nuestro sitio se almacene físicamente en C:\inetpub\ wwwroot, por lo que es necesario especificar que un directorio cualquiera actúe como sitio Web (a lo que se llama directorio virtual). Aunque el directorio no se encuentre en C:\inetpub\wwwroot, virtualmente si lo estará. 3. Genere en el directorio de trabajo (C:\APVBNETVS) un directorio que se llame HolaMundoWeb. Ese será el directorio de trabajo de la aplicación Web que creará. 4. Seleccione Inicio – Panel de control – Herramientas administrativas – Servicios de Internet Information Server.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

87

5. Expanda el árbol Servicios de Internet Information Server hasta que localice el nodo Sitio Web Predeterminado. 6. Estando en ese nodo, despliegue el menú contextual y seleccione la opción de menú Nuevo – Directorio virtual….

3

7. Aparecerá el Asistente para crear un directorio virtual. Haga clic en Siguiente en la pantalla inicial. Cuando el asistente pregunte por el alias de su sitio, escriba APVBNETVS y haga clic en Siguiente. 8. Como directorio de contenido del sitio Web, seleccione o escriba la ruta del directorio que acaba de crear (C:\APVBNETVS\HolaMundoWeb) y haga clic en Siguiente. 9. Deje los permisos tal como están. Haga clic en Siguiente y luego en Finalizar. 10. Se habrá creado un sitio llamado APVBNETVS. 11. Ubique el nodo APVBNETVS en el árbol de servicios de Servicios de Internet Information Server y selecciónelo. En el panel de la derecha podrá observar que no hay elementos disponibles en dicho sitio. Cierre el programa Servicios de Internet Information Server.

88

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Creación de una aplicación Web ASP.NET 12. En el Solution Explorer seleccione el nodo de la solución Ejercicios y en el menú contextual seleccione Add – New Web Site. Aparecerá la ventana Add New Web Site.

13. En Templates seleccione ASP.NET Web Site. En Location haga clic en el botón Browse; se desplegará la ventana Choose Location, que permite seleccionar una ruta física del sistema operativo (si está codificando en \InetPub\wwwroot) o un directorio virtual. 14. Seleccione en el panel derecho el origen Local IIS para indicar que el desarrollo se trabajará en un directorio virtual dentro de la máquina. Al seleccionar Local IIS, aparecerán en organización de árbol de nodos todos los sitios registrados. Seleccione su sitio APVBNETVS. Haga clic en Open para aceptar.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

89

3

15. Se generará el sitio Web ASP.NET. La página principal sobre la que se estará trabajando es Default.aspx; las páginas pueden trabajarse en modo de diseño (Design) y en modo codificación (Source). La forma de alternar entre uno y otro modo es seleccionando las pestañas que aparecen en la parte inferior de Document Window. Al estar en Design, se puede utilizar Toolbox para integrar objetos en la interfaz. En modo Source es necesario agregar las etiquetas en el lugar indicado.

90

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. Cambie a modo de diseño (Design) y utilizando Toolbox (CTRL-ALT-X), agregue un Button y un Label. 17. Seleccione el objeto Label1 y asigne en la propiedad Name, el mismo nombre que asignó en Windows: lblResultado. 18. Haga doble clic en el botón que agregó a la interfaz. Aparecerá el procedimiento de evento que se ejecutará al momento de hacer clic en el botón. Codifique lo siguiente en el procedimiento Button1_Click:

Codificación de HolaMundoWeb

19. Seleccione el nodo http://localhost/APVBNETVS en el Solution Explorer y establézcalo como proyecto de inicio.

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

91

20. Vuelva a generar la solución (Ctrl-Mayús-B) y, si no hay problemas en la generación, depure la aplicación (tecla F5). Debe funcionar igual que la aplicación Windows: al hacer clic en el botón, el mensaje de la etiqueta debe cambiar. 21. En este ejercicio comprobamos que el desarrollo Windows y Web realizado desde Visual Studio es prácticamente idéntico. 22. Finalmente nuestro proyecto quedaría como sigue.

3

23. En cualquier momento puede llamar a edición cualquier elemento de la solución. Dependiendo del tipo de archivo que se trate, Visual Studio invocará Text Editor, Form Designer, Web Form Designer o lo que sea pertinente. 24. En Solution Explorer haga doble clic en el nodo HolaMundoCon – Module1.vb, luego haga doble clic en HolaMundoWin – Form1.vb; haga clic en http://localhost/ APVBNETVS/ - Default.aspx, y finalmente haga clic en http://localhost/APVBNETVS/ - Default.aspx – Default.aspx.vb. Vea cómo se comporta Visual Studio. 25. Guarde su aplicación y ciérrela. FIN DEL EJERCICIO*

92

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 3. Técnicas de desarrollo con Visual Studio 2005

93

TERMINOLOGÍA Barra de selección de documentos, 72, 83 Bloque de código, 67 Categorías de controles, 81 Desarrollos colaborativos, 63 Directorio virtual, 86

Document Window, 71 Guión bajo (_), 67 Intellisense, 74 Internet Information Server, 86 Modo fijo, 80 Módulo de ocultación automática, 80 Objeto de inicio, 84

Pestaña de selección, 83 Project Type, 66, 68, 70 Properties, 82 Proyectos, 61 Selector de documentos activos, 72 de elementos, 73 de miembros, 73 sln, 66

Solución(es), 61 Solution Explorer, 69 Start Page, 65 Startup object, 84 Tab, 83 Tabs, 72 Templates, 66, 68, 70 Text Editor, 71-2 Toolbox, 79

PREGUNTAS 3.1 ¿Cuáles son las recomendaciones generales de organización de soluciones y proyectos en Visual Studio? 3.2 ¿Cuáles son los elementos básicos de sintaxis del lenguaje Visual Basic? 3.3 ¿Cuáles son las principales diferencias entre los proyectos de Consola, Windows y Web? 3.4 ¿Para qué sirve Solution Explorer? 3.5 ¿Para qué sirve Toolbox? 3.6 ¿Cuáles son las principales características de Text Editor?

3

94

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es el nivel más alto de organización de trabajo en Visual Studio: a) Proyecto b) Solución c) Ensamblado 2. Son colecciones de archivos fuente que producen un ensamblado al momento de ser compilados: a) Proyecto b) Solución c) Paquete 3.

Herramienta que nos permite ver los elementos que componen una solución, en forma de árbol de nodos: a) Solution Explorer b) Solution Viewer c) Start Page

4. Es la capacidad de Text Editor para proponer objetos y miembros, al momento de editar el código: a) Intellisense b) Coloring c) Tooltip interactive 5. Consiste en tratar de compilar todos los programas y elementos asociados a un proyecto o solución para la generación de ensamblados. a) Build b) Compile c) Debug Parte 2: Coloque en la línea la letra «F» si el enunciado es falso, y «V» si es verdadero. 6.

Visual Basic es sensible al uso de mayúsculas y minúsculas.

7.

Text Editor y Document Window son, en esencia, lo mismo.

8.

La ocultación automática está disponible sólo en Text Editor y Toolbox.

9.

Para probar la aplicación Web es necesario tener instalado y funcionando IIS.

10.

Las plantillas (templates) permiten predefinir recursos disponibles durante la creación de una aplicación.

Capítulos: 4 Variables, arreglos y tipos de datos 5 Espacios de nombres y desarrollo de librerías 6 Manejo de operadores 7 Estructuras de decisión y control 8 Manejo estructurado de excepciones

Herramientas de Visual Studio revisadas: 1. 2. 3. 4. 5. 6. 7. 8.

Debug / Breakpoints Command Window Autos / Locals / Watch Immediate Window Comment / Uncomment Clipboard Ring Task List Error List

Parte 2 Fundamentos de programación en Visual Basic En esta parte del libro se analizan los fundamentos de la programación en lenguaje Visual Basic. Utilizando al máximo las herramientas de Visual Studio 2005, se estudia el manejo de las variables de memoria, así como las estructuras de decisión y control desde las cuales se realizará el consumo de las clases de la biblioteca de .NET Framework (BCL). Finalmente, aprenderá a implementar esquemas de manejo estructurado de excepciones con el fin de controlar, mediante programación, las acciones procedentes en caso de que se tengan problemas en tiempo de ejecución. Nuestra reflexión es la siguiente: la discusión si Java es mejor que .NET es irrelevante. Lo importante no es el lenguaje de programación que escogemos para trabajar, sino lo que podemos hacer con el lenguaje. Un excelente lenguaje en manos de alguien que no tiene nada que decir es una herramienta mal aprovechada. Preocúpese por tener un objetivo valioso a alcanzar, y luego emplee representaciones abstractas de datos e instrucciones precisas para desarrollar programas que cumplan de forma óptima con el objetivo planteado.

4

CAPÍTULO

4

Variables, arreglos y tipos de datos Objetivos: Conocer las generalidades del manejo de variables y arreglos, así como la definición de sus características especiales. 1. Conocerá las variables de memoria y su funcionamiento en .NET. 2. Aprenderá a declarar las variables de memoria. 3. Se familiarizará con el comportamiento y las características de las variables de memoria. 4. Conocerá los tipos de datos admitidos por .NET y la forma en que se realizan conversiones. 5. Entenderá el alcance de las variables de memoria dentro de un programa. 6. Comprenderá qué son los arreglos, cuáles son sus tipos y la forma de definirlos. 7. Aprenderá a implementar esquemas Strong Typing.

97

98

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de datos en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión implícita (Casting) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión explícita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conversión por método . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceso a datos Value type y Reference type . . . . . . . . . . . . . . . . . . . . . . . . . Capacidades de los tipos valor y referencia . . . . . . . . . . . . . . . . . . . . . Naturaleza de tipo de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ByVal y ByRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strong Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Option Explicit [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Option Strict [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demostración del alcance de las variables y la forma en que preservan valores (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo elemental de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Declaración de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valores por omisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Demostración de la declaración de variables y constantes, y la realización de conversiones . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Construcción de un solo proyecto . . . . . . . . . . . . . . . . . . Origen de las variables: clases y estructuras . . . . . . . . . . . . . . . . . . . . . Alcance de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accesibilidad de las variables (accesibility) . . . . . . . . . . . . . . . . . . . . . . Demostración del alcance de las variables y la forma en que preservan valores (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos unidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arreglos escalonados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobación del uso de arreglos unidimensionales, multidimensionales y escalonados . . . . . . . . . . . . . . . . . . . . . . . Estructuras y enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99 100 102 105 106 106 107 107 107 108 108 109 109 109 110 112 112 113 113 114 114 115 117 118 119 120 121 125 126 127 128 129 133 133 134 135 136 136 138

Capítulo 4. Variables, arreglos y tipos de datos

99

El mundo de la computación es, en última instancia, un mundo de datos. Los principales objetivos de toda aplicación son procesar datos para transformarlos en información, hacerlos llegar en la cantidad y la forma precisas a las personas indicadas (y autorizadas), y almacenarlos de manera eficiente. No es asunto menor entender los datos y la forma en que se comportan. Una ineficiente selección de la forma en que se manejan los datos puede acarrear errores y mal desempeño de la aplicación. Es importante recordar también que los lenguajes de programación son estructuras simbólicas que permiten hacer uso de los dispositivos y recursos de una computadora. Uno de los componentes más importantes de una computadora es la memoria de acceso aleatorio (RAM/Random Access Memory). La RAM es indispensable para una computadora debido a que los programas y datos deben residir en ella para que puedan ser tomados de ahí por el procesador; nada puede ser procesado por una computadora si no está antes en la memoria. Dicho de otra manera, el procesador no habla con nadie más que con la RAM. Ahora bien, la memoria se encuentra seccionada en posiciones de memoria, cada una de las cuales tiene un identificador interno (que a veces nos es revelado en forma de número hexadecimal cuando Windows causa un volcado de memoria). La memoria puede ser utilizada por el sistema operativo para que todos los programas funcionen; ¿puede un programador disponer de posiciones de memoria? Por supuesto que sí: a través de las variables de memoria. El presente capítulo analiza la forma en que es necesario codificar el almacenamiento de valores en memoria en Visual Basic, de forma que los procesos puedan utilizarla eficientemente.

Variables Una variable de memoria es la referencia lógica a una posición física de memoria RAM. Por medio de las variables es posible almacenar valores en la memoria, asignarles un nombre determinado y disponer del valor almacenado cuando se requiera. Estos valores almacenados estarán disponibles en tanto que no liberemos la memoria, ya sea por medio de programación o como resultado de haber cerrado la sesión de programa donde fueron definidos. Por supuesto, apagar la máquina produce el cierre de todos los programas y, por tanto, la pérdida de los valores almacenados en las variables.

4

100

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las variables tienen siempre las siguientes características: ❑ Identificador (identifier). Es el atributo que permite distinguir a una variable de otra. ❑ Tipo de dato (datatype). Es el tipo de valor que podrá almacenar la variable; determi-

na el tratamiento interno que tendrá el valor y la cantidad en bytes que consumirá en memoria, entre otras cosas. ❑ Alcance (scope). Es el atributo que define el código dentro de un programa en que una

variable puede ser utilizada sin utilizar calificador; es el estado de existencia y la persistencia del valor de la variable en tiempo de ejecución. ❑ Accesibilidad (accessibility). Es el permiso que se proporciona al código para leer la

variable o escribir en ella. ❑ Tiempo de vida (lifetime). Es el periodo de ejecución en el cual la variable está dis-

ponible. FIGURA 4.1 Disposición de memoria en .NET

Identificadores Se le llama identificador (identifier) al nombre lógico de un elemento de programación por medio del cual puede ser referido. Las variables, al igual que los procedimientos, las clases, las estructuras y otros elementos poseen un identificador; a través de él, dichos elementos son utilizables de manera programática. Reglas de composición de los identificadores. con las siguientes reglas:

Los identificadores deben cumplir

Capítulo 4. Variables, arreglos y tipos de datos

101

❑ Deben iniciar con un carácter alfabético o guión bajo ( _ ). ❑ Pueden contener sólo caracteres alfabéticos, dígitos decimales o guiones bajos. ❑ Si se inician con un guión bajo, deben contener al menos un dígito decimal o un carác-

ter alfabético. ❑ No pueden contener espacios intermedios.

Reglas no escritas de composición de los identificadores. Existen otras reglas no forzosas, pero que le pueden ser de mucha ayuda: ❑ Se sugiere que un identificador sea ilustrativo; es decir, debe indicar claramente su con-

tenido. Por ejemplo, si una de sus variables sirve para almacenar en memoria la edad de una persona, su variable puede llamarse Edad o X; sin embargo, Edad es un nombre más útil, pues proporciona una mejor idea del valor que contiene, mientras que X puede ser cualquier cosa. ❑ Dado que una variable puede ser utilizada repetidamente dentro de un programa, es

más práctico emplear nombres cortos. Entre Nombre y NombreDelClienteQueAdquiere lo más recomendable es emplear la primera opción.

Producto

❑ Use el guión bajo sólo si es necesario hacerlo. Recuerde que el guión bajo es el conti-

nuador de línea del lenguaje y puede crearse confusión innecesaria. Prefiera Mensuales a Ventas_Mensuales.

Ventas

❑ Se recomienda el manejo de mayúscula al principio del nombre y al inicio de cada una

las palabras que compongan el identificador (Pascal casing), con el fin de aumentar la legibilidad. VentasMensuales es recomendable; ventasmensuales no. ❑ Evite en lo posible el uso de conjunciones. Use VentasMensuales, no VentasDelMes. ❑ Evite el uso de abreviaturas. Use VentasMensuales, no VtsM.

En lo que respecta al uso de mayúsculas, minúsculas y prefijos para la denominación de variables en Visual Basic, se consideran algunos estilos que constituyen convencionalismos internacionalmente reconocidos. Aunque Visual Basic permite formar los identificadores como le plazca, es mejor seguir las reglas que todos los desarrolladores del mundo parecen estar siguiendo. Pascal casing. El estilo Pascal casing consiste en usar mayúscula al principio del nombre y al inicio de cada una las palabras que compongan el identificador. Éste es el estilo más utilizado en Visual Basic; por ejemplo, VentasMensuales.

4

102

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se recomienda este estilo al denominar: ❑ Clases ❑ Enumeraciones (constantes predefinidas del lenguaje) ❑ Eventos ❑ Interfaces ❑ Espacios de nombres ❑ Métodos y propiedades

Camel casing. El estilo Camel casing se caracteriza por colocar en mayúscula la primera letra de cada palabra de un identificador, excepto la primera. Por ejemplo, ventas Mensuales. Este estilo está muy difundido entre los programadores de C# o Java. Se recomienda utilizar este estilo: ❑ Al denominar parámetros; si el parámetro se compone de una sola palabra, toda la pa-

labra va en minúscula. ❑ En elementos de alcance privado, como campos y variables.

Notación húngara (Hungarian notation). La Notación húngara se caracteriza por colocar un prefijo a las variables para indicar su tipo o función. A decir de Microsoft, este estilo está cayendo en desuso, por lo cual sugerimos evitarlo. Por ejemplo, intVentasMensuales, da a entender que se trata de un dato Integer. NOTA Evitar la notación húngara es la recomendación de Microsoft. En realidad, la notación húngara sigue siendo utilizada mucho por la comunidad de desarrollo, e incluso en el sitio de Microsoft encontramos muchos ejemplos con dicha notación. Utilizar la notación húngara será a fin de cuentas una decisión del equipo de desarrollo, y no afecta la funcionalidad de las aplicaciones.

Este apartado presenta recomendaciones que puede o no seguir. En cualquier caso, lo importante no es el estilo que elija usar, sino que todos los miembros de un equipo de desarrollo lo compartan y utilicen de manera consistente.

Tipos de datos en Visual Basic Las variables pueden almacenar cualquier tipo de valor, desde una secuencia de caracteres hasta un número o una fecha. Dependiendo del tipo, será posible hacer tal o cual cosa con

Capítulo 4. Variables, arreglos y tipos de datos

103

el contenido de la variable. Esto implica la necesidad de definir qué tipo de valor almacenará la variable para saber qué es posible hacer con ella. Además de determinar el tratamiento interno del valor, el tipo de dato (datatype) define la cantidad en bytes que consumirá en memoria y las operaciones que se podrán realizar con el mismo. Se conoce como dominio el conjunto de valores válidos para un dato. Por ejemplo, el dominio de un dato que almacenará un número de mes, consiste en los números enteros del 1 al 12. Cuando el dominio está relacionado con el tipo de dato, se le llama dominio de tipo; por ejemplo, en el caso del tipo de dato Byte, el dominio será de números enteros del 0 al 255. Todo en Visual Basic es un objeto, y todo objeto tiene un determinado tipo, lo que se conoce como type. Se tienen dos clases de types en el lenguaje: ❒ Types que forman parte del lenguaje, llamados types intrínsecos. ❒ Types de usuario, llamados también user-defined types, que son clases, estructuras, in-

terfaces y otros elementos que no forman parte de .NET Framework. Cada type tiene un nombre, que es el identificador a través del cual se invoca la funcionalidad desde el código fuente en un determinado lenguaje. El nombre del type puede ser más corto en un lenguaje que en .NET Framework. Por ejemplo, para Visual Basic la referencia Integer es equivalente a referir el type System.Int32 de .NET Framework, que es más complejo. Todos los lenguajes tienen acceso a la misma biblioteca de clases, lo que varía la implementación que cada lenguaje requiere para llegar a System.Int32 (Visual Basic, Integer; C#, int; C++, int o long; JScript, int). Además de nombre, los types también poseen un tamaño, que representa su el consumo en bytes. Esto es importante dado que la memoria RAM es siempre limitada. Los types intrínsecos pueden ser clases, estructuras e interfaces preconstruidas en .NET Framework, que ayudan a estandarizar el manejo de valores de datos o a producir comportamientos. En ese sentido, Integer es un type que representa un valor, mientras que WriteLine es un type, en el sentido de que es un método de una clase de BCL que no debe ser instanciada para funcionar.

4

104

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Visual Basic acepta los siguientes tipos de datos intrínsecos: Tipo de dato

Estructura o Clase.NET Framework a la que se hace referencia

Consumo en bytes

Rango de valores (dominio de tipo)

Boolean

System.Boolean (estructura)

1 byte

True o False

Byte

System.Byte (estructura)

1 byte

De 0 a 255 (sin signo)

Char

System.Char (estructura)

2 bytes

Caracteres UNICODE

Date

System.DateTime (estructura)

8 bytes

De enero 1, 0001 a diciembre 31, 9999

Decimal

System.Decimal (estructura)

12 bytes

a) +/-79,228,162,514,264,337, 593,543,950,335 sin punto decimal; b) +/-7.9228162514264337593543950335 con 28 posiciones después del punto decimal; c) el mayor número menor a cero representable es: +/-0.0000000000000000000000000001

Double

System.Double (estructura)

8 bytes

a) -1.79769313486231E+308 a -4.94065645841247E-324 para valores negativos; b) 4.94065645841247E-324 a 1.79769313486231E+308 para valores positivos

Integer

System.Int32 (estructura)

4 bytes

De -2,147,483,648 a 2,147,483,647

Long

System.Int64 (estructura)

8 bytes

De -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

Short

System.Int16 (estructura)

2 bytes

De -32,768 a 32,767

Single

System.Single (estructura)

4 bytes

a) -3.402823E+38 a -1.401298E-45 para números negativos; b) 1.401298E-45 a 3.402823E+38 para valores positivos

String

System.String (clase)

Depende de la plataforma

De 0 a aproximadamente dos mil millones de caracteres Unicode

Se consideran tipos de dato numérico los siguientes: Byte, Double, Integer, Long, Short y Single. Se consideran tipos de dato no numérico los siguientes: Boolean, Date, Decimal, Object y String. Aunque Decimal almacena números, el manejo que hace del punto flotante complica su manejo; Object, por su parte, puede asumir cualquier valor.

Capítulo 4. Variables, arreglos y tipos de datos

105

Algunas recomendaciones pertinentes con respecto a la definición de tipos de datos son las siguientes: ❑ Determine cuidadosamente el tipo de dato más adecuado para una variable, de forma que

las operaciones a realizar con los valores no produzcan conflictos de tipos. Si, por ejemplo, va a realizar operaciones de alta precisión, el tipo de datos Integer no le servirá. ❑ Utilice el tipo de datos que consuma sólo la cantidad de memoria necesaria. Si va a al-

macenar la edad de una persona, escoja Byte porque consume menos memoria que, por ejemplo, Integer. ❑ Use, en lo posible, tipos de datos numéricos, pues son los que más eficientemente ma-

neja la computadora. ❑ En términos de tiempo de procesamiento, el tipo de dato más eficiente, indiscutiblemen-

te, es Integer, mientras que el menos eficiente es Object. ❑ Visual Basic puede realizar lo que se llama conversión de tipo cast; es decir, una con-

versión de tipos de datos en tiempo de ejecución entre tipos de datos compatibles. Es preferible que usted mismo haga las conversiones; aunque es más cómodo dejar que el lenguaje lo haga, usted pierde el control de su programa y, en caso de que se presenten problemas, será más difícil determinar en dónde se encuentran. ❑ Sea previsor y actúe en concordancia con respecto a las posibilidades de que un dato, y

especialmente uno de tipo numérico, pueda exceder los dominios de tipo al ser manipulado. Considere el siguiente ejemplo: un programador elige un tipo Integer partiendo del razonamiento matemático de que la suma de dos números enteros siempre es un número entero. Sin embargo, si se suma 2,000,000,000 más 2,000,000,000, el resultado excederá el límite del dominio de tipo. En este caso, el programador debió haber elegido Long, el tipo de dato en que puede convertirse la suma de dos Integer. En ocasiones los problemas originados por esta situación (numeric overflow), se presentan después de haber utilizado la aplicación durante mucho tiempo.

Conversión de datos En muchas ocasiones requerirá realizar conversiones de tipos de datos, y principalmente del tipo String a otros. Se conoce como conversión de datos a cambiar el tipo de dato de un valor por otro. Existen tres formas de conversión de datos en Visual Basic.

4

106

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Conversión implícita (Casting) La conversión implícita, conocida como casting, se da cuando el CLR realiza la conversión en tiempo de ejecución sin que el programa lo especifique. Este tipo de conversión es común en los tipos de datos numéricos. Hay un fenómeno que se conoce como narrowing, cuando la conversión se realiza de un tipo con mayor dominio a uno de menor dominio (Integer a Byte, por ejemplo); por otro lado, se conoce como widening cuando la conversión se realiza de un tipo de menor dominio a uno de mayor dominio (Byte a Integer, por ejemplo). En el caso de narrowing, hay que prestar mucha atención en no proporcionar datos que excedan el dominio de tipo; por ejemplo, tratar de pasar 100000I (Integer) a 100000S (Short), dado que los datos pueden truncarse, e incluso provocar excepciones.

Conversión explícita La conversión explícita consiste en aplicar funciones específicas mediante código para realizar la conversión. Se utiliza principalmente para convertir tipos String/Char a otros. La conversión explícita puede hacerse mediante funciones específicas y funciones genéricas. Las principales funciones específicas utilizadas son las siguientes: Función

Consecuencia

CBool(Expresión)

Convierte Expresión a Boolean.

CByte(Expresión)

Convierte Expresión a Byte.

CChar(Expresión)

Convierte Expresión a Char.

CDate(Expresión)

Convierte Expresión a Date.

CDbl(Expresión)

Convierte Expresión a Double.

CDec(Expresión)

Convierte Expresión a Decimal.

CInt(Expresión)

Convierte Expresión a Integer.

CLng(Expresión)

Convierte Expresión a Long.

CObj(Expresión)

Convierte Expresión a Object.

CShort(Expresión)

Convierte Expresión a Short.

CStr(Expresión)

Convierte Expresión a String.

La principal función de conversión genérica es CType, cuya sintaxis es la siguiente: CType(Expresión,

NombreTipoDato)

Donde Expresión es la expresión a convertir, y NombreTipoDato es el nombre del tipo de dato al que se desea convertir la expresión. Por ejemplo: CType(“4”, Integer)

Capítulo 4. Variables, arreglos y tipos de datos

107

Conversión por método Algunos tipos de datos, por ejemplo la mayoría de los numéricos, tienen implícito un método que permite hacer una conversión. El más común de éstos es ToString, que permite convertir a la representación String un valor dado. Por ejemplo: Dim Edad As Integer = 30 Dim EdadTexto As String = Edad.ToString()

En este caso, se declara una variable llamada Edad, de tipo Integer, a la cual se le asigna el valor 30. Después se declara una variable llamada EdadTexto que tomará la representación String de la variable Edad; es decir, “30”.

Acceso a datos Value type y Reference type Datos de referencia y datos de valor

Visual Basic, como todo lenguaje de programación, permite el uso de la memoria de la máquina a través de las variables. Es posible acceder a los datos almacenados en las variables mediante dos tipos de acceso: tipos de valor (value type) y tipos de referencia (reference type). Dependiendo de la forma en que se tenga acceso a los valores almacenados, el consumo de memoria puede variar.

Capacidades de los tipos valor y referencia Dependiendo del tipo de acceso a los datos, las capacidades de almacenamiento y economía difieren. Con los tipos de valor (value type): ❑ Las variables almacenan un dato de un tipo determinado. ❑ Cada variable tiene su propio alojamiento en memoria. ❑ Cada variable contiene su propia copia del dato. ❑ Las operaciones realizadas con una variable no afectan a ninguna otra. ❑ La asignación de valor a una variable crea una copia de datos (no se sustituye el valor

anterior). Con el tipo referencia (reference type): ❑ Las variables hacen referencia a un objeto (es decir, emanan de una clase).

4

108

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ Las variables mantienen una referencia apuntando a la posición en memoria en donde

se encuentran los datos. ❑ Las variables son intermediarias entre un programa y la memoria.

Naturaleza de los tipos de datos Los tipos de datos tienen una naturaleza intrínseca en relación con un tipo de acceso. Son value type: ❑ Todos los tipos de datos que almacenan números: Byte, Decimal, Double, Integer, Long, Short, Single.

❑ Los tipos de datos Boolean, Char y Date. ❑ Todas las estructuras, incluyendo aquellas que se conforman de elementos reference type.

Son reference type: ❑ El tipo de dato String. ❑ Todos los arreglos de memoria (arrays), aun cuando sus elementos sean value type. ❑ Lo que sea instancia de una clase.

ByVal y ByRef Cuando los datos son pasados como argumentos a funciones y procedimientos, es posible especificar el tipo de acceso que se desea tener. Para ello eso se utilizan las palabras reservadas ByVal y ByRef. Si se utiliza ByVal, se le está especificando al procedimiento o función que utilice su propia versión del dato y que mantenga intacto su el valor original. Si se utiliza ByRef, se le está especificando al procedimiento o función que utilice la misma posición de memoria que el dato original, por lo que las modificaciones realizadas al argumento afectan a ese dato. Es importante considerar que el uso de naturaleza del dato no se imponga.

ByVal

y

ByRef

es respetado siempre y cuando la

Cuando sus procedimientos o funciones sean de uso genérico para varios objetos o datos, se recomienda ampliamente utilizar ByVal, a fin de que se realicen operaciones de la manera más segura posible.

Capítulo 4. Variables, arreglos y tipos de datos

109

Strong Typing Antes de Visual Basic, el lenguaje había sido muy permisivo con los programadores; obviaba muchas cosas y les permitía no ser formales con la técnica, lo que a largo plazo siempre causaba problemas. Si no se declaraban las variables, si no se especificaban los tipos de datos o si no se planeaban las conversiones, Visual Basic lo hacía de manera automática. Eso provocaba que los errores de fondo fueran difíciles de encontrar, ya que el universo de cosas que podían estar equivocadas excedía nuestro conocimiento dado que no todo estaba bajo nuestro control. Resultaba patético pasar horas revisando un programa en busca de un error de lógica o algoritmo, para descubrir finalmente que el verdadero problema era “un error de dedo” que Visual Basic había “arreglado” por nosotros sin que nos diéramos cuenta. Para evitar esas penosas situaciones, existen dos estatutos que se agregan antes de cualquier cosa en el código y que aseguran que la codificación siga una técnica formal, de tipo strong typing; es decir, donde todos los datos están asociados de manera explícita y no ambigua a un tipo determinado.

Option Explicit [On/Off] La instrucción Option Explicit, cuando está activada (On), obliga al programador a declarar todas las variables que utilice en el programa. Si se intenta emplear una variable no declarada, se produce un error. Option Explicit permite generar programas de tipo de datos asegurados (type safe), en el sentido de que todas las variables deben declararse a partir de tipos de datos reconocidos.

Option Strict [On/Off] La instrucción Option Strict, cuando está activado (On), obliga a que las conversiones de datos se realicen de manera explícita. En tal caso, las conversiones implícitas (casting) no están disponibles ni para las conversiones amplias. Option Strict permite generar programas de tipo de datos reforzados (strong type), en el sentido de que todas las conversiones deben ser explícitas. Si usted especifica Option Explicit y Option Strict es muy probable que su código sea bastante formal, y no se encontrará con errores extraños en tiempo de ejecución. El valor predeterminado de Option Explicit y Option Strict es Off. Una excelente práctica de desarrollo es hacer que sus programas sean Strong type, con eso reducirá el porcentaje de errores que pudieron evitarse con un poco de formalidad al declarar y utilizar variables.

4

110

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 4.1 Demostración del alcance de las variables y la forma en que preservan valores (I)

En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado ValRef. 3. Edite el programa de tal forma que aparezca como sigue:

Codificación de ValRef-Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Option Explicit On Option Strict On Module Module1 Sub Main() Dim Texto As String = “Texto Original” Console.WriteLine(Texto) Valor(Texto) Console.WriteLine(Texto) Referencia(Texto) Console.WriteLine(Texto) Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub Sub Valor(ByVal Texto As String) Texto = “Texto Valor” Console.WriteLine(“”) End Sub Sub Referencia(ByRef Texto As String) Texto = “Texto Referencia” Console.WriteLine(“”) End Sub End Module

Capítulo 4. Variables, arreglos y tipos de datos

Ejecución guiada de

111

ValRef – Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (Oprima F5). 5. Este programa es type safe, dado que todas las variables deberán declararse antes de ser utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explícita (Option Strict). 6. El programa declara una variable de memoria, llamada Texto, que se verá sometida a modificaciones en su contenido (línea 7); de inicio, se le asigna un valor de Texto original, mismo que es mostrado en la consola (línea 8). La variable será proporcionada como argumento a dos procedimientos, uno de los cuales tratará el dato como valor (líneas 17 a la 20), y otro como referencia (líneas 22 a la 25). 7. Uso del dato como tipo valor. En la línea 9 se proporciona la variable como argumento de un procedimiento llamado Valor; dicho procedimiento recibe el valor y le da tratamiento como tipo valor. En la línea 18 se modifica el valor de Texto, por Texto Valor, y se muestran los efectos del cambio en la línea 19. Después de ejecutar Valor(), se muestra el contenido de la variable Texto (línea 10); es posible observar que, aunque se modificó el valor de la variable en el procedimiento, el valor original no se modificó en lo absoluto. Esto se debe a que el dato fue manejado como tipo valor, lo que provoca que el argumento genere su propia copia del dato, dejando al dato original intacto. 8. Uso del dato como tipo referencia. En la línea 11 se proporciona la variable como argumento de un procedimiento llamado Referencia; dicho procedimiento recibe el valor y le da tratamiento como tipo referencia. En la línea 23 se modifica el valor de Texto, por Texto Referencia, y se muestran los efectos del cambio en la línea 24. Después de ejecutar Referencia, se muestra el contenido de la variable Texto (línea 12); es posible notar que el valor original se modificó. Esto se debe a que el dato fue manejado como tipo referencia, lo que provoca que el argumento no genere su propia copia del dato, sino que utilice para el manejo de información la misma posición de memoria que el valor original.

4

112

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Si todo ocurrió como se esperaba, la salida será la siguiente: Texto Original

Texto Original

Texto Referencia Pulse INTRO para continuar

FIN DEL EJERCICIO*

Manejo elemental de variables Declaración de variables Para utilizar una variable es necesario declararla; declarar una variable es el proceso mediante el cual se establece un identificador, que será reconocido en tiempo de ejecución, para almacenar uno o más valores de un determinado tipo. No se pueden utilizar variables que no hayan sido declaradas previamente. La declaración de una variable se lleva a cabo a través de la instrucción de declaración: Dim. La sintaxis más sencilla de Dim es la siguiente: Dim

Identificador [As TipoDato] [ = ValorInicial]

Donde Identificador es el nombre que se desea asignar a la variable, y TipoDato es el tipo de dato que corresponde al valor que almacenaremos en la variable. En .NET es posible asignar un valor al momento de la declaración (ValorInicial).

NOTA La expresión “almacenar valores en las variables de memoria” es una expresión en sentido figurado: los valores no “se almacenan” en las variables sino en posiciones físicas de la RAM, y las variables son sólo el medio a través del cual se tiene acceso a dichas posiciones de memoria. Cuando se dice que almacenamos valores en las variables, nos referimos a que almacenamos valores en una posición física de memoria, que es referida por el identificador de la variable.

Capítulo 4. Variables, arreglos y tipos de datos

113

La especificación del tipo de dato a través de la palabra reservada As es opcional; si se omite la especificación de tipo de dato, la variable se declara automáticamente bajo el tipo Object. Esta declaración automática garantiza que no se utilice una variable que no ha sido declarada; sin embargo, es la alternativa más ineficiente, ya el CLR tendrá que invertir tiempo constantemente en determinar qué tipo de valor es el que está almacenado en la variable. A continuación se muestran ejemplos de declaración de variables: 1 2 3 4 5 6

Dim Dim Dim Dim Dim Dim

Edad Edad As Edad As Edad As Nombre, Nombre,

Integer System.Int32 Integer = 50 Apellido As String Apellido As String, Edad As Integer

La línea 1 declara una variable Object. La línea 2 declara una variable Integer. La 3 es exactamente igual a la línea 2, ya que Integer es la referencia a System.Int32. La línea 4, además de declarar la variable, le asigna un valor de inicio. La línea 5 demuestra que se pueden declarar varias variables de un mismo tipo, separando los identificadores con comas. La línea 6 demuestra que Dim acepta la declaración de dos o más variables de un mismo tipo, y de dos o más tipos.

Constantes Se conoce como constantes a las variables que sólo cambiarán su valor una vez en su tiempo de vida. Para definirlos se utiliza la siguiente sintaxis. Const

Identificador [As TipoDato] = ValorInicial

Donde Identificador es el identificador de la constante, TipoDato es el tipo de dato que tendrá la constante y ValorInicial es el valor que tendrá la constante durante todo su tiempo de vida. Por ejemplo: Const PI As Single = 3.1416

Literales Si se menciona un número 4, no tenemos suficiente información para saber si el número es Byte, Integer, Double, Decimal, dado que 4 puede ser de cualquiera de esos tipos. Lo mismo ocurriría con “A”, dado que no sabríamos si se trata de un dato String o Char.

4

114

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se tienen literales que permiten definir un valor, liberándolo de las ambigüedades de tipo que pudiera tener. Las literales son las siguientes: Type

Literal

Ejemplo de uso

Boolean

True

True

False

False

Char

C

“A”C

Decimal

D

3.1416D

Double

R

3.1416R

Integer

I

10I

Long

L

10L

Short

S

10S

Single

F

3.14F

String

“ “

“A”

Valores por omisión Cada variable, en caso de que no se le asigne un valor, tendrá un valor por omisión. A continuación se muestra una relación de los valores por omisión para los tipos de datos. Tipo de dato

Valor por omisión

Tipos de datos numéricos

0

Boolean

False

Date

01/01/0001 12:00 A.M.

Decimal

0

Object

Nothing

String

“”

Ejercicio 4.2 Demostración de la declaración de variables, constantes, y la realización de conversiones

En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso de variables en un proceso.

Capítulo 4. Variables, arreglos y tipos de datos

115

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado AreaRectangulo. 3. Edite el programa de tal forma que aparezca como sigue.

Codificación de AreaRectangulo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

- Module1.vb

Module Module1 Sub Main() Const Titulo As String = “—- Rectángulo —-” Dim Base As Integer Dim Altura As Single = 0 Dim Resultado As Single, Entrada As String Console.WriteLine(Titulo) Console.Write(“Base: “) Entrada = Console.ReadLine() Base = CInt(Entrada) Console.Write(“Altura: “) Entrada = Console.ReadLine() Altura = CType(Entrada, Single) Resultado = (Base * Altura) Console.WriteLine(“Resultado: “ & Resultado.ToString()) End Sub End Module

➤ Construcción de un solo proyecto 4. Al agregar éste, se tendrán cuatro proyectos en la solución. En ocasiones, cuando las soluciones son muy grandes, reconstruir una completamente para saber si se tienen problemas en el proyecto que se está desarrollando puede implicar un consumo innecesario de recursos de procesamiento. 5. Para construir únicamente un proceso, y no todos los de la solución, basta con seleccionar el proyecto en Solution Explorer, desplegar el menú contextual y seleccionar la opción Build. De esa forma se construirá sólo el proyecto seleccionado.

4

116

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Seleccione en Solution Explorer el proyecto; para ello coloque el puntero sobre el nombre del proyecto AreaRectangulo, haga clic con el botón derecho del ratón para desplegar el menú contextual y seleccione Build.

7. Vea en Output cómo se procesa solamente el proyecto recién desarrollado. Cuando su proyecto ya no presente errores, podrá construirse la solución, y ejecutarse con confianza.

Ejecución guiada de AreaRectangulo

– Module1.vb

8. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (F5). 9. La línea 4 declara una constante, a la cual se le asigna como valor el mensaje que ha de aparecer como encabezado del programa (línea 9); en la línea 5 se muestra una declaración de variable en su forma más sencilla; en la línea 6 se comprueba que es posible asignar un valor inicial al momento de la declaración; en la línea 7 se comprueba la posibilidad de declarar múltiples variables de múltiples tipos en una misma línea (aunque esta práctica no se recomienda porque podría hacer perder claridad al código). 10. En la línea 9 se muestra el título del programa en la consola, en la 10 se muestra el mensaje que pregunta la base del rectángulo y en la 11 se asigna a la variable Entrada el valor que el usuario ingresa desde la consola. 11. Como el dato se recibe en formato String desde la consola, la línea 12 se encarga de convertirlo en Integer, utilizando para ello la función específica CInt; el resultado es asignado a la variable Base. La misma mecánica se seguirá para preguntar y convertir

Capítulo 4. Variables, arreglos y tipos de datos

117

la altura del rectángulo, con la diferencia de que se utilizará para la conversión la función genérica CType. 12. La línea 17 calcula el área del rectángulo, asignando el valor a la variable Resultado. Como Resultado es de tipo Single, posee de forma intrínseca el método ToString, que es utilizado en la línea 18 para mostrar los resultados. 13. Todas las conversiones que realizamos en este programa pudieron haberse obviado, dado que el programa no es type safe; es decir, el CLR hubiera realizado la conversión cast en caso de que nosotros no la hubiéramos llevado a cabo de manera explícita. 14. Proporcione un valor de 10 para la base y 15 para la altura, y vea los resultados. Si todo ocurrió como se esperaba, la salida será la siguiente: Entrada

—- Rectángulo —Base: 10 Altura: 15 Resultado: 150

FIN DEL EJERCICIO*

Origen de las variables: clases y estructuras Decíamos que en Visual Basic las variables son instancias de una clase o una estructura: ❑ Variables basadas en clase (intermediación requerida).

Sabemos que una clase es la definición formal de un tipo de objeto. Un objeto es la instancia de una clase; éste puede contener información y comportamiento. En el caso de los datos almacenados en memoria a través de un objeto, éstos pueden estar disponibles al usuario mediante referencias. Uno hace referencia al objeto, y el objeto hace referencia a una posición de memoria en donde se encuentra el dato; esa intermediación que realiza el objeto para llegar al dato consume recursos de almacenamiento temporal en la computadora (lo que se conoce como heap allocation). Este tipo de variables exigen más recursos, pero ofrecen mayor funcionalidad.

❑ Variables basadas en estructura (acceso directo, sin intermediación).

Una estructura (structure) es muy similar a una clase, en el sentido de que puede almacenar datos y métodos; la diferencia con respecto a una variable basada en una clase es que la variable basada en estructura contiene de manera directa los datos definidos en la estructura; esto elimina la necesidad de una intermediación entre la variable y el dato, por lo que no se consumen recursos adicionales de la computadora en el área de almacenamiento temporal.

En la tabla que muestra los tipos de datos disponibles en Visual Basic se hace referencia a la estructura o la clase en la que se basan.

4

118

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El hecho de que las variables tengan su origen en una estructura o clase les proporciona una funcionalidad extendida y extensible, que hace de las variables un elemento del lenguaje con vida propia.

Alcance de las variables El alcance (scope) de las variables determina en qué partes del código podrá ser utilizada una variable sin utilizar un calificador. Para entender el alcance debemos entender primero el concepto de bloque de código. Un bloque de código (code block) es el conjunto de líneas que constituyen una unidad de ejecución. Generalmente se encuentran delimitados por una línea de inicio y una línea de conclusión (a lo que se conoce como branching); todas las instrucciones que culminen con End son delimitadores de bloque de código (Module-End Module, Sub-End Sub, If-End If, etcétera). Existen otras instrucciones, como For-Next y Do-Loop, que aunque no concluyen con End, también contienen bloques de código. Los bloques pueden ser condicionales o no. Son bloques condicionales cuando su ejecución depende del valor obtenido al resolver una expresión lógica (If-End If, Do-Loop, por ejemplo), mientras que son bloques no condicionales aquellos que no dependen de una evaluación para ejecutarse (Module-End Module, Namespace-End Namespace, por ejemplo). Un aspecto importante a tomar en cuenta es que un bloque de código puede formar parte de otro bloque de código. Las variables tienen los siguientes alcances: ❑ Alcance de bloque (Block scope).

El alcance de bloque se presenta cuando la variable está disponible sólo en el bloque de código en el que está declarada. El alcance de bloque es el más estrecho, en el sentido de que la variable tiene la menor vigencia posible. Cómo se define: declarando la variable dentro de un bloque de código.

Este tipo de alcance se aplica en los siguientes estatutos: ■ Do-Loop ■ For [Each]-Next ■ If-End If ■ Select-End Select ■ SyncLock-End SyncLock ■ Try-End Try ■ While-End While ■ With-End With

Capítulo 4. Variables, arreglos y tipos de datos

119

❑ Alcance de procedimiento (Procedure scope).

El alcance de procedimiento se presenta cuando la variable está disponible sólo para el procedimiento en el que está declarada. Cuando las variables pueden ser utilizadas sólo dentro del procedimiento que las declara, reciben el nombre de variables locales. Cómo se define: declarando la variable dentro de un procedimiento, pero no dentro de un bloque; se recomienda declarar al inicio del procedimiento, antes de cualquier bloque de código.

❑ Alcance de módulo (Module scope).

El alcance de módulo se presenta cuando la variable está disponible para todos los procedimientos de un determinado módulo, clase o estructura en la que está declarada. Cómo se define: declarando la variable dentro del capítulo, clase o estructura, antes de declarar cualquier procedimiento.

❑ Alcance de espacio de nombres (Namespace scope). El alcance de espacio de

nombres se presenta cuando la variable está disponible para todos los módulos, clases o estructuras contenidas en un espacio de nombres. Este alcance es el de mayor amplitud. Cómo se define: declarando una variable a nivel módulo, con accesibilidad Friend o Public (que se verá más adelante).

Shadowing Existe la posibilidad de que en un mismo programa existan dos variables con el mismo nombre; esto puede parecer contradictorio, ya que se había expresado que cada variable debe tener un identificador único. Ya con el conocimiento que hemos adquirido, podemos decir que dos variables no pueden compartir el mismo identificador si tienen el mismo alcance. En resumen, pueden existir variables homónimas si se declaran con diferente alcance; en ese sentido, podemos declarar una variable variableZ a nivel módulo, y una variable variableZ dentro de un procedimiento, lo cual no causará problemas al momento de compilar, pero sí se podrá generar un procesamiento particular en tiempo de ejecución. El hecho de que dos variables tengan el mismo identificador no causa problema para Visual Basic siempre y cuando tengan alcances distintos; el programa utilizará para el procesamiento de datos aquella variable con alcance más estrecho; a este comportamiento se le da el nombre de shadowing. Los valores de variables con el mismo nombre y distinto alcance serán mantenidos en tiempo de ejecución, a fin de utilizar el valor de menor alcance según se requiera en el programa.

4

120

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Accesibilidad de las variables (accesibility) La accesibilidad (accesibility) de una variable es el permiso que se proporciona al código para leerla o escribir en ella. El concepto de accesibilidad está muy ligado al concepto de alcance, ya que entre los dos constituyen la disponibilidad real de una variable para su uso a través de código. Las diferentes opciones que se tienen de accesibilidad son: ❑ Public.

Conocidas como variables públicas. Se proporciona acceso público a la variable; es decir, no hay restricciones de uso de la variable cuando se define como pública. Sólo se puede definir a nivel capítulo, espacio de nombres o archivo físico; nunca a nivel procedimiento.

❑ Protected.

Conocidas como variables protegidas. Se proporciona acceso protegido a la variable; es decir, pueden ser utilizadas sólo por la clase en que se declaró la variable, o en aquellas clases derivadas de ésta. Sólo se puede definir a nivel clase, nunca a nivel procedimiento.

❑ Friend.

Se proporciona acceso que asume confianza hacia el usuario (de ahí lo “amistoso”); pueden ser utilizadas por el programa que la declara, y por todos aquellos que se encuentren en el mismo ensamblado. Sólo se puede definir a nivel capítulo, espacio de nombres o archivo físico; nunca a nivel procedimiento.

❑ Protected Friend.

Se proporciona la unión de restricciones de

Protected

y de

Friend.

❑ Private.

Conocidas como variables privadas. Se proporciona acceso privado a una variable. Sólo están disponibles para el alcance en el que fueron declaradas. Sólo se puede definir a nivel capítulo, espacio de nombres, o archivo físico; nunca a nivel procedimiento.

❑ Static.

Conocidas como variables estáticas. Permite incrementar la persistencia del valor de las variables, manteniendo el último valor que haya asumido aun después de la terminación del procedimiento que la declaró. Sólo se puede definir a nivel procedimiento. No se pueden declarar variables estáticas en los procedimientos de una estructura; sólo se aceptan para los procedimientos de clases. Static es muy similar a una variable Public pero se diferencian por el lugar en donde se declaran. En cierta forma, las variables Static serían como variables públicas declaradas en los procedimientos.

❑ Shared.

Conocidas como variables compartidas. Indica que la variable no está asociada con la instancia de una clase o estructura determinada. Se puede acceder a una variable compartida a través de un calificador anteponiendo al nombre de la variable el nombre de la clase en donde se declaró inicialmente, más un punto separador. Sólo se puede definir a nivel capítulo, espacio de nombres o archivo físico; nunca a nivel pro-

Capítulo 4. Variables, arreglos y tipos de datos

121

cedimiento. Las variables compartidas (shared variables) identifican una sola unidad de almacenamiento, sin importar cuántas instancias de la clase que la declara hayan sido creadas. Cuando una variable no es definida como compartida, se conoce como variable de instancia (instance variable), y cada instancia mantiene la referencia de su propio valor. Este tipo de variables es especialmente útil para trasladar valores de un formulario a otro, en aplicaciones de formularios múltiples, ya que no basta con que las variables sean públicas. ❑ ReadOnly.

Especifica que se trata de una variable de sólo lectura.

Si no se especifica alguna opción de accesibilidad, las variables serán variables de instancia y privadas (instance variable, private). En caso de que se desee asignar alguna opción de accesibilidad, la especificación pasa a ser el estatuto de declaración y puede sustituir a Dim. Por ejemplo: Static Dim Edad As Integer

Es lo mismo que: Static Edad As Integer

4 NOTA En el caso de la accesibilidad es importante tener en cuenta la accesibilidad del objeto contenedor de la variable (objeto que contiene a otro objeto). Se puede proporcionar permiso a nivel procedimiento, pero si no se tiene permiso para disponer del capítulo, clase o estructura que contiene el procedimiento mencionado, no será posible llegar nunca a él.

Ejercicio 4.3 Demostración del alcance de las variables y la forma en que preservan valores (II) En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solución Ejercicios, que debe encontrarse en (archivo de extensión sln).

C:\APVBNETVS\Ejercicios

2. Agregue a su solución un proyecto Windows – Console Application, llamado Alcance. 3. Edite el programa de tal forma que aparezca como sigue:

122

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Alcance 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

- Module1.vb

Option Explicit On Option Strict On Module Module1 Dim Texto1 As String = “Alcance módulo” Sub Main() Console.WriteLine(Texto1) Dim Texto2 As String = “Alcance procedimiento” If Texto2 “” Then Console.WriteLine(Texto2) Dim Texto3 As String = “Alcance block” Console.WriteLine(Texto3) End If Procedimiento1() Procedimiento1() Procedimiento1() Procedimiento2() Console.WriteLine(“ “) Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub Sub Procedimiento1() Static Texto4 As String Texto4 = “Valor + “ & Texto4 Dim Texto5 As String = “Texto 5” Console.WriteLine(“—Procedimiento 1 ——”) Console.WriteLine(“Texto 1: “ & Texto1) Console.WriteLine(“Texto 4: “ & Texto4) Console.WriteLine(“———————————”) End Sub Sub Procedimiento2() Console.WriteLine(“—Procedimiento 2 ——”) If Texto1 “” Then Dim Texto1 As String = “Shadow” Console.WriteLine(“Texto 1: “ & Texto1) End If Console.WriteLine(“Texto 1: “ & Texto1) Console.WriteLine(“———————————”) End Sub End Module

Capítulo 4. Variables, arreglos y tipos de datos

Ejecución guiada de Alcance

123

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (Oprima F5). 5. Este programa es type safe, dado que todas las variables deberán declararse antes de ser utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explícita (Option Strict) (líneas 1 y 2). 6. Se declaran variables con diferente alcance en las líneas 5, 9 y 12. En la línea 5 se declara la variable Texto1; ésta tiene un alcance a nivel módulo, debido a que se declara dentro del módulo, fuera de cualquier procedimiento. Esta variable podrá ser utilizada por todos los procedimientos del módulo, es decir, y Procedimiento2(); esto se comprueba en la líneas 8 y 29, pues se despliega en la consola una variable no definida en esos procedimientos.

Main(), Procedimiento1()

En la línea 9 se declara la variable Texto2, que tiene un alcance a nivel procedimiento, por estar declarada dentro de un procedimiento específico, pero fuera de un bloque de código; por esa razón se trata de una variable local. Esta variable estará disponible sólo para Main(), pero no para otros procedimientos. En la línea 12 se declara la variable Texto3, que tiene un alcance a nivel bloque de código y estará disponible desde que se declara (línea 12) hasta que se encuentre el estatuto que marca el final del bloque de código (en este caso End If, en la línea 14). Si se trata de utilizar la variable Texto3 después de la línea 14, pensando que es una variable local (de alcance a nivel procedimiento), nuestro programa generará error, ya que la variable sólo existe declarada para el bloque en que se declara. 7. Comprobación de la variable estática. En la línea 15 se manda ejecutar Procedimiento1(); en dicho procedimiento se define una variable estática llamada Texto4 (línea 25). Esta variable tendrá un tiempo de vida que excede el tiempo de vida del procedimiento que la declara, ya que por ser estática, mantendrá los valores en memoria aun después de concluida la ejecución del procedimiento. En la línea 26 se asigna a Texto4 la constante String Valor + que se concatenará con el valor que tenga la misma Texto4; en virtud de que la variable es estática, el valor que va adoptando se comporta como un acumulador, que nunca pierde el valor que tenía, obtenido de procesamientos anteriores.

4

124

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las líneas 16 y 17 mandan ejecutar Procedimiento1(), a fin de que se compruebe que efectivamente la variable mantiene su valor al correr de las múltiples ejecuciones del procedimiento. 8. Comprobación de shadowing. Ya vimos que en la línea 5, Texto1 se definió con un alcance a nivel módulo y, al momento de declarar la variable, se le asignó el valor Alcance módulo. En Procedimiento2(), se vuelve a definir la variable Texto1 (línea 37) y se le asigna al momento de declaración el valor Shadow. 9. a) ¿Qué alcance tiene la variable Texto1, declarada en la línea 37?

b) ¿Qué valor posee Texto1 cuando es desplegada en la consola en la línea 38?

c) ¿Qué valor posee Texto1 cuando es desplegada en la consola en la línea 40?

Como podrá darse cuenta, el programa no genera conflicto con la doble declaración de la variable; simplemente utiliza aquella que tenga menor alcance. Si todo ocurrió como se esperaba, la salida será la siguiente: Alcance módulo Alcance procedimiento Alcance block ––Procedimiento 1 –––– Texto 1: Alcance módulo Texto 4: Valor + –––––––––––––––––––––– ––Procedimiento 1 –––– Texto 1: Alcance módulo Texto 4: Valor + Valor + –––––––––––––––––––––– ––Procedimiento 1 –––– Texto 1: Alcance módulo Texto 4: Valor + Valor + Valor + –––––––––––––––––––––– ––Procedimiento 2 –––– Texto 1: Shadow Texto 1: Alcance módulo –––––––––––––––––––––– Pulse INTRO para continuar

Capítulo 4. Variables, arreglos y tipos de datos

125

10. Modifique la línea 21, sustituyendo el estatuto de declaración Static por Dim. Ejecute el programa nuevamente, y explique qué sucede:

FIN DEL EJERCICIO *

Arreglos Se conoce como arreglos (arrays) —también llamados matrices en algunos casos— a un conjunto de posiciones en memoria que son referidas por un mismo identificador. Se accede a un dato almacenado en una posición de memoria dentro de un arreglo a través de un subíndice, que es la posición secuencial de cada elemento dentro de la colección. Los subíndices, como en todos los lenguajes de .NET, son de base cero; es decir, inician en cero. En Visual Basic, los arreglos tienen un tratamiento de colecciones, por lo cual los subíndices siempre se especifican entre paréntesis. Las colecciones son conjuntos de objetos lógicamente relacionados, diferenciados por un subíndice. En su calidad de colecciones, pueden ser explorados con la instrucción For taxis es la siguiente: For Each

Each, cuya sin-

Elemento [As TipoDato] In Colección BloqueCódigo [Exit

For]

Next

Donde Elemento es la variable de trabajo en donde se almacenará el elemento (TipoDato), que de no especificarse asumirá el mismo tipo de dato que tengan los elementos de la colección. Colección es la colección de objetos que podrán ser leídos de forma secuencial utilizando For Each. BloqueCodigo es el bloque de código que se ejecutará de forma iterativa para cada elemento de la colección explorado. Al encontrar Next, el proceso iterativo comienza nuevamente; es posible interrumpir el ciclo en cualquier momento utilizando Exit For.

4

126

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Arreglos unidimensionales Los arreglos unidimensionales se conocen simplemente como arreglos, y requieren de un sólo subíndice para tener acceso a un elemento del arreglo. La forma de declarar un arreglo en Visual Basic es la siguiente. Dim Arreglo(MáximoSubíndice) As TipoDato

Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que las variables. MáximoSubíndice es el número mayor de subíndice del arreglo y TipoDato es el tipo de dato de los elementos del arreglo. Por ejemplo: Dim VentaMensual(11) As Integer

En este caso se tiene un arreglo de 12 posiciones (0 a 11), donde los elementos son de tipo Integer. En caso de que no se especifique un número determinado de elementos, el arreglo será de un número indeterminado de elementos. Dim VentaMensual() As Integer

A este tipo de arreglos se les llama arreglos unidimensionales, pues únicamente es necesario especificar un subíndice para tener acceso a una de sus posiciones en memoria. También es posible asignar valores al momento de declarar un arreglo. En ese caso no se deberá especificar número de elementos, ya que éste se calculará automáticamente considerando el número de valores que se especifiquen entre llaves ({ }), separados por comas (,). La sintaxis correspondiente es la siguiente: Dim

Arreglo() As TipoDato = {SerieValores}

Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos y SerieValores es la serie de valores que asumirán los elementos; los valores deberán estar separados por comas. Por ejemplo: Dim Numeros() As Integer = {10,20,40,100}

En este caso, Numeros(1) tendrá el valor de 20.

Capítulo 4. Variables, arreglos y tipos de datos

127

Arreglos multidimensionales Se conoce como arreglo multidimensional a un conjunto de posiciones en memoria que son referidas por un solo identificador a través de dos o más subíndices. Al número de subíndices que es necesario especificar para tener acceso a una posición de memoria de un arreglo se le llama dimensionalidad (dimensionality) o rango (rank); Visual Basic acepta hasta 32 dimensiones. A los arreglos de dos dimensiones (dimensionalidad 2), que son los multidimensionales más utilizados, se les da el nombre de arreglos rectangulares. La sintaxis para definirlos es la siguiente: Dim Arreglo(MS1,MS2,...,MSn) As TipoDato

Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que las variables. MS1 es el número mayor de subíndice para la dimensión 1, MS2 es el número mayor de subíndice para la dimensión 2, y así hasta definir todas las dimensiones. TipoDato es el tipo de dato de los elementos del arreglo. Por ejemplo: Dim VentaTrim(2,3) As Integer

En este caso se tiene un arreglo de 12 posiciones (de 0 a 2, 3 posiciones; de 0 a 3, 4 posiciones; 3 posiciones  4 posiciones=12), donde los elementos son de tipo Integer. En caso de que no se especifique un número determinado de elementos, el arreglo será de un número indeterminado de elementos. Dim VentaTrim(,) As Integer

A este tipo de arreglos se les llama arreglos multidimensionales, pues es necesario especificar un subíndice para tener acceso a una posición en memoria del arreglo. También es posible asignar valores al momento de declarar un arreglo. En ese caso no se deberá especificar número de elementos, ya que el número de elementos se calculará automáticamente considerando el número de valores que se especifiquen entre llaves ({ }), separados por comas (,). Cada llave constituye la serie de valores para una dimensión. La sintaxis sería la siguiente. Dim

Arreglo(,) As TipoDato = {{SerieValores1},{SerieValores2}}

Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y SerieValores1 y SerieValores2 es la serie de valores que asumirán los elementos; los valores deberán estar separados por comas.

4

128

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejemplo. Dim VentaTrim(,) As Integer = {{1000,20000,10000,5000}, _ {2000,30000,15000,2000}}

En este caso, VentaTrim(1,2) tendrá el valor de 15000.

Arreglos escalonados Se conoce como arreglos escalonados (jagged arrays) a un arreglo que almacena arreglos. La sintaxis para su definición sería la siguiente. Dim

Arreglo()() As TipoDato

Donde Arreglo es el identificador del arreglo; su denominación sigue las mismas reglas que las variables. Dependiendo el número de arreglos que se desee incluir, se deberán agregar pares de paréntesis después del nombre de variable. TipoDato es el tipo de dato que tienen los elementos en los arreglos. Por ejemplo: Dim Numeros()() As Byte

En este caso se tiene un arreglo que almacenará dos arreglos, donde los elementos son de tipo Byte. También es posible asignar valores al momento de declarar un arreglo. En ese caso, los valores son definiciones de arreglos. Dim

Arreglo()()As TipoDato = {Arreglo1,Arreglo2}

Donde Arreglo es el nombre del arreglo, TipoDato es el tipo de dato de los elementos, y Arreglo1 y Arreglo2 son arreglos con elementos que son TipoDato; los arreglos deberán estar separados por comas. Por ejemplo: Dim Numeros()() As Byte = { Byte(){10,15,12,11}, _ Byte() {40,50,60} }

Capítulo 4. Variables, arreglos y tipos de datos

129

En este caso, Numeros(0)(3) tendrá el valor de 11. Estaríamos extrayendo, del arreglo 0, el elemento 3. El primer subíndice indica el número de arreglo del que se trata, mientras que el segundo indica el o los subíndices del elemento que queremos extraer. Un arreglo escalonado puede contener arreglos unidimensionales o multidimensionales. Los arreglos escalonados no son lo mismo que los arreglos multidimensionales; estos últimos pueden llegar a consumir cantidades muy grandes de memoria. Por ejemplo, si se quiere almacenar en un arreglo el número de identificación de 1000 empleados y 5 números de categorías de empleados, un arreglo multidimensional ocuparía 1000  5 posiciones de memoria, es decir, 5000; un arreglo escalonado, por el contrario, requeriría sólo 1000  5, es decir, 1005. Si el arreglo fuera de datos Long (8 bytes), la diferencia en consumo de memoria sería de 31,960, que podría implicar un ahorro muy importante. Algo que es importante tomar en cuenta es que los arreglos escalonados no forman parte de CLS, por lo que trabajarán adecuadamente sólo en implementaciones Microsoft, y no en otras plataformas que implementen considerando CLS como base.

Ejercicio 4.4 Comprobación del uso de arreglos unidimensionales, multidimensionales y escalonados En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Visual Basic y la forma en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado Arreglos. 3. Edite el programa de tal forma que aparezca como sigue:

4

130

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Arreglos

1 2 3 4 5 6 7 8 9 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

- Module1.vb

Option Explicit On Option Strict On Module Module1 Sub Main() Dim i As Integer Console.WriteLine(“Arreglo unidimensional 1:”) Dim Uni1() As Integer = {22, 49, 20, 40} For Each i In Uni1 Console.WriteLine(i) Next Console.WriteLine(“Arreglo unidimensional 2:”) Dim Uni2() As Integer = {55, 66, 77} For Each i In Uni2 Console.WriteLine(i) Next Console.WriteLine(“Arreglo Dim Multi(,) As Integer = Console.WriteLine( _ String.Format(“Fila 0: Multi(0, 1))) Console.WriteLine( _ String.Format(“Fila 1: Multi(1, 1))) Console.WriteLine( _ String.Format(“Fila 2: Multi(2, 1)))

multidimensional:”) {{92, 49}, {44, 20}, {10, 48}} {0},{1} “, Multi(0, 0),

{0},{1} “, Multi(1, 0),

{0},{1} “, Multi(2, 0),

Console.WriteLine(“Arreglo escalonado:”) Console.WriteLine(“Arreglo 1, posición 2”) Dim Esca()() As Integer = {Uni1, Uni2} Console.WriteLine(Esca(1)(2)) Console.Write(“Presione INTRO”) Console.ReadLine() End Sub End Module

Capítulo 4. Variables, arreglos y tipos de datos

Ejecución guiada de Arreglos

131

– Module1.vb

4. Construya la solución (Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (oprima F5). 5. En la línea 10 se declara un arreglo unidimensional, llamado Uni1, y al mismo tiempo que se declara se le asignan valores a las posiciones de memoria del arreglo. Se trata de un arreglo de cuatro posiciones de memoria, por lo que sus subíndices irán de 0 a 3. 22 49 20 40

4 En la línea 11 se inicia una estructura For Each que permitirá hacer una lectura de los valores almacenados en el arreglo. La estructura utilizará la variable i, que es de tipo Integer, para trabajar cada uno de los elementos del arreglo Uni1. La estructura For Each comenzará una lectura secuencial de todos los elementos, desde el subíndice 0 hasta el 3; i asumirá el valor del elemento que se esté leyendo en el momento, por lo que trabajar con i es como estar trabajando con el elemento del arreglo. La línea 12 provoca que se vea en la consola el contenido de cada una de las posiciones en memoria. La línea 16 declara un arreglo unidimensional de tres posiciones, llamado Uni2, que será utilizado junto con Uni1 más adelante. El proceso para el mostrado de contenido se repite con Uni2. Sus valores son los siguientes: 55 66 77 6. En la línea 22 se declara un arreglo multidimensional, llamado Multi, constituido por dos dimensiones. Se asignan valores al momento de la declaración, que nos indican que el arreglo será de dos columnas y tres filas. Vea cómo el número de series de valores de-

132

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

termina el número de filas, mientras que el número de elementos de cada serie de valores determina el número de columnas: 92

49

44

20

10

48

Las líneas de la 23 a la 28 se encargan de mostrar los valores que componen cada fila. Para ello nos apoyamos de la función String.Format, que hace una sustitución directa de parámetros. Vea cómo funciona: String.Format(“Primer valor {0} segundo valor {1}”, 10, 20)

generaría como resultado: “Primer valor 10 segundo valor 20”

Los parámetros se incluyen con base 0, y deberá proporcionarse una serie de valores separados por comas después del String que queremos construir. El primer valor de la serie toma la primera posición ({0}), el segundo la segunda ({1}), y así sucesivamente. Los subíndices en los arreglos indican la fila y la columna, considerando una base cero. 7. La línea 32 define un arreglo escalonado, llamado Esca, que almacena los arreglos Uni1 y Uni2: 22

55

49

66

20

77

40 La línea 33 muestra, del segundo arreglo almacenado (subíndice 1), el tercer elemento almacenado (subíndice 2). Entre los primeros paréntesis irá el subíndice del arreglo escalonado; es decir, permite seleccionar al arreglo a inspeccionar. En los siguientes paréntesis se coloca el subíndice (o subíndices) del arreglo seleccionado. A diferencia de un arreglo multidimensional, en donde todas las filas tienen igual número de columnas, en un arreglo escalonado la forma y dimensiones dependen de los arreglos almacenados.

Capítulo 4. Variables, arreglos y tipos de datos

133

Si todo ocurrió como se esperaba, la salida será la siguiente: Arreglo unidimensional 1: 22 49 20 40 Arreglo unidimensional 2: 55 66 77 Arreglo multidimensional: Fila 0: 92,49 Fila 1: 44,20 Fila 2: 10,48 Arreglo escalonado: Arreglo 1, posición 2 77 Presione INTRO

8. Vea el siguiente ejemplo y coloque las referencias que hacen falta. a) Para utilizar Uni1

49 =

b) Para utilizar Uni2

55 = _________________________

c) Para utilizar Multi

10 = _________________________

d) Para utilizar Esca

66 = _________________________

Uni1(1)

Estructuras y enumeraciones Estructuras Las estructuras (structures) son la implementación de estructuras de datos definidos por el usuario en Visual Basic. Las estructuras son elementos value type y pueden contener datos y comportamientos. Son muy parecidas a las clases, con la diferencia que estas últimas son reference type. La forma de implementar estructuras se identifica de acuerdo con la siguiente sintaxis: Structure

NombreEstructura

Elementos End Structure

4

134

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

donde NombreEstructura es el nombre de la estructura en cuestión, y Elementos podrán ser variables, funciones, procedimientos y eventos asociados a aquélla. Por ejemplo: Structure NombreCompleto Public Nombre As String Public ApellidoPaterno As String Public ApellidoMaterno As String Function End Structure

En este caso se declaró una estructura que almacena el nombre y los apellidos de una persona. Las variables que componen la estructura tienen acceso público, a fin de ser utilizadas de forma abierta. En caso de que se tengan en una estructura variables que se utilicen sólo dentro de la estructura misma, la accesibilidad deberá variarse.

Enumeraciones Las enumeraciones (enumerations) son colecciones de valores constantes, nominados con el fin de limitar un dominio determinado. Son muy útiles para evitar el uso de valores no válidos para elementos clasificados, como podrían ser colores, categorías, estados, etcétera. La forma de implementar enumeraciones se realiza de acuerdo con la siguiente sintaxis: Enum

NombreEnumeración Elementos

End Enum

Donde NombreEnumeración es el nombre de la enumeración, y Elementos podrán ser las constantes permitidas. A las constantes se les puede asignar o no un valor de inicio. Por ejemplo: Enum Estado Activo Inactivo End Structure

En este caso se declaró una enumeración que permite el uso de las referencias Estado.Activo y Estado.Inactivo como valores válidos. Pudo haber sido también de la siguiente forma: Enum Estado Activo = “A” Inactivo = “I” End Structure

Donde además de limitarse el dominio, se permite asignar un valor interno a la constante.

Capítulo 4. Variables, arreglos y tipos de datos

MAPA

135

MENTAL DEL CAPÍTULO

4

136

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Accesabilidad, 100, 120 Accessibility, 100, 120 Alcance, 100, 118 de bloque, 118 de espacio de nombres, 119 de módulo, 119 de procedimiento, 119 Arrays, 125 Arreglo(s), 125 dimensional, 127 escalonados, 128 unidimensionales, 126 As, 113 Block scope, 118 Bloque(s) condicionales, 118 de código, 118 no condicionales, 118 Boolean, 104 ByRef, 108 Byte, 104 ByVal, 108 Camel casing, 102 Casting, 106 Char, 104 Code block, 118 Colecciones, 125

Constantes, 113 Conversión de datos, 104 explícita, 106 implícita, 106 por método, 107 Datatype, 100, 103 Date, 104 Decimal, 104 Dim, 112 Dimensionalidad, 127 Dimensionality, 127 Dominio, 103 Double, 104 Enum, 134 Enumeraciones, 134 Enumerations, 134 Estructura, 117, 133 Friend, 120 Hungarian notation, 102 Identificador, 100 Identifier, 100 Instance variable, 121 Instrucción de declaración (Dim), 112 Integer, 104 Jagged arrays, 128 Lifetime, 100 Literales, 113 Long, 104

Matrices, 125 Module scope, 119 Namespace scope, 119 Narrowing, 106 Notación húngara, 102 Option Explicit, 109 Strict, 109 Pascal casing, 101 Private, 120 Procedure scope, 119 Programas de tipo de datos asegurados, 109 reforzados, 109 Protected, 120 Friend, 120 Public, 120 Rango, 127 Rank, 127 ReadOnly, 121 Reference type, 107 Scope, 100, 118 Shadowing, 119 Shared, 120 Short, 104 Single, 104 Static, 120 String, 104 Strong type, 109

typing, 109 Structure(s), 117, 133 Subíndice, 125 Tiempo de vida, 100 Tipo de dato, 100, 103 no numérico, 104 numérico, 104 Tipos de referencia, 107 de valor, 107 Type safe, 109 Value type, 107 Variable(s) basadas en clase (intermediación requerida), 117 basadas en estructura(sin intermediación requerida), 117 compartidas, 120 de instancia, 121 de memoria, 99 de solo lectura, 121 estáticas, 120 privadas, 120 protegidas, 120 públicas, 120 Widening, 106

PREGUNTAS 4.1 ¿Qué son las variables y cuáles son sus principales características? 4.2 ¿Qué son los arreglos y de qué tipos hay? 4.3 Explique la diferencia entre Value Type y Reference Type. 4.4 ¿Cómo se puede lograr que un programa sea strong typing? 4.5 ¿Qué tipos de datos acepta .NET? Enumérelos y proponga un ejemplo de un dato de la vida real que encaje dentro del dominio de tipo.

Capítulo 4. Variables, arreglos y tipos de datos

137

Notas:

4

138

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es la referencia lógica a una posición física de la memoria RAM: a) Estructura b) Variable c) Tipo de dato 2. Es el estatuto que ayuda a que el código sea type safe: a) Option Explicit b) Option Strict c) Option Compare 3. Es el atributo que define la cantidad de código en que una variable puede ser utilizada sin invocar su calificador: a) Alcance b) Accesibilidad c) Tiempo de vida 4. Es el permiso que se proporciona al código para poder leer y escribir en una variable: a) Alcance b) Accesibilidad c) Tiempo de vida 5. Es el comportamiento que da preferencia a la variable de alcance más estrecho: a) Selecting b) Scoping c) Shadowing

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Las variables públicas son las que tienen mayores restricciones.

7.

Una de las nuevas capacidades de .NET es poder utilizar variables aun sin haberlas declarado.

8.

Los arreglos multidimensionales tienen un manejo de memoria más económico que los arreglos escalonados.

9. 10.

El alcance de módulo es más estrecho que el alcance de bloque. El identificador de una variable no puede repetirse en un mismo alcance.

CAPÍTULO

5

Espacios de nombres y desarrollo de librerías Objetivos: Aprender qué son los espacios de nombres y cómo crearlos y

utilizarlos. 1. Conocerá qué son los espacios de nombres. 2. Sabrá cuáles son los espacios de nombres más utilizados en .NET. 3. Se familiarizará con el manejo de los nombres calificados para in-

vocar espacios de nombres. 4. Aprenderá a importar espacios de nombres en un programa. 5. Aprenderá a crear espacios de nombres definidos por el usuario y se familiarizará con la forma en que se utilizan en forma de librerías. 6. Aprenderá el uso de alias de espacios de nombres.

139

140

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Espacios de nombres (namespaces) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nomenclatura para los espacios de nombres . . . . . . . . . . . . . . . . . . . . Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de namespaces propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Alias para los espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Independencia de los ensamblados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación y consumo de una librería (DLL) basada en un espacio de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Creación de una librería DLL . . . . . . . . . . . . . . . . . . . . . ➤ Revisión de todos los elementos asociados a un proyecto, usando Solution Explorer . . . . . . . . . . . . . . . . ➤ Establecimiento de una referencia a una librería desde Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Consumo de una librería programáticamente . . . . . . . . Utilización del depurador (Debug) de Visual Studio y la ejecución línea a línea basada en puntos de interrupción (breakpoints) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Establecimiento de un punto de interrupción (breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Ejecución línea por línea (Code Stepping) . . . . . . . . . . . ➤ Modificación de programas en tiempo de ejecución . . . ➤ Puntos de interrupción condicionales . . . . . . . . . . . . . . . ➤ Habilitación e inhabilitación de puntos de interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Eliminación de los puntos de interrupción (breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilización de Command Window . . . . . . . . . . . . . . . . . . . . . . . . ➤ Escritura de comandos de Visual Studio usando Command Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de herramientas avanzadas para la depuración . . . . . . . . . ➤ Apilado de herramientas en Visual Studio . . . . . . . . . . . ➤ Ventanas de variables (variable windows) . . . . . . . . . . . ➤ Ventanas de inspección de código . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

141 143 143 144 148 149 150 151 151 153 153 154 155 156

157 158 158 159 160 161 161 162 162 165 165 166 168 170 171 171 173

Capítulo 5. Espacios de nombres y desarrollo de librerías

141

Espacios de nombres (namespaces) Por definición, un espacio de nombres (namespace) es un esquema lógico que permite agrupar clases y types relacionados a través de un nombre. En términos generales, es una referencia lógica a las librerías utilizadas por un programa. Las librerías, como seguramente ya sabe, son archivos binarios ejecutables, preferentemente con extensión DLL, que contienen procedimientos de uso común (en forma de clases) disponibles para que los programas los utilicen. La extensibilidad de un lenguaje es su capacidad para integrar librerías desarrolladas por otros. Seguramente le habrá sucedido que al tratar de ejecutar un programa (con extensión EXE) que copió desde otra máquina éste no funciona y despliega una mensaje de error donde dice que no puede encontrar un DLL que necesita para trabajar. Podemos concluir algo: que los programas se apoyan en las librerías, pues mandan llamar a ejecución procedimientos contenidos en ellas. Los espacios de nombres hacen que la identificación, localización y uso de las librerías se realice de manera sencilla y lógica. Cuando se desarrolla en Visual Basic se crean muchos objetos que de manera conjunta representan la interfaz de usuario, y que a través de su comportamiento forman lo que llamamos aplicación. A cada objeto de la aplicación se le pueden alterar las propiedades o ejecutar sus métodos, y éstos pueden ser utilizados por funciones o estructuras de decisión y control. Tanto las clases de las que derivan los objetos como las funciones del lenguaje deben estar definidas en alguna parte. Físicamente, los archivos de clases de .NET Framework tienen la extensión DLL; en .NET las cosas no cambian y cada vez que usted declara una variable de tipo int, por ejemplo, realmente está generando una instancia de una clase que se encuentra definida en un archivo DLL. Probablemente para usted sea transparente, pero un programa simple puede estar haciendo referencia a varias clases que se encuentran en archivos DLL distintos. Tome en cuenta que .NET Framework pone a su disposición un número muy grande de clases ya preparadas para que usted las utilice; éstas se distribuyen en muchas librerías de vínculos dinámicos (DLL), algunas de ellas de más de 2 MB de código puro, que satisfacen casi cualquier requerimiento general de programación. Tener en mente los nombres físicos de los archivos DLL y la referencia exacta de las clases que contienen puede ser una labor titánica. Si desarrolla utilizando Visual Studio quizá se facilite su trabajo, porque la herramienta de desarrollo establece los enlaces con los DLL de manera automática.

5

142

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Tener muchos archivos físicos de librerías constituye una ventaja, pues implica que el lenguaje ya contiene muchas funciones que no será necesario programar; por otro lado, plantea un problema, pues encontrar tantos archivos no resulta práctico. NOTA Las librerías de vínculos dinámicos que conforman el .NET Framework cumplen con todas las especificaciones de .NET y, por tanto, son ensamblados; aclaramos esto para que no intente llevar estos archivos DLL a otro sistema y registrarlos, pensando que funcionarán: si no tiene instalado .NET Framework no lo harán porque son ensamblados y, por tanto, son código administrado que requiere la presencia del CLR.

Buscando la simplificación, Microsoft creó un sistema lógico que permite organizar y categorizar las clases disponibles en las librerías que componen el .NET Framework, basándose en un concepto: los espacios de nombres (namespaces). Los espacios de nombres proporcionan una estructura que organiza y simplifica la referencia a las clases a través del .NET Framework, y no sólo Microsoft Visual Basic puede usar los espacios de nombres; también pueden hacerlo el resto de los lenguajes .NET, ya que realmente conviven con el CLR. Es muy importante señalar que los espacios de nombres no tienen nada que ver con la herencia entre las clases. Los espacios de nombres sólo están relacionados con la identificación de clases, y no con la jerarquía madre-hija de éstas. Ciertamente, los espacios de nombres sugieren una jerarquía, pero ésta no tiene nada que ver con la herencia entre clases; realmente se trata de un agrupamiento basado en funcionalidad. Quienes desarrollan basándose en la tecnología COM están conscientes de que los espacios de nombres son la evolución lógica de los identificadores ProgID. Un espacio de nombres es dos cosas: a) un convencionalismo de nomenclatura y b) un esquema lógico de organización de clases de .NET Framework. Los espacios de nombres organizan colecciones de clases y eliminan la ambigüedad al momento de hacer referencias a ellas. Un mismo espacio de nombres puede hacer referencia a diferentes archivos DLL que contengan clases de funcionalidad similar. Los espacios de nombres parten de dos grandes grupos: System y Microsoft. A partir de ahí se generan subgrupos especiales, de acuerdo con la funcionalidad.

Capítulo 5. Espacios de nombres y desarrollo de librerías

143

Nomenclatura de los espacios de nombres La nomenclatura de los espacios de nombres se basa en la notación Pascal casing, con división basada en puntos para representar la jerarquía. En el caso de System.Console.WriteLine que ya hemos utilizado, System es el espacio de nombres, Console es la clase y WriteLine es el método de la clase. Generalmente, el último elemento del nombre es un type (método, propiedad, campo, etcétera), el penúltimo es una clase de BCL, y todo lo que anteceda es la jerarquía de espacios de nombres para llegar a la clase. Es importante mencionar que el desarrollador puede crear sus propias jerarquías de espacios de nombres, que también se regirán por las mismas reglas de nomenclatura. Algunos de los espacios de nombres más utilizados de la librería de clases de .NET Framework son los siguientes: NOTA Por su extensión, no se listan todos los espacios de nombres disponibles en .NET Framework, sino sólo los que a criterio del autor son los más usuales.

Microsoft El espacio de nombre Microsoft y todas sus dependencias ayudan a integrar las tecnologías Microsoft a los desarrollos. Además integra los elementos principales de los nuevos lenguajes de Microsoft. Espacio de nombre (Namespace)

Utilidad

Microsoft.SqlServer.Server

Contiene clases que permiten integrar CLR en Microsoft SQL Server y su motor de ejecución.

Microsoft.Csharp

Contiene clases que dan soporte a la compilación y generación de código usando C#.

Microsoft.Jscript

Contiene clases que apoyan a la compilación y generación de código usando Jscript.

Microsoft.VisualBasic

Contiene clases que apoyan a la compilación y generación de código usando Visual Basic.

Microsoft.VisualBasic.FileIO

Contiene tipos que dan soporte al manejo del sistema de archivos usando Visual Basic.

Microsoft.Win32

Provee dos tipos de clases: aquellas que manejan eventos iniciados por el sistema operativo y las que manipulan el registro del sistema (Windows Registry).

5

144

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

System El espacio de nombre System y todas sus dependencias contienen las clases fundamentales de la plataforma .NET. En esta jerarquía se encuentran las clases base para definir valores, referencias, tipos de datos, eventos y manejadores de eventos; además contienen los elementos para la declaración de interfaces, atributos, excepciones de procesos, etcétera. También se incluyen en ella todas las clases que hacen de los lenguajes de .NET herramientas de propósito general, dado que se encuentran clases de graficación, acceso a datos, telecomunicaciones, criptografía, matemáticas, etcétera. Nombre del espacio de nombre (Namespace)

Utilidad

System.Collections

Contiene interfaces y clases que definen varias colecciones de objetos, como lists, queues, arreglos de bits, hashtables y diccionarios.

System.Collections.Generic

Contiene interfases y clases que definen colecciones genéricas, que permiten a los usuarios crear colecciones strong type que proveen mejor tipo de seguridad y desempeño.

System.Configuration

Contiene los tipos que proveen el modelo de programación para manejo de datos de configuración.

System.Data

Contiene clases que constituyen la mayor parte de la arquitectura de ADO.NET. La arquitectura de ADO.NET permite el acceso y manipulación eficiente de bases de datos de diversas tecnologías (SQL Server, Acces, Oracle, ODBC, OLEDB, etcétera).

System.Data.Common

Contiene clases compartidas por los proveedores de datos de .NET Framework. Un proveedor de datos de .NET Framework, describe una colección de clases usadas para acceder orígenes de datos, como bases de datos, en el espacio administrado.

System.Data.Design

Contiene clases que pueden ser usadas para generar typed-datasets personalizados.

System.Data.Odbc

Contiene clases que el proveedor de datos para ODBC de .NET Framework encapsula.

System.Data.OleDb

Contiene clases que el proveedor de datos para OLE DB de .NET Framework encapsula.

System.Data.OracleClient

Contiene clases que el proveedor de datos para Oracle de .NET Framework encapsula.

System.Data.Sql

Contiene clases que apoyan funcionalidad específica de SQL Server. Complementa a System.Data.SqlClient, sobre todo en el manejo integrado de SQL Server 2005 y CLR.

Capítulo 5. Espacios de nombres y desarrollo de librerías

145

System.Data.SqlClient

Contiene clases que el proveedor de datos para SQL Server de .NET Framework encapsula.

System.Data.SqlServerCE

Describe una colección de clases que pueden ser usadas para acceder a una base de datos en SQL Server CE para dispositivos Windows CE-based en el espacio administrado.

System.Data.SqlTypes

Contiene clases para tipos de datos nativos en SQL Server. Estas clases proveen una alternativa más rápida que otros tipos de datos. Ayuda a prevenir errores de conversión que puedan derivar en pérdida de precisión.

System.Diagnostics

Provee de clases que permiten interactuar con los procesos del sistema, logs de eventos, desempeño de contadores. También provee clases que permiten buscar errores en la aplicación y rastrear la ejecución de código.

System.DirectoryServices

Provee acceso sencillo al Active Directory.

System.DirectoryServices.ActiveDirectory

Provee un modelo abstracto de alto nivel para la manipulación de las tareas de servicio del directorio de Microsoft® Active Directory®.

System.Drawing

Provee acceso a la funcionalidad de gráficos básicos GDI+.

System.Drawing.Design

Contiene clases que extienden la interfaz de usuario en tiempo de diseño.

System.Drawing.Drawing2D

Provee funcionalidad gráfica avanzada (bidimensional y vectores). Incluye paletas de gradientes, la clase Matrix (usadas para definir transformaciones geográficas) y la clase GraphicsPath.

System.Drawing.Printing

Provee de servicios de impresión de gráficos.

System.Drawing.Text

Provee funcionalidad de tipografía GDI+ avanzada. Permite a los usuarios crear una colección de fuentes.

System.Globalization

Contiene clases que definen información relacionada con la cultura, incluyendo lenguajes, el país/región, el calendario en uso, el formato de fechas, moneda, números y el orden de cadenas. Indispensable su uso si se desarrollan aplicaciones de alcance internacional.

5

146

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

System.IO

Contiene tipos que permiten lectura sincrónica y asincrónica de flujos de datos y archivos.

System.IO.Compression

Contiene clases que proveen compresión y descompresión básica de flujos de datos.

System.IO.Ports

Contiene clases para el control y uso de puertos.

System.Messaging

Provee clases que permiten la conexión, monitoreo y administración de mensajes de colas en la red para enviar y recibir mensajes.

System.Net

Proveen una interfaz de programación para los principales protocolos usados en redes actuales.

System.Net.Configuration

Contiene clases para la configuración programática de System.Net.

System.Net.Mail

Contiene clases usadas para enviar correos electrónicos a un servidor SMTP (Simple Mail Transfer Protocol).

System.Net.Mime

Permite representar encabezados MIME (Multipurpose Internet Mail Exchange).

System.Net.NetworkInformation

Provee acceso a datos de tráfico de datos, información de direcciones de red y notificaciones de cambios de direcciones de la computadora local. También contiene clases para implementar Ping.

System.Net.Sockets

Provee una implementación de interfaces Windos Sockets(Winsock), para ayudar a los desarrolladores que necesitan control de acceso a la red.

System.Runtime.Remoting

Provee de clases e interfaces que permiten a desarrolladores crear y configurar aplicaciones distribuidas.

System.Security

Provee de una estructura subyacente del sistema de seguridad de .NET Framework, incluyendo clases base para permisos.

System.Security.Cryptography

Provee servicios criptográficos. Incluye codificación y descodificación segura de datos, así como muchas otras operaciones, como hashing, generación de números aleatorios, y autentificación de mensajes.

System.Security.Cryptography.X509Certificates

Contiene lenguaje de implementación del certificado Authenticode X.509 v.3.

System.Security.Cryptography.Xml

Contiene clases que apoyan la creación y validación de firmas digitales XML.

Capítulo 5. Espacios de nombres y desarrollo de librerías

147

System.Text

Contiene clases para la representación y conversión de sistemas textuales, como ASCII, Unicode, UTF-7 y UTF-8.

System.Text.RegularExpressions

Contiene clases que proveen acceso al motor de expresiones regulares de .NET Framework.

System.Threading

Provee clases e interfaces que habilitan programación multitarea.

System.Timers

Provee de un componente temporizador, que permite disparar un evento en intervalo específico.

System.Transactions

Contiene clases que permiten al código participar en transacciones.

System.Web

Provee clases e interfaces que habilitan el modelo de petición respuesta para ambientes Web, basados en el protocolo HTTP, además del manejo de cookies.

System.Web.Configuration

Contiene clases que son usadas para configurar ASP.NET.

System.Web.Mobile

Contiene las capacidades principales, incluyendo autentificación y manejo de errores, requerido para construir aplicaciones móviles ASP.NET.

System.Web.SessionState

Provee clases e interfaces que habilitan el almacenamiento de datos desde un cliente específico en una aplicación Web en el servidor.

System.Web.UI

Provee clases e interfaces que permiten crear interfaces de usuario en ambiente Web.

System.Web.UI.WebControls

Contiene clases que permiten crear elementos gráficos de interfaz de usuario en una aplicación Web.

System.Windows.Forms

Contiene clases para crear aplicaciones basadas en Windows para aprovechar las características de la interfaz gráfica disponibles en el sistema operativo de Microsoft Windows.

System.Xml

Provee soporte de procesamiento XML.

System.Xml.Serialization

Contiene clases que son usadas para serializar documentos en formato XML.

5

148

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

No son todos los espacios de nombres; la mayoría tiene niveles jerárquicos de mayor profundidad que sería imposible tratar en este texto. Utilice la tabla como punto de partida para buscar más información. En la ayuda de Visual Studio puede buscar .NET Framework Class Library, y de ahí seleccionar un tema que le interese.

Uso de espacios de nombres Tiempos de compilación de CLR

Las aplicaciones desarrolladas en .NET pueden disponer de todas las clases y objetos del .NET Framework, es decir, todos los recursos de .NET Framework; lo único que hay que hacer es referirlos adecuadamente. Si se desea hacer uso de cualquier clase de BCL es necesario proporcionar el nombre preciso de ésta. Una forma en que se pueden referir los recursos de BCL es a través de lo que se conoce como nombres calificados (fully qualified name), que son la especificación textual de la jerarquía de espacios de nombres que permite ubicar una clase o type (Namespace.Clase.Type). Es posible utilizar todas las clases disponibles de .NET Framework a través de sus nombres calificados, pero eso no es del todo práctico pues en ocasiones éstos pueden ser bastante largos (System.Runtime.Remoting.Channels.Http, por ejemplo). Una forma de obviar la escritura del nombre calificado completo es importando los espacios de nombres. Para ello se utiliza la instrucción Imports. Basta con que coloque lo siguiente al principio de su programa: Imports

EspacioNombre

Donde EspacioNombre es la parte del nombre calificado que desea obviar al momento de programar. En Visual Basic se puede incluir hasta el nombre de la clase de BCL, con lo que el código puede llegar a simplificarse bastante. Puede darse el caso de que en dos o más ensamblados se repita el nombre de clases, referencias o métodos; en ese caso, la ambigüedad debe eliminarse a través de nombres calificados, los cuales permiten definir el origen de los recursos referidos.

Capítulo 5. Espacios de nombres y desarrollo de librerías

149

Los siguientes dos programas funcionarían de la misma forma: Sin uso de instrucción Imports: Module Module1 Sub Main() System.Console.Write(“Presione INTRO”) system.Console.ReadLine() System.Console.WriteLine(“Hola mundo.”) End Sub End Module

Con uso de instrucción Imports: Imports System.Console Module Module1 Sub Main() Write(“Presione INTRO”) ReadLine() WriteLine(“Hola mundo.”) End Sub End Module

Contaminación de espacios de nombres y colisiones de nombre. Como puede apreciar, los espacios de nombres permiten obviar la jerarquía de clases que permite tener acceso a una clase o a un método (type). Puede darse el caso, principalmente cuando un equipo de desarrollo trabaja sobre un mismo proyecto, de que dos o más programadores denominen a un método de la misma forma; cuando se da esa repetición de nombres de métodos en diferentes jerarquías, se dice que estamos ante contaminación de espacios de nombres (namespace pollution). Si, existiendo contaminación de nombres, en un mismo programa se tratan de utilizar métodos homónimos, CLR es incapaz de diferenciarlos, por lo que se presenta el fenómeno de colisión de nombres (name collisions). Las colisiones de nombres se resuelven utilizando nombres calificados, mientras que la contaminación de espacios de nombres se evita mediante una planeación minuciosa del proyecto de desarrollo, además de utilizar métodos estructurados de desarrollo.

Creación de namespaces propios .NET Framework proporciona una cantidad enorme de clases, accesibles a través de sus muchos espacios de nombres. Pero eso no es suficiente, pues todo lenguaje que presuma de ser extensible debe permitir a los desarrolladores agregar funcionalidad específica que no está presente de manera genérica.

5

150

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Es posible agregar espacios de nombres adicionales a los contenidos de origen en .NET Framework; los pasos para hacerlo son los siguientes: 1. Desarrollar el código de una librería (programa de extensión de Microsoft Visual Basic), delimitando el contenido de la librería a través del estatuto Namespace. 2. Compilar el código de la librería como tipo library, con lo cual no se generaría un archivo ejecutable (EXE), sino una librería de vínculos dinámicos (DLL). 3. Para hacer uso de la funcionalidad de una librería, es necesario hacer referencia a ella; eso se puede hacer desde Visual Studio (si se trata de una aplicación Windows o Web, a través de la opción de menú Project – Add Reference...), o en tiempo de compilación si se trata de una aplicación de consola y no se utiliza Visual Studio. 4. Es opcional utilizar nombres calificados una vez que se establece la referencia. La sintaxis para crear un espacio de nombres es la siguiente: Namespace

EspacioNombre ‘ Codigo de elementos

End Namespace

Donde EspacioNombre es el nombre a través del cual se referirán los elementos contenidos en espacio de nombres que se genera. Una cosa importante a tomar en cuenta es que para crear una jerarquía dentro de un espacio de nombres es posible anidarlos, por lo cual una declaración Namespace puede estar definida dentro de otra, creando el efecto EspacioNombre1.EspacioNombre2.Type.

Alias para los espacios de nombres Codificar utilizando nombres calificados puede ser muy complicado debido a que, en ocasiones, los espacios de nombres no son muy cortos (de ahí que recurriéramos a importarlos). Esto plantea un nuevo problema: nos quedamos sin información con relación a qué espacio de nombres contiene qué elementos. Un escenario ideal sería que los espacios de nombres no tuvieran el nombre muy largo, a fin de poder integrarlos al código sin necesidad de mucho esfuerzo; con ello obtendríamos información con relación al espacio de nombres de origen y, al mismo tiempo, comodidad al codificar. En pocas palabras, queremos espacios de nombres con nombres no muy largos, pero tampoco de nombre inexistente.

Capítulo 5. Espacios de nombres y desarrollo de librerías

151

Esto es posible si asignamos un alias al espacio de nombres. Un alias de importación es la equivalencia en nombre que le damos a un espacio de nombres al momento de importarlo. Vea la sintaxis para establecer un alias de espacio de nombres: Imports

Alias = EspacioNombres

Donde EspacioNombres será el nombre del espacio de nombres que será referido a través de Alias.

Independencia de los ensamblados Una referencia del ejecutable hacia el archivo DLL se realiza en el momento en que se genera el ejecutable, y la referencia es directa entre el ejecutable y la librería. El DLL se encuentra en el mismo directorio que la aplicación; otros ensamblados podrán hacer referencia al DLL, incluso con el mismo nombre y no importa: el metadatos sabrá reconocer qué librería le corresponde al ejecutable. Esta sencilla modificación que aporta .NET tiene implicaciones trascendentales. Anteriormente, se generaba un componente o una librería y ésta debía ser registrada en el Registro de Windows antes de poder ser utilizada (por lo general se almacenaba en un recipiente común \Windows\System o \WINNT\System, según el sistema). Cuando una librería se actualizaba, los programas que la utilizaban podrían ya no ser compatibles, dando lugar al infierno de los DLL. Ahora, cada ejecutable puede disponer de su propia versión de la librería, y .NET no dejará que se pierdan las referencias entre librerías y ejecutables. En .NET, las librerías desarrolladas por el usuario tienen total independencia del Registro de Windows. Para distribuir una aplicación, basta copiar el ejecutable y las librerías que utiliza. Sobra decir que no necesitará copiar las librerías que forman parte de .NET Framework, ya que para que un ejecutable .NET (ensamblado) funcione en un equipo, éste debe tener el CLR y el .NET Framework instalado, por lo que dichas librerías se tienen por disponibles.

Referencias Una referencia puede definirse como la especificación de enlazado entre un programa y una librería, en donde la librería pone su funcionalidad a disposición del programa hasta donde la accesibilidad lo permite.

5

152

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las referencias pueden establecerse fácilmente desde Visual Studio. Lo primero que hay que saber es que cada proyecto tiene sus propias referencias. Al crear un proyecto desde Visual Studio, la herramienta establece las referencias más usuales para el tipo de aplicación. En el Solution Explorer pueden observarse claramente, ya que bajo el nodo de un proyecto siempre hay un nodo References. Si se requiere hacer una nueva referencia, es necesario colocarse sobre el nodo References del proyecto al que se desea agregar la referencia, y seleccionar Add Reference desde el menú contextual. Con esto aparecerá la ventana Add Reference.

La ventana muestra varias fichas. En la ficha .NET podrán seleccionarse las librerías de .NET Framework o aquellas que se registren en GAC utilizando nombres fuertes (strong names). En la ficha COM se pueden seleccionar aquellas librerías COM que se desee utilizar, dado que la plataforma .NET les da soporte. En la ficha Projects es posible seleccionar los proyectos .NET que sean de tipo Library (DLL), de los cuales se pueden consumir clases expuestas. En la ficha Browse pueden examinarse los archivos que se encuentran en el equipo, con el fin de seleccionar algún DLL. La ficha Recent permite invocar las librerías de reciente uso o creación, a fin de encontrarlas sin buscar en todos lados.

Capítulo 5. Espacios de nombres y desarrollo de librerías

153

En cualquiera de las fichas es posible seleccionar los componentes seleccionando la librería a referir y haciendo clic en el botón Ok, a fin de que las referencias queden establecidas.

Ejercicio 5.1 Creación y consumo de una librería (DLL) basada en un espacio de nombres En este ejercicio se comprobará la forma en que funcionan los alcances de variables en Visual Basic, y la manera en que podemos aprovechar su manejo para preservar valores en memoria con eficiencia. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln).

➤ Creación de una librería DLL 2. Agregue a su solución un proyecto Windows – Class library, llamado MisUtilerias. Es muy importante que el proyecto sea una librería de clases, para que al compilar el proyecto se genere un ensamblado de extensión DLL. 3. Edite el programa de tal forma que aparezca como sigue:

Codificación de 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

MisUtilerias - Continuar.vb

Imports System.Console Namespace Funciones Public Class Continuar Public Shared Sub EsperaINTRO() WriteLine() WriteLine(“Pulse INTRO para continuar”) ReadLine() End Sub End Class End Namespace

4. Esta librería generará el archivo MisUtilerias.DLL. Posee un espacio de nombres denominado Funciones, que a su vez contiene una clase llamada Continuar que tiene defi-

5

154

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

nido un método llamado EsperarINTRO. El método se encarga de mostrar un mensaje y esperar a que se pulse INTRO para continuar. Como lo recordará, hemos estado utilizando código similar en los últimos ejercicios, por lo que en éste constituye una manera de automatizar esa labor tan común. 5. Es muy importante notar que la clase es pública (Public) dado que le daremos un uso de librería, y deseamos que sea utilizable por cualquier proyecto (incluso aquellos que no pertenecen a la solución). También es importante ver que el método es público y compartido (Shared), lo que indica que está disponible para uso externo a la clase. 6. Construya el nuevo proyecto que creó y guarde todos los archivos de la solución (oprima las teclas Ctrl-Mayús-S). 7. Compruebe que al generar el proyecto se haya creado una librería Busque en la siguiente ruta:

DLL

en su equipo.

C:\APVBNETVS\Ejercicios\MisUtilerias\bin\Debug

➤ Revisión de todos los elementos asociados a un proyecto, por medio de Solution Explorer 8. Agregue a su solución un proyecto Windows – Console Application, llamado meUtilerias. 9.

Consu-

Seleccione en Solution Explorer el proyecto ConsumeUtilerias. Haga clic en el botón Show All Files de la barra de herramientas de Solution Explorer. Con ello aparecerán elementos que hasta el momento no había visto. Vea el árbol jerárquico de recursos asociados a su proyecto. El que nos interesa más en estos momentos es el nodo References; haga clic en dicho nodo con el fin de ver qué contiene.

Capítulo 5. Espacios de nombres y desarrollo de librerías

155

10. Al seleccionar un Template al momento de crear un proyecto en Visual Studio, la herramienta sabe qué espacios de nombres son los más comunes para el tipo de proyecto, y procede a establecer referencias con las librerías correspondientes. Eso nos libera del trabajo de establecer referencias que son obvias, dado un tipo de archivo. Como podemos comprobar, nuestra librería MisUtilerias no se encuentra dentro de las referencias, por lo que no podríamos utilizar su funcionalidad en nuestro programa.

➤ Establecimiento de una referencia a una librería desde Solution Explorer 11. Seleccione su proyecto ConsumeUtilerias en Solution Explorer. Despliegue el menú contextual y seleccione Add Reference. Vaya a la ficha Projects y seleccione el proyecto MisUtilerias. Haga clic en Ok.

5

12. Vea cómo al agregar la referencia, Solution Explorer actualiza el árbol de elementos del proyecto, incluyendo nuestra librería.

156

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Consumo de una librería programáticamente 13. Ahora codifique el programa que consume la librería.

Codificación de ConsumeLibrería 1 2 3 4 5 6 7 8 9 10 11

– Module1.vb

Imports System.Console Imports MisUtilerias.Funciones Module Module1 Sub Main() WriteLine(“Mensaje desde el programa”) Continuar.EsperaINTRO() End Sub End Module

14. Vea cómo al editar las líneas de importación de espacios de nombres, ya teníamos disponible nuestro espacio de nombres en Intellisense.

Capítulo 5. Espacios de nombres y desarrollo de librerías

157

15. Se importa el nombre de la librería y el espacio de nombres (línea 2). Ya en el código, sólo es necesario invocar el nombre de la clase y el type (línea 8). Podríamos haber simplificado aún más, incluyendo la clase en el Imports.

Ejecución guiada de ConsumeLibrería

– Module1.vb

16. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (oprima Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (oprima F5). 17. Si todo salió bien, el programa debe producir el siguiente resultado: Mensaje desde el programa Pulse INTRO para continuar

18. Con este pequeño ejemplo ya comprobó cómo se generan bibliotecas de clases en .NET y cómo se consumen desde otros proyectos. FIN DEL EJERCICIO *

Ejercicio 5.2 Utilización del depurador (Debug) de Visual Studio y la ejecución línea a línea basada en puntos de interrupción (breakpoints) Se agregarán puntos de interrupción a una aplicación, y se revisarán las opciones de ejecución línea a línea usando Visual Studio.

5

158

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

1. Usando Visual Studio, abra la solución Ejercicios. 2. En el Solution Explorer encuentre el nodo correspondiente a ConsumeLibreria – Module1.vb. Haga doble clic en dicho nodo para editar el código. Establezca el proyecto como proyecto de inicio (StartUp Project).

➤ Establecimiento de un punto de interrupción (breakpoint) 3. Seleccione la línea Sub Main() y establezca un punto de interrupción con la opción Debug – Toggle Breakpoint (F9), o bien, haciendo clic en el borde externo izquierdo de Text Editor, junto a la línea en la que desea agregar un punto de interrupción. Aparecerá una marca en el borde externo izquierdo de Text Editor, indicando que la línea tiene un punto de interrupción.

4. Genere nuevamente la solución y ejecútela.

➤ Ejecución línea por línea (code stepping) 5. Al momento de llegar a la línea 6 el programa se detendrá.

6.

Al lanzar a ejecución una aplicación (oprimiendo la tecla F5), se entra en modo debug, que es un estado de ejecución en donde Visual Studio provee todas las herramientas para la depuración de aplicaciones en tiempo de ejecución.

7.

Seleccione repetidamente Debug – Step Over (F10), hasta terminar la ejecución del programa. La ejecución continuará en modo línea a línea. Al encontrar un llamado a un recurso externo al programa (clases, librerías, funciones, etcétera), las tomará como una sola línea; es decir, no profundizará en lo que pasa dentro del recurso externo al programa. Las líneas que se vayan ejecutando aparecerán resaltadas en amarillo.

Capítulo 5. Espacios de nombres y desarrollo de librerías

159

8.

Ejecute nuevamente la aplicación (oprima F5). Seleccione repetidamente Debug – Step Into (F11), hasta terminar la ejecución del programa. La ejecución continuará en modo línea a línea. Al encontrar un llamado a un recurso externo al programa (clases, librerías, funciones, etcétera), realizará también una inspección línea a línea de dichos recursos. Las líneas que se vayan ejecutando aparecerán resaltadas en amarillo.

9.

Ejecute nuevamente la aplicación (oprima F5). Seleccione repetidamente Debug – Step Into (F11), hasta llegar a las líneas de código de la librería de MisUtilerias. Seleccione Debug – Step Out (Mayús-F11) para terminar de ver el contenido de la librería y continuar con la ejecución en el programa que mandó llamar la librería.

10.

En cualquier momento, cuando se está en tiempo de depuración, se puede continuar la ejecución normalmente (Continue), detener momentáneamente la ejecución (Break All) o terminar la depuración (Stop Debugging).

➤ Modificación de programas en tiempo de ejecución (Edit and Continue) > Lo nuevo Anteriormente, una vez que se iniciaba la depuración de un programa (oprimiendo F5), no había forma de modificar el programa en el momento. Si detectábamos un error de ortografía en un mensaje del sistema, por ejemplo, y nos percatábamos del error al estar ejecutando el programa línea por línea, no era posible hacer la modificación en el momento. Si queríamos corregir el error de inmediato era necesario suspender la ejecución, hacer las modificaciones, volver a construir la aplicación y volver a ejecutarla. En Visual Studio 2005, en cambio, es posible modificar un programa en tiempo de depuración, viendo los cambios de manera inmediata.

11. Ejecute nuevamente la aplicación (F5). Al llegar al punto de interrupción, continúe la ejecución con Step Over (F10). Al llegar a la línea 7, que despliega Mensaje desde el programa, cambie en ese momento el mensaje por Mensaje editado en tiempo de depuración. Siga ejecutando con Step Over. Compruebe en la consola que se ha escrito el nuevo mensaje, lo que indica que tomó como buenos nuestros cambios realizados en

5

160

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

tiempo de depuración. A esta capacidad de Visual Studio se le denomina Edit and Continue, y sólo está disponible si el archivo está en vista de código fuente (source view).

➤ Puntos de interrupción condicionales 12. En ocasiones queremos que un punto de interrupción detenga la depuración sólo en caso de que sea necesario. La necesidad de interrupción debe estar expresada en términos de una condición lógica. A los puntos de interrupción que detienen la depuración sólo con base en una condición se les llama puntos de interrupción condicionales. 13. En el Solution Explorer encuentre el nodo correspondiente a AreaRectángulo – Module1.vb. Haga doble clic en dicho nodo para editar el código. Establezca el proyecto como proyecto de inicio (StartUp Project). 14. Coloque un punto de interrupción en la línea Base=CInt(Entrada). 15. Coloque el puntero del ratón sobre el punto de interrupción, despliegue el menú contextual y seleccione Condition....

16. Aparecerá la ventana Breakpoint Condition, en donde se podrá especificar la condición que provocará que el punto de interrupción detenga la depuración. Especifique que si el dato proporcionado es menor o igual a cero se detenga la depuración (CInt(Entrada)GotoLn 7 >Debug.ToggleBreakpoint >Debug.Start >Debug.StepOver >Debug.StepOver >Debug.StepOver >Debug.StopDebugging >Debug.DeleteAllBreakpoints

10. Lo que hicimos fue ir a la línea 7 del código, establecer un punto de interrupción, iniciar la depuración, ejecutar tres líneas, línea por línea, y detener la depuración. En el caso de comandos que se repiten, podemos ahorrarnos la escritura consultando la historia de comandos de Command Window (oprimiendo la tecla de dirección hacia arriba). FIN DEL EJERCICIO*

Ejercicio 5.4 Uso de herramientas avanzadas para la depuración

5 Se agregarán puntos de interrupción a una aplicación y se revisarán las opciones de ejecución línea a línea, usando Visual Studio. 1. Usando Visual Studio, abra la solución Ejercicios. 2. En el Solution Explorer encuentre el nodo correspondiente a Alcance – Module1.vb. Haga doble clic en dicho nodo para editar el código. Establezca el proyecto como proyecto de inicio (StartUp Project).

➤ Apilado de herramientas en Visual Studio 3. Seleccione la línea Module

Module1

y establezca un punto de interrupción.

4. Inicie la depuración de la solución (tecla F5). 5. En tiempo de depuración aparecen dos herramientas principales: Auto y Command Window. En realidad son muchas más herramientas, sólo que no están visibles por el momento. Como podrá comprobar, en tiempo de depuración Command Window comparte su espacio con otras herramientas: Call Stack, Breakpoints, Immediate Window y Output.

166

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Por otro lado, Autos comparte su espacio con otras herramientas: Locals y Watch 1.

7. Cuando hay varias herramientas apiladas en un mismo espacio en Visual Studio, cada una constituye una ficha de selección horizontal (Tabs). La forma de seleccionar alguna de las herramientas es haciendo clic sobre la ficha. En caso de que las herramientas estén en modo de ocultación automática, lo que usted verá serán las pestañas de selección vertical de las fichas; cumplen con la misma funcionalidad que las horizontales, sólo que se distribuirán en los extremos laterales de Visual Studio.

➤ Ventanas de variables (variable windows) 8. Visual Studio proporciona una serie de herramientas que permiten ver los cambios que las variables experimentan en tiempo de depuración. A estas herramientas se les da el nombre de ventanas de variables (variable windows). Ordinariamente se trata de Locals, Autos, Watch y Quick Watch. Cada una de las ventanas muestra tres columnas: nombre de la variable (name), valor (value) y tipo de dato (type). 9. La ventana Autos sirve para mostrar las variables utilizadas por la línea de código que actualmente se está ejecutando, así como las variables utilizadas por las líneas anteriores a la que se está ejecutando, dentro de un mismo alcance. Esta ventana cambia dinámicamente y es alimentada por el Depurador de Visual Studio (debugger). 10. Oprima repetidamente la tecla F11 hasta llegar a Sub Main(). Vea los cambios que experimenta la ventana Autos.

Capítulo 5. Espacios de nombres y desarrollo de librerías

167

11. Vea cómo se muestran dos variables. Al llegar a Sub Main() detecta que el procedimiento tiene una variable llamada Texto2, que aún no toma valor. La variable Texto1, aunque no forma parte del procedimiento, se muestra porque está disponible dado que tiene alcance de módulo. En otras palabras, es una variable utilizada por las líneas anteriores a la actual. 12. Seleccione la pestaña Locals. Esta herramienta sólo mostrará las variables locales del alcance en que se encuentra la línea de código que actualmente se está ejecutando. Dada la línea en la que nos encontramos, sólo aparecerá la variable Texto2.

13. Seleccione Watch 1. Esta herramienta permite agregar variables y expresiones que deseamos saber cuánto valen en todo momento. Esta herramienta no carga variables automáticamente, por lo que hay que especificarle qué queremos que muestre. 14. La ventana Quick Watch (oprima las teclas Ctrl-Alt-Q) funciona de forma parecida a Watch, con la diferencia de que puede mostrar sólo el contenido de una variable o expresión en un momento dado. Por ejemplo, si queremos saber qué valor tiene la variable Texto4 en este momento, presionamos las teclas Ctrl-Alt-Q, con lo que aparecerá Quick Watch. Coloque en Expression Texto4 y haga clic en Reevaluate. Con ello se mostrará el contenido de la variable. En nuestro caso, Texto4 no está dentro del alcance en donde nos encontramos, por lo cual se reporta como no declarada.

5

168

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

15. Si estando en Quick Watch hacemos clic en Add Watch, la variable que evaluamos se agregará a Watch.

➤ Ventanas de inspección de código 16. Seleccione Call Stack, que se encuentra apilada junto con Command Window. En esta herramienta se muestran los programas, procedimientos y métodos que se están ejecutando en un momento dado. En caso de que un procedimiento llame a otro procedimiento, aparecerán los dos.

17. En nuestro caso, muestra que actualmente nos encontramos en la línea 37, en el Procedimiento2() que fue llamado en la línea 18 por el procedimiento Main(). Saber de dónde nace la ejecución de un procedimiento ayuda a resolver el origen de los problemas, en caso de que se presenten. Resulta interesante ver que Call Stack revisa el origen de los procedimientos hasta llegar al ensamblado (Alcance.exe), dando información del proyecto (Alcance), el programa (Module1) y finalmente el procedimiento.

Capítulo 5. Espacios de nombres y desarrollo de librerías

169

18. Seleccione Breakpoints, que sirve para mostrar todos los puntos de interrupción y su estado. Con esta herramienta podemos saber la línea en que se encuentran, si están activos o no, si les aplican condiciones y en qué casos detendrán la depuración. En nuestro caso aparece el único punto de interrupción que agregamos.

19. Seleccione Immediate Window, que sirve para evaluar expresiones y variables de una forma programática y a petición. 20. Para desplegar valores podemos utilizar el comando Print, con su alias ? 21. Escriba en Immediate Window la siguientes instrucciones: ? Texto1 Debug.StepInto ? Texto1

5

22. Lo que hicimos fue mostrar el contenido de Text1. Luego provocamos que la depuración avanzara en modo Step Into, con lo cual la variable adquirió valor; se volvió a mostrar el contenido de la variable Texto1 y pudimos comprobar el nuevo valor de la variable. 23. Detenga la depuración, elimine todos los puntos de interrupción y guarde su solución. FIN DEL EJERCICIO*

170

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 5. Espacios de nombres y desarrollo de librerías

171

TERMINOLOGÍA Alias de importación, 151 Aplicación, 141 Autos, 166 Breakpoint, 158 Code steping, 158 Edit and continue, 160

Ejecución línea por línea, 158 Espacio de nombres, 141 Extensibilidad, 141 Fully qualified name, 148 Imports, 148

Locals, 166 Namespace, 141 Nombres calificados, 148 fuertes, 152 Punto(s) de interrupción, 158 condicionales, 160

Quick Watch, 166 References, 152 Referencia, 151 Strong names, 152 Variable windows, 166 Watch, 166

PREGUNTAS 5.1 ¿Cuáles son los espacios de nombres principales de BCL? 5.2 ¿Qué función tiene el estatuto Import? 5.3 ¿Qué beneficio deriva de programar librerías? 5.4 Mencione los espacios de nombres que cree usted que contengan la funcionalidad necesaria para dar soporte a sus aplicaciones profesionales.

5

172

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:

Capítulo 5. Espacios de nombres y desarrollo de librerías

EXAMEN

173

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Sistema lógico de organización de clases de .NET Framework, de acuerdo a su funcionalidad: a) Global Assembly Cache b) Biblioteca de Clases Base c) Espacios de nombres 2. Es la especificación textual de la jerarquía de espacios de nombres que permite ubicar una clase o type: a) Nombres calificados b) Espacios de nombres c) Object Hierarchy 3. Es la instrucción a través de la cual se especifican los espacios de nombre que utilizará un programa: a) Imports b) Reference c) Using 4. Es la equivalencia de nombre que le damos a un espacio de nombres: a) Alias de importación b) Reference c) Nombre calificado 5. Es el fenómeno que se presenta cuando en un programa se refieren dos métodos, pertenecientes a espacios de nombres diferentes, pero que tienen el mismo nombre: a) Colisión de nombre b) Contaminación de espacios de nombres c) Concurrencia de nombres

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6. 7. 8. 9. 10.

Los espacios de nombres reflejan la jerarquía lógica y física de las clases en .NET Framework. Las librerías de .NET Framework son totalmente independientes del Registro de Windows. Las principales jerarquías de espacios de nombres en .NET Framework son System y Objects. El explorador de objetos permite verificar los objetos que estamos utilizando y sus características. En .NET, cada programa puede disponer de su propia versión de una librería, como consecuencia de la información contenida en el metadatos.

5

CAPÍTULO

6

Manejo de operadores Objetivos: Aprender el manejo de los operadores aritméticos, de asignación, de comparación y lógicos, con todas sus variantes. 1. Reconocerá los operadores aritméticos y la forma en que se emplean. 2. Sabrá qué son los operadores de asignación y de asignación incluyente, y cómo se manejan. 3. Se familiarizará con los operadores comparativos y cómo se manejan. 4. Aprenderá a manejar los operadores Is y Like, para llevar a cabo comparaciones complejas de datos String. 5. Entenderá qué son los operadores lógicos y los operadores lógicos de circuito corto, y cómo se manejan. 6. Comprenderá cuál es la prioridad de ejecución de los operadores, y cómo se maneja ésta utilizando paréntesis.

175

176

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Expresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de asignación incluyente . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores comparativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Consideraciones relativas al código ASCII . . . . . . . . . . . . . . . . . . . . . . . Option Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores Is, IsNot y TypeOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operador Like . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores lógicos de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . Tabla de comportamiento de operadores lógicos . . . . . . . . . . . . . . . . . Prioridad entre operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de paréntesis para otorgar preferencia de ejecución . . . . . . . . . . Utilización general de operadores de Visual Basic . . . . . . . . . . . ➤ Comentarios en bloques de código . . . . . . . . . . . . . . . . ➤ Uso de Clipboard Ring . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Selección basada en bloques de código (Block Selection) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de operadores de asignación incluyente y operadores de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

177 178 178 179 180 181 182 183 183 185 187 188 189 190 191 192 193 195 196 200 201 201 203

Capítulo 6. Manejo de operadores

177

Sabemos que el procesador constituye el corazón de un sistema de computación: ahí es donde esencialmente se lleva a cabo el procesamiento de la información en forma de operaciones aritméticas y lógicas. Los operadores son los elementos de que se vale un lenguaje de programación para la transformación de expresiones mediante cálculos o comparaciones; son elementales en el sentido de que nada se calcula y nada se decide sin su presencia. Ya sabemos qué tipos de datos admite .NET y cómo se definen; el presente capítulo explica que no sólo es importante declarar y almacenar datos, sino manipularlos de tal forma que a partir de ellos se genere información nueva. Ésta es la esencia del cómputo.

Operadores aritméticos ¿Quién no conoce los operadores aritméticos? Debido a que forman parte de la educación básica difícilmente podríamos agregar algo que no se sepa con respecto a ellos. Quizá lo “nuevo” sea la forma en que Visual Basic utiliza los operadores aritméticos. No obstante lo obvio del tema, para no ser omisos definiremos a los operadores aritméticos como los símbolos que producen, a partir de dos expresiones numéricas conocidas, una nueva expresión numérica, como resultado de la aplicación de un cálculo aritmético entre aquéllas. El lenguaje dispone de los siguientes operadores aritméticos básicos: +

Suma (concatenación)

Suma expresiones numéricas. Concatena expresiones de tipo String.



Resta

Representa la diferencia entre dos números o especifica la condición negativa de uno.

*

Multiplicación

Multiplica dos números.

/

División

Divide un número entre otro.

\

División entera

Divide un número entre otro, dando un resultado necesariamente entero.

Módulo

Divide un número entre otro, dando como resultado el residuo.

Exponenciación

Sirve para elevar un número a una determinada potencia; un número puede ser negativo si el

Mod ^

exponente es un entero.

6

178

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = Expresión1 Operador Expresión2 Donde Expresión1, Expresión2 y Resultado son siempre datos numéricos; Operador es el operador aritmético utilizado. Se debe tomar en cuenta que Resultado puede no ser del mismo tipo que las expresiones; por ejemplo, la suma de dos Integer, 2,000,000,000 y 2,000,000,000, no es Integer, y la división de un Integer 3, entre 2, no dará un número Integer. NOTA En el caso de los datos de tipo String, es posible utilizar el operador de suma, que se encarga de concatenar o unir las expresiones. Para evitar la ambigüedad del operador “+”, Visual Basic acepta el uso del símbolo “&” para concatenación de expresiones String. En realidad, la concatenación no se considera una operación aritmética.

Operadores de asignación Los operadores de asignación son los que permiten asignar un valor a una variable o propiedad. El ejemplo clásico de este tipo de operadores es el signo de “igual” (=). Variable = Valor donde Variable es una variable o propiedad que puede recibir valores, y Valor, una expresión válida para el tipo de dato de Variable.

Expresión Aunque puede resultar obvio, una expresión es un valor, existente o derivado: es expresión existente si corresponde a una literal válida para un determinado tipo de dato, o una variable que la contenga; es expresión derivada, cuando es el resultado de someter varios valores existentes, sean éstos variables o literales, a la acción de operadores. Vea los siguientes ejemplos de expresiones: 4 “A” 4+5 3=2 “A” & “B”

Existente. Valor numérico 4 Existente. Valor String A Derivado. Valor numérico 9 Derivado. Valor lógico False, pues 3 y 2 no son iguales Derivado. Valor de concatenación String AB

Capítulo 6. Manejo de operadores

179

Considere los siguientes ejemplos, después de definir la siguiente variable: Dim Edad As Integer = 20

Expresiones que podemos utilizar: La variable misma

Edad

La transformación de la variable

str(Edad) “Edad:” & Str(Edad)

La transformación de la variable y otras literales

Operadores de asignación incluyente Son operadores de asignación incluyente aquellos que consideran el valor que posee la variable o propiedad a la que se le asigna el valor como primera expresión de una operación, asignando el resultado de la operación a la variable misma. Los operadores de asignación incluyente existen para los siguientes operadores: ^, *, /, \, +, –, &, y la forma de representarlos es el operador seguido inmediatamente por un signo de igual. Veamos las siguientes asignaciones equivalentes: x = x +1 x = x-1 x = x * 4 x = x ^ 2

Es lo mismo que Es lo mismo que Es lo mismo que Es lo mismo que

x += 1 x –= 1 x *= 4 x ^= 2

Vea los siguientes ejemplos: Hace que Var1 Si Var1 vale

Y Var2 vale

La operación

valga

10

3

var1 ^= var2

1000

10

3

var1 *= var2

30

12

3

var1 /= var2

4

10

3

var1 \= var2

3

10

3

var1 += var2

13

“ABC”

“DEF”

var1 &= var2

“ABCDEF”

10

3

var1 -= var2

7

6

180

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Operadores comparativos Los operadores comparativos permiten comparar expresiones, una en relación con otra, para dar como resultado un valor de falso (False), verdadero (True) o nulo (Null), dependiendo de si la comparación es una verdad o no. Hasta el momento no hemos tratado los valores nulos; los valores nulos son la ausencia de valor alguno, y su utilidad es para aplicaciones específicas en donde la afectación de un valor es importante. La siguiente tabla presenta los operadores comparativos que Visual Basic maneja: Operador < (Menor que)

(Mayor que) >= (Mayor o igual que) = (Igual a)

(Distinto de)

Verdadero si

Falso si

Nulo si

expresión1 < expresión2

expresión1 >= expresión2

= Null

expresión1 expresión2

= Null

expresión1 > expresión2

expresión1 = expresión2

expresión1 < expresión2

= Null

expresión1 = expresión2

expresión1 expresión2

expresión1 o expresión2 = Null

expresión1 expresión2

expresión1 = expresión2

= Null

expresión1 o expresión2

expresión1 o expresión2

expresión1 o expresión2

expresión1 o expresión2

expresión1 o expresión2

La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = Expresión1 Operador Expresión2 Expresión1 y Expresión2 pueden ser cualquier tipo de expresiones comparables entre sí. Resultado será siempre lógico (True, False), o nulo (Null). Operador es el operador utilizado para la comparación.

Capítulo 6. Manejo de operadores

181

Algunos ejemplos del uso de estos operadores son: “A” = “B”

Retorna False

1 > 0.5

Retorna True

2 >= 2

Retorna True

“S” < “s”

Retorna True

Tome en cuenta que las letras mayúsculas, para efectos de comparación, tienen un valor en código ASCII menor a las minúsculas; por tanto, son menores. Adicionalmente, la “A” es menor que la “Z”.

Consideraciones relativas al código ASCII El juego de caracteres de siete bits denominado ASCII (American Standard Code Information Interchange / Código Estándar Estadounidense para el Intercambio de Información) es ampliamente utilizado para representar letras y símbolos de un teclado estándar de Estados Unidos. El juego de caracteres ASCII es igual que los primeros 128 caracteres (0-127) del juego de caracteres ANSI, utilizado por las máquinas antiguas. Es importante que conozca algunas referencias del código ASCII que pueden serle de utilidad: Código ASCII

Representa

8

BackSpace (RETROCESO)

13

Enter (INTRO)

32

SpaceBar (BARRA ESPACIADORA)

64

“@”

92

“\”

Código ASCII

Representa

48 al 57

“0” al “9”

65 al 90

“A” a la “Z”

97 al 122

“a” a la “z”

225, 233, 237,

“á”, “é”, “í”,

243, 250, 241

“ó”, “ú”, “ñ”

Algunas personas, sobre todo aquellas que no tienen su teclado configurado adecuadamente, saben que presionando la tecla ALT y las correspondientes del teclado numérico a un código ASCII, éste aparecerá. Para ello es necesario que el teclado nu-

6

182

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mérico esté activado (teniendo el BLOQ NUM / NUM LOCK activado). Por ejemplo: equivale a teclear

Alt + 64

“@”

Visual Basic, por otro lado, tiene funciones que permiten obtener la representación simbólica de un código ASCII, así como el código ASCII a partir de una representación simbólica. Las funciones que lo permiten son Chr( ) y Asc( ), respectivamente. Estas funciones emplean la siguiente sintaxis: Chr(CódigoASCII ) Asc(“Caracter”)

Por ejemplo: Chr(64)



“@”

Asc(“@”)



64

Option Compare Uno de los conceptos importantes relacionado con la comparación de datos (específicamente de los de tipo String), es su sensibilidad al uso de mayúsculas y minúsculas. Se dice que un esquema de comparación es case-sensitive cuando una comparación es sensible a la diferencia entre mayúsculas y minúsculas (“A” ≠ “a”). Se dice que un esquema de comparación es non case-sensitive, cuando una comparación no lo es (“A” = “a”). En el caso de Visual Basic, podemos especificar de qué manera queremos que nuestros programas se comporten respecto de las comparaciones. Para ello, utilizamos el estatuto Option Compare. Su sintaxis es la siguiente: Option Compare [Text / Binary]

Si se especifica Option Compare Text, las comparaciones se realizarán bajo el esquema insensible al uso de mayúsculas y minúsculas; si se especifica Option Compare Binary, las comparaciones se realizarán bajo el esquema sensible. debe especificarse al inicio de los programas, antes de cualquier línea de código. Si se omite la especificación, el esquema de comparación será sensible (Binary).

Option Compare

Capítulo 6. Manejo de operadores

183

Operadores Is, IsNot y TypeOf Además de los operadores comparativos comunes, Visual Basic proporciona dos operadores comparativos especiales: Is y Like. El operador Is es un operador que determina si una variable hace referencia a la misma posición de memoria que otra. La forma en que se resuelve este operador es la siguiente: Resultado = Expresión1 Is Expresión2 Expresión1 y Expresión2 deben ser variables reference type. Resultado siempre es lógico (True, False). devolverá verdadero (True) si las variables comparadas refieren a la misma posición de memoria, y falso (False) si refieren a posiciones distintas de memoria.

Is

En ocasiones, lo que se desea saber es si un objeto no refiere la misma posición que otro. Anteriormente, la tarea se debía realizar combinando los operadores Not e Is, de la siguiente forma: If Not Objeto1 Is Objeto2 Then WriteLine(“Diferentes”)

Dado que esta expresión es poco natural en su lectura, Visual Basic incluye el operador IsNot, que devuelve True en caso de que dos objetos no refieran a la misma posición de memoria. La línea de código quedaría como sigue: If Objeto1 IsNot Objeto2 Then WriteLine(“Diferentes”)

En ocasiones la comparación no se realiza entre un objeto y otro, sino entre un objeto y un type. Visual Basic incluye un operador denominado TypeOf... Is, que devuelve verdadero en caso de que un objeto sea de un tipo determinado. Por ejemplo, si deseamos saber si la variable X es de tipo Integer, tendríamos que especificar lo siguiente: If (TypeOf X Is Integer) Then WriteLine(“X es Integer”)

Operador Like El operador Like compara dos expresiones String, no en términos de igualdad, sino en términos de cumplimiento de un patrón determinado. Este operador es especialmente útil cuando se verifica si una cadena de caracteres compuesta obedece a un formato predefinido. Imagine un código de producto que siempre sea de tres letras, un guión y cuatro números; en tal caso se tienen dos opciones: utilizar Like

6

184

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

o desarrollar una rutina que analice carácter por carácter la expresión y sus posiciones. Sobra decir que utilizar Like es mucho más efectivo. La forma en que se resuelve este operador es la siguiente: Resultado = Expresión1 Like Expresión2 Expresión1 debe ser una expresión de tipo String; Expresión2 es un patrón String que se pretende reconocer como existente en Expresión1. Resultado siempre es lógico (True, False). Like retornará verdadero (True) si el patrón a buscar es reconocido dentro del dato String

base de la comparación, y falso (False) en caso de que no se reconozca. El patrón a buscar, llamado patrón nominado, es una literal conformada por caracteres especiales que representan el contenido de caracteres a buscar; a continuación una tabla que muestra dichos caracteres y su significado.

Carácter de patrón

Significado

?

Cualquier carácter

*

Varios caracteres o ninguno

#

Cualquier dígito (0-9)

[lista]

Cualquier carácter de la lista

[!lista]

Cualquier carácter que no esté en la lista

Considere los siguientes ejemplos: “F” Like “F”

Devuelve True

“24/10/2002” Like “##/##/####”

Devuelve True

“ABC” Like “AB*”

Devuelve True

“MP3” Like “[A-Z][A-Z]#”

Devuelve True

“MPG” Like “[A-Z][A-Z]#”

Devuelve False

“MP3” Like “[A-Z][A-Z]?”

Devuelve True

“MPG” Like “[A-Z][A-Z]?”

Devuelve True

“AMERICA” Like “A*A”

Devuelve True

“HP2992” Like “[!H]*”

Devuelve False

“DP2992” Like “[!H]*”

Devuelve True

[email protected]” Like “*@*”

Devuelve True

Capítulo 6. Manejo de operadores

185

Recomendamos utilizar los patrones para determinar la validez de formatos mixtos de datos; por ejemplo, claves de cuatro letras y tres números. Si lo que va a evaluar son formatos más estándar, como números o fechas, recomendamos otras funciones más sofisticadas como IsNumeric() o IsDate().

Operadores lógicos Los operadores lógicos son aquellos que sirven para unir o negar condiciones, produciendo un valor lógico. Los operadores lógicos básicos son: ❑ Not Niega el resultado de una condición. Revierte el valor; si la condición que afecta es True

producirá False, y viceversa.

❑ And Cuando de entre dos condiciones las dos deben ser True para que en su conjunto

la expresión sea True. (Con todas las condiciones True, devolverá True). ❑ Or Cuando de entre dos condiciones, al menos una debe ser True para que en su con-

junto la expresión sea True. (Con al menos una condición True, devolverá True.) ❑ Xor Cuando entre dos condiciones, al menos una cumple por True, pero no las dos.

La forma en que se resuelven este tipo de operadores es la siguiente: Resultado = [Expresión1] Operador Expresión2 Expresión1 y Expresión2 son expresiones de tipo lógico. En el caso de Not, Expresión1 no se debe poner, ya que el operador actúa sobre una sola expresión. Resultado será siempre lógico (True, False). Cuando una expresión lógica se compone de una sola comparación, se dice que es una expresión lógica simple debido a que se resolverá en sólo un tiempo; si involucra dos o más comparaciones, o la utilización de un operador lógico, se dice que es una expresión lógica compuesta, debido a que la expresión lógica deberá resolverse en dos o más tiempos (se resuelve la comparación y luego se resuelve dentro del contexto en que se encuentra). Una expresión lógica compuesta siempre se compone de expresiones lógicas simples, afectadas por operadores lógicos que las obligan a resolverse como una sola expresión lógica.

6

186

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejemplos:

Not True

Es False, porque es lo contrario a True.

Not False

Es True, porque es lo contrario a False.

Not “A” = “B”

Es True, porque “A” = “B” es False, pero negado es True.

“A” = “B” And 1 > 0.5

Es False, porque no todas las condiciones son True.

“A” = “B” Or 1 > 0.5

Es True, porque al menos una condición es True.

En caso de tenerse más de dos condiciones conjuntas, entra en operación lo que se conoce como preferencia, que consiste en determinar el orden en que las condiciones u operaciones se han de resolver. Por ejemplo: “A” = “B” OR 1 > 0.5 AND 2 >= 2 AND “S” > “s”

es False. Las condiciones se resuelven de izquierda a derecha. Vea la explicación en la figura 6.1: FIGURA 6.1 Resolución de una expresión con múltiples condiciones

❑ Primero se resuelven las condiciones de comparación. ❑ Una vez resueltas las condiciones de comparación, se sigue el orden de izquierda a de-

recha: se resuelve la primera condición de tipo lógico; el resultado de ésta forma parte de la siguiente condición, y así hasta terminar. ❑ La expresión inicia siendo una expresión lógica compuesta, formada por cuatro expre-

siones lógicas simples, que con la ayuda de tres operadores lógicos se ven obligadas a resolverse como una sola expresión lógica que termina con un valor False.

Capítulo 6. Manejo de operadores

187

Las condiciones se resuelven como si tuvieran paréntesis imaginarios: ( ( (“A” = “B” Or 1 > 0.5) And 2 >= 2) And “S” > “s”)

En donde las condiciones encerradas en los paréntesis de mayor profundidad se resuelven primero. Si usted agrega de manera explícita paréntesis en las condiciones, les asignará preferencia. Por ejemplo, cambiemos un poco el orden del ejemplo anterior y veamos qué sucede: “S” > “s” Or 2 >= 2 And 1 > 0.5 And “A” = “B”

De acuerdo a lo que vimos, se resolvería la primera condición con la segunda (False Or True, se resuelve como True), el resultado se resolvería con la tercera (True And True, devuelve True), y el resultado se resolvería con la cuarta (True And False, devuelve False). El resultado de lo último que se resolvió fue False. ¿Cómo cambiaríamos la condición, mediante el uso de paréntesis, para que el resultado fuera verdadero? A continuación una solución: (“S” < “s” OR ( 2 >= 2 AND 1 > 0.5 And “A” = “B”))

De esta forma forzamos que en primera instancia se resuelva el paréntesis de mayor profundidad, que contiene la segunda, tercera y cuarta expresiones (True And True And False, devuelve False), el resultado se resuelve con la primera condición, por ser el paréntesis de mayor profundidad que sigue (True Or False, devuelve True). Una regla es que siempre debe cerrar los paréntesis que abra. Una inadecuada colocación de condiciones puede arrojar resultados erróneos; le recomendamos que aunque de forma predefinida existe una preferencia, usted determine claramente cuál desea, utilizando paréntesis cuando tenga más de una condición por resolver.

Operadores lógicos de circuito corto En programación es común que para que algo suceda, debe cumplirse más de una condición. Uno de los problemas que tenía la anterior versión de Visual Basic, es que no era lo suficientemente inteligente para saber que ya no tenía caso resolver ciertas condiciones, en el caso de And y Or. Sabemos que en el caso de And, si una expresión lógica es False todo es False; si en una comparación nos encontramos que la primera expresión lógica es False, ¿qué caso tiene resolver la segunda expresión?

6

188

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se denominan operadores lógicos de circuito corto (short- circuiting), aquellos que son capaces de determinar la necesidad de continuar evaluando condiciones posteriores a las primeras. Son dos: ❑ AndAlso

Procesa comparaciones lógicas de circuito corto, de tipo And; produce False a la primera expresión False que se encuentra, y concluye con la resolución de expresiones.

❑ OrElse

Procesa comparaciones lógicas de circuito corto, de tipo Or; produce True a la primera expresión True que se encuentra, y concluye con la resolución de expresiones.

Tabla de comportamiento de operadores lógicos La siguiente tabla muestra el comportamiento de los operadores lógicos:

Operador

Si Expresión1 es

Y Expresión2 es

Resultado

And

True

True

True

And

True

False

False

And

False

True

False

And

False

False

False

Or

True

True

True

Or

True

False

True

Or

False

True

True

Or

False

False

False

Xor

True

True

False True

Xor

True

False

Xor

False

True

True

Xor

False

False

False

AndAlso

True

True

True

AndAlso

True

False

False

AndAlso

False

Ni siquiera se evalúa

False

AndAlso

False

Ni siquiera se evalúa

False

OrElse

True

Ni siquiera se evalúa

True

OrElse

True

Ni siquiera se evalúa

True

OrElse

False

True

True

OrElse

False

False

False

Capítulo 6. Manejo de operadores

189

Prioridad entre operadores Cuando hay varias expresiones dentro de una expresión que las engloba, cada parte de ésta se evalúa y resuelve en un orden predeterminado donde ciertos operadores han de resolverse antes que otros; a esto se le conoce como prioridad de los operadores. Tener esto en mente es importante, pues algunos operadores requieren resolver expresiones derivadas antes de ser resueltas. Por ejemplo: (2+5) > (3+1)

No podemos resolver la expresión que implica el operador comparativo (>), si antes no resolvemos las expresiones que involucran el operador de suma (+). El procesador no resuelve operaciones a nivel abstracto. Cuando hay expresiones que contienen operadores de más de una categoría (aritméticos, de comparación y lógicos), se resuelven en este orden: 1. Las expresiones que tienen operadores aritméticos. 2. Las expresiones que tienen operadores de comparación. 3. Las expresiones que involucran operadores lógicos. Esto tiene sentido si tomamos en cuenta que la materia prima para los operadores aritméticos son generalmente expresiones numéricas o expresiones String, y con ellos se genera una nueva expresión numérica o expresión String. Los operadores de comparación, por su parte, tienen como materia prima dos expresiones numéricas o expresiones String, y con ellos se determina un valor lógico. Por último, los operadores lógicos permiten generar una expresión lógica de dos expresiones lógicas. Los operadores de comparación tienen la misma prioridad; es decir, se evalúan de izquierda a derecha en el orden en que aparecen. Los operadores se evalúan en el siguiente orden de prioridad: Aritméticos Exponenciación (^) Negatividad de expresión (–) Multiplicación y división (*, /) División de enteros (\) Módulo aritmético (Mod) Adición y sustracción (+, –)

6

190

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Comparación Igualdad (=) Desigualdad () Menor que () Menor o igual que (=)

Lógicos Not And Or Xor

Cuando hay multiplicación y división en la misma expresión, cada operación se evalúa a medida que aparece, de izquierda a derecha. Del mismo modo, cuando se presentan adiciones y sustracciones en una misma expresión, cada operación se evalúa tal como aparecen de izquierda a derecha.

Uso de paréntesis para otorgar preferencia de ejecución Es posible usar paréntesis para saltar el orden de preferencia y forzar que algunas partes de una expresión se evalúen antes que otras. Las operaciones entre paréntesis se realizarán antes que aquellas que se encuentren fuera. Sin embargo, dentro de los paréntesis, la prioridad de los operadores se mantiene según las reglas. Cuando se emplean paréntesis para determinar un orden de resolución de expresiones, se está especificando la preferencia de ejecución explícita. Cuando se deja que el lenguaje proporcione el orden de izquierda a derecha, atendiendo a la prioridad de los operadores, se habla de la preferencia de ejecución automática. Los programadores profesionales acostumbran el uso de la preferencia de ejecución explícita, ya que es más fácil de analizar al momento de depurar los programas y deja una idea clara de la forma en que se desea que las cosas se resuelvan. El operador de concatenación de cadenas (&) no es realmente un operador aritmético, pero en orden de prioridad se encuentra a continuación de todos los operadores aritméticos y antes que todos los operadores de comparación.

Capítulo 6. Manejo de operadores

191

No olvide que por más larga que parezca una expresión, todos los operadores actúan sobre dos expresiones, y de dos en dos, hasta dejar una sola expresión final que podrá ser asignada a una variable o propiedad, o utilizada por algún estatuto o función.

Ejercicio 6.1 Utilización general de operadores de Visual Basic En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso de variables en un proceso. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Operadores.

Windows – Console Application, llamado

3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Operadores 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

- Module1.vb

Module Module1 Sub Main() Dim Numero1 As Integer = 5 Dim Numero2 As Single = 2 Dim Texto1 As String = “Visual “ Dim Texto2 As String = “Basic.NET” Console.WriteLine(Numero1) Console.WriteLine(Numero2) Console.WriteLine(Numero1 + Numero2) Console.WriteLine(Numero1 – Numero2) Console.WriteLine(Numero1 * Numero2) Console.WriteLine(Numero1 / Numero2) Console.WriteLine(Numero1 \ Numero2) Console.WriteLine(Numero1 Mod Numero2) Console.WriteLine(Texto1 Is Texto2) Console.WriteLine(Texto1 IsNot Texto2) Console.WriteLine(Texto1 + Texto2) Console.WriteLine(Texto1.Trim() + Texto2.Trim()) Console.WriteLine(Texto1.Trim() + “ “ + Texto2.Trim()) Console.WriteLine(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

6

192

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Operadores

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. Los resultados son simples resoluciones de operadores que no requieren explicación. Lo único novedoso es el uso del método Trim del objeto String, que se encarga de eliminar los espacios adicionales en el texto. Los resultados deben ser los siguientes: 5 2 7 3 10 2.5 2 1 False True Visual Basic.NET VisualBasic.NET Visual Basic.NET Pulse INTRO para continuar

➤ Comentarios en bloques de código 6. En ocasiones se requiere comentar una buena cantidad de líneas de código. La alternativa más laboriosa y demorada es colocar un apóstrofo al inicio de cada línea; la otra alternativa es utilizar las herramientas de Visual Studio. 7. Seleccione de la línea 8 a la 20. 8.

Seleccione Edit – Advanced – Comment Selection, o presione la las teclas Ctrl-K, Ctrl-C. Esta secuencia de teclas se especifica presionando Ctrl-K, soltando, e inmediatamente presionando Ctrl-C. Se debieron haber comentado todas las líneas que estaban seleccionadas:

Capítulo 6. Manejo de operadores

193

9. Marque nuevamente las líneas de la 8 a la 20, que se encuentran comentadas. 10.

Seleccione Edit – Advanced – Uncomment Selection, o presione la secuencia de teclas Ctrl-K, Ctrl-U. Los apóstrofos debieron desaparecer.

➤ Uso de Clipboard Ring 11. Una de las tareas más comunes realizadas dentro de un editor de textos es copiar y pegar código (copy and paste). Generalmente al seleccionar código se parte de una posición determinada en una línea, se selecciona todo lo que resta de la línea hacia la derecha, se incluyen varias líneas y se llega a una posición determinada de una línea de fin. En términos generales, el copiado se hace con base en líneas de código, a lo que se conoce como line-based copy-paste.

6

194

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Se oprime la combinación de teclas Ctrl-C o Ctrl-X para copiar o mover el contenido seleccionado al portapapeles del equipo, que es la memoria temporal de trabajo en el ambiente Windows. Una vez que se tiene algo en el portapapeles, se puede pegar su contenido en un lugar determinado, oprimiendo Ctrl-V. Existe la creencia generalizada de que sólo se mantiene en el portapapeles lo último que se copia. 13. Realice, utilizando Ctrl-X y Ctrl-V, los siguientes cambios: mueva la línea 9 justo antes de la línea 8, y ponga la línea 17 inmediatamente antes de la 16. Ponga atención a cómo lo hace. 14. Seguramente seleccionó la línea 9 de manera completa, oprimió Ctrl-X, se colocó al inicio de la línea 8 y oprimió Ctrl -V. Después seleccionó la línea 17 de manera completa, oprimió Ctrl -X, se colocó al inicio de la línea 16 y oprimió Ctrl -V. ¿Es correcto? 15. El portapapeles realmente almacena hasta las últimas 20 cosas que haya copiado o colocado en él, y pueden ser extraídas utilizando Ctrl-Mayús-V. Al reunirse 20 contenidos en portapapeles y tratar de agregar uno más, el contenido más antiguo se pierde y el nuevo contenido toma la primera posición de recuperación. El portapapeles tiene una organización de recuperación LIFO (Last In, First Out / Últimas entradas, primeras salidas), que da lugar a lo que se conoce como circuito del portapapeles o Clipboard Ring. 16. Hay que deshacer los cambios que realizó, es decir, regresar las líneas 8 y 17 originales a su lugar. Para ello utilizaremos el circuito del portapapeles. 17. Seleccione completamente la que ahora es la línea 16. Oprima Ctrl-X. Con ello el portapapeles tiene almacenados los siguientes valores: 1: Console.WriteLine(Texto1 IsNot Texto2) ...

18. Seleccione completamente la que ahora es la línea 8. Oprima Ctrl-X. Con ello el portapapeles tiene almacenados los siguientes valores: 1: Console.WriteLine(Numero2) 2: Console.WriteLine(Texto1 IsNot Texto2) ...

19. Vaya a la que ahora es la línea 9 y oprima Ctrl-Mayús-V una vez. Visual Studio retornará lo que se tenga en la posición 1, que es lo último que colocamos en el portapapeles. 20. Vaya a la que ahora es la línea 17 y oprima Ctrl-Mayús-V dos veces. Visual Studio retornará en la primera ocasión la posición uno, y en la segunda la posición dos. Vea cómo se sustituye automáticamente lo que está retornándose del portapapeles.

Capítulo 6. Manejo de operadores

195

21. Imagine las posibilidades de almacenar en el portapapeles los nombres de las variables de uso más común en un proceso, y estarlas invocando de manera rápida en nuestra edición.

➤ Selección basada en bloques de código (Block Selection) 22. Analizando el código podemos darnos cuenta de que Console se repite en múltiples ocasiones. Se puede simplificar el código agregando un Import al inicio del programa, eliminando el nombre de la clase Console en todo nuestro código. El problema es quitar Console de las líneas, dado que tendríamos que hacerlo línea por línea. 23. Utilizando la selección basada en líneas no podemos seleccionar únicamente el nombre del objeto Console de todas ellas sin marcar el resto de la línea. 24. Visual Studio permite lo que se conoce como selección basada en bloques (Block Selection), que implica seleccionar un área rectangular del área de edición. 25. Trace un rectángulo que encierre los nombres de objeto Console en el área de edición. Para hacerlo, arrastre el puntero del ratón desde la esquina superior izquierda de lo que quiere marcar hasta la esquina inferior derecha mientras oprime la tecla Alt. No olvide incluir el punto de Console.

6

196

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

26. Oprima las teclas Ctrl-X para enviar el contenido al portapapeles, con lo cual se eliminan las referencias del código. 27. Vaya al inicio del programa, y antes de cualquier otra línea agregue la siguiente: Imports System.Console

28. Construya la solución (teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). FIN DEL EJERCICIO *

Ejercicio 6.2 Uso de operadores de asignación incluyente y operadores de circuito corto En este ejercicio se utilizará una aplicación de consola para comprobar los operadores de asignación incluyente, así como los operadores de circuito corto. El programa solicita tres números entre 1 y 10. A través de asignación incluyente se acumularán los valores capturados, y mediante los operadores de circuito corto se hará más eficiente un proceso, detectándose de entre los números capturados alguno que sea primo. Recuerde que un número primo es aquel que se divide sólo entre 1 y entre sí mismo; en el rango de nuestro ejemplo, los únicos números primos son 1, 2, 3 y 7. En este ejercicio se utilizará una aplicación de consola para comprobar la declaración y uso de variables en un proceso. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado Primos. 3. Edite el programa de tal forma que aparezca como sigue:

Capítulo 6. Manejo de operadores

Codificación de Primos 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

197

- Module1.vb

Option Explicit On Option Strict On Module Module1 Sub Main() Dim Dim Dim Dim

N1 As N2 As N3 As Total

Integer Integer Integer As Integer = 0

Console.WriteLine(“— Suma de 3 números ———————-”) Console.WriteLine(“— Sólo capture enteros del 1 al 10”) Console.Write(“Número 1 de 3:”) N1 = CInt(Console.ReadLine()) Console.Write(“Número 2 de 3:”) N2 = CInt(Console.ReadLine()) Console.Write(“Número 3 de 3:”) N3 = CInt(Console.ReadLine()) Total += N1 Total += N2 Total += N3 If ((N1 = 1 OrElse N1 = 2 OrElse N1 = 3 OrElse N1 = 7) OrElse _ (N2 = 1 OrElse N2 = 2 OrElse N2 = 3 OrElse N2 = 7) OrElse _ (N3 = 1 OrElse N3 = 2 OrElse N3 = 3 OrElse N3 = 7)) Then Console.WriteLine(“Al menos uno de los números es primo”) Else Console.WriteLine(“Ninguno de los números es primo”) End If Console.WriteLine(“Total:” & CType(Total, String)) Console.WriteLine(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

6

198

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Primos

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (CTRL-MAYÚS-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. El programa declara las variables de trabajo de la línea 5 a la 8. 6. Es importante que esté consciente de cómo estamos haciendo la conversión de datos, tanto al momento de recibir los valores de consola, como al mostrarlos, dado que nuestro programa es type safe. 7. Capture como datos de entrada los números 4, 6, 8. La línea 22 ejecuta una asignación incluyente basada en suma; Total += N1, es igual que haber escrito Total = Total + N1. En este caso, N1 vale cero porque no se le especificó valor al momento de ser declarada. Después de la línea 22, Total vale 0 + 4; es decir, 4; después de la línea 23, vale 4 + 6, es decir 10, y después de la línea 24, vale 10 + 8, es decir 18. Las líneas 26, 27 y 28 realmente son una sola línea de código. Se estará evaluando si N1 es alguno de los números primos posibles del 1 al 10. Si N1 es igual a 1, o igual a 2, o igual a 3, o si es igual a 7, la primera expresión es True. La misma comparación se realiza con N2 y con N3. Internamente, con los números que se proporcionaron, las operaciones se resolverían de la siguiente manera: if

((False OrElse False OrElse False OrElse False) OrElse _ (False OrElse False OrElse False OrElse False) OrElse _ (False OrElse False OrElse False OrElse False))

que sería lo mismo que: if (False)

Por tanto, el programa tendría una salida falsa, reportando que ninguno de los números tecleados es primo. Si todo ocurrió como se esperaba, la salida será la siguiente: –– Suma de 3 números –––––––––––––– –– Sólo capture enteros del 1 al 10 Número 1 de 3:4

Capítulo 6. Manejo de operadores

199

Número 2 de 3:6 Número 3 de 3:8 Ninguno de los números es primo Total:18 Pulse INTRO para continuar

8. Ahora ejecute el ensamblado, capturando los números 3, 6, 8. Si N1 es igual a 1, o igual a 2, o igual a 3, o si es igual a 7, la primera expresión es True. La misma comparación se realiza con N2 y con N3. Internamente, con los números que se proporcionaron, las operaciones se resolverían de la siguiente manera: If

((False OrElse False OrElse True OrElse False) OrElse

(False OrElse False OrElse False OrElse False) OrElse (False OrElse False OrElse False OrElse False))

que sería lo mismo que: If (True)

Como puede observar, la forma en que se resuelve la condición es mucho más simple debido a que los operadores de circuito corto. La primera condición se resuelve por True, debido a que con Or, ante la presencia de al menos un True, todo es True. Ya no se sigue evaluando más condiciones. Si todo ocurrió como se esperaba, la salida será la siguiente: –– Suma de 3 números –––––––––––––– –– Sólo capture enteros del 1 al 10 Número 1 de 3:3 Número 2 de 3:6 Número 3 de 3:8 Al menos uno de los números es primo Total:17 Pulse INTRO para continuar

6

200

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 6. Manejo de operadores

201

TERMINOLOGÍA And, 185 AndAlso, 188 Clipboard Ring, 193 Comment Selection, 192 Distinto de (), 180 División (/), 177 entera (\), 177 Exponenciación (^), 177 Expresión, 178 Igual a (=), 178, 180

Is, 183 IsNot, 183 Like, 183 Mayor o igual que (>=), 180 Mayor que (>), 180 Menor o igual que ( 18 Then If Registro = True Then Autorizacion = True End If

2) If Edad > 18 Then If Registro = True Then Autorizacion = True End If

3) For i = 1 to 10 x *= i If x > 30 Then Console.WriteLine(“Límite de treinta o más”) Exit For Next i End If

FIN DEL EJERCICIO*

Capítulo 7. Estructuras de decisión y control

MAPA

227

MENTAL DEL CAPÍTULO

7

228

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Bloque de código, 208 Bucles, 211 Case Else, 210 Do Loop, 214 Else, 209 Estatuto condicional, 208 Estructura(s) anidada, 215 de control, 211 de decisión, 207 envolvente, 215 Exit Do, 215

For, 212 While, 213 ExpresiónLógica, 208 For Next, 211 If, 208 Instrucciones, 208 Select Case, 210 Step, 212 Task List, 223 While, 212

PREGUNTAS 7.1

¿Cuáles son las estructuras de decisión más importantes y cuál es la sintaxis de cada una de ellas?

7.2

¿Cuáles son las estructuras de control más importantes y cuál es la sintaxis de cada una de ellas?

7.3

¿En qué casos es más recomendable utilizar Do

7.4

¿Cuáles son las reglas que se aplican al anidado de estructuras?

Loop

que While?

Capítulo 7. Estructuras de decisión y control

229

Notas:

7

230

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Son estructuras que permiten decidir qué líneas de código se han de ejecutar: a) Estructuras de decisión b) Estructuras condicionales c) Estructuras lógicas 2. Es un conjunto de líneas de código que tienen su propia identidad de ejecución: a) Procedimiento b) Bloque de código c) Transacción 3. Es la estructura ideal para cuando se han de ejecutar procesos mutuamente excluyentes, dependiendo de un valor determinado: a) If b) For c) Select Case 4. Es la estructura óptima cuando se conoce con certeza el número de iteraciones de un proceso: a) While b) For Next c) Select Case 5. Tipo de estructura que se presenta cuando una estructura se encuentra dentro de otra: a) Estructuras anidadas b) Grupo de estructuras c) Jerarquía de estructuras

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

If utiliza una expresión lógica para decidir la ejecución de código en sentido afirmativo o negativo.

7.

Las estructuras de control son conocidas también como bucles.

8.

Select Case es una estructura de control.

9.

Con While se pueden generar ciclos infinitos.

10.

La última estructura en abrirse debe ser la primera en cerrarse.

CAPÍTULO

8

Manejo estructurado de excepciones Objetivos: Aprenderá la forma de manejar errores y excepciones en .NET. 1. Aprenderá cuál es la diferencia entre errores y excepciones. 2. Aprenderá a manejar excepciones, utilizando el bloque Try Catch Finally. 3. Aprenderá a filtrar de manera específica las excepciones, a fin de controlar las respuestas de las aplicaciones frente a imprevistos. 4. Aprenderá a disparar excepciones generadas por el usuario

231

232

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Errores y Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manejo estructurado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Try...Catch...Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloque Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clase System.Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de Try Catch Finally y de las propiedades de la clase System. Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Despliegue de errores en tiempo de diseño usando Error List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calificadores de excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objeto Err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lanzamiento de excepciones propias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lanzamiento de excepciones definidas por el usuario . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

233 234 235 235 235 236 236 237 240 241 241 242 242 243 246 246 249 250 250 252

Capítulo 8. Manejo estructurado de excepciones

233

Un buen programador no es el que conoce todas las estructuras y funciones del lenguaje, sino aquel que garantiza la solución de los problemas a través de los programas que desarrolla. El desarrollo de aplicaciones, como toda actividad humana, es perfectible. Usted no debe preocuparse si sus programas presentan problemas en la primera compilación: resulta totalmente normal que un programa falle. Lo que no es normal es que desconozcamos cómo manejar las fallas de una manera lógica y estructurada que nos ayude a reducir el número de problemas hasta límites aceptables. La psicología indica que la madurez de una persona se mide por su capacidad de solucionar por sí misma sus propios problemas. Esta afirmación general se aplica al caso particular del desarrollo de programas: es un programador maduro el que sabe resolver problemas.

Errores y Excepciones Los errores son acciones u omisiones relacionadas con el proceso de desarrollo que producen comportamientos inesperados en el programa resultante. Por otro lado, existe un concepto denominado excepción, que es una violación a las reglas sintácticas o de alcance de un lenguaje de programación. Las excepciones pueden ser excepciones de software, si están relacionadas con una mala aplicación del lenguaje, o con la asignación de valores fuera de dominio a propiedades o argumentos; también pueden ser excepciones de hardware, cuando su origen tiene que ver con la falla o saturación de un dispositivo físico: el programa puede estar correcto, pero ¿cómo escribir información en un disco que está lleno, por ejemplo? Una excepción siempre es un error, debido a que el resultado obtenido no es el deseado, pero un error no siempre es una excepción; las excepciones por lo general interrumpen la ejecución de un programa, mientras que los errores pueden pasar desapercibidos para el compilador del lenguaje. Si un desarrollador entendió mal las especificaciones de un programa —una fórmula aritmética, por ejemplo—, es probable que codifique correctamente una fórmula que no es correcta; el programa no reportará errores en tiempo de compilación o ejecución, pero sin duda alguna generará resultados equivocados. El programa se compilará sin problemas, no tendrá excepciones, pero sí generará errores. Se concluye entonces que los errores tienen un universo más amplio de manifestaciones; las excepciones, en cambio, tienen un campo más reducido: el del uso inadecuado del lenguaje, manejo inadecuado de dominios o problemas de hardware.

8

234

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En términos llanos, hay que temerle más a los errores que a las excepciones, ya que las excepciones son un aspecto totalmente manejable en Visual Basic. NOTA Visual Studio brinda una excelente asistencia durante el proceso de desarrollo para reducir el número de fallas en los programas. Prácticamente se anticipa al programador en la detección de las excepciones; las únicas excepciones que ocurren en tiempo de ejecución son aquellas relacionadas con la asignación de valores inadecuados o fuera de rango a variables, argumentos, o propiedades. Las demás son detectadas en el editor de código (excepto algunas excepciones de hardware, que es posible detectar sólo hasta el momento de ejecución).

Manejo estructurado de excepciones Desde sus inicios, Visual Basic había manejado los errores a través del objeto Err. El manejo de errores era no estructurado: era difícil leer, depurar y mantener el código. Los saltos en el código no eran lo más apropiado para el modelo de programación estructurada, ya que la secuencia de los procesos se perdía. El manejo estructurado de excepciones (SEH/Structured Exception Handling) es la capacidad que tiene un lenguaje para permitir manejar excepciones a través de una estructura de control que “protege” porciones localizadas de código, de manera lógica y consistente, sin perder nunca la secuencia de los procesos. Algunas de las ventajas del manejo estructurado de excepciones son las siguientes: ❑ El manejo estructurado de excepciones permite delimitar claramente los bloques de có-

digo a proteger y determinar qué errores se espera que se produzcan. ❑ El flujo de ejecución es más sencillo de seguir, ya que no existen saltos en la ejecución

del código. ❑ Las estructuras para el manejo de excepciones se pueden anidar, ofreciendo mayor con-

trol al manejo de excepciones.

Capítulo 8. Manejo estructurado de excepciones

235

Try...Catch...Finally

8

Se puede implementar el manejo estructurado de excepciones a través del estatuto ...Catch...Finally. Bloque para el manejo estructurado de excepciones

Try-

Su sintaxis es la siguiente: Try

Código a ser protegido Catch

Define el tipo de excepción a capturar y la acción que deberá tomarse [Finally

Define acciones que podrán ser ejecutadas de manera opcional] End Try

Bloque Try Éstas son las particularidades del bloque Try

... End Try:

❑ Delimita el área de código en donde puede suceder una excepción. ❑ El código escrito dentro del bloque Try se considera código protegido. ❑ Si ocurre una excepción, el proceso se transfiere al bloque Catch, que contendrá el có-

digo que queremos ejecutar dado el caso. ❑ Se puede utilizar Exit Try para salir en cualquier instante del bloque de código prote-

gido, continuando el flujo del programa después del End

Try.

Bloque Catch Si una excepción sucede en el bloque Try, la ejecución de dicho programa se suspende y continúa al principio del bloque Catch. Estos bloques son una serie de estatutos que comienzan con la palabra reservada Catch, seguida de un tipo determinado y reconocido de excepción, así como la acción que deberá realizarse en caso de que la excepción sea detectada. Estas son las particularidades del bloque Catch:

236

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ Se puede utilizar uno o varios bloques Catch para manejar las excepciones. ❑ Se recomienda manejar de manera separada las excepciones que provoquen acciones

distintas, a fin de mantener la secuencia lógica del programa. ❑ Es posible capturar excepciones predefinidas en .NET Framework, o bien crear nuestras

propias excepciones. ❑ Se puede utilizar el estatuto When para comparar una excepción que ocurre con aquellas

reconocidas por .NET Framework, utilizando para ello el número único de excepción.

Bloque Finally El bloque Finally se ejecuta después del bloque Try, en caso de que no ocurran excepciones, o después del bloque Catch correspondiente, en caso de que sí haya sucedido una excepción. Este bloque es opcional en su definición, pero no en su ejecución; si se define un bloque éste se ejecutará siempre.

Finally,

El uso más común de Finally es liberar objetos o cerrar archivos después de que una excepción ha sucedido. En cierta forma, es lo mismo declarar Finally que escribir código fuera de Try. Aunque Finally es opcional, recomendamos su utilización pues aclara el código y permite la implantación de un manejo verdaderamente estructurado: primero a) se define qué se hace, luego, b) se define qué hacer si hay excepciones, y finalmente, c) se define qué ocurre después, hayan ocurrido o no excepciones. Si en el código protegido por Try no ocurren excepciones, el control del programa hace caso omiso del bloque Catch, para pasar directamente a la ejecución de Finally.

Clase System.Exception Visual Basic maneja las excepciones a través de la clase System.Exception. Recuerde que en Visual Basic todo es objeto, incluyendo una excepción que es capturada. Una sintaxis común de Catch es la siguiente: Catch

VariableExcepción As

System.Exception

En caso de que ocurra una excepción en el bloque de código protegido, el control del programa pasa a la línea Catch, se capturará la excepción y se almacenará en una instancia de la clase System.Exception que se declara en la misma línea Catch.

Capítulo 8. Manejo estructurado de excepciones

237

En nuestro ejemplo, VariableExcepción sería la variable objeto en donde estaría almacenada la información del problema ocurrido. En su calidad de objeto, VariableExcepción tendría las propiedades y los métodos de la clase que le dio origen, es decir, System.Exception. Algunas de las propiedades más relevantes de System.Exception son las siguientes: Propiedad

Descripción

Message

Contiene la información de lo que causó la excepción.

StackTrace

Antecedente de ejecución; muestra primeramente la línea que causó el error (en su formato interno de ejecución), sigue con el procedimiento, capítulo y otros datos si los hubiere. Esto permite ubicar, en el contexto modular del programa, a la excepción.

Source

Contiene el nombre de la aplicación u objeto que originó la excepción. Puede tratarse incluso de la librería de .NET Framework que es llamada a ejecución y que causa la excepción.

InnerException

El hecho de que una excepción se presente puede dar lugar a otras excepciones (por ejemplo, declarar mal una variable puede provocar excepciones al utilizar dicha variable). En caso de que se presenten excepciones anidadas, mostrará las excepciones que se presentaron en orden de aparición.

ToString

Muestra el nombre calificado de la excepción, el mensaje, el anidamiento de excepciones y el antecedente de ejecución.

Todo esto le quedará claro al hacer el primer ejercicio.

Ejercicio 8.1 Uso de Try Catch Finally y de las propiedades de la clase System.Exception En este ejercicio se protegerá un código determinado utilizando Try... Catch... El programa solicita dos números (un dividendo y un divisor), y a partir de ahí intentará una división. Deliberadamente se causará una excepción al tratar de dividir entre cero (lo cual, como sabemos, es imposible).

Finally...

1.

Abra la solución Ejercicios, que debe encontrarse en (archivo de extensión sln).

2.

Agregue a su solución un proyecto Windows – Console Application, llamado Excepciones1.

3.

Edite el programa de tal forma que aparezca como sigue:

C:\APVBNETVS\Ejercicios

8

238

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Excepciones1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main() Try WriteLine(“Prueba de manejo de Excepciones”) Dim N1, N2, Resultado As Decimal Write(“Dame el dividendo:”) N1 = CDec(ReadLine()) Write(“Dame el divisor:”) N2 = CDec(ReadLine()) Resultado = N1 / N2 WriteLine(“Resultado:” & Resultado.ToString) Catch eProblema As Exception WriteLine(“> Origen:”) WriteLine(eProblema.Source) WriteLine(“> Mensaje:”) WriteLine(eProblema.Message) WriteLine(“> Antecedente de ejecución:”) WriteLine(eProblema.StackTrace) WriteLine(“> Texto completo:”) WriteLine(eProblema.ToString) Finally Write(“Pulse INTRO para continuar”) ReadLine() End Try End Sub End Module

Ejecución guiada de Excepciones1 4.

– Module1.vb

Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (F5).

Capítulo 8. Manejo estructurado de excepciones

5.

239

Cuando se protege un bloque de código y éste no causa excepciones, se ejecutan los bloques Try y Finally, pero no Catch (este último se ejecuta sólo en el caso de excepciones). La línea 12 declara todas las variables que vamos a utilizar en nuestro programa. La línea 14 preguntará el número que actuará como dividendo (N1) y la línea 16 el que actuará como divisor (N2). La línea 17 es la que intenta la división (N1/N2), asignando el resultado a la variable Resultado.

6.

Proporcione el valor 10 como dividendo y 5 como divisor. En nuestro ejemplo, dividir 10 entre 5 no causa ningún problema, y por tanto, el programa trasladará el control de la ejecución de la línea 18 (bloque Try) a la 28 (bloque Finally); las líneas intermedias, que corresponden al bloque Catch, son ignoradas.

7.

Ejecute la aplicación nuevamente, pero proporcione el valor 10 como dividendo y 0 como divisor. Cuando intenta resolver la línea 14, el programa determina que eso no es posible, y genera una excepción. Al detectar que una excepción ha ocurrido, el control del programa se trasladará al bloque Catch, en la línea 19. La excepción que es capturada se almacenará como un objeto basado en System.Exception (declarada en la misma línea Catch). En nuestro caso, el objeto se llama eProblema.

Las líneas 21, 23, 25 y 27 muestran algunas propiedades importantes del objeto eProblema que nos ayudarán a entender qué excepción está ocurriendo y dónde. Después de ejecutar el código del bloque Catch, el programa ejecutará el bloque de código Finally. Si todo ocurrió como se esperaba, la salida será la siguiente: Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 > Origen: mscorlib > Mensaje: Attempted to divide by zero. > Antecedente de ejecución: at System.Decimal.FCallDivide(Decimal& result, Decimal d1, Decimal d2) at System.Decimal.Divide(Decimal d1, Decimal d2) at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\ Excepciones1\Module 1.vb:line 17 > Texto completo: System.DivideByZeroException: Attempted to divide by zero. at System.Decimal.FCallDivide(Decimal& result, Decimal d1, Decimal d2) at System.Decimal.Divide(Decimal d1, Decimal d2) at Excepciones1.Module1.Main() in C:\APVBNETVS\Ejercicios\ Excepciones1\Module 1.vb:line 17 Pulse INTRO para continuar

8

240

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Despliegue de errores en tiempo de diseño usando Error List 8. Ya vimos la forma en que se pueden detectar excepciones en tiempo de depuración; lo ideal, sin embargo, es percatarnos de las excepciones antes de ejecutar los programas. En el caso de nuestro ejemplo el programa es correcto, pero los datos que el usuario introduce son los que pueden causar las excepciones. Hay otros tipos de excepciones: los errores de sintaxis —violaciones a las reglas de escritura en un lenguaje de programación determinado—, junto con las referencias erróneas —el uso de elementos (variables, estructuras, clases, etcétera) que no han sido declarados o que no están disponibles dentro del alcance en el cual queremos utilizarlas— son el pan de cada día en las labores de desarrollo. 9. Hay una herramienta en Visual Studio, Error List, que permite ver los errores de sintaxis y las referencias erróneas en tiempo de diseño, es decir, durante la edición. 10. En Error List se muestran los errores (errors), alertas (warnings) y mensajes (messages) que se presentan en el código que estamos editando. Los errores son aquellas cosas que generarán la interrupción del programa en tiempo de depuración, las alertas son aquellos detalles que si bien no interrumpen la depuración, si son prácticas inadecuadas de programación. Los mensajes son los mensajes informativos proporcionados por Visual Studio, aplicables a lo que estemos editando. 11. Modifique la línea 12 de su código, cambiando el nombre de la variable N1 por N3. Al hacer esto se generarán múltiples problemas, dado que la variable N1 es utilizada en varias partes del programa y habrá quedado sin declararse. 12. Seleccione View – Error List (Ctrl-\, Ctrl-E) para ver la herramienta Error List.

Capítulo 8. Manejo estructurado de excepciones

241

13. En Error List se muestran los errores que contiene el programa, el archivo físico donde se encuentran los problemas y la línea de código en se encuentra (la línea, la columna y el proyecto al que pertenece). En la parte superior aparecen fichas en las que se puede seleccionar lo que queremos ver, sean errores (errors), alertas (warnings) o mensajes (messages). En nuestro caso sólo tenemos dos errores, que son reportados en Error List. 14. Error List mostrará los errores de toda la solución, por lo que es especialmente útil cuando modificamos librerías. De esta forma podemos percibir los efectos que tendrán nuestras modificaciones en otros programas que las consumen. 15. Si se hace doble clic en un error, Visual Studio trasladará el control a la posición en donde se encontró el mismo, lo que facilita enormemente la navegación en el código. 16. Haga doble clic en el error 2. Compruebe que se ha trasladado a la línea y la posición en donde se encontró el error. 17. Modifique la línea 12 de su código, y corrija el nombre de la variable que está ocasionando el problema. Cambie N3 por N1. 18. Guarde los cambios realizados en su solución. FIN DEL EJERCICIO*

Filtrado de excepciones Visual Basic proporciona mucha flexibilidad en el manejo de excepciones: posibilita tener rutinas genéricas, o bien, atender las excepciones de manera particular. También es posible seguir utilizando el objeto Err, que se utilizaba en versiones anteriores de Visual Basic.

Calificadores de excepción Los calificadores de excepción son los nombres reconocidos internamente por .NET para cada una de las excepciones que pueden ocurrir. Generalmente, el calificador de excepción proporciona una muy clara idea de lo que está sucediendo. En el caso del ejercicio 08.01, el calificador fue el siguiente: System.DivideByZeroException. ¿A alguien le queda duda de que se trata de una excepción determinada por la clase System, que tiene que ver con una división entre cero? Las excepciones que existen pueden ser muchas; hay dos formas de conocerlas: que sucedan (lo que no es muy recomendable), o bien, revisando la ayuda de Visual Basic, en donde cada clase lista las excepciones que pueden ocurrir en el uso de los objetos basados en ellas. Por ejemplo, la clase System tiene las siguientes excepciones importantes, entre otras:

8

242

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ ❑ ❑ ❑ ❑ ❑ ❑ ❑

DivideByZeroException DLLNotFoundException IndexOutOfRangeException InvalidCastException OutOfMemoryException OverFlowException PlataformNotSupportedException UnauthorizedException

Cada clase tendrá las suyas y habrá que investigarlas de manera particular. NOTA El editor de código de Visual Studio, al realizar la declaración Catch, sugiere a través de IntelliSense las excepciones válidas para lo que está desarrollando.

Objeto Err Visual Basic sigue proporcionando el objeto Err, utilizado en versiones pasadas de Visual Basic, con la limitación de que no se puede implementar el manejo estructurado de excepciones (Structured Exception Handling) usando Try... Catch... Finally..., y el manejo de errores (Error Handling) usando On Error, de manera simultánea. El objeto Err sí puede utilizarse en el manejo estructurado de excepciones. Esto es muy útil cuando se desea trabajar con números de error en lugar de calificadores de excepción, utilizando la propiedad Number.

Tipos de filtrado de excepciones Cuando al definir un bloque Catch utilizamos un calificador de excepción para capturar el problema, estamos creando un manejador de excepciones basado en tipos (Type-Filtered Exception Handler). Cuando al definir un bloque Catch no utilizamos un calificador de excepción, sino una condición diversa, estamos creando un manejador de excepciones del usuario (User-Filtered Exception Handler), utilizando el estatuto When. En un bloque Try se pueden especificar tantos bloques Catch como se desee. Entre más bloques Catch se tengan, más particular será el manejo de excepciones.

Capítulo 8. Manejo estructurado de excepciones

243

Ejercicio 8.2

8

Filtrado de excepciones

En este ejercicio se protegerá un código determinado, utilizando Try... Catch... FiEl programa solicita dos números (un dividendo y un divisor) y a partir de ahí se intentará una división. Como sabemos, no se puede dividir un número entre cero. Difiere del ejercicio anterior en que en éste no se manejarán las excepciones de manera genérica, sino particularmente, a través del filtrado de excepciones. nally....

Deliberadamente se causará una excepción al tratar de dividir entre cero, o proporcionando un valor que no es numérico. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado ciones2. 3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Excepciones2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

– Module1.vb

Option Explicit On Option Strict Off Imports System.Console Module Module1 Sub Main() Dim Satisfactorio As Boolean = True Try WriteLine(“Prueba de manejo de Excepciones”) Dim N1, N2, Resultado As Byte Write(“Dame el dividendo:”) N1 = ReadLine() Write(“Dame el divisor:”) N2 = ReadLine() Resultado = N1 / N2 WriteLine(“Resultado:” & Resultado.ToString) Catch eProblema As System.DivideByZeroException WriteLine(“>>>>>>> Se trató de dividir entre cero”)

Excep-

244

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

WriteLine(“Error:” & Err.Number.ToString) Satisfactorio = False Catch eProblema As System.InvalidCastException WriteLine(“>>>>>>> La conversión cast no es posible”) WriteLine(“Error:” & Err.Number.ToString) Satisfactorio = False Catch When Err.Number = 6 WriteLine(“>>>>>>> Manejo fuera de límite (Overflow)”) Satisfactorio = False Finally If Satisfactorio Then WriteLine(“Programa sin problemas”) Else WriteLine(“Programa con problemas.”) End If End Try Write(“Pulse INTRO para continuar”) ReadLine() End Sub End Module

Ejecución guiada de Excepciones2

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (F5). 5. Es importante tomar en cuenta que este programa no es type safe dado que tiene la indicación Option Strict Off (línea 2); esto porque intentaremos conversiones tipo cast. También es importante ver que las variables de trabajo son de tipo Byte (línea 12) y, por tanto, admiten sólo un dominio 0 a 255 sin signo. 6. Proporcione el valor 10 como dividendo y 0 como divisor. 7. Si colocamos el cero como divisor, al querer resolver la línea 17, el programa determina que eso no es posible y genera una excepción. La excepción es de tipo DivideByZeroException, por lo que el control del programa se trasladará al bloque Catch que, de manera particular, hace referencia a dicho tipo de excepción. El control del programa irá al bloque Catch que refiere el tipo de excepción DivideByZeroException en la línea 19. Se ejecutarán las líneas 20, 21 y 22, y luego se procederá a ejecutar el bloque Finally. Se ejecuta el bloque Catch que corresponde.

Capítulo 8. Manejo estructurado de excepciones

245

La línea 21 muestra el número de error del que se trata, utilizando para ello la propiedad Number del objeto Err, que también funciona en Visual Basic (en forma mejorada). La línea 20 muestra un mensaje particular para la excepción de la que se trata; éste es el mayor beneficio de filtrar los errores, ya que si se tienen excepciones diferentes, es lógico que se necesiten acciones diferentes para manejarlas. El manejo genérico de excepciones trata a todas por igual, lo que resta precisión a la función de depuración de programas. El control del programa, agotado el bloque Catch particular para la excepción que se provocó, seguirá en el bloque Finally. Es importante ver cómo la línea 9 declara una variable de tipo Boolean (Satisfactorio), que nos servirá para saber si el proceso fue satisfactorio (True) o si presentó excepciones (False). Inicialmente se considera que el proceso es satisfactorio (True). En caso de que suceda alguna excepción, se cambiará el valor de Satisfactorio a False; con dicho valor le daremos flexibilidad al código del bloque Finally; anteriormente, Finally no diferenciaba si el programa había causado excepción o no. Nosotros le damos esa funcionalidad con la variable de apoyo, colocando un condicional que ejecute cierto código si presentó excepciones, y otro bloque de código distinto si no las causó. Si todo ocurrió como se esperaba, la salida será la siguiente: Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 >>>>>>> Manejo fuera de límite (Overflow) Programa con problemas. Pulse INTRO para continuar

8. Ejecute la aplicación nuevamente (tecla F5), proporcione el valor 10 como dividendo y A como divisor. Vea cómo el programa diferencia entre los tipos de excepciones que pueden ser causadas en un proceso. Al detectar que no es posible hacer la conversión tipo cast del valor “A” a su equivalente Byte, se causa el error. Si todo ocurrió como se esperaba, la salida será la siguiente: Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:A >>>>>>> La conversión cast no es posible Error:13 Programa con problemas. Pulse INTRO para continuar

8

246

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9. Ejecute la aplicación nuevamente (tecla F5) y proporcione el valor 1000. Vea cómo el programa diferencia entre los tipos de excepciones que pueden ser causadas en un proceso. Al detectar que 1000 excede el límite de tipo Byte, se genera la excepción. Si todo ocurrió como se esperaba, la salida será la siguiente. Prueba de manejo de Excepciones Dame el dividendo:1000 >>>>>>> Manejo fuera de límite (Overflow) Programa con problemas. Pulse INTRO para continuar

FIN DEL EJERCICIO *

Lanzamiento de excepciones propias Ciertos casos requieren considerar que un proceso, no violatorio de ninguna de las reglas del lenguaje, tiene un comportamiento equivocado, susceptible de ser considerado un error. En ese caso, es recomendable tener elementos suficientes para provocar excepciones cuando se detecta algo indeseable, como si se tratara de una excepción reconocida por el lenguaje. En términos generales, sabemos que cuando se produce una excepción, el CLR genera una instancia de la clase System.Exception automáticamente. La instanciación, en ese caso, es realizada en tiempo de ejecución por el mismo sistema. Nada nos impide instanciar nosotros: la forma en que podemos hacerlo es a través del uso de Throw New Exception, con la siguiente sintaxis: Throw New Exception(“Mensaje de error”)

Ejercicio 8.3 Lanzamiento de excepciones definidas por el usuario En este ejercicio se protegerá un código determinado, utilizando Try... Catch... Finally.... El programa solicita dos números (un dividendo y un divisor) y a partir de ahí se intentará una división. Como sabemos, no se puede dividir un número entre cero. Este ejemplo se diferencia de los anteriores en que nos anticiparemos para lanzar una excepción antes de que el programa lo haga.

Capítulo 8. Manejo estructurado de excepciones

247

Deliberadamente se causará una excepción al tratar de dividir entre cero, y se capturará la excepción antes de que se realice la división (cuando anteriormente se manifestaba la excepción). 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado ciones3. 3. Edite el programa de tal forma que aparezca como sigue:

Codificación de Excepciones3

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

– Module1.vb

Option Explicit On Option Strict On Imports System.Console

Module Module1 Sub Main() Try WriteLine(“Prueba de manejo de Excepciones”) Dim N1, N2, Resultado As Decimal Write(“Dame el dividendo:”) N1 = CDec(ReadLine()) Write(“Dame el divisor:”) N2 = CDec(ReadLine()) If N2 = 0 Then Throw New Exception(“Divisor no puede ser cero”) End If Resultado = N1 / N2 WriteLine(“Resultado:” & Resultado.ToString) Catch eProblema As Exception WriteLine(“> Problema: “ & eProblema.Message) Finally Write(“Pulse INTRO para continuar”) ReadLine() End Try End Sub End Module

Excep-

8

248

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de Excepciones3

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. Proporcione el valor 10 como dividendo y 0 como divisor. Al intentar resolver la línea 20, el programa determinaría que eso no es posible, y generaría una excepción. No esperamos a que el programa señale la excepción: sabemos que si el divisor es cero la operación no puede ser correcta. Con eso en mente, decidimos anticiparnos,y en la línea 17 evaluamos si N2 (el divisor) es cero, en cuyo caso, lanzaremos una excepción nueva, creada por nosotros (instanciamos System.Exception), tal como lo muestra la línea 18. El control del programa se traslada al bloque Catch, y es manejada como cualquier otra excepción. Si todo ocurrió como se esperaba, la salida será la siguiente. Prueba de manejo de Excepciones Dame el dividendo:10 Dame el divisor:0 > Problema: Divisor no puede ser cero Pulse INTRO para continuar

FIN DEL EJERCICIO*

Capítulo 8. Manejo estructurado de excepciones

MAPA

249

MENTAL DEL CAPÍTULO

8

250

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Calificadores de excepción, 241 Catch, 235 Código protegido, 235 Err, 234, 242 Error List, 240 Errores, 233 Excepciones de hardware, 233

de software, 233 Excepciones, 233 Exit, 235 Finally, 235-6 InnerException, 237 Manejador de excepciones basado en tipos, 242 del usuario, 242

Manejo estructurado de excepciones, 234 Message, 237 SHE, 234 Source, 237 StackTrace, 237 Structured Exception Handling, 234

PREGUNTAS 8.1 ¿Para qué sirven los bloques Try

Catch Finally?

8.2 ¿En qué consiste el filtrado de excepciones? 8.3 ¿Qué son los calificadores de excepción y para qué sirven? 8.4 ¿De qué manera es posible lanzar excepciones personalizadas?

System.Exception, 236 Throw, 246 ToString, 237 Try, 235 Try…Catch…Finally, 235

Capítulo 8. Manejo estructurado de excepciones

Notas:

251

8

252

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Son violaciones a las reglas sintácticas o de alcance de un lenguaje de programación: a) Errores b) Excepciones c) Bugs 2. Es la capacidad que tiene un lenguaje para permitir manejar excepciones a través de una estructura de control que protege bloques de código: a) Manejo estructurado de excepciones b) Control de errores c) Depuración 3. Es la clase de .NET a través de la cual se manejan las excepciones: a) Object.Exception b) e.Exception c) System.Exception 4. Son los nombres de excepciones reconocidos internamente por .NET: a) Calificadores de excepción b) Excepciones nominadas c) Excepciones basadas en tipo 5. Filtrado de errores en el que, utilizando Catch, se especifica una condición usando where: a) Filtrado de excepciones basado en tipos b) Filtrado de excepciones del usuario c) Filtrado condicional

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Las excepciones tienen mayor alcance que los errores.

7.

La ejecución del código Finally se llevará a cabo sólo si se produce una excepción.

8.

Visual Basic es compatible con Err, utilizado en versiones anteriores.

9.

Throw sirve para provocar excepciones.

10.

Try y On Error pueden convivir en un mismo procedimiento o método.

Capítulos: 9

Fundamentos de la programación orientada a objetos

10 Clases, métodos y propiedades

Parte 3 Programación orientada a objetos

11 Herencia y polimorfismo

Herramientas de Visual Studio revisadas: 1. Form Designer. 2. Selector de documentos activos. 3. Class Designer. 4. Class Diagram. 5. Class View.

En esta parte del libro se presentan los conceptos de la programación orientada a objetos (POO) utilizando Visual Basic. Aprovecharemos las capacidades de este lenguaje y las herramientas de Visual Studio para la creación de objetos de negocios y clases, que posteriormente podrán ser utilizados desde cualquier aplicación, haciendo realidad el esquema de desarrollo reutilizando el código. Aprenderá a encapsular clases, utilizar la herencia de funcionalidad y el manejo contextualizado de procedimientos por medio del polimorfismo. Nuestra reflexión es la siguiente: la búsqueda de tiempo libre lleva a las personas a ser creativas, para hacer más cosas con el mínimo esfuerzo. Sin embargo, no todas las personas con estas características son creativas; sólo aquellas con la curiosidad y los conocimientos suficientes podrán utilizar esa creatividad para realizar cosas que trabajen para facilitarles la existencia. El enfoque orientado a objetos nos lleva a identificar algo que ya hemos hecho y reutilizarlo para hacer nuestros desarrollos menos extenuantes.

CAPÍTULO

9

Fundamentos de la programación orientada a objetos Objetivos: Aprender los conceptos fundamentales de la programación orientada a objetos, así como las ventajas de dicha orientación. 1. Conocerá los términos fundamentales de la programación orientada a objetos: clases, objetos, campos, propiedades, métodos y eventos. 2. Entenderá en qué consiste el encapsulamiento, la herencia y el polimorfismo. 3. Aprenderá las capacidades de adaptación de los objetos: Overloading, Overriding y Shadowing.

255

256

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Términos básicos de POO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clases y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Campos, propiedades, métodos y eventos . . . . . . . . . . . . . . . . . . . . . . Encapsulamiento (encapsulation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herencia (inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polimorfismo (polymorphism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overloading, Overriding y Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . Elementos esenciales de los objetos que permiten su programación . . . . . . Identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comportamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobación de la identidad, el estado y el comportamiento de objetos . . . . . . . . . . . . . . . . . . . . . . . . ➤ Instanciación de objetos en Visual Studio . . . . . . . . . . . ➤ Modificación de la identidad de los objetos en Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Programación de comportamientos desde Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

257 258 258 259 261 263 264 265 265 266 269 269 269 273 274 275 276 276 278

Capítulo 9. Fundamentos de la programación orientada a objetos

Clases y objetos

257

El presente capítulo expone los conceptos generales de la programación orientada a objetos (POO). Estos conceptos están relacionados con los objetos en sí y con su relación con otros objetos.

Todavía se habla de la POO con entusiasmo, sobre todo cuando quien lo hace no ha programado con lenguajes como C++ o Java. Es necesario destacar que hace mucho tiempo el tema dejó de ser una novedad, y, sin embargo, por alguna extraña razón, se sigue viendo a dicho modelo de programación como “lo nuevo” (sobre todo entre aquellos que nunca han desarrollado en POO). Quizá tenga mucho que ver que el lenguaje más utilizado en el mundo, Visual Basic en su versión 6, no estaba orientado a objetos; cualquiera que programara en POO formaba parte de un grupo más reducido y diferente, lo que confiere siempre un cierto grado de especialidad. Hasta hace poco, un programador en C++ era más elogiado que un programador de Visual Basic, en gran medida porque había menos programadores de C++ que de Visual Basic (simple economía: a menor oferta, mayor el precio). Ahora las cosas están cambiando, ya que Visual Basic se integra al mundo POO, toma de sí mismo la simplicidad de su código, y adopta de la plataforma .NET capacidades que eliminan las limitaciones que anteriormente tenía, ganando flexibilidad y potencia, y cubriendo aspectos que antes eran más sencillos en otros lenguajes como C++. Si se pregunta qué es mejor, el enfoque de procedimientos, el de eventos o el orientado a objetos, la respuesta es contundente: depende de lo que se quiera hacer. Hay cosas más sencillas de implementar en una orientación que en otra, así que no se sienta mal por no haber aprendido a programar en POO con anterioridad. Quizá no lo haya necesitado. Aunque la experiencia previa en programación es muy útil al aprender POO, no todo el que programa Visual Basic 6.0 podrá programar en Visual Basic sin modificar algunos paradigmas. Es importante, por no decir que indispensable, comprender el marco teórico del modelo orientado a objetos para ser un buen programador en POO.

Términos básicos de POO Ya hemos dicho que en Visual Basic casi todo es un objeto. Por ese motivo, es importante tener los conceptos relacionados con la programación orientada a objetos muy bien dominados. Los conceptos que vea en este capítulo son fundamentales para entender la progra-

9

258

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mación orientada a objetos en Visual Basic; léalos cuantas veces sea necesario hasta que los comprenda plenamente.

Clases y objetos Una clase es una definición formal de un tipo de objeto. La clase define qué datos formarán parte de un objeto, qué tareas desarrollará el objeto, y de qué manera interactuará el objeto con el usuario y con otros objetos. Los objetos son instancias de una clase. Por instancia podemos entender una copia funcional de la clase. A la acción de generar un objeto a partir de una clase, se le denomina instanciación. Al procedimiento o código que realiza la instanciación se le denomina constructor. Al procedimiento o código que destruye a un objeto, liberando los recursos que éste consumía, se le llama destructor. En los lenguajes .NET no es necesario codificar destructores (como era necesario hacer, por ejemplo, en C++), debido a la existencia del garbage collector, que es el elemento de CLR que se encarga de eliminar objetos no utilizados a fin de liberar los recursos que utilizan.

Campos, propiedades, métodos y eventos Las clases, y por tanto los objetos que se derivan de ellas, son un conjunto de datos y comportamientos; tanto las clases como los objetos están formadas por campos, propiedades y métodos. Los campos y las propiedades representan la información que un objeto contiene. Los campos (fields) son elementos de una estructura que actúan como valores equivalentes, nominados. Las propiedades (properties) son muy parecidas a los campos en el sentido de que almacenan valores; su implementación, sin embargo, es más formal, ya que para leer y asignar valores a las propiedades es necesario el uso de las instrucciones Property Get y Property Set, las cuales proporcionan un mayor control con respecto a la forma en la que los valores pueden ser asignados o leídos. Cuando se utilizan propiedades, la lectura y la asignación de valores son directas, lo que implica que entre el programa que usa las propiedades y el valor almacenado existe una capa intermedia de control, que ayuda a aislar (isolate) a la aplicación de los valores que utilizará, permitiendo que dichos valores puedan ser validados antes de que se lean o asignen.

Capítulo 9. Fundamentos de la programación orientada a objetos

259

Los métodos son los comportamientos predefinidos que puede presentar un objeto. En cierta forma, los métodos representan las acciones que el objeto podrá realizar. La manera en que se pueden definir los métodos es agregando procedimientos y funciones a una clase; al momento de generar una instancia de dicha clase, los procedimientos y funciones que le codificamos a la clase formarán los métodos disponibles para el objeto. Un evento es el resultado de la interacción que un usuario o programa tiene con un objeto, en una circunstancia dada, que desencadena la ejecución de un procedimiento o método.

FIGURA 9.1 Estructura de un objeto

La interacción que tiene el usuario o programa con un objeto provoca internamente una interacción de dicho objeto con otros, que puede ser bidireccional, ya sea que el objeto reciba una petición de un objeto o aplicación, o bien que realice una petición a otro objeto o aplicación. A las propiedades, métodos y eventos también suele llamárseles miembros (members), que son el conjunto de elementos declarados por una clase.

Encapsulamiento (encapsulation) Para que una aplicación realmente esté orientada a objetos debe admitir las cualidades de encapsulamiento, herencia y polimorfismo. Estas tres cualidades son representativas de POO.

9

260

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

El encapsulamiento es la capacidad que tiene un objeto para almacenar datos y procedimientos, como una unidad funcional, y permitir el acceso a ellos sin que los demás objetos tengan la necesidad de conocer cómo se integran dichos datos y dicho comportamiento dentro del objeto. Usted ya sabe que los objetos se hacen peticiones entre sí a través de mensajes, y que un objeto puede hacer uso de otros objetos. Imagine que un objeto (objeto A) realiza un cálculo financiero complejo. Imagine que otro objeto (objeto B) realiza un cálculo que determina el monto de los gastos de la compañía en un periodo determinado. Resulta que el objeto A, para desarrollar sus operaciones, necesita la información que produce el objeto B, y para obtener dicha información se comunica con B enviando un mensaje (mensaje X). Como respuesta, el objeto B le envía al objeto A la contestación a través de un mensaje (mensaje Y). La persona que desarrolló el objeto B se da cuenta de que el cálculo que realiza el objeto puede mejorarse. Procede a cambiar el código (comportamiento), haciéndolo más eficiente, reduciendo el tiempo de respuesta a la mitad. Como consecuencia del encapsulamiento, el objeto A no necesita saber qué hace el objeto B para proporcionar la información que se le pide. El encapsulamiento permite que el estado o el comportamiento de un objeto pueda modificarse para darle mayor o mejor funcionalidad al objeto, sin afectar a otros objetos asociados. El objeto A sigue enviando el mensaje X al objeto B, y el objeto B le sigue respondiendo con el mensaje Y, sólo que en la mitad del tiempo que antes. El encapsulamiento sólo debe respetar una regla: al modificar un objeto, éste debe seguir aceptando los mismos mensajes de petición, y enviando los mismos mensajes de respuesta. Fuera de eso, el objeto puede ser una caja negra para los demás desarrolladores, sin que ello perjudique la funcionalidad de la aplicación. Las ventajas que proporciona el encapsulamiento a los programadores son las siguientes: ❑ Facilita la modularidad.

Un módulo es un bloque de código que desarrolla un proceso específico. La modularidad es la capacidad que se tiene de dividir los procesos en múltiples procesos más pequeños. Cuando se inicia un proyecto de programación orientada a objetos, cada objeto actúa como un módulo; a cada desarrollador se le pide que desarrolle ciertos objetos, que obedeciendo a determinados mensajes de petición, proporcionen determinados mensajes de respuesta. Al final del proyecto se integran todos los objetos, que de forma complemen-

Capítulo 9. Fundamentos de la programación orientada a objetos

261

taria se dan servicio entre sí; en un momento dado, si a una persona se le ocurre modificar un objeto que otra persona está utilizando, esto no impacta negativamente, porque los mensajes que se comunican los objetos no deben de sufrir variación. ❑ Mantiene la información oculta.

El objeto puede por sí solo encargarse de modificar los valores de sus propiedades; además, para hacer uso del objeto no es necesario conocer cómo realiza las operaciones (comportamiento). Sólo el objeto se encarga de manejar su estado y comportamiento. Hay procesos tan complejos, importantes y confidenciales que sólo el desarrollador del objeto está autorizado para conocerlos. Imagine que tiene un objeto que se encarga de codificar y decodificar información confidencial en la organización; por ejemplo, si todos los programadores que utilizaran el objeto pudieran conocer los pormenores del algoritmo de codificación y decodificación, no estaríamos seguros en qué momento podría ser conocido por todos, y, por tanto, copiado y vulnerado. El encapsulamiento elimina la necesidad de que otros conozcan cómo está codificado un objeto y, por tanto, favorece la confidencialidad de la implantación de los procesos.

Herencia (inheritance) La herencia describe la capacidad de crear una nueva clase basada en una existente. La clase a partir de la cual se generará la nueva recibe el nombre de clase base (base class); la nueva clase, llamada clase derivada (derived class), hereda todas las propiedades, métodos y eventos de la clase base y a partir de ahí, es posible agregarle las propiedades y métodos particulares que la hacen especial. Un ejemplo puede aclararnos las cosas. Imagine que crea una clase llamada Vehículo AutoMotor. Esta clase contendrá propiedades que todos los vehículos automotores tienen como son color, tipo de transmisión, tipo de combustible, etcétera. Además, tendrá definidos los métodos aplicables para todos los vehículos automotores; por ejemplo, encender o apagar el motor. Hay un tipo de vehículos automotores que sirven para carga de materiales (vehículo de carga); en ellos, la capacidad de carga en toneladas, las dimensiones máximas de la carga y la necesidad de refrigeración de la carga son importantes, pero, ¿son esos datos importantes para un vehículo que sólo es utilizado para transportar personas? La respuesta es que no. Tenemos las siguientes alternativas de solución para manejar la información del ejemplo: ❑ Definir la clase VehículoAutoMotor con todas las características posibles para todos los

vehículos automotores posibles; eso sobrecargaría a la clase de muchas propiedades no aplicables para todos los vehículos, complicando el trabajo de afirmar o negar las carac-

9

262

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

terísticas aplicables a un vehículo en particular. En realidad, todo está siendo manejado en un mismo objeto, tal y como sería en una programación procedural. ❑ Definir una clase independiente de VehículoAutoMotor; por ejemplo, VehículoAutoMotorCarga,

que contenga todas las propiedades y los métodos que requieren ser especificadas para un vehículo automotor de carga. Obviamente, muchas de las características de los vehículos automotores de carga son comunes para todos los vehículos automotores. Eso implicaría una doble codificación (codificación redundante), que revela que, no obstante que ya teníamos codificados los pormenores de los vehículos automotores, no reutilizamos dicho código, pues creamos uno enteramente nuevo. En esta alternativa tampoco funciona la herencia.

❑ Definir una clase independiente, por ejemplo VehículoAutoMotorCarga, que contenga

sólo aquellas propiedades y métodos no definidos en VehículoAutoMotor. La nueva clase (VehículoAutoMotorCarga) se generaría a partir de una clase base (Vehículo AutoMotor), aprovechando toda su codificación. Esta alternativa implica un uso funcional de la herencia, en donde se tiene una clase base y una clase derivada.

Clases derivadas

Clase Base

FIGURA 9.2 Herencia

Las ventajas que proporciona la herencia para los programadores de software son las siguientes:

Capítulo 9. Fundamentos de la programación orientada a objetos

263

❑ Reuso de código.

La mayor ventaja de la herencia es que el código se reutiliza de una forma más eficiente, pues las clases parten de otras clases más generales; esto garantiza que de inicio las clases ya tienen la funcionalidad de otras anteriormente creadas. Sólo se estará desarrollando nueva funcionalidad, evitándose el código redundante.

❑ Jerarquía de clases.

Es posible realizar una jerarquía que distinga procesos genera-

les y específicos. La figura 9.2 muestra de manera conceptual cómo, a partir de una clase base, surgen clases derivadas que pueden disponer de todas las propiedades, métodos y eventos de la clase base, y que además incluyen las características particulares de aquello que no es posible representar usando solamente lo definido en la clase base. En la jerarquía de clases, la clase base no requiere de las clases derivadas, pero las clases derivadas sí requieren de lo definido en la clase base.

Polimorfismo (polymorphism) El polimorfismo es la capacidad de manejar múltiples clases que pueden ser utilizadas de manera intercambiable a través de una misma implementación (nombre de clase). El polimorfismo es esencial para la programación orientada a objetos, ya que permite, a través de un mismo nombre de clase, agrupar diferentes funcionalidades, dependiendo de las propiedades y métodos que se utilicen al momento de invocarlas.

NOTA En Visual Studio puede verse claramente esta capacidad. Si en alguno de sus programas utiliza, por citar un ejemplo, la función Val, que convierte a número una expresión, aparecerá una referencia como sigue:

La misma implementación (Val) puede comportarse de tres maneras, dependiendo del argumento que reciba. Si la función recibe un argumento String, realizará la conversión y devolverá un valor de tipo Double; si recibe un argumento de tipo Char, devolverá un valor de tipo Integer; y si recibe un argumento Object, devolverá un valor de tipo Double. El programador no tendrá que preocuparse por saber qué clase ha de utilizar en caso de proporcionar un argumento String, Char u Object. El polimorfismo se encarga de realizar la selección adecuada.

9

264

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Imagine que tiene una aplicación que controla las ventas de un negocio. Puede ser que tenga un objeto llamado RegistraVenta, que se encargue de almacenar en una base de datos los pormenores de la venta. Suponga que hay un objeto llamado ActualizaLíneaCrédito que se encarga de actualizar la línea de crédito de los clientes que compran en el establecimiento; como ha de suponer, las acciones que realizará ActualizaLíneaCrédito tienen que ver si la compra se realiza a crédito o de contado. En enfoque procedural, sería necesario hacer dos procedimientos distintos, de diferente nombre, para controlar cada una de las alternativas. En POO se pueden generar dos clases distintas, que contengan cada una de las alternativas de la actualización de la línea de crédito; la diferencia estriba en que para el programa sólo existirá una. Será la misma plataforma de ejecución la que determine, con base en los datos proporcionados, qué clase es la que se empleará.

Overloading, Overriding y Shadowing Para implementar el polimorfismo, hay que conocer tres conceptos básicos: Overloading, Overriding y Shadowing. Al explicar el polimorfismo, concluimos que un mismo nombre de método puede tener funcionalidad distinta dependiendo de los argumentos que le son proporcionados. Como sabe, los argumentos van entre paréntesis y separados por comas, después del nombre del método o función; por tratarse de una lista de valores, estamos ante la presencia de una serie de valores.

NOTA La implementación en programación de la terminología descrita en este capítulo se demostrará en el capítulo siguiente.

Los miembros con característica Overloaded son utilizados para proporcionar diferentes versiones de una propiedad o método que tiene el mismo nombre, pero que acepta diferente número de argumentos, o argumentos de diferente tipo de dato. Las propiedades y métodos con característica Overriden son utilizados para reemplazar una propiedad o método que, habiendo sido heredado de una clase base, no es lo apropiado para la clase derivada. Esto permite sustituir elementos heredados de la clase base, con aquellos que la clase derivada realmente necesita.

Capítulo 9. Fundamentos de la programación orientada a objetos

265

La única restricción que se tiene es que los miembros Overriden deben aceptar el mismo número de argumentos y devolver los mismos valores, respetando los tipos de datos de la clase base, a efecto de que el encapsulamiento de los objetos sea posible. Los miembros con característica Shadowed son aquellos que reemplazan localmente a otros miembros existentes, dentro de un alcance diferente al original.

Elementos esenciales de los objetos que permiten su programación Al generar instancias de una clase, estamos generando un objeto. Una vez que los objetos existen, es posible utilizarlos para obtener funcionalidad de la aplicación. Es importante que nos hagamos a la idea de que un objeto, una vez que es creado, ya posee vida propia y es independiente de todos los demás. Los objetos tienen tres características principales: ❑ Identidad ❑ Estado ❑ Comportamiento

Identidad La identidad del objeto es su capacidad de tener un nombre que lo identifica y diferencia de los demás. No podemos crear ningún objeto sin asignarle un nombre para su identificación; de ser así generaríamos un elemento al cual no podríamos invocar de ninguna manera. Al momento de instanciarse, todos los objetos son exactamente iguales a la clase de la cual derivan; sólo se diferenciarán por su identidad. En Visual Basic los objetos poseen una propiedad llamada Name, a través de la cual se manifiesta su identidad. A la propiedad Name también se le conoce como propiedad de identidad. La propiedad Name puede ser utilizada en tiempo de ejecución para evaluar la identidad de un objeto por su nombre, y no por su identificación en el programa (nombre de la variable objeto, a lo que se conoce como nombre programático). El valor que posee la propiedad Name es de tipo String, lo que facilita mucho su utilización en los procesos que estemos codificando. Los programadores de Visual Basic en su versión 6 tal vez no le dieran importancia al hecho de que todos los controles que se utilizaban en las aplicaciones debían ser referidos por

9

266

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

su nombre programático, pues era la única posibilidad que había para identificar los elementos de un programa. Una vez realizada la codificación, cambiar la identidad a un control (modificar la propiedad Name) era impensable, ya que sería necesario modificar el código para admitir el nuevo nombre asignado. En Visual Basic queda claramente definido que se tiene un nombre programático (nombre de los objetos) y una identidad de los objetos, en la propiedad Name.

Estado El estado de un objeto es la situación de forma y comportamiento que tiene el objeto en un momento determinado en tiempo de ejecución. El estado está determinado por el juego de valores que tienen sus propiedades. Como sabemos, las propiedades son las características particulares del objeto y especifican su nombre, posición, apariencia y hasta sus capacidades de interacción con el usuario y otros objetos. Un objeto puede estar disponible o no para su uso en una interfaz (Enabled=True o Enabled=False); puede tener un ancho de 10 o 20 píxeles (Width=10 o Width=20). Si cambiamos el valor de cualquiera de las propiedades, como podría ser incrementar el ancho del objeto de 10 a 20 píxeles, ello representa una modificación de estado. La figura 9.3 nos invita a imaginar el núcleo de un objeto como un conjunto de propiedades establecidas; vea cómo la identidad del objeto también forma parte del estado del mismo, pues Name es una propiedad, al igual que las de posición, apariencia y otras.

Comportamiento El comportamiento es la capacidad del objeto para funcionar de una determinada manera. Como respuesta a la interacción del usuario, de otros objetos, o incluso del mismo sistema operativo, el objeto podrá comportarse de diferente forma. El comportamiento de un objeto se presenta por la posibilidad de mandar llamar a ejecución: ❑ Los métodos ❑ Los procedimientos de evento ❑ Los procedimientos y funciones definidas por el usuario

Los métodos, como sabe, son los comportamientos predefinidos que un objeto puede presentar, y que se encuentran definidos por la clase de la cual el objeto deriva.

Capítulo 9. Fundamentos de la programación orientada a objetos

267

Los procedimientos de evento son aquellos procedimientos que le suceden a un objeto como respuesta a la interacción que tienen con el usuario u otros objetos. El objeto tiene un conjunto de eventos que reconoce, y usted como desarrollador lo único que hace es decirle a su programa a) que quiere que un objeto determinado sea sensible a los eventos que le sucedan (especificación WithEvents al momento de la declaración), b) elaborar un procedimiento y c) especificarle a dicho procedimiento que será ejecutado en caso de que le suceda el evento a alguno de los objetos que maneje (handles). En versiones anteriores de Visual Basic, un procedimiento de evento podía servir sólo para manejar las acciones que deberían suceder cuando a un objeto determinado le sucedía un evento determinado; de hecho, el nombre de los procedimientos de evento estaba formado por el nombre del objeto y el nombre de evento, separados por un guión bajo. Había controles para los cuales se aplicaban las mismas validaciones (por ejemplo, que los cuadros de texto no se dejaran vacíos); no obstante que el proceso a realizar era el mismo para todos los cuadros de texto, a cada uno de ellos se le debía definir un procedimiento de evento. Algunas cosas cambiaron en Visual Basic. Un procedimiento de evento puede manejar un mismo evento para uno o más objetos; por ese motivo, el nombre asociado a un solo objeto y un solo evento ya no tiene sentido. Ahora el nombre del procedimiento de evento puede ser el que sea. La única cosa que debemos respetar son los argumentos implícitos. Los procedimientos pueden admitir argumentos; con base en ellos es posible modificar el resultado del procesamiento o el valor que devuelven (en el caso de las funciones). Los argumentos implícitos son aquellos que son declarados por Visual Basic de manera automática; en la declaración de este tipo de argumentos el programador no participa más que como espectador y usuario. Cada evento podrá exigir la presencia de los argumentos implícitos que necesita para trabajar; cuando nosotros declaramos un objeto especificando que queremos que sea sensible a eventos (WithEvents), también le estamos diciendo al programa que queremos que Visual Basic se encargue de actualizar, en tiempo de ejecución, los datos de los argumentos implícitos de cada uno de los eventos aplicables al objeto. Nosotros no determinamos el valor que tendrán los argumentos implícitos; es el CLR, en tiempo de ejecución, el que determina qué valores tendrán. Los procedimientos definidos por el usuario y las funciones definidas por el usuario, son los procedimientos y funciones que usted codifica; no dependen de los eventos que pueden sucederle al objeto, ni requieren estar predefinidos en ninguna clase: son la forma más pura de codificación. Hace muchos años, cuando nadie hablaba aún de objetos ni de eventos, los procedimientos y funciones definidos por el usuario ya existían.

9

268

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA Algunos desarrolladores, para no estar preocupándose respecto a qué objetos permitirán manejo de eventos y cuáles no, colocan la especificación WithEvents a todos los objetos. Aunque es una forma simple de quitarse problemas, no es lo más estructurado; deja ver que el programador no conoce a profundidad el comportamiento que tendrá su interfaz. Sugerimos colocar WithEvents sólo a los objetos que realmente manejarán procedimientos de eventos.

La figura 9.3 muestra un panorama completo de la composición de un objeto. El círculo del centro es el estado del objeto. Dentro del estado se encuentra la identidad, pues la propiedad de identidad forma parte del estado. Alrededor del estado del objeto están las formas de comportamiento, que mantienen un diálogo con dicho estado, pues los métodos, procedimientos de evento y procedimientos de usuario pueden modificar el estado, y éste puede determinar la disponibilidad de las formas de comportamiento. Los procedimientos y funciones definidas por el usuario son la parte más especializada de las aplicaciones, ya que contienen los bloques de código que han de realizar aquello que el lenguaje por sí mismo no puede. En ocasiones se dice que los procedimientos y funciones definidas por el usuario son las reglas de negocio, para la aplicación. FIGURA 9.3 Estado y comportamiento

Capítulo 9. Fundamentos de la programación orientada a objetos

269

Ejercicio 9.1 Comprobación de la identidad, el estado y el comportamiento de objetos En este ejercicio se comprobará la identidad, el estado y el comportamiento de un objeto. 1. 2.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado CambiaEstado.

Interfaz CambiaEstado - Form1.vb [Design]

➤ Instanciación de objetos en Visual Studio 3.

4.

5.

Al indicar la creación de una aplicación Windows, Visual Studio se encarga de instanciar objetos en tiempo de diseño. El primero de ellos es un objeto que tiene como origen la clase System.Windows.Forms.Form, de nombre predeterminado Form1; este objeto tiene la particularidad de ser un contenedor, es decir, un objeto que contiene otros objetos, de ahí que sea el primero en instanciarse. El nombre que Visual Studio le asigna a los objetos que genera se forma por el nombre del type que le da origen, más un número consecutivo de todos los objetos del mismo tipo encontrados en el proyecto. Ya que se genera la instancia de System.Windows.Forms.Form, aparece la herramienta Form Designer, que permitirá la modificación del estado del objeto Form1 en tiempo de diseño. Cuando tenemos la posibilidad de manipular objetos en Form Designer se dice que trabajamos en tiempo de diseño.

9

270

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 9.4 Form Designer

Moderadores de tamaño

6.

7. 8.

El formulario, al igual que todos los objetos que son agregados a la interfaz en tiempo de diseño, tienen valores por omisión en todas sus propiedades. El objeto Form1 posee un aspecto que los valores por omisión le proporcionan. Seleccione la opción View – Toolbox (oprima las teclas Ctrl-Alt-X) para que aparezca Toolbox. Si Toolbox está en ocultación automática, fíjela en Document Window. En Toolbox expanda el grupo de controles Common Controls.

Capítulo 9. Fundamentos de la programación orientada a objetos

271

9.

Haga doble clic en el control Button. Con ello se agregará en modo de inserción un botón en el área de diseño de Form Designer. 10. Su interfaz ahora debe aparecer como sigue. La pregunta interesante es ¿dónde se guarda el código que genera esta interfaz?

FIGURA 9.5 Interfaz con controles derivados de clases

11. En Solution Explorer haga clic en Show All Files. 12. Seleccione el nodo CambiaEstado – Form1.vb. Vea cómo dicho nodo se compone de dos programas: Form1.vb y Form1.Designer.vb. En Form1.vb se editan los comportamientos de la aplicación, mientras que en Form1.Designer.vb se codifica la interfaz, instanciando todos los objetos.

9

272

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

13. Haga doble clic sobre el nodo Form1.Designer.vb y vea el código que aparece. Es un poco complejo, pero es el trabajo que Form Designer nos ha ahorrado. Con Visual Studio no nos preocupamos por instanciar los objetos de interfaz, ni por cambiar de forma programática los valores por omisión de las propiedades. Al agregar un botón, por ejemplo, se agrega automáticamente el siguiente código en el programa Form1.Designer.vb: Me.Button1 = New System.Windows.Forms.Button ... ‘ ‘Button1 ‘ Me.Button1.Location = New System.Drawing.Point(0, 0) Me.Button1.Name = “Button1” Me.Button1.Size = New System.Drawing.Size(75, 23) Me.Button1.TabIndex = 0 Me.Button1.Text = “Button1” Me.Button1.UseVisualStyleBackColor = True ... Friend WithEvents Button1 As System.Windows.Forms.Button

14. Si pretende ser un desarrollador profesional, sin duda requiere Visual Studio. Como podrá leer en comentarios del mismo programa, no se recomienda que modifique el programa directamente. Deje a Visual Studio hacer su trabajo y dedíquese a desarrollar en modo de diseño lo más que pueda. Sólo edite el código si sabe lo que está haciendo, y no descarte la posibilidad que el programa deje de funcionar o que Visual Studio deshaga los cambios que usted realice al programa sin notificarle nada. 15. En Solution Explorer haga doble clic en el nodo Form1.vb, para regresar al tiempo de diseño del formulario. 16. Seleccione View – Properties (F4) para ver la herramienta Properties. 17. Seleccione el objeto Form1, haciendo un solo clic en el formulario que se ve en Form Designer. 18. Busque la propiedad Size, y vea las dimensiones que tiene el formulario. Algunas propiedades pueden expandirse, lo que indica que se forman por otras propiedades. La propiedad Size se compone de dos propiedades: Width y Height.

Capítulo 9. Fundamentos de la programación orientada a objetos

273

Escriba los valores que encuentra. Height: Width:

________________ ________________

19. Seleccione el modificador de tamaño que aparece en el borde inferior del formulario y arrástrelo hacia arriba, de tal forma que el formulario quede a la mitad de su tamaño original. Consulte nuevamente los valores que componen Size. Compruebe que las modificaciones en tiempo de diseño afectan directamente las propiedades de los objetos, modificando su estado. Height: Width:

________________ ________________

20. Para mayor precisión, haga los siguientes cambios en Form1. Height

150

Text

Cambio de estado

21. Seleccione el objeto Button1, haciendo un solo clic en el botón que se ve en Form Designer. Text

Cambiar Color

22. Utilizando el modificador de tamaño que se encuentra en el borde derecho del botón, amplíe el ancho del botón.

23. Arrastre el botón al centro del formulario, para que sea más estético. 24. Decida la forma en que prefiere cambiar las propiedades de sus objetos.

➤ Modificación de la identidad de los objetos en Visual Studio 25. Modificar la identidad de los objetos en Visual Studio es muy sencillo, basta con seleccionar el objeto al que se le desea cambiar la identidad y modificar el valor de su propiedad Name desde Properties. 26. Seleccione el objeto Form1. 27. En Properties busque la propiedad Name y asigne el valor de Formulario. Por omisión Visual Studio le asigna un nombre a cada objeto. Modifique el nombre por omisión sólo si cambiará el estado del objeto o si utilizará sus propiedades de forma programática.

9

274

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Cuando hacemos referencia a la forma programática de hacer las cosas, queremos decir que a través de código hacemos cosas que es posible hacer en tiempo de diseño utilizando las herramientas de Visual Studio. 28. Una recomendación general es que asigne los nombres de los objetos al inicio de los trabajos de desarrollo, antes de codificar comportamientos; asignados los nombres procure no cambiarlos, dado que el tal caso tendría que actualizar cada línea de código en donde los objetos eran utilizados, o de lo contrario se generará error. 29. Seleccione a Button1 haciendo un solo clic en el botón, y en Properties cambie el valor de la propiedad Name a Cambiar.

➤ Programación de comportamientos desde Visual Studio 30. Haga doble clic en Button1. Con ello se podrá editar el procedimiento de evento Click; en dicho procedimiento se codifica lo que queremos que pase cuando en tiempo de ejecución el usuario haga clic en el botón. El programa que se editará es Form1.vb. 31. Agregue el siguiente código al procedimiento: Me.BackColor = Color.Coral Cambiar.BackColor = Color.LightSkyBlue

El Text Editor presentará lo siguiente:

32. Vea cómo la clase tiene el mismo nombre del objeto Form y cómo el procedimiento es igual al nombre del botón y del evento que se está codificando (Cambiar_Click). La línea 4 cambia el color de fondo del formulario, mientras que en la línea 5 se cambia el color de fondo del botón. 33. Es importante notar que los cambios de estado en forma programática se logran de la siguiente forma: Objeto.Propiedad = Valor

34. Vea cómo el formulario no se refiere con su nombre (Formulario) sino por la constante Me; esto debe ser así por la forma en que Visual Studio maneja los formularios. Si no se estuviera utilizando Visual Studio, tendría que referirse el formulario por su nombre.

Capítulo 9. Fundamentos de la programación orientada a objetos

275

Ejecución guiada de CambiaEstado - Form1.vb

35. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 36. Haga clic en el botón y vea los cambios de color que provocamos. FIN DEL EJERCICIO *

MAPA

MENTAL DEL CAPÍTULO

9

276

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Argumentos implícitos, 267 Campos, 258 Clase, 258 Codificación redundante, 262 Comportamiento, 266 Constructor, 258 Destructor, 258 Encapsulamiento, 259-60 Encapsulation, 259 Estado, 266 Evento, 259

Fields, 258 Form Designer, 269 Funciones definidas por el usuario, 267 Handles, 267 Herencia, 261 Identidad, 265 Inheritance, 261 Instancia, 258 Instanciación, 258 Jerarquía de clases, 263 Members, 259 Métodos, 259, 266

Miembros, 259 Objetos, 258 Overloaded, 264 Overloading, 264 Overriden, 264 Overriding, 264 Polimorfismo, 263 Polymorphism, 263 POO, 257 Procedimientos de evento, 267 definidos por el usuario, 267 Programación orientada a

objetos (POO), 257 Properties, 258 Propiedades, 258 Reuso de código, 263 Shadowed, 265 Shadowing, 264 WithEvents, 267

PREGUNTAS 9.1 ¿Cuáles son las tres características principales que identifican a la programación orientada a objetos? 9.2 Defina clase, objeto, propiedad, método y evento. 9.3 Explique qué es el estado de un objeto. 9.4 Explique los conceptos Overloading, Overriding y Shadowing. 9.5 ¿Cuáles son las ventajas que aporta la herencia? 9.6 ¿Cuáles son las ventajas que aporta el encapsulamiento? 9.7 ¿Cuáles son las ventajas que aporta el polimorfismo?

Capítulo 9. Fundamentos de la programación orientada a objetos

277

Notas:

9

278

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. A la acción de generar un objeto a partir de una clase se le llama: a) Instanciación b) Generación de objetos c) Derivación 2. Es el procedimiento o código que libera recursos que ya no utilizará un objeto: a) Constructor b) Destructor c) GarbageCollector 3. Es la habilidad de crear una nueva clase basada en una clase existente: a) Polimorfismo b) Herencia c) Encapsulamiento 4.

Es la capacidad que tiene un objeto de almacenar datos y procedimientos como una unidad funcional: a) Polimorfismo b) Herencia c) Encapsulamiento

5. Son asociaciones formales de uno o más datos de un determinado tipo, que da lugar a un nuevo tipo de dato compuesto: a) Delegado b) Estructura c) Encapsulado

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso, y «V» si es verdadero. 6.

La clase derivada hereda su funcionalidad a la clase base.

7.

El estado de un objeto es su capacidad de tener un nombre que lo identifica y lo diferencia de los demás objetos.

8.

Los objetos que producirán la ejecución de procedimientos de evento requieren ser creados con la cláusula WithEvents.

9. 10.

En programación POO, la codificación redundante es necesaria. Los métodos son comportamientos predefinidos de un objeto.

CAPÍTULO

10

Clases, métodos y propiedades Objetivos: Aprender a definir de manera programática clases, métodos y propiedades. 1. Aprenderá qué son las clases y cómo se definen de manera programática. 2. Conocerá las propiedades y cómo se definen de manera programática. 3. Conocerá los métodos y cómo se definen de manera programática. 4. Aprenderá a crear bibliotecas DLL e invocarlas desde programas externos. 5. Sabrá qué son los modificadores de acceso y cómo se utilizan en la programación orientada a objetos.

279

280

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Definición de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Definición de propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de bibliotecas de clases (librerías) . . . . . . . . . . . . . . . . . . . . . . . . . . Condiciones para la utilización de las bibliotecas de clases . . . . . . . . . . . . . . Creación de una clase con propiedades y métodos . . . . . . . . . . . ➤ Uso de Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Creación de un diagrama de clases y modificación del mismo con Class Designer . . . . . . . . . . . . . . . . . . . . . ➤ Uso del selector de documentos activos (Active Documents) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Adición de métodos usando Class Designer . . . . . . . . . . ➤ Uso de Class View para examinar objetos . . . . . . . . . . . Consumo una clase a través de instancias . . . . . . . . . . . . . . . . . . Uso de Object Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Visualización de referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de clases en soluciones diferentes . . . . . . . . . . . . . . . . . . . . ➤ Integración de proyectos existentes a una nueva solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Distribución de copias locales de librerías DLL . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

281 281 283 284 284 285 289 291 292 296 298 302 302 304 304 305 307 308 308 310

Capítulo 10. Clases, métodos y propiedades

281

En capítulos anteriores tuvimos la oportunidad de trabajar con objetos que, necesariamente, fueron derivaciones de alguna clase definida en la biblioteca de clases de .NET Framework. Lo importante en este punto es saber que no siempre la biblioteca de clases de .NET Framework es la solución a nuestros problemas; seguramente hay algún proceso o cálculo muy específico que nosotros deberemos desarrollar. Por esa razón es indispensable aprender a desarrollar una biblioteca de clases propias.

Definición de una clase Antes de proceder a desarrollar una clase determinada, asegúrese de que no está desarrollada ya y que forme parte de la biblioteca de clases de .NET Framework; sería lamentable invertir tiempo y esfuerzo en el desarrollo de una clase existente, ¿no? Si ya está seguro de que no existe una clase que se ajuste a lo que usted necesita, proceda entonces a generar una clase en Visual Basic. Para crear una clase debe utilizar la siguiente sintaxis: Class

NombreClase CódigoClase

End Class

Donde NombreClase es el nombre a través del cual la clase puede ser invocada. La instanciación de la clase se deberá llevar a cabo por medio de este nombre. CódigoClase es el contenido de la clase; como sabemos, el contenido de la clase se compone de datos (propiedades) y comportamiento (métodos y funciones). Por esa razón debemos definir dentro de la clase los procedimientos (Sub - End Sub), funciones (Function - End Function), y propiedades (Property - End Property) que debe tener, entre otros atributos. Una clase, como ya sabe, es la definición formal de un objeto. Las clases por sí mismas no pueden ser utilizadas; es necesario crear unidades funcionales de las clases, es decir, objetos. Para ello debemos recurrir a un constructor, que es el código que genera la instancia de una clase. En Visual Basic, un constructor típico sería: Dim

Objeto As

New

NombreClase( )

Donde Objeto es el nombre de la instancia de la clase y NombreClase es el nombre de la clase que se está instanciando. New es la instrucción constructora por excelencia. Una vez generada la instancia de la clase, podemos utilizar todos sus elementos: métodos, funciones y propiedades.

10

282

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Definición de propiedades Para una clase se puede, además de definir su comportamiento a través de métodos y funciones, especificar qué propiedades han de conformar su estado. Las propiedades son las características particulares de un objeto; la clase debe definir qué propiedades tendrán los objetos que deriven de ella. Para su definición, es necesario definir las propiedades dentro del bloque de código que compone la clase. Las propiedades almacenan valores de un determinado tipo de dato; las operaciones que se pueden hacer con dicho valor es leerlo (GET) o asignarlo (SET). Las propiedades, aunque también son valores almacenados, tienen un manejo más formal que las variables de memoria y, de hecho, requieren de una variable de memoria que permita la verificación de los valores antes de su lectura o asignación. La siguiente es la sintaxis de la definición de propiedades: Class NombreClase Dim Variable As TipoDatoPropiedad Property NombrePropiedad As TipoDatoPropiedad Get

CódigoLecturaValor End Get Set (VariableArgumento As

TipoDatoPropiedad) CódigoAsignaciónValor

End Set End Property

... ... End Class

Donde NombreClase es el nombre de la clase a la que pertenece la propiedad. Antes de declarar la propiedad se debe declarar una variable de trabajo (Variable) del mismo tipo de dato que el que pretende almacenar la propiedad (TipoDatoPropiedad). Para recuperar el valor que tiene la propiedad se usa CódigoLecturaValor, que es el bloque de código que se encarga de recuperar el valor de la variable de paso, para considerarlo como valor de la propiedad. Para asignarle un valor a una propiedad se utiliza una variable de trabajo (VariableArgumento) que recibe, a manera de argumento, el valor que se pretende asignar a la propiedad. CódigoAsignaciónValor es el bloque de código que se encarga de validar el valor que se pretende asignar a la propiedad; en caso de que sea válido, realiza la asignación.

Capítulo 10. Clases, métodos y propiedades

283

En una clase se pueden definir tantas propiedades como se requieran en el programa y, por supuesto, además se pueden definir métodos y funciones que formen parte de la misma. Estos métodos y funciones pueden hacer uso de las propiedades con sólo referirlas por su nombre.

Creación de bibliotecas de clases (librerías) En nuestros ejemplos hemos experimentado la definición de clases en el mismo capítulo en donde se instancian y utilizan. Este comportamiento no es común en desarrollos grandes, pues generalmente se definen las clases de manera independiente al programa que las utiliza. De hecho, la biblioteca de clases de .NET Framework es independiente de todo programa; uno simplemente invoca una librería y utiliza los métodos (types) y propiedades que tiene. Dicho de otra forma, hasta donde hemos visto, la clase se encuentra dentro del mismo ensamblado (EXE) que el programa; ahora requerimos saber cómo hacer para que las clases se encuentren en un archivo de vínculos dinámicos (DLL), que es independiente del ejecutable.

NOTA En este texto, como toda la documentación técnica relativa al tema, se utilizan los términos “biblioteca de clases” y “librería de clases” indistintamente. Tienen el mismo significado.

Modificadores de acceso La idea es generar una librería de clases independiente de los programas ejecutables; es apropiado pensar que dicha biblioteca estará disponible para su utilización por uno, dos o más ejecutables (de ahí la razón de independizarla). Ello no significa, sin embargo, que cualquier ejecutable pueda hacer uso de la biblioteca de clases; es posible que no queramos limitar el acceso a la biblioteca de clases. Para ello podemos utilizar los denominados modificadores de acceso. Los modificadores de acceso son calificadores de declaración que determinan el grado de encapsulamiento de una clase. El acceso se aplica a las entidades (clases, propiedades, métodos). A continuación se muestran a grandes rasgos los modificadores de acceso:

10

284

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Palabra clave

Definición

Public

Las entidades pueden ser llamadas desde cualquier parte; también se le conoce como acceso público.

Private

Las entidades se pueden llamar sólo desde el contexto mismo de su declaración. También se le conoce como acceso privado.

Friend

El acceso friend permite el acceso a las entidades desde el mismo programa en donde se hace su declaración.

Protected

El acceso protegido permite el acceso a las entidades sólo desde la misma clase, así como sus clases derivadas.

Protected

Es la mezcla del acceso friend y el acceso protegido.

Friend

La forma de especificar los modificadores de acceso es colocándolos al principio de la definición de las clases, propiedades y métodos.

Condiciones para la utilización de las bibliotecas de clases Las condiciones necesarias para la definición y utilización de una biblioteca de clases son las siguientes: ❑

Proporcionar el modificador de acceso requerido.



Compilar la biblioteca de clases como librería (/target:library).



Establecer la referencia del ejecutable con respecto a la librería (/r:librería.dll).

Si usted desarrolla utilizando Visual Studio, podrá despreocuparse de establecer la mayoría de las referencias y especificar la salida a DLL al momento de compilar, dado que la herramienta se encarga de dar las indicaciones correspondientes.

Ejercicio 10.1 Creación de una clase con propiedades y métodos

En este ejercicio se generará una clase que contiene propiedades y métodos para su consumo desde otros programas.

Capítulo 10. Clases, métodos y propiedades

1. 2. 3.

285

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Class Library llamado Clase. En Text Editor desplegará lo siguiente:

10 4.

Cambie el nombre de la clase, sustituyendo Class1 por Areas.

➤ Uso de Code Snippets 5.

6.

Una de las costumbres más arraigadas de los programadores es utilizar en programas nuevos código que ya han escrito antes. Con una operación de copiar y pegar se ahorra mucho tiempo, dado que hay código que requiere de pocas modificaciones para funcionar en casi todos los programas. Visual Studio incorpora muchas pequeñas rutinas de uso común con el fin de que sean integradas y modificadas para su utilización en programas; a estos patrones de código preestablecidos se les da el nombre de Code Snippets. Una de las operaciones más comunes al codificar clases es la incorporación de propiedades, para lo cual debe de existir un code snippet. Colóquese dentro de la clase, despliegue el menú contextual y seleccione Insert snippet...

286

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7.

Aparecerá una herramienta parecida a Intellisense, que permite seleccionar los patrones de código preestablecidos de Visual Studio. Seleccione Common Code Patterns.

8.

Seleccione Properties and Procedures.

9.

Seleccione Define a Property.

Capítulo 10. Clases, métodos y propiedades

287

10. Aparecerá el patrón de código preestablecido buscado. Observe cómo algunas partes del código están sombreadas: son los elementos variables del code snippet. Se puede navegar entre ellos utilizando las teclas TAB para ir al siguiente y BACKTAB para ir al anterior. Al modificar un elemento variable, se modifica en todas las partes donde se utiliza; esto es una ventaja con respecto al uso de copiar y pegar, dado que era común olvidar sustituir todas las referencias, generando errores. En el elemento variable que dice newPropertyValue escriba pBase. Presione TAB, con lo que debe desplazarse al segundo elemento variable, que por el momento tiene el valor de Integer; cámbielo por Decimal. Presione TAB y sustituya NewProperty por Base. 11. Vea cómo, automáticamente, se actualizan las referencias posteriores.

10

12. Después de la propiedad que se definió, agregue otra propiedad utilizando code snippets. En el elemento variable que dice newPropertyValue escriba pAltura. Presione TAB, con lo que debe desplazarse al segundo elemento variable, que por el momento tiene el valor de Integer; cambie Integer por Decimal. Presione TAB y sustituya NewProperty por Altura. Por el momento su código debe lucir de la siguiente manera:

288

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

13. Después de la segunda propiedad, desde el menú contextual seleccione Insert snippet...., y utilice el code snippet Common Code Patterns – Properties and Procedures – Define a function. En el elemento variable MyFunc coloque el valor Rectangulo, en Integer coloque Decimal, y en los paréntesis que indican el valor de retorno escriba (Base * Altura). 14. Después de la función anterior, escriba otra: desde el menú contextual seleccione Insert snippet...., y utilice el code snippet Common Code Patterns – Properties and Procedures – Define a function. En el elemento variable MyFunc coloque el valor TrianguloRectangulo, en Integer coloque Decimal y en los paréntesis que indican el valor de retorno escriba ((Base * Altura)/2). 15. El código debe haber quedado como sigue.

Codificación de Clase

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

– Class1.vb

Public Class Areas Private pBase As Decimal Public Property Base() As Decimal Get Return pBase End Get Set(ByVal value As Decimal) pBase = value End Set End Property Private pAltura As Decimal Public Property Altura() As Decimal Get Return pAltura End Get Set(ByVal value As Decimal) pAltura = value End Set End Property Function Rectangulo() As Decimal Return (Base * Altura) End Function Function TrianguloRectangulo() As Decimal Return ((Base * Altura) / 2) End Function End Class

Capítulo 10. Clases, métodos y propiedades

289

> Lo nuevo En Visual Studio 2005 los code snippets formalizan lo que los desarrolladores hacían todo el tiempo: copiar y pegar.

➤ Creación de un diagrama de clases y modificación del mismo con Class Designer 16. Desde la barra de herramientas de Solution Explorer, seleccione View Class Diagram . Aparecerá el diagrama de la clase (class diagram).

10 17. Al visualizar un diagrama de clases, Document Window invoca una herramienta llamada Class Designer, que permite diseñar de forma visual y dinámica clases de usuario. 18. Si hace clic en el icono para ver detalles , Class Designer se dividirá en dos paneles; en el superior quedará el diagrama de la clase en modo extendido, mientras que en el inferior aparecerá la ventana Class Details, que mostrará la relación de propiedades, métodos y eventos de la clase, además de permitir agregar o eliminar elementos. En caso de que Class Details no aparezca de manera predeterminada, es posible invocar el menú de contexto desde el diagrama de la clase y seleccionar View Class Details.

290

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Con el modificador de tamaño que tiene el diagrama de la clase en el extremo derecho, amplíe la dimensión del diagrama, de tal forma que quede con un ancho del doble.

20. En la barra de herramientas de Class Designer aparecerán los siguientes iconos:

Utilícelos alternadamente y vea las variaciones que tiene el diagrama de clase. Finalmente seleccione el modo Display Full signature.

Capítulo 10. Clases, métodos y propiedades

291

21. La parte baja de Class Designer muestra la herramienta Class Details. Busque el apartado Properties y haga clic en . Automáticamente se agregará una línea en donde podrá especificar los elementos básicos de la propiedad. En la columna Name coloque el valor Radio, en Type coloque Decimal, deje el Modifier como Public, y finalmente en Summary escriba Valor de medida del radio.

10 ➤ Uso del selector de documentos activos (Active Documents) 22. Si presiona las teclas Ctrl-Tab aparecerá el selector de documentos activos. En dicha herramienta se podrán seleccionar las herramientas activas, así como los documentos. Para seleccionar alguno de los elementos, puede hacer clic sobre la herramienta o documento, utilizando las flechas de dirección, o mantenga oprimida la tecla Ctrl mientras oprime repetidamente la tecla Tab hasta que se seleccione el documento deseado.

23. Presione Ctrl y mantenga presionada la tecla. Ahora presione Tab en repetidas ocasiones hasta que el programa en que codificamos la clase, Class1.vb (C:\APVBNETVS\ Ejercicios\Clase\Class1.vb) aparezca; cuando se haya seleccionado el archivo deseado, simplemente suelte la tecla Ctrl y el archivo aparecerá en Document Window.

292

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

24. Vea cómo lo que agregamos en Class Designer se ha agregado a nuestro código:

25. ¿Qué diferencias encuentra entre las propiedades definidas usando code snippets y la propiedad definida desde Class Designer?

26. Regrese al diagrama de clase (ClassDiagram1.cd) y modifique la información de Summary para todos los elementos de la clase: Miembro

Summary

Tipo

Rectangulo

Muestra el área de un rectángulo

Method

TrianguloRectangulo

Muestra el área de un triángulo rectángulo

Method

Altura

Valor de medida de la altura

Property

Base

Valor de medida de la base

Property

pAltura

Variable de paso para altura

Field

pBase

Variable de paso para base

Field

➤ Adición de métodos usando Class Designer 27. Agregar métodos utilizando Class Designer es casi tan sencillo como agregar propiedades. En el panel Class Details de Class Designer puede agregarlo en el apartado de Methods, haciendo clic en .

Capítulo 10. Clases, métodos y propiedades

293

28. Otra forma de hacerlo es utilizando el icono para agregar nuevos miembros a la clase. Haga clic en el icono New Method; aparecerá un menú en el cual debe seleccionar New Method.

10

29. Automáticamente se agregará una línea en donde podremos especificar los elementos básicos del método. En la columna Name coloque el valor Circulo, en Type coloque el tipo del valor de retorno, que en este caso es Decimal; deje el Modifier como Public. 30. En Summary haga clic en el botón Description . En Summary escriba Muestra el área de un círculo y en Returns escriba Área del círculo (Decimal).

294

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

31. Al lado de cada miembro en Class Details aparece un pequeño icono que indica el tipo de miembro del que se trata. Al hacer doble clic sobre el icono de miembro, Visual Studio permitirá la edición del miembro del que se trate. Icono

Miembro Property Method Events Field

32. Haga doble clic sobre el icono de miembro del método Circulo. El programa deberá ir al código en donde se defina el método. 33. Complemente el código, de tal forma que quede de la siguiente manera: Codificación de Clase 1 2 3 4 5 6 7

– Class1.vb – Circulo()

‘’’ ‘’’ Muestra el área de un círculo ‘’’ ‘’’ Área del circulo (Decimal) Public Function Círculo() As Decimal Return (3.1416D * (Radio ^ 2)) End Function

34. El código completo debe haber quedado de la siguiente forma: Codificación de Clase 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

– Class1.vb

Public Class Areas ‘’’ ‘’’ Variable de paso para base ‘’’ Private pBase As Decimal ‘’’ ‘’’ Valor de medida de la base ‘’’ Public Property Base() As Decimal Get Return pBase End Get Set(ByVal value As Decimal) pBase = value End Set End Property

Capítulo 10. Clases, métodos y propiedades

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

‘’’ ‘’’ Variable de paso para altura ‘’’ Private pAltura As Decimal ‘’’ ‘’’ Valor de medida de la altura ‘’’ Public Property Altura() As Decimal Get Return pAltura End Get Set(ByVal value As Decimal) pAltura = value End Set End Property ‘’’ ‘’’ Muestra el área de un rectángulo ‘’’ Function Rectangulo() As Decimal Return (Base * Altura) End Function ‘’’ ‘’’ Muestra el área de un triángulo rectángulo ‘’’ Function TrianguloRectangulo() As Decimal Return ((Base * Altura) / 2) End Function ‘’’ ‘’’ Valor de medida del radio ‘’’ Public Property Radio() As Decimal Get End Get Set(ByVal value As Decimal) End Set End Property ‘’’ ‘’’ Muestra el área de un círculo ‘’’ ‘’’ Área del círculo (Decimal) Public Function Círculo() As Decimal Return (3.1416D * (Radio ^ 2)) End Function

End Class

295

10

296

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

35. En este programa, ¿cuántas líneas de código ha escrito usted sin la asistencia de Visual Studio? _____________________________

➤ Uso de Class View para examinar objetos 36. La herramienta Class View permite examinar y acceder a los objetos pertenecientes a una solución y sus miembros correspondientes. Para ver esta herramienta seleccione View – Class View (oprima la combinación de teclas Ctrl-Mayús-C). Class View se compone de una barra de herramientas, una barra de búsqueda, un árbol de archivos y miembros, y un panel de objetos y miembros. FIGURA 10.1 Class View

37. En la barra de búsqueda de Class View escriba Base y haga clic en el botón Search que aparece en la misma barra de búsqueda.

,

Capítulo 10. Clases, métodos y propiedades

297

38. Aparecerán en el árbol de archivos y miembros todos aquellos que contengan la palabra Base, empezando con la que más concuerde con el patrón a buscar (que es la propiedad que definimos en nuestra clase). Haga clic en el botón Back que aparece en la barra de herramientas de Class View. 39. En el árbol de archivos y miembros busque el nodo Clase y expanda el árbol hasta colocarse en el miembro Areas. Observe cómo al seleccionar el nodo, todos sus miembros aparecen en el panel de objetos y miembros. De esa forma se pueden examinar los miembros de una clase y seleccionarlos para diferentes operaciones.

10

40. En el panel de objetos y miembros seleccione el miembro Circulo(), despliegue el menú contextual y seleccione Go To Definition. De esa forma Visual Studio localizará el archivo de la solución en la cual el miembro fue codificado, permitiendo su edición. De esta forma se evita estar navegando por el Solution Explorer tratando de encontrar una clase y luego navegar entre el código para encontrar el código que define el miembro.

298

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

41. Guarde los cambios en su solución. FIN DEL EJERCICIO*

Ejercicio 10.2 Consumo de una clase a través de instancias En este ejercicio se consumirá una clase. Para ello se generará una instancia (objeto) y se utilizarán los métodos declarados en la clase.

Capítulo 10. Clases, métodos y propiedades

1. 2. 3.

4. 5.

299

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Console Application, llamado UtilizaClase. En Solution Explorer seleccione UtilizaClase y despliegue el menú contextual. Seleccione Add Reference. En la ventana Add Reference seleccione la pestaña Projects y seleccione el proyecto Clase. Con ello habilitamos a nuestra nueva aplicación para consumir la funcionalidad de la clase que definimos en el ejercicio anterior. Haga clic en Ok. Agregue las líneas necesarias para hacer type safe a su programa; importe el espacio de nombres System con la clase Console. En Text Editor mostrará lo siguiente:

10

6.

Importe un nuevo espacio de nombres que le permita tener acceso a los recursos de la clase con la cual establecimos referencia. Escriba la siguiente línea antes del bloque de módulo: Imports Clase

7.

Vea cómo Intellisense ya reconoce la existencia de nuestra clase.

300

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

8.

Dentro del módulo deberá generar una instancia de la clase Areas. Para ello deberá escribir la siguiente línea de código, que declara una variable (X) de tipo Areas (con ello se reserva en memoria un espacio para manejar una variable que alojará un objeto construido a partir de nuestra clase, con toda la funcionalidad que le hayamos codificado): Dim X As Areas

9.

Declarar la variable no implica que ya tengamos un objeto. Simplemente tenemos reservado un lugar para guardar el objeto, pero el objeto aún no existe. Para generarlo necesitamos hacer uso de un constructor, lo que implica utilizar la instrucción New. Para generar un objeto a partir de Areas, y almacenar dicho objeto en el área que hemos reservado, utilizamos la siguiente línea: X = New Areas()

10. A través de la variable X ya podemos hacer uso de toda la funcionalidad programada en la clase. El código de los puntos 8 y 9 puede simplificarse, instanciando al momento en que declaremos, dando una línea como la que sigue: Dim X As New Areas

11. Vea cómo Intellisense ya reconoce la existencia de nuestra clase y sus miembros. Incluso da la información que nosotros establecimos como comentario.

Capítulo 10. Clases, métodos y propiedades

301

12. El código completo debe haber quedado de la siguiente manera:

Codificación de UtilizaClase 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Imports Clase

Module Module1

10

Sub Main() Dim X As New Areas X.Altura = 10D X.Base = 20D WriteLine(“—- Áreas calculadas ———-”) WriteLine(“Rectángulo: “ & CType(X.TrianguloRectangulo(), String)) Write(“Presione INTRO para continuar”) ReadLine() End Sub End Module

Ejecución guiada de UtilizaClase

– Module1.vb

13. Construya la solución (oprima la combinación de teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (oprima la tecla F5). 14. La línea 5 importa el espacio de nombres Clase, que está disponible gracias a que establecimos la referencia con la librería Clase. En la línea 11 se declara una variable que tiene como origen nuestra clase Areas; en la misma línea de declaración se genera la instancia del objeto, utilizando el constructor New. 15. Se proporciona valor a las propiedades Altura y Base del objeto (líneas 13 y 14), y se utiliza el método TrianguloRectangulo() para comprobar la funcionalidad de la clase. Como TrianguloRectangulo() retorna un valor Decimal, se realiza la conversión a String para evitar problemas en la concatenación.

302

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

16. Como proporcionamos un valor 10 para la altura y 20 para la base, el resultado es el siguiente: —- Áreas calculadas ———Rectángulo: 100 Presione INTRO para continuar

➤ Uso de Object Browser 17. Visual Studio provee una herramienta llamada Object Browser, que permite ver información de las clases y sus comentarios. 18. Seleccione en Class View el miembro Circulo() de la clase Area de nuestro proyecto Clase. Despliegue el menú contextual y seleccione Browse Definition. Vea cómo aparece, además de la información usual presentada por Class View, un apartado que muestra la información de los comentarios que especificamos al crear el método. Es muy importante colocar información valiosa en los comentarios, a fin de que sean de utilidad al ser consultados en Object Browser. No está de más decir que si hacemos doble clic sobre alguno de los miembros en Object Browser, Visual Studio nos trasladará al código de definición.

➤ Visualización de referencias 19. Visual Studio mantiene un complejo sistema de referencias a recursos, de tal forma que todos estén disponibles casi de cualquier parte. Para llegar al código de definición de un

Capítulo 10. Clases, métodos y propiedades

303

miembro de una clase, por ejemplo TrianguloRectangulo(), basta hacer doble clic sobre TrianguloRectangulo () en Class View, o hacer doble clic sobre TrianguloRectangulo () en Object Browser, e incluso en Text Editor, colocándonos sobre TrianguloRectangulo() y seleccionando Go To Definition en el menú de contexto.

10

20. Internamente, Visual Studio conoce dónde se encuentra todo lo que utilizamos en un programa. Vaya a Solution Explorer y, desde el nodo UtilizaClase, despliegue el menú contextual y seleccione Build. Vea la ventana Output y percátese de que no sólo se construyó el proyecto UtilizaClase, sino también Clase, dado que contiene clases que son utilizadas por UtilizaClase.

304

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

21. Edite el código de

Module1 de UtilizaClase.

Coloque el puntero del ratón sobre y despliegue el menú contextual; seleccione Find All References. Aparecerá una ventana llamada Find Symbols Results, que mostrará todas las referencias físicas que permiten a Visual Studio encontrar todos los recursos que su programa necesita.

TrianguloRectangulo()

22. Por supuesto, al hacer doble clic en cualquiera de los elementos, Visual Studio nos trasladará al código de definición correspondiente. 23. Guarde los cambios en su solución. FIN DEL EJERCICIO *

Ejercicio 10.3 Uso de clases en soluciones diferentes

En este ejercicio realizará los trabajos necesarios para poner a disposición de todos los desarrolladores la funcionalidad de una clase. Es común que un grupo de desarrolladores, en ambientes profesionales, generen librerías comunes que de forma estandarizada son utilizadas en todas las soluciones que construyen. Usos comunes son clases para gobernar la seguridad de las aplicaciones, clases para el acceso eficiente a los datos, clases para interfaces de usuario uniformes, etcétera. Sólo un grupo de desarrolladores son los encargados de fabricar las librerías, mientras que todos los demás desarrolladores, en todos los demás proyectos, las utilizan. Veamos cómo se logra esto usando Visual Studio.

➤ Integración de proyectos existentes a una nueva solución 1.

Genere una nueva solución, llamada Calculos. Seleccione File – New – Project. Seleccione en Project types la opción Other Project types - Visual Studio Solutions, y seleccione en Templates la opción Blank Solution. En Name coloque Calculos y en Location especifique C:\APVBNETVS.

Capítulo 10. Clases, métodos y propiedades

2. 3.

4.

5.

6.

7.

305

Agregue a la solución un proyecto Windows – Console Application, llamado PruebaLibreria. En Solution Explorer seleccione PruebaLibreria y despliegue el menú contextual. Seleccione Add Reference. En la ventana Add Reference seleccione la ficha Projects. Como puede ver, no aparece ningún proyecto, por lo cual no encontramos la librería Clase que definimos en el proyecto anterior. Seleccione la pestaña .NET y busque Clase. Como podrá comprobar, tampoco aparece nuestra biblioteca dentro de las que se encuentran registradas en GAC (Global Assembly Caché). Haga clic en Cancel. Hay que agregar un elemento existente, en este caso el proyecto Clase de la solución Ejercicios. Proceda de la siguiente forma: seleccione la solución Calculos, despliegue el menú contextual y seleccione Add – Existing project. Seleccione el proyecto de la librería, que se identifica por el archivo Clase.vbproj (Visual Basic Project) ubicado en el directorio C:\APVBNETVS\Ejercicios\Clase. Si en este momento intenta agregar una referencia, se dará cuenta de que el proyecto de librería Clase ya aparece dentro de la pestaña Projects de Add Reference, con lo cual normalmente podrá establecer la referencia sin problemas. El problema es que deberá realizar este proceso en cada proyecto en el que desee utilizar la funcionalidad de la clase; ello implica dar permisos sobre los objetos de la librería y exponer el contenido del código a modificaciones no autorizadas. Los problemas no paran ahí: imagine que la librería incluya código de cifrado a datos sensibles, todo el mundo sabrá cómo se codificó el algoritmo de seguridad. En realidad agregar el proyecto a la nueva solución no es lo que queríamos hacer, sino disponer de la funcionalidad de la librería, sin saber nada más respecto al código o la composición. Elimine el proyecto Clase que acaba de agregar. Para ello, seleccione en Solution Explorer el nodo Clase, despliegue el menú contextual y seleccione Remove. Al solicitarse la confirmación de eliminación, confírmela. Esto no impacta físicamente al proyecto, solamente elimina la referencia de la solución.

➤ Distribución de copias locales de librerías DLL 8.

9.

Una buena práctica es hacer una copia local de la librería DLL en el directorio de trabajo de la nueva solución. Copie el archivo Clase.DLL que se encuentra en C:\APVBNETVS\Ejercicios\Clase\Bin\Debug, y péguelo en C:\APVBNETVS\Calculos. Aunque la referencia podría hacerse directamente en el archivo original, se recomienda el uso de copias locales para que al momento de integrar paquetes de instalación el conjunto de recursos esté más organizado. En Solution Explorer seleccione el nodo Calculos, despliegue el menú contextual y seleccione Add Existing Item. Aparecerá una ventana que le permitirá seleccionar archivos. Seleccione la copia local de la DLL que está en C:\APVBNETVS\Calculos.

10

306

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. En Solution Explorer seleccione el nodo PruebaLibreria. Despliegue el menú contextual y seleccione Add Reference. Seleccione la pestaña Browse. Seleccione el archivo Clase.DLL que se encuentra en C:\APVBNETVS\Calculos. De esa forma disponemos de la funcionalidad del ensamblado, sin entrar en los pormenores de su desarrollo, desde una copia local. 11. Abra desde Solution Explorer el código de Module1.vb de PruebaLibreria. Agregue un Imports, vea Intellisense y note que ya se puede disponer de la clase.

12. Guarde los cambios de su solución. FIN DEL EJERCICIO*

Capítulo 10. Clases, métodos y propiedades

MAPA

307

MENTAL DEL CAPÍTULO

10

308

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Class, 281 Designer, 289 Code Snippets, 285 Diagrama de la clase, 289

Friend, 284 GET, 282 Librerías, 283 Modificadores de acceso, 283

Friend, 284 Object Browser, 302 Public, 284 Private, 284 SET, 282 Property, 282 Propiedades, 282 Protected, 284

PREGUNTAS 10.1 ¿Cuál es la sintaxis para declarar una clase? 10.2 ¿Cuál es la sintaxis para declarar una propiedad? 10.3 Explique los modificadores de acceso y su impacto en los elementos de una clase. 10.4 Explique el procedimiento para crear una biblioteca o librería. 10.5 ¿Qué especificaciones deben hacerse en un programa para que pueda consumir la funcionalidad de una clase que se encuentra en una librería externa?

Capítulo 10. Clases, métodos y propiedades

309

Notas:

10

310

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Es la definición formal de un objeto: a) Clase b) Propiedad c) Método 2. Es la instrucción constructora por excelencia: a) New b) CreateObject c) Dim 3. Son las características particulares de los objetos: a) Métodos b) Clases c) Propiedades 4. Calificadores de declaración que determinan el grado de encapsulamiento de una clase: a) Agregados b) Delegados c) Modificadores de acceso 5. Es la especificación de destino (target) que aplica para las bibliotecas de clase, al momento de compilar para generar un DLL: a) Library b) Class c) Binary

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Las clases que pertenecen a la biblioteca de clases de .NET Framework pueden utilizarse directamente, sin necesidad de instanciación, pero las creadas por el usuario no.

7.

Una librería DLL puede ser utilizada sólo por un ensamblado, ya que la información de ésta queda registrada en metadatos.

8.

Se pueden definir tantas propiedades al objeto como nuestros programas requieran.

9.

Para utilizar una librería desde un programa que le es ajeno, es necesario establecer la referencia al compilar mediante el argumento /r

10.

Una clase Public puede ser utilizada por todos los programas y procedimientos de una aplicación.

CAPÍTULO

11

Herencia y polimorfismo Objetivos: Aprender la implementación de herencia y polimorfismo de los objetos. 1. Aprenderá qué es la herencia entre objetos y cuándo se debe utilizar. 2. Conocerá los modificadores de funcionalidad de los objetos para programar adecuadamente la herencia en una jerarquía de clases. 3. Sabrá qué son MyBase y MyClass, y cuándo utilizarlas. 4. Aprenderá en qué consiste el polimorfismo y cómo establecerlo de manera programática.

311

312

Aprenda Practicando Visual Basic 2005 usando Visual Studio

Contenido Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¿Cuándo se debe utilizar la herencia? . . . . . . . . . . . . . . . . . . . . . . . . . Inherits (Heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notlnheritable (No heredable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mustlnherit (Debe heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modificadores de acceso, necesarios para la herencia . . . . . . . . . . . . . Programación de clases base y clases derivadas . . . . . . . . . . . . . ➤ Adición de clases a un módulo usando Class Designer . . Estatutos auxiliares para el manejo de herencia y polimorfismo . . . . . . . . . . NotOverridable (No reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overridable (Reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MustOverridable (Debe reemplazarse) . . . . . . . . . . . . . . . . . . . . . . . . . Overrides (Reemplaza) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Overloads (Sobrecarga/Sustituye) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MyBase y MyClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprobación del polimorfismo basado en herencia y el uso de MyBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Especificación de modificadores de herencia usando Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

313 313 314 314 314 315 315 316 323 324 324 324 324 324 325 325 326 327 335 336 336 338

Capítulo 11. Herencia y polimorfismo

313

El manejo de propiedades, métodos y eventos es sólo el principio de la programación orientada a objetos; las características principales de la POO descansan en la capacidad de los objetos para trabajar en colaboración con otros objetos, y de aprovechar total o parcialmente su funcionalidad mediante la reutilización de código según lo requieran las aplicaciones. En el presente capítulo estudiaremos los principios que permiten el máximo aprovechamiento del código a través de POO y con sus dos capacidades características: herencia y polimorfismo.

Herencia La herencia (inheritance) es un concepto fundamental de la programación orientada a objetos, y consiste en la capacidad de definir clases que sirven como base de otras clases, evitando la redundancia en la definición de elementos como métodos, eventos y propiedades. Hay una clase base y una o varias clases derivadas; las clases derivadas aprovechan todo lo declarado en la clase base, asumiéndolo como suyo y utilizando capacidades que no están codificadas en ellas. Las clases derivadas pueden heredar, e incluso extender, las propiedades, los métodos y los eventos de la clase base. Es posible también que las clases derivadas sustituyan o modifiquen (override) la funcionalidad de los métodos de la clase base. En Visual Basic, por omisión, todas las clases pueden heredarse. Las ventajas de la herencia son muchas, pero la principal es que el desarrollador tendrá que escribir y depurar el código sólo una vez, para una clase, y disponer en muchas clases de la misma funcionalidad, estableciendo las referencias adecuadas.

¿Cuándo se debe utilizar la herencia? La herencia entre clases no debe utilizarse por el simple hecho de que el lenguaje lo permite. La herencia debe planearse; el desarrollador debe pensar cómo han de ser las clases, organizándolas en lo que se conoce como jerarquía de clases. Se recomienda una jerarquía de clases cuando entre las clases se presenta una relación de tipo Es-un (is-a); debe evitarse el uso de herencia cuando se trata de relaciones Tiene-un (has-a). Una clase que contiene las características de los automóviles en general (Automóviles) tiene mucho que compartirle a una clase que almacena las particularidades de los automóviles deportivos (AutomóvilesDeportivos), pues un automóvil deportivo, antes que ser de tipo deportivo, es un automóvil (is-a). Ahora pregúntese, ¿qué comparte un dueño de un automóvil y un automóvil? Automóviles y DueñosAutomóviles, no comparten rasgos. Las personas que poseen automóviles no se derivan de los automóviles, ni viceversa. Que una persona tenga un (has-a) automóvil, no quiere decir que comparta con éste sus métodos,

11

314

Aprenda Practicando Visual Basic 2005 usando Visual Studio

propiedades y eventos. Imagínese tener que determinar el tipo de transmisión, número de puertas y número de serie que una persona posee. Simplemente, de una cosa no puede derivar la otra. Se recomienda una jerarquía de clases, obviamente, sólo si el código de una clase brinda alguna funcionalidad que se pueda reutilizar; tratar de heredar aspectos muy particulares que sólo son pertinentes para una clase no tiene sentido.

Inherits (Heredar) El estatuto Inherits se utiliza para especificar que una clase de nueva creación tiene como base una clase ya existente. La clase nueva es la clase derivada (derived class); la clase ya existente es la clase base (base class). La sintaxis es la siguiente: Class

NombreClaseDerivada NombreClaseBase ... Inherits

End Class

En este caso, la clase derivada dispone de todos los elementos declarados en la clase base.

NotInheritable (No heredable) Ya decíamos que por omisión todas las clases en Visual Basic pueden heredarse. Habrán ocasiones en que no queramos que una clase pueda heredarse; en tal caso, hay que especificar, al declarar una clase, que ésta no es heredable. La sintaxis para ello es la siguiente: NotInheritable Class

NombreClase

... End Class

En este caso, intentar heredar NombreClase generaría un error (Inherits

NombreClase).

MustInherit (Debe heredar) Como sabemos, los objetos son instancias de una clase. Ya explicábamos que no se puede tener acceso a la funcionalidad de una clase sino a través de una instancia de la misma, es decir, de un objeto basado en la clase. Eso es verdadero sólo relativamente. ¿Habrá alguna forma de que podamos disponer de la funcionalidad de una clase sin generar una instancia de la misma? La respuesta es que sí. Podemos declarar una clase que no pueda instanciarse pero que pueda ser utilizada sólo si se hereda por otra clase. Para hacer eso es necesario especificar el estatuto MustInherit.

Capítulo 11. Herencia y polimorfismo

315

La sintaxis es la siguiente: MustInherit Class

NombreClase

... End Class

En este caso, instanciar NombreClase generaría error (Dim

Objeto As New NombreClase())

NOTA Algunos lenguajes como C++ y C#, llaman a las clases calificadas como MustInherit, como clases abstractas (abstract class).

Modificadores de acceso, necesarios para la herencia Usted debe determinar el alcance que tendrá su jerarquía de clases, a efecto de restringir el acceso a las clases, de tal manera que sólo puedan heredarlas aquellas porciones de código que deban hacerlo. Calificar una clase como clase pública (public class), se logra utilizando el modificador de acceso Public al momento de la declaración de la clase. Esto garantiza que todas las clases podrán utilizar la clase todo el tiempo; en este caso, el acceso es abierto. Si no quiere una clase de acceso abierto, puede restringir el acceso a la clase utilizando los modificadores de acceso Friend y Private. Tome en cuenta que en una jerarquía de clases el acceso puede heredarse sólo hacia un acceso igual o mayor, nunca menor: una clase con acceso Public no puede heredar una clase Friend o Private, y una clase Friend no puede heredar una Private. En este ejercicio se generará una clase base y una clase derivada, y se comprobará la herencia entre ellas.

Ejercicio 11.1 Programación de clases base y clases derivadas

1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Console Application, llamado Herencia. Abra Class View (oprima las teclas Ctrl-Mayús-C) y colóquese en el nodo Herencia – Herencia; despliegue el menú contextual y seleccione View Class Diagram.

11

316

Aprenda Practicando Visual Basic 2005 usando Visual Studio

4.

Se desplegará Class Designer.

➤ Adición de clases a un módulo usando Class Designer 5.

Colóquese en cualquier parte del diagrama de clase y despliegue el menú contextual. Seleccione Add – Class.

Capítulo 11. Herencia y polimorfismo

317

6.

Aparecerá la ventana New Class. En este programa queremos codificar clases en el programa de consola que ya comenzamos a construir (Module1.vb). Asignamos en Class Name el nombre MiClaseBase, en Access dejamos el valor de Public, y en File name especificamos que queremos agregar la clase a un archivo existente (Add to existing file), colocando el nombre de nuestro programa de consola (Module1.vb).

7.

Con ello se habrá agregado a nuestro programa de consola una clase. Como podrá sospechar, las clases no sólo se pueden codificar como proyectos independientes, sino también integrarse perfectamente en otros proyectos.

8.

Aparecerá nuestra nueva clase en el diagrama de clase. Seleccione la nueva clase, despliegue el menú contextual y seleccione Class Details.

11

318

Aprenda Practicando Visual Basic 2005 usando Visual Studio

9.

Utilizando Class Details, agregue a MiClaseBase dos métodos, llamados Mensaje1() y Mensaje2(). En la columna Type no coloque nada, debido a que los métodos no devolverán valores.

10. Haga las modificaciones pertinentes para que nuestro código luzca como sigue. En esencia se hace al programa strong type, se importa un espacio de nombres, se colocan en Main() líneas para que el programa espere una tecla y se provee de comportamiento a los métodos de MiClaseBase.

Codificación de Herencia 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main() Write(“Presione INTRO para continuar”) ReadLine() End Sub End Module Public Class MiClaseBase ‘’’ ‘’’ Envía primer mensaje ‘’’ Public Sub Mensaje1() WriteLine(“Clase Base - Mensaje 1”) End Sub

Capítulo 11. Herencia y polimorfismo

25 26 27 28 29 30 31 32

319

‘’’ ‘’’ Envía segundo mensaje ‘’’ Public Sub Mensaje2() WriteLine(“Clase Base - Mensaje 2”) End Sub End Class

11. Regrese al diagrama de clase del programa Herencia, agregue una nueva clase (Add – Class); en Class name especifique MiClaseDerivada, en Access especifique Public, y en File name seleccione Add to existing file, especificando nuestro programa, es decir, Module1.vb.

11

12. Seleccione en el diagrama de clase el objeto MiClaseDerivada, despliegue el menú contextual y seleccione Class Details. Agregue un método, cuyo nombre sea Mensaje3().

320

Aprenda Practicando Visual Basic 2005 usando Visual Studio

13. Complemente el código de tal forma que luzca de la siguiente manera:

Codificación de Herencia 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Sub Main() Dim MiObjeto As New MiClaseDerivada MiObjeto.Mensaje1() MiObjeto.Mensaje2() MiObjeto.Mensaje3() Write(“Presione INTRO para continuar”) ReadLine() End Sub End Module Public Class MiClaseBase ‘’’ ‘’’ Envía primer mensaje ‘’’ Public Sub Mensaje1() WriteLine(“Clase Base - Mensaje 1”) End Sub ‘’’ ‘’’ Envía segundo mensaje ‘’’ Public Sub Mensaje2() WriteLine(“Clase Base - Mensaje 2”) End Sub End Class Public Class MiClaseDerivada Inherits MiClaseBase ‘’’ ‘’’ Envía tercer mensaje ‘’’ Public Sub Mensaje3() WriteLine(“Clase Base - Mensaje 2”) End Sub End Class

Capítulo 11. Herencia y polimorfismo

Ejecución guiada de Herencia

321

– Module1.vb

14. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 15. En un módulo lo que se ejecuta es el procedimiento principal, llamado Main(), líneas 22 a la 30. El módulo completo tiene dos clases: MiclaseBase, de la línea 20 a la 35, y MiClaseDerivada, de la línea 37 a la 46. tiene dos métodos: Mensaje1( ), de la línea 22 a la 27, y Mensaje2( ), de la línea 29 a la 34. MiClaseDerivada tiene un solo método: Mensaje3( ), de la línea 40 a la 45.

MiClaseBase

Tome en cuenta que la clase MiClaseDerivada no posee los métodos pues la que los posee es la clase MiClaseBase.

Mensaje1()

y

Mensaje2(),

Lo más importante de este programa es que MiClaseDerivada hereda la funcionalidad de MiClaseBase al aplicar la instrucción Inherits, en la línea 38; aun cuando Mensaje1() y Mensaje2() no están declaradas en MiClaseDerivada, ya forman parte de dicha clase, debido a que son tomadas de la clase base. La integración es tal que, al estar codificando el programa, Intellisense reconoce los miembros de MiClaseBase como parte de MiClaseDerivada.

11

322

Aprenda Practicando Visual Basic 2005 usando Visual Studio

16. En la línea 10 se tiene un constructor que genera una instancia de la clase MiClaseDerivada bajo el nombre de MiObjeto. Observe cómo las líneas 11 y 12 hacen uso de métodos no declarados en la clase MiClaseDerivada; esto es posible gracias a que, al haber establecido una relación de herencia con MiClaseBase, la clase derivada dispone automáticamente de todos los métodos, propiedades y eventos declarados en la clase base. De esta forma, MiClaseDerivada sólo declarará cosas que no están declaradas en MiDeclarar los mismos métodos en ambas clases sería redundante.

ClaseBase.

Tome en cuenta las dimensiones que puede tomar su jerarquía de clases, ya que si hereda una clase que a su vez es derivada de otra clase, se hereda también la funcionalidad de la clase base de ésta. Si todo ocurrió como se esperaba, la salida será la siguiente: Clase Base - Mensaje 1 Clase Base - Mensaje 2 Clase Base - Mensaje 2 Presione INTRO para continuar

17. Si consultamos el diagrama de clase, nos daremos cuenta que reconoce ya la relación de herencia existente entre nuestras dos clases.

FIN DEL EJERCICIO *

Capítulo 11. Herencia y polimorfismo

323

Estatutos auxiliares para el manejo de herencia y polimorfismo Tiempos de compilación de CLR

En ocasiones heredamos una clase, pero nos damos cuenta que algunas entidades (métodos, propiedades, eventos) no se ajustan del todo a lo que verdaderamente necesitamos; en resumen, no nos sirven tal y como fueron heredadas. Es posible que pensemos que los elementos heredados son útiles, pero que lo serían más con algunas pequeñas modificaciones. Dichas modificaciones se realizan en la clase derivada, respecto de las definiciones originales existentes en la clase base. La programación orientada a objetos hace posible que eso suceda, pues permite implementar diferentes comportamientos para un método (override), o de plano reemplazarlo por completo (overload). La funcionalidad heredada puede modificarse por otra que sea más indicada para el problema de programación que deseamos resolver; con ello se promueve que la reutilización del código sea flexible y adaptable. Por omisión, una clase derivada hereda los métodos y propiedades de su clase base. Si necesitamos que una propiedad o método heredado se comporte de manera distinta a como se definió en la clase base, puede ser implementada de forma distinta (overridden) o reemplazada (overloaded); esto quiere decir que la herencia sirve hasta donde nosotros deseamos comenzar a hacer modificaciones. Los estatutos auxiliares de herencia sirven para especificar el grado de modificación que ha de darse entre la clase derivada y la clase base; estos son: Overridable, NotOverridable, Overrides, MustOverride y Overloads. En cuanto a la clase base hay tres escenarios:

FIGURA 11.1 Estatutos auxiliares para el manejo de herencia

11

324

Aprenda Practicando Visual Basic 2005 usando Visual Studio

NotOverridable (No reemplazable) El primer escenario es que la clase base no acepte que su funcionalidad sea modificada o sustituida. En ese caso, el estatuto NotOverridable evita que una propiedad o método de una clase base pueda ser sustituido en una clase derivada. Por omisión, los métodos públicos en una clase base son NotOverridable.

Overridable (Reemplazable) El segundo escenario es que la clase base admita modificaciones o sustituciones a su funcionalidad. El estatuto Overridable establece que una propiedad o método (elemento) de una clase base puede ser modificado en su implementación o sustituido en una clase derivada.

MustOverride (Debe reemplazarse) El tercer escenario es que la modificación a la funcionalidad de la clase base no sólo sea posible, sino que sea obligatoria. El estatuto MustOverride hace que sea obligatorio hacer variaciones, en la clase derivada, de las propiedades o método de la clase base que han sido heredados. Del lado de la clase derivada hay dos escenarios, que sólo son posibles si los elementos de la clase base permiten modificaciones en la funcionalidad.

Overrides (Reemplaza) El primer escenario es cuando la clase base permite que su funcionalidad sea modificada, respetando la estructura original del elemento modificado. El estatuto Overrides permite la variación en la clase derivada, de sus propiedades o sus métodos. Esto será siempre y cuando se mantengan los mismos argumentos en el método de la clase base y la clase derivada. Overrides sólo permite desarrollar en la clase derivada una implementación distinta de un elemento de la clase base, y no su sustitución por otro que no guarde semejanza.

Overloads (Sobrecarga/Sustituye) El segundo escenario es que se desee sustituir la funcionalidad, sin necesidad de respetar estructuras o condiciones precedentes. En ocasiones, además de modificar el comportamiento de los métodos que participan en una relación de herencia, es necesario hacer uso de diferentes argumentos, ya sea porque los que se tienen deben considerar otros tipos de datos, o bien, porque el método que mo-

Capítulo 11. Herencia y polimorfismo

325

difica al heredado de la clase base requiere una cantidad distinta de argumentos. En este caso, ya no hablamos de una implementación distinta de lo mismo, sino de dos métodos bastante distintos entre sí que comparten un nombre. En este último caso, Overrides no sirve pues exige igualdad de argumentos. Para poder lograr nuestro cometido, debemos utilizar Overloads, que indica la sustitución del método de la clase base por otro de la clase derivada, tengan o no relación entre sí. Overloads es la única forma de implementar, bajo un mismo nombre, dos métodos que no coinciden más que en el nombre.

MyBase y MyClass Se puede utilizar la palabra reservada MyBase para llamar a ejecución a un método de la clase base desde una clase derivada. Esto quiere decir que a) si existe herencia entre dos clases, y b) en la clase derivada se modifica un método, entonces c) es posible mandar llamar a ejecución al método, ya sea en la forma en que se encuentra en la clase base, o en la forma en que se encuentra en la clase derivada misma. Con MyBase podemos obligar a la aplicación a que utilice un método de la clase base y no de la clase derivada; en caso contrario, es posible que queramos mandar llamar el método tal y como está en la clase derivada. Para ello utilizamos la palabra reservada MyClass, que se encarga de llamar a ejecución un método que se encuentra en la misma clase cuando ésta es derivada. Es importante saber que tanto MyBase como MyClass, aunque en su manejo parecen objetos, realmente no lo son. No se instancian; existen porque el lenguaje los proporciona para un manejo más flexible de la herencia y el polimorfismo.

Polimorfismo El polimorfismo es la habilidad que tiene el lenguaje para definir múltiples clases que contengan métodos y propiedades del mismo nombre, pero que brindan diferente funcionalidad. Cuando se presenta el polimorfismo es posible elegir, en tiempo de ejecución, aquellos métodos o propiedades que necesitamos. No importa que varias clases posean los mismos métodos y las mismas propiedades: la aplicación debe ser capaz de utilizar precisamente aquellas cuya funcionalidad estemos invocando. La herencia y la sustitución de métodos y propiedades tienen mucho que ver con el polimorfismo. Cuando se declara una clase y a partir de ésta se derivan otras clases, estamos ante la presencia de la herencia; si además de esto, los métodos y propiedades de la clase

11

326

Aprenda Practicando Visual Basic 2005 usando Visual Studio

base que fueron heredados son modificados (Overriden) o sustituidos (Overloaded) en la clase derivada, de tal manera que comparten el mismo nombre pero no la misma funcionalidad, estamos ante el polimorfismo. Una manifestación aún más pura del polimorfismo se presenta cuando se utiliza Overloads, que implica una sustitución completa de métodos que se encuentran en clases que guardan una relación de herencia. Cuando en una clase derivada se modifican métodos o propiedades de la clase base, se dice que hay polimorfismo basado en herencia.

Ejercicio 11.2 Comprobación del polimorfismo basado en herencia y el uso de MyBase

En este ejercicio se comprobará el polimorfismo basado en herencia; para ello se definirán varias clases, se heredarán unas con otras y se verá el uso de la palabra reservada MyBase. El programa calculará lo que se le pagará a los empleados, partiendo del supuesto que puede haber pago normal, agregarse un bono por puntualidad del 25 por ciento, e incluso un bono adicional del 20 por ciento. 1.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln).

2.

Agregue su solución un proyecto Windows – Console Application, llamado Nomina.

3.

Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Const PagoXHoraVig As Decimal = 120D Const BonoPuntualidad As Decimal = 1.25D Sub Main() End Sub End Module

Capítulo 11. Herencia y polimorfismo

4.

327

Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – y haga clic en el icono View Class Diagram. Agregue, usando Class Designer, una clase llamada Pago, que será pública y que se agregará al programa de consola que estamos trabajando. Nomina

5.

11 ➤ Especificación de modificadores de herencia usando Properties 6.

En el diagrama de clase seleccione la clase Pago que acaba de agregar, invoque Class Details y agregue un método de nombre CalculaPago, que será público y que devolverá un valor Decimal. En Class Details seleccione el método que acaba de agregar y despliegue el menú contextual; seleccione la opción Properties.

328

Aprenda Practicando Visual Basic 2005 usando Visual Studio

7.

En la propiedad Inheritance

8.

En este punto, nuestro código debe lucir de la siguiente manera:

Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

modifier

seleccione el valor Overridable.

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Public Const PagoXHoraVig As Decimal = 120D Public Const BonoPuntualidad As Decimal = 1.25D Sub Main() End Sub End Module Public Class Pago ‘’’ ‘’’ Cálculo del pago neto ‘’’ Public Overridable Function CalculaPago() As Decimal End Function End Class

Capítulo 11. Herencia y polimorfismo

9.

Coloque como argumentos de CalculaPago() las horas trabajadas y el pago por hora. Complemente el método, a fin de que proporcione un resultado. El procedimiento debe quedar de la siguiente manera:

Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14

329

– Module1.vb - Pago

Public Class Pago ‘’’ ‘’’ Cálculo del pago neto ‘’’ Public Overridable Function CalculaPago(_ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Return (HorasTrabajadas * PagoXHora) End Function End Class

10. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – Nomina y haga clic en el icono View Class Diagram. 11. Agregue, usando Class Designer, una clase llamada PagoBonificado, que será pública y que se agregará al programa de consola que estamos trabajando. 12. En el diagrama de clase seleccione la clase PagoBonificado que acaba de agregar, invoque Class Details y agregue un método de nombre CalculaPago(), que será público y devolverá un valor Decimal. 13. Edite el programa y agregue una línea que especifique que la nueva clase hereda la funcionalidad de la clase Pago. Aquí se generaría una contaminación de espacios de nombres, dado que Pago ya posee un método llamado CalculaPago(), y al estar heredando su funcionalidad, equivaldría a estar definiendo dos miembros con el mismo nombre, lo cual no es posible. Para evitar el problema, estando en Class Details seleccione el método CalculaPago() de PagoBonificado, e invoque Properties; deberá modificarse la propiedad Inheritance modifier, asignando un valor Overrides. Dado que se está realizando una operación de reemplazo (overrides), los argumentos del método deben ser exactamente los mismos. La única variante entre los dos procedimientos es que el método CalculaPago() de la clase PagoBonificado retorna el monto a pagar multiplicado por la constante de bono de puntualidad. Seguramente se dio cuenta de que el monto a pagar es un dato que ya ofrece CalculaPago() de la clase Pago, por lo que se consume el método de la clase base. 14. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o bien agregando el siguiente código en el programa:

11

330

Aprenda Practicando Visual Basic 2005 usando Visual Studio

Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

– Module1.vb - PagoBonificado

Public Class PagoBonificado Inherits Pago ‘’’ ‘’’ Cálculo de pago con bonificación ‘’’ Public Overrides Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Dim PagoNeto As Decimal PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora) Return PagoNeto * BonoPuntualidad End Function End Class

15. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – Nomina y haga clic en el icono View Class Diagram. 16. Agregue, usando Class Designer, una clase llamada PagoBonificadoExtra, que será pública y se agregará al programa de consola que estamos trabajando. 17. En el diagrama de clase seleccione la clase PagoBonificadoExtra que acaba de agregar, invoque Class Details y agregue un método de nombre CalculaPago(), que será público y devolverá un valor Decimal. 18. Edite el programa y agregue una línea que especifique que la nueva clase hereda la funcionalidad de la clase PagoBonificado. Aquí se generaría una contaminación de espacios de nombres, dado que Pago ya posee un método llamado CalculaPago(), y al estar heredando su funcionalidad, equivaldría a estar definiendo dos miembros con el mismo nombre, lo cual no es posible. 19. Hay otro problema: el nuevo método, además de los beneficios de puntualidad, integrará un beneficio adicional que el usuario podrá especificar, por lo cual el método CalculaPago() no tiene el mismo número de argumentos que CalculaPago() de la clase PagoBonificado, por lo que una operación de reemplazo no es posible. Deberá realizarse una operación de sustitución (overload) para que los argumentos del método no necesariamente sean los mismos. La sustitución deberá especificarse vía código, dado que Properties no ofrece el valor Overload para Inheritance modifier (lo cual tiene mucho sentido si consideramos que la sustitución tiene que ver más con el polimorfismo que con la herencia). La única variante entre los dos procedimientos es que el método CalculaPago() de la clase PagoBonificadoExtra devuelve el monto a pagar multiplicado por la constante de bono de puntualidad (información que ofrece el método CalculaPago() de la clase base), y además le agrega un porcentaje adicional de beneficio.

Capítulo 11. Herencia y polimorfismo

331

20. Desarrolle el punto anterior utilizando Class View, Class Designer y Class Details, o bien agregando el siguiente código en el programa.

Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

– Module1.vb - PagoBonificadoExtra

Public Class PagoBonificadoExtra Inherits PagoBonificado ‘’’ ‘’’ Cálculo de pago con bonificación y extra ‘’’ Public Overloads Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal, _ ByVal Extra As Decimal) As Decimal Dim PagoBonificado As Decimal PagoBonificado = MyBase.CalculaPago( _ HorasTrabajadas, PagoXHora) Return PagoBonificado * Extra End Function End Class

11

21. Complemente el procedimiento Main() para proveer de funcionamiento al programa. Al final, deberá lucir como sigue: Codificación de Nomina 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

– Module1.vb

Option Explicit On Option Strict On Imports System.Console Module Module1 Public Const PagoXHoraVig As Decimal = 120D Public Const BonoPuntualidad As Decimal = 1.25D Sub Main() Dim PagoNoPuntuales As Pago = New Pago() Dim PagoPuntuales As New PagoBonificado() Dim PagoPuntualesPlus As New PagoBonificadoExtra() Dim Horas As Decimal = 40 WriteLine(“Pago a los no puntuales: “ & _ PagoNoPuntuales.CalculaPago(Horas, PagoXHoraVig)) WriteLine(“Pago a los puntuales: “ & _ PagoPuntuales.CalculaPago(Horas, PagoXHoraVig)) WriteLine(“Pago a los puntuales, + extra: “ & _ PagoPuntualesPlus.CalculaPago(Horas, _ PagoXHoraVig, 1.2D))

332

Aprenda Practicando Visual Basic 2005 usando Visual Studio

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

Write(“Pulse INTRO para continuar”) ReadLine() End Sub End Module Public Class Pago ‘’’ ‘’’ Cálculo del pago neto ‘’’ Public Overridable Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Return (HorasTrabajadas * PagoXHora) End Function End Class Public Class PagoBonificado Inherits Pago ‘’’ ‘’’ Cálculo de pago con bonificación ‘’’ Public Overrides Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal) As Decimal Dim PagoNeto As Decimal PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora) Return PagoNeto * BonoPuntualidad End Function End Class Public Class PagoBonificadoExtra Inherits PagoBonificado ‘’’ ‘’’ Cálculo de pago con bonificación y extra ‘’’ Public Overloads Function CalculaPago( _ ByVal HorasTrabajadas As Decimal, _ ByVal PagoXHora As Decimal, _ ByVal Extra As Decimal) As Decimal Dim PagoBonificado As Decimal PagoBonificado = MyBase.CalculaPago( _ HorasTrabajadas, PagoXHora) Return PagoBonificado * Extra End Function End Class

Capítulo 11. Herencia y polimorfismo

Ejecución guiada de Nomina

333

– Module1.vb

22. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 23. El programa calcula el monto a pagar a los empleados. Hay tres escenarios: un pago para todos los empleados, que es un monto neto; además hay un monto para los empleados puntuales, que es un poco más alto; finalmente hay un monto aún más alto para los que son puntuales, pero además tienen un desempeño excepcional. 24. El programa se compone del procedimiento Main(), líneas 10 a la 26, que se encarga de hacer las instancias de las clases, así como de mostrar los resultados. 25. Al inicio del módulo se declaran dos constantes de alcance público, que por lo mismo estarán disponibles tanto para el módulo como para las clases del programa. Se anexan estas constantes con el único fin de no solicitar información al usuario para la demostración del programa. 26. El método Pago.CalcularPago() requiere dos argumentos: horas trabajadas y pago por hora. Con ellos calcula el monto del pago a realizar, que resulta de la multiplicación de los argumentos. La clase PagoBonificado hereda la funcionalidad de la clase Pago, y de hecho consume el resultado de sus métodos. A su vez, PagoBonificadoExtra hereda la funcionalidad de PagoBonificado. Las relaciones de herencia entre las clases quedan como sigue: Pago es clase base de PagoBonificado; Pago bonificado es clase derivada de Pago y clase base para PagoBonificadoExtra; PagoBonificadoExtra sólo es clase derivada de PagoBonificado. Respecto al manejo de los métodos, podemos decir que el método Pago.CalculaPago() es sustituido por PagoBonificado.CalculaPago, y PagoBonificado.CalculaPago es sustituido por PagoBonificadoExtra.CalculaPago. FIGURA 11.2 Relaciones de herencia del programa

11

334

Aprenda Practicando Visual Basic 2005 usando Visual Studio

27. Al ejecutarse el programa, se definen los valores iniciales del pago por hora vigente (línea 7) y del bono de puntualidad (línea 8). En el procedimiento principal se genera una instancia de la clase Pago (línea 11), una instancia de la clase PagoBonificado (línea 12) y una instancia de PagoBonificadoExtra (línea 13). La funcionalidad de nuestras clases está disponible a través de las variables objeto que acabamos de definir. Otro dato que se provee es el número de horas por semana sobre las que se calculan los pagos (línea 14). 28. En las líneas 16 y 17 se muestra un mensaje que para construirse consume el método CalculaPago() de la clase Pago, que es la que dio origen al objeto PagoNoPuntuales. Se proporcionan como argumentos el número de horas laboradas y el pago por hora vigente. El método se encarga de recibir los dos valores (líneas 36 a la 38), multiplicarlos y devolver el resultado (línea 40). Es importante observar que este método fue codificado de tal forma que permite su reemplazo y sustitución (modificador Overridable). 29. En las líneas 18 y 19 se muestra un mensaje que para construirse consume el método CalculaPago() de la clase PagoBonificado (la que dio origen al objeto PagoPuntuales). Se proporcionan como argumentos el número de horas laboradas y el pago por hora vigente. El método se encarga de recibir los dos valores (líneas 51 a la 53) y declara una variable de trabajo (línea 55) a la cual le asigna el valor retornado el método MyBase.CalculaPago(); en virtud de que la clase base es Pago, sería equivalente a ejecutar Pago.CalculaPago(). Se pasan los datos recibidos a MyBase.CalculaPago() y al resultado se le aplica el bono de puntualidad (línea 57). Es importante notar que la clase hereda la funcionalidad de la clase Pago (línea 46) y reemplaza la implementación del método Pago.CalculaPago(), por lo cual respeta la cantidad y el tipo de los argumentos establecidos en la clase base (líneas 51 a 53). 30. En las líneas 20 y 22 se muestra un mensaje que para construirse consume el método CalculaPago() de la clase PagoBonificadoExtra, que es la que dio origen al objeto PagoPuntualesPlus. Se proporcionan como argumentos el número de horas laboradas, el pago por hora vigente y el porcentaje aplicable al pago por buen desempeño. El método se encarga de recibir los tres valores (líneas 68 a la 71) y declara una variable de trabajo (línea 73) a la cual le asigna el valor retornado el método MyBase.CalculaPago(), es decir, PagoBonificado.ClaseBase(), a la cual le pasa los datos que necesita. Al resultado le aplica el bono extra (línea 76). Es importante observar que la clase hereda la funcionalidad de la clase PagoBonificado (línea 63) y sustituye la implementación del método PagoBonificado.CalculaPago() (líneas 68 a 71), dado que recibe un número distinto de argumentos que el mismo método en su clase base. Si todo ocurrió como se esperaba, la salida será la siguiente: Pago a los no puntuales: 4800 Pago a los puntuales: 6000.00 Pago a los puntuales, + extra: 7200.000 Pulse INTRO para continuar

FIN DEL EJERCICIO*

Capítulo 11. Herencia y polimorfismo

MAPA

335

MENTAL DEL CAPÍTULO

11

336

Aprenda Practicando Visual Basic 2005 usando Visual Studio

TERMINOLOGÍA Abstract class, 315 Clase(s) abstractas, 315 base, 313 Clases derivadas, 313 Debe reemplazarse, 324 Herencia, 313

Inheritance, 313 Inherits, 314 Jerarquía de clases, 313 MustInherit, 314 MustOverride, 3234 MyBase, 325 MyClass, 325

No reemplazable, 324 NotInheritable, 314 NotOverridable, 323-4 Overload, 323 Overloaded, 323 Overloads, 323-4 Overridable, 323-4

Overridden, 323 Override, 313, 323 Overrides, 323-4 Polimorfismo, 325 Reemplaza, 324 Reemplazable, 324 Sobrecarga/Sustituy e, 324

PREGUNTAS 11.1 ¿Qué es la herencia? 11.2 ¿En qué casos se recomienda la implementación de la herencia? 11.3 ¿Cuáles son los estatutos para establecer relaciones de herencia entre clases? 11.4 Mencione y explique los estatutos auxiliares de herencia y polimorfismo. 11.5 Mencione un ejemplo de automatización real, en donde pueda usted implementar herencia y polimorfismo.

Capítulo 11. Herencia y polimorfismo

337

Notas:

11

338

Aprenda Practicando Visual Basic 2005 usando Visual Studio

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es la habilidad de una clase para servir de base a otra clase, trasladándole su funcionalidad: a) Herencia b) Polimorfismo c) Encapsulamiento 2. Tipo de relación para la que se recomienda la herencia: a) Has-a b) Is-a c) Go-to 3. Permite la variación en la clase derivada, de las propiedades y métodos (requiere mantener los mismos argumentos): a) Inherits b) Overrides c) Overloads 4. Habilidad de un lenguaje para definir clases que se comporten distinto, a pesar de llamarse igual: a) Herencia b) Polimorfismo c) Encapsulamiento 5. Permiten generar un tipo de dato compuesto: a) Delegados b) Clases c) Estructuras

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Por omisión, las clases en Visual Basic son NotInheritable.

7.

Si no desea un acceso abierto a su clase puede restringir el acceso al utilizar el modificador Friend.

8.

MyClass se utiliza para llamar a ejecución un método de la clase base.

9.

La manifestación más pura del polimorfismo es la utilización de overloads.

10.

Si un auto

móvil y su dueño fueran objetos, la relación entre ellos sería is-a.

Capítulos: 12 Desarrollo de aplicaciones Windows 13 Desarrollo de aplicaciones Web con ASP.NET 14 Servicios Web XML

Herramientas de Visual Studio revisadas: 1. 2. 3. 4. 5. 6.

Form Designer Menu Designer Dynamic Help String collection editor HTML Designer Regular Expression Editor

Otras herramientas: 1. disco.exe 2. wsdl.exe

Parte 4 Interfases Windows/Web y Servicios Web XML En esta parte del libro aprenderemos a desarrollar las interfases que proporcionarán a nuestros procesos datos completos y correctos. Esta parte describe la manera de recopilar los datos necesarios para el procesamiento y el almacenamiento. Comienza con una revisión de las posibilidades de las interfases de plataforma Windows, hoy por hoy, las más sofisticadas y poderosas. Posteriormente analiza la elaboración de interfases para el ambiente Web con ASP.NET. Finalmente, trata el tema de los Servicios Web XML, que permiten la elaboración de interfases desatendidas, propias para el consumo aplicación a aplicación. Hay quienes argumentan que los datos nunca son suficientes para satisfacer las necesidades; esa percepción es propia de las aplicaciones mal delimitadas. El desarrollador inteligente siempre sabe producir el máximo de información con el mínimo de datos, y se asegura de que los pocos datos requeridos siempre sean proporcionados en la cantidad y la forma correctas.

CAPÍTULO

12

Desarrollo de aplicaciones Windows Objetivos: Conocer los elementos básicos del trabajo con controles para la creación de aplicaciones con interfaz gráfica Windows. 1. Conocerá los conceptos generales del desarrollo de interfaces y su orientación a objetos en .NET. 2. Utilizará la ayuda de .NET. 3. Se familiarizará con los grupos de controles más importantes para el desarrollo de aplicaciones Windows. 4. Aprenderá el concepto de las colecciones y su relevancia en el desarrollo de aplicaciones Windows. 5. Conocerá las generalidades del enfoque. 6. Aprenderá a desarrollar una interfaz Windows utilizando Visual Studio.

341

342

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Interfaz de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo de interfaces basadas en objetos . . . . . . . . . . . . . . . . . . . . . . . . . Controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formas de agregar controles a una interfaz . . . . . . . . . . . . . . . . . . . . . Estrategia para el estudio efectivo de los controles . . . . . . . . . . . . . . . Jerarquía de clases relacionadas con controles . . . . . . . . . . . . . . . . . . . . . . . Uso de la ayuda para conocer los miembros de las clases de BCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Uso de Dynamic Help . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Búsqueda de temas en la ayuda . . . . . . . . . . . . . . . . . . . ➤ Estructura de un tópico de ayuda . . . . . . . . . . . . . . . . . . Clasificación de los controles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles comunes (Common Controls) . . . . . . . . . . . . . . . . Grupo de controles contenedores (Containers) . . . . . . . . . . . . . . . . . . Grupo de controles de menú y barras de herramientas (Menus & Toolbars) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles componentes (Components) . . . . . . . . . . . . . . . . . Grupo de controles de impresión (Printing) . . . . . . . . . . . . . . . . . . . . . Grupo de controles de cuadros de diálogo (Dialogs) . . . . . . . . . . . . . . Manejo de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Las colecciones y la programación de aplicaciones Windows . . . . . . . . For Each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enfoque (Focus) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interfaz multipágina con manejo avanzado de cuadros de texto, barra de menús y botones de comando . . . . . . . . . . . ➤ Establecimiento de valores generales de formulario . . . ➤ Adición de un sistema de menús usando Menu Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Líneas guía en tiempo de diseño para la alineación de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Cómo agregar imágenes a objetos Button . . . . . . . . . . . ➤ Opciones de formato para grupos de objetos . . . . . . . . ➤ Cómo establecer páginas de controles (TabControl) . . . Uso de grupos de controles, combos y selectores de número . . Orden de tabulación y activación dinámica de controles . . . . . . ➤ Lanzamiento de tareas desde la barra de menús . . . . . . ➤ Procedimiento para el evento de arranque (Load) . . . . .

344 345 347 348 348 349 350 350 352 353 355 355 357 357 358 358 359 360 361 362 352 363 364 365 366 368 370 372 375 380 382 384 386

Capítulo 12. Desarrollo de Aplicaciones Windows

➤ Uso de Tab Order para establecer el orden de tabulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Bloqueo de controles (Lock Controls) . . . . . . . . . . . . . . . ➤ Activación dinámica de elementos . . . . . . . . . . . . . . . . . Uso de controles para la visualización de páginas Web . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

343

387 389 389 391 392 393 394 396

12

344

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Interfaz de usuario Se llama interfaz de usuario al sistema de elementos de software a través de los cuales un programa determinado se articula con el usuario para recibir datos y actuar en consecuencia. La interfaz puede ser gráfica (GUI, Interfaz gráfica de usuario, Graphic User Interface), si está constituida por elementos gráficos (iconos, punteros, ventanas); o textual, cuando el usuario introduce comandos e instrucciones en forma de cadenas de caracteres específicas (por ejemplo, las aplicaciones de consola). En el caso de Visual Basic es posible implementar interfaces de usuario en ambas modalidades. El objetivo principal de una interfaz, sea cual sea su tipo, es recibir los datos válidos, mínimos, suficientes y necesarios para que un programa produzca los resultados esperados, y para dar al usuario la información relacionada con sus operaciones. La interfaz de usuario es el principal elemento de comunicación entre las aplicaciones y los consumidores de la aplicación. Pueden ser consumidores de la aplicación las personas que la utilizan o los programas que se conectan a ella de manera automática y aprovechan su funcionalidad sin mediar la intervención humana (como en el caso de los servicios Web XML). Una interfaz se constituye en un punto de contacto con el usuario: permite la entrada y salida de datos, encargándose de los enlaces subyacentes que el usuario no tiene necesidad de conocer. El usuario captura información y espera un resultado, sin importarle la arquitectura de hardware y software que permitan a la aplicación producir la respuesta.

FIGURA 12.1 Forma de trabajo de una interfaz.

Capítulo 12. Desarrollo de Aplicaciones Windows

345

Una buena interfaz: ❑ Permite la recopilación de la cantidad precisa de datos que el programa requiere para su

procesamiento. Más datos de los requeridos es innecesario; menos, es insuficiente. ❑ Permite la recopilación de los datos, en el tipo de dato que se necesita. Si se desea cap-

turar una fecha de nacimiento, lo que se espera es un dato de tipo Date, y no un String, un Integer u otro. ❑ Valida que los datos respeten las reglas de operación. Si las reglas de operación deter-

minan que una fecha a capturar no sea anterior a la fecha del día del sistema, o que un número deba estar entre un determinado rango, la interfaz debe garantizar que sólo se admitan datos que respeten dichas reglas. ❑ Proporciona la manera de corregir los errores que en la captura se cometan, y debe

orientar al usuario sobre la forma correcta de captura. ❑ Debe ser amigable, estética y proporcionada. De preferencia, deben respetar los con-

vencionalismos que el usuario utilice con más frecuencia; el programador no debe anteponer sus preferencias personales si éstas no facilitan la aceptación de la aplicación por parte del usuario. ❑ La interfaz de usuario debe proporcionar la información de manera organizada y estéti-

ca, de manera que el usuario la encuentre en la cantidad y la forma requerida.

NOTA En computación hay un fenómeno que se conoce como GIGO (Garbage In, Garbage Out/basura entra, basura sale). Si una aplicación acepta datos erróneos, muy probablemente se generarán errores en el procesamiento. Se puede tener la mejor aplicación del mundo, pero si la persona que utiliza la aplicación introduce datos equivocados, obtendrá resultados equivocados. Lo más que puede hacer un programador es validar tantos datos como sea posible, ya sea por tipo de dato o por regla de operación.

Desarrollo de interfaces basadas en objetos Una interfaz sencilla y práctica para efectos explicativos es el registro de un usuario, tal como se muestra en la figura 12.2. Consiste en un cuadro de diálogo con un espacio para especificar un nombre de usuario, otro para dar una contraseña y un tercero donde se deberá confirmar la contraseña. El botón Aceptar no se habilita sino hasta que se hayan proporcionado todos los datos requeridos.

12

346

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 12.2 Interfaz elemental.

Para cumplir con el propósito de la interfaz, el mínimo de datos que podemos preguntar son el usuario y la contraseña dos veces. La interfaz muestra varios elementos: tres etiquetas (objetos Label), tres cuadros de texto (objetos TextBox) y dos botones de comando (objetos Button). Todos ellos se encuentran en un objeto más grande, al que se conoce como formulario (objeto Form). La interfaz está compuesta entonces por 9 objetos. Un objeto contenedor es el que puede contener otros objetos. Los objetos contenedores son conocidos también como objetos padre (parent), mientras que los objetos contenidos son conocidos como objetos hijo (child). Es posible que un objeto contenedor esté contenido en otro objeto contenedor, por lo que podemos decir que éstos pueden anidarse. Se tienen los siguientes elementos gráficos de interfaz: 1 objeto contenedor y 8 objetos contenidos (1 objeto padre y 8 objetos hijos). Es importante recalcar que en .NET usted no tiene que redactar el código necesario para dibujar píxel por píxel cada uno de los elementos. La codificación ya está disponible como parte de BCL en forma de objetos que pueden ser invocados desde su programa. Para dibujar un formulario, por ejemplo, basta con instanciar la clase System.Windows.Forms.Form y modificar el estado del objeto para obtener la apariencia y el comportamiento deseado. Los objetos que se necesitan en nuestra interfaz derivan de las siguientes clases: Clase BCL System.Windows.Forms.Form

Tipo

Cantidad

Parent

1

System.Windows.Forms.Label

Child

3

System.Windows.Forms.TextBox

Child

3

System.Windows.Forms.Button

Child

2

Capítulo 12. Desarrollo de Aplicaciones Windows

347

Controles Los controles son las representaciones gráficas de las clases, disponibles en Visual Studio a través de Toolbox. Los controles son la forma para llegar a las clases de BCL, a fin de generar instancias que se conviertan en objetos de interfaz. Aunque los controles y los objetos son cosas distintas, está tan generalizado el uso de la palabra control para designar las instancias de las clases agregadas a una interfaz gráfica que es común encontrarlos como sinónimos. Si desea que su interfaz sea efectiva, requiere saber manejar los objetos que ésta incluya; esto sólo se logra conociendo la clase de la cual derivan y las capacidades de dicha clase. Los controles están disponibles en la barra de herramientas, o Toolbox. La herramienta Toolbox se organiza en grupos de controles, clasificándolos de acuerdo con la similitud de su funcionalidad o enfoque. Los grupos de controles pueden expandirse o contraerse con el fin de tener presentes sólo los controles que utilicemos. Incluso es posible la generación de grupos de controles del usuario, colocando ahí los controles más usuales para nosotros; con ello se facilita la operación de buscarlos y encontrarlos. FIGURA 12.3 Toolbox, o barra de herramientas.

12

348

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Formas de agregar controles a una interfaz Existen tres formas para agregar un control a una interfaz gráfica: 1. Modo inserción. Se logra haciendo doble clic sobre un control en Toolbox. El objeto se agregará al espacio de trabajo, donde podrá moverse o ajustarse. En este modo no hay control de la posición en la que el objeto se colocará, ni de sus dimensiones. 2. Modo arrastre. Se logra arrastrando un control desde Toolbox hasta el espacio de trabajo. En este modo tenemos el control de la posición que ocupará el objeto, pero no de sus dimensiones. 3. Modo trazo. Consiste en hacer un clic sobre un control en Toolbox, y dibujar en el espacio de trabajo el contorno que ha de ocupar el control. En este modo tenemos control de la posición y las dimensiones que el objeto ocupará.

Estrategia para el estudio efectivo de los controles La siguiente es la secuencia que recomendamos para aprender a utilizar los controles disponibles en la biblioteca de clases de .NET Framework y sus miembros: 1. Tenga bien claro lo que desea hacer. Si no sabe lo que quiere, tampoco sabrá qué clase es la más adecuada a sus necesidades; no sea de las personas que define la interfaz de usuario a medida que se da cuenta lo que la clase permite hacer; pues es la forma más fácil de hacer de una interfaz de usuario un laboratorio de aprendizaje de clases, lo que a la larga es ineficiente. 2. Investigue para qué sirven los objetos generados a partir de la clase. Si la clase no es lo que usted busca, seleccione otra que le sirva más específicamente ¡La biblioteca de clases de .NET Framework posee tantas, que seguro encontrará alguna que se adecue a sus necesidades! Incluso si encuentra una que le sea de utilidad, siga buscando; es posible que encuentre otra clase que le funcione de manera más específica. Sea profundo en su análisis para decidir las clases a utilizar; le aseguramos que será tiempo bien invertido, pues si selecciona una clase que no es la más adecuada perderá tiempo codificando aquellas cosas que la clase no proporciona de origen. Le va a desilusionar bastante romperse la cabeza para obtener cierta funcionalidad, para luego encontrarse una clase ya integrada a la biblioteca de .NET Framework que hacía precisamente eso que usted codificó. 3. Investigue las propiedades relevantes de la clase. Las propiedades determinan en gran medida la forma en que lucen y pueden comportarse los objetos; es importante ver primero las propiedades, antes de otros miembros, ya que los valores asignados a las propiedades pueden determinar la disponibilidad de los eventos y los métodos. 4. Investigue qué eventos reconoce la clase. Esto le permitirá determinar si un objeto generado a partir de la clase le sirve para sus propósitos de interacción y si obede-

Capítulo 12. Desarrollo de Aplicaciones Windows

349

ce a la filosofía de la interfaz de usuario que está desarrollando. Investigue primero los eventos por la sencilla razón de que, generalmente, mandamos a ejecución un método como respuesta a un evento; si el evento no sucede, el método tampoco sucederá. 5. Investigue, finalmente, los métodos que permite la clase. Utilizando los métodos podrá poner a trabajar las capacidades de comportamiento intrínseco del objeto.

Jerarquía de clases relacionadas con controles En la estrategia expuesta anteriormente queda claro que es necesario aprender las propiedades, los métodos y los eventos de las clases de las cuales derivan los objetos, a fin de gobernar su apariencia y comportamientos. Una forma lógica de hacerlo es seleccionar los tipos de objeto que necesitamos y explorar sus propiedades, métodos y eventos; de esta forma podremos darnos cuenta de que muchas de las propiedades, métodos y eventos se repiten en todos los objetos. La explicación a ese fenómeno es que derivan de clases genéricas comunes, que proveen la funcionalidad básica para todos los objetos. Aprender las clases genéricas automáticamente lleva a conocer un alto porcentaje de capacidades de las clases para la definición de objetos de interfaz. La gran mayoría de los controles constituyen una clase derivada de la clase Control, que a su vez es derivada de la clase Object. FIGURA 12.4 Jerarquía de clases para interfaces en Windows.

12

350

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Esto implica que, como ya lo sabe, los controles heredan propiedades, métodos y eventos de la clase base. La figura 12.4 ejemplifica la jerarquía de clases a la que están sujetos la mayoría de los controles que se utilizan en una interfaz de usuario. Si puede entender cuáles son los miembros de la clase Object y la clase Control habrá entendido el comportamiento general de los controles. El número de miembros de dichas clases es muy extenso; no sería práctico mencionarlos todos. Si desea consultar un listado exhaustivo búsquelos en la ayuda de .NET Framework, mediante el nombre del control que le interese y la palabra Class.

Ejercicio 12.1 Uso de la ayuda para conocer los miembros de las clases de BCL Conocerá la forma en que se puede buscar información de clases en la ayuda de .NET (es necesario que la ayuda esté instalada en el sistema). 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Haga clic en el botón Show All Files de la barra de herramientas de Solution Explorer. 3. En Solution Explorer seleccione el nodo HolaMundoWin – Form1.vb – Form1.Designer.vb.

➤ Uso de Dynamic Help 4. Elija la opción de menú Help – Dynamic Help. 5. Aparecerá en el espacio de trabajo la herramienta Dynamic Help.

Capítulo 12. Desarrollo de Aplicaciones Windows

351

6. La herramienta Dynamic Help es una ayuda dinámica que actualiza vínculos a los temas de ayuda relativos a lo que estemos haciendo. Dependiendo de lo que estemos trabajando, aparecerán los vínculos pertinentes. Inicialmente aparecerán temas genéricos del tipo de proyecto que tengamos en el espacio de trabajo. 7. Busque la siguiente línea de código y seleccione la palabra Label. Me.lblResultado = New System.Windows.Forms.Label

8. En Dynamic Help aparecerán sólo temas relacionados con lo que acabamos de seleccionar.

9. Busque la ayuda de la clase Label. Deberá iniciar con Label Class. 10. Vea cómo aparecen varios temas que inician con Label Class, pues la clase Label existe en diferentes jerarquías de espacios de nombres (namespaces). Si una clase apunta hacia System.Web.UI.MobileControls, se refiere a las clases para interfaces de cómputo móvil; System.Web.UI.WebControls, se refiere a las clases para interfaces Web ASP.NET; finalmente System.Windows.Forms agrupa a las clases para definir objetos en interfaces basadas en Windows. Incluso hay implementaciones de los controles para la programación en programas de Microsoft Office, como Word y Excel. Dado que estamos en una aplicación Windows, seleccione Label Class (System.Windows.Forms).

12

352

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

> Lo nuevo En Visual Studio 2005, el contenido de la ayuda se distribuye de forma distinta, más organizada y predecible. Cada clase tendrá un encabezado de tema (Class), para posteriormente ofrecer generalidades (about class), miembros (all members), información del constructor (constructor), sintaxis declarativa (declarative sintaxis), eventos, métodos y propiedades (events, methods, properties).

11. Lo anterior despliega la ayuda de Visual Studio.

➤ Búsqueda de temas en la ayuda 12. La ayuda se compone de tres elementos básicos: Index, que se encarga de enumerar todos los temas incluidos; Topic content, que muestra el contenido de la ayuda correspondiente al tema, e Index Results, que muestra los diferentes temas que se encuentran para una búsqueda. 13. Index tiene dos fichas: Contents, que muestra los tópicos de forma organizada por temas en un esquema de árbol de nodos, e Index, que permite especificar un tema a buscar, ya sea sobre toda la ayuda o aplicando un filtro por tecnología. 14. Utilizando Index, especifique en Filtered by el valor .NET Framework, con el fin de filtrar la ayuda y ver sólo los temas relacionados con la plataforma .NET. Busque la ayu-

Capítulo 12. Desarrollo de Aplicaciones Windows

353

da de los cuadros de texto, especificando TextBox Class, about en Look for:, y oprimiendo la tecla Intro al finalizar. 15. Aparecerán en Index Results aquellos temas que concuerden con la búsqueda.

16. Seleccione el tópico sobre el mismo.

TextBox Class (System.Windows.Forms),

haciendo doble clic

➤ Estructura de un tópico de ayuda 17. Un tópico de ayuda se compone de explicaciones y vínculos. La ayuda aparece en Topic Content. FIGURA 12.5 Ayuda.

12

354

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Dependiendo del tópico de ayuda mostrado aparecerán diversos elementos en Topic Content. En el encabezado del tópico aparecerá el nombre del mismo; debajo, vínculos de acceso rápido a temas de interés general o, por lo menos, un vínculo See Also, que lleva a temas relacionados. Dependiendo del tópico los demás vínculos pueden variar. 19. También en el encabezado del tópico aparece un vínculo para expandir o contraer los subtópicos de la ayuda; si los subtópicos están contraídos, aparecerá el vínculo Expand All, que permitirá expandirlos; en caso de que estén expandidos, aparecerá el vínculo Collapse All, para contraerlos. 20. En caso de que los subtópicos correspondientes a TextBox Class no estén expandidos, haga clic en el vínculo Expand All. 21. Con la finalidad de encontrar información específica, la ayuda cuenta con una opción de filtro que varía dependiendo del contenido que se está buscando. Un filtro típico es el lenguaje .NET en el que se ejemplifican las instrucciones y sintaxis; si usted sólo codifica en Visual Basic, probablemente ver los ejemplos y sintaxis en todos los lenguajes .NET incluidos en la ayuda (C#, C++, J#, JScript) no hará más que complicar la investigación. En caso de que el tópico tenga ejemplos de codificación, la ayuda de .NET Framework permitirá seleccionar el o los lenguajes en los que desee ver las implementaciones en código. 22. En Language filter seleccione únicamente Visual Basic (usage). Vea cómo en el cuerpo de la ayuda aparecerán sólo ejemplos en el lenguaje seleccionado. Observe cómo en Visual Basic se puede incluso filtrar la ayuda para ver el uso (usage) o la declaración de las sentencias (declaration). 23. En el cuerpo de la ayuda aparecerá el tema desarrollado en subtópicos y ejemplos. Los subtópicos pueden contraerse o expandirse, haciendo clic en el icono (+ , – ) que aparece contiguo al título. Generalmente aparecerá un resumen de la funcionalidad del tópico en la parte superior. 24. En el encabezado de la ayuda haga clic en el vínculo Members para examinar las propiedades, los métodos y los eventos disponibles para el objeto Label en una interfaz Windows. 25. Vea cómo el filtro ha cambiado. Ahora permite filtrar con base en los miembros que desea ver. Ya decíamos que los objetos de interfaz derivan de Object y de Controls. Si ya conoce los miembros comunes de dichas clases, es probable que sólo le interese ver en la ayuda aquellos miembros que son particulares de la clase investigada. 26. En la ayuda de los miembros de Label, encuentre la propiedad BackColor. Dicha propiedad es común a todos los controles, dado que la heredan de la clase Controls. 27. Expanda el cuadro combinado del filtro y desmarque todas las casillas de verificación. Vea cómo BackColor ya no aparece. Esto sucede porque se inhabilitó la opción Include Inherited Members. 28. Este procedimiento es aplicable para encontrar ayuda para todas las clases de BCL. 29. Cierre la ventana de ayuda de .NET. FIN DEL EJERCICIO *

Capítulo 12. Desarrollo de Aplicaciones Windows

355

> Lo nuevo En Visual Studio 2005 la ayuda viene mejorada, dado que permite la integración con la comunidad de desarrolladores (se requiere estar en línea para ello). No sólo se puede consultar lo último en documentación, sino que directamente se pueden agregar preguntas a foros de Visual Studio. Se tiene un nuevo menú, llamado Community, que permitirá el acceso a los recursos disponibles para la comunidad de desarrolladores a nivel mundial.

Clasificación de los controles La herramienta Toolbox muestra los controles de forma categorizada por grupos, de tal manera que puedan ser identificados aquellos con mayor afinidad en cuanto a su propósito. Dependiendo de la aplicación que se esté desarrollando (consola, Windows, Web, mobile) Toolbox mostrará los controles pertinentes. En el caso de las aplicaciones Windows, los controles incluidos en Toolbox son los siguientes (se mencionan las categorías de controles más importantes):

Grupo de controles comunes (Common Controls) Concentra los controles más comúnmente utilizados en interfaces basadas en Windows. Control

Nombre

Uso

Pointer

Indica la no selección de otros controles. Este control realmente no se enlaza con ninguna clase de BCL y aparece en todos los grupos de controles.

Button

Muestra un botón que al presionarlo desencadena una acción.

CheckBox

Representa una casilla de verificación.

CheckedListBox

Representa una lista de opciones que pueden ser marcadas en forma de casillas de verificación.

ComboBox

Representa un cuadro combinado de opciones (cuadro de texto + lista desplegable).

DateTimePicker

Representa un selector de fechas.

12

356

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Label

Representa una etiqueta textual de sólo lectura.

LinkLabel

Representa una etiqueta que puede desplegar hipervínculos.

ListBox

Representa una lista.

ListView

Representa una colección de elementos, preferentemente gráficos, que pueden ser seleccionados.

MaskedTextBox

Representa un cuadro de texto que distingue entre una entrada válida y una inválida, de acuerdo con un patrón.

MonthCalendar

Representa un selector de fechas en modo mes.

NotifyIcon

Representa un icono en el área de notificación.

NumericUpDown

Representa un selector de números dentro de un intervalo.

PictureBox

Representa un cuadro en el cual se puede desplegar una imagen.

ProgressBar

Representa una barra de control de avance de un proceso.

RadioButton

Representa un botón de opción.

RichTextBox

Representa un cuadro de texto RTF (Rich Texto Format, Formato de texto enriquecido).

TextBox

Representa un cuadro de texto.

ToolTip

Representa un cuadro de información que aparece sólo al sobreponer el puntero del ratón sobre un elemento de interfaz.

TreeView

Representa una colección jerárquica de elementos (nodos) y permite su selección.

WebBrowser

Representa un navegador de Internet que puede incluirse en un formulario.

Capítulo 12. Desarrollo de Aplicaciones Windows

357

Grupo de controles contenedores (Containers) Reúne los controles contenedores utilizados en interfaces Windows. Dentro de ellos podrán colocarse otros controles, heredando propiedades de aspecto y disponibilidad. Control

Nombre

Uso

FlowLayoutPanel

Representa un espacio de trabajo en el cual los controles se acomodan automáticamente de forma vertical y horizontal.

GroupBox

Representa un marco que agrupa a otros controles, con la opción de incluir un texto superior explicativo.

Panel

Representa un espacio de trabajo en el cual se pueden colocar controles que requieren agruparse.

SplitContainer

Representa un área de espacio de trabajo que se divide en dos paneles que pueden ajustarse de manera dinámica.

TabControl

Representa un conjunto de páginas de controles, que pueden seleccionarse mediante el uso de fichas.

TableLayoutPanel

Representa un panel dinámico que se subdivide en celdas.

Grupo de controles de menú y barras de herramientas (Menus & Toolbars) Concentra los controles para el diseño de sistemas de menús y barras de herramientas basadas en Windows. Control

Nombre

Uso

ContextMenuStrip

Representa un menú contextual.

MenuStrip

Proporciona un sistema de menús a un formulario.

StatusStrip

Representa una barra de estado para un formulario.

12

358

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ToolStrip

Representa un contenedor para objetos de barra de herramientas.

ToolStripContainer

Proporciona paneles laterales en una forma, y un panel central, en donde se pueden colocar otros controles.

Grupo de controles de datos (Data) Concentra los controles para el manejo de datos tomados de diversas fuentes. Control

Nombre

Uso

DataSet

Representa una base de datos desconectada que se almacena en memoria.

DataGridView

Representa una rejilla de datos que permite personalizar la apariencia.

BindingSource

Encapsula una fuente de datos para una forma.

BindingNavigator

Representa una interfaz de navegación y manipulación de datos cuando se tienen en el formulario controles enlazados con las fuentes de datos.

ReportViewer

Permite la visualización de reportes ReportViewer.

Grupo de controles componentes (Components) Concentra los controles de uso genérico basados en componentes .NET. Control

Nombre

Uso

BackgroundWorker

Representa la ejecución de un proceso en un flujo de procesamiento separado (thread).

DirectoryEntry

Representa el encapsulamiento de nodos y objetos de Active Directory.

Capítulo 12. Desarrollo de Aplicaciones Windows

359

DirectorySearcher

Representa una consulta sobre el Active Directory.

ErrorProvider

Representa una interfaz entre un control y un error asociado con él.

EventLog

Representa una interacción con el logo de eventos de Windows.

FileSystemWatcher

Representa un monitoreo que vigila y detecta si un directorio o archivo ha sufrido cambios en su contenido.

HelpProvider

Representa ayuda popup o en línea para un control.

ImageList

Representa una colección de objetos de imagen.

MessageQueue

Representa un manejador de colas en .NET.

PerformanceCounter

Representa un componente de monitoreo de desempeño de Windows (performance counter).

Process

Representa el acceso a procesos que pueden ser detenidos o iniciados de manera local o remota.

SerialPort

Representa un recurso de acceso al puerto serial.

ServiceController

Representa un servicio de Windows y permite su manipulación.

Timer

Representa un temporizador, que permite ejecutar procesos en determinado intervalo.

Grupo de controles de impresión (Printing) Concentra los controles para la manipulación de la salida por impresora.

12

360

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Control

Nombre

Uso

PageSetupDialog

Permite a los usuarios establecer la configuración de las páginas de impresión.

PrintDialog

Representa un cuadro de diálogo estándar de Windows para la selección de impresora y envío de impresión.

PrintDocument

Representa un documento de impresión que puede diseñarse.

PrintPreview Control

Representa una versión esencial de presentación preliminar.

PrintPreview Dialog

Representa un cuadro de diálogo estándar de Windows para la visualización de presentaciones preliminares.

Grupo de controles de cuadros de diálogo (Dialogs) Concentra los controles de cuadros de diálogo para incorporar funcionalidad estilo Windows a las aplicaciones. Control

Nombre

Uso

ColorDialog

Representa un cuadro de diálogo estándar de Windows para la selección de colores.

FolderBrowser Dialog

Muestra y permite que el usuario seleccione un directorio de los existentes en el sistema de archivos.

FontDialog

Representa un cuadro de diálogo estándar de Windows para la selección de fuentes.

OpenFileDialog

Representa un cuadro de diálogo estándar de Windows para la selección de un nombre de archivo existente.

SaveFileDialog

Representa un cuadro de diálogo estándar de Windows para la especificación de nombres de archivo válidos.

Capítulo 12. Desarrollo de Aplicaciones Windows

361

Este libro no incluye todas las propiedades y el manejo de los controles, dado que el tema es extenso y no tiene que ver con Visual Basic como lenguaje, sino con el uso específico de las clases de BCL.

Manejo de colecciones Uno de los conceptos más importantes en .NET Framework es el manejo de colecciones. Una colección es un conjunto de objetos de igual naturaleza que se agrupan como unidad de referencia, y a los que es posible referirse como una unidad, además de ser elementos individuales y autónomos. Podemos encontrarnos las colecciones como instancias de clases de tipo Collection, como arreglos o como propiedades de objetos que permiten el manejo de colecciones (como es el caso de los contenedores). Es requisito para una colección que todos los objetos de la misma sean de un mismo tipo, a fin de guardar una coherencia de contenido que no perjudique el procesamiento que se realice con la colección. A cada uno de los elementos de una colección se le da el nombre de item. Los items son accesibles ya sea por un subíndice que indica la posición del elemento dentro de la colección, o por un nombre de elemento, en el caso que estos estén denominados. Dado que una colección tiene su propia identidad y comportamiento, posee propiedades y métodos que permiten su manipulación. Por ejemplo, para conocer el número de elementos que componen la colección basta con invocar la propiedad Collection.Count de la colección; para agregar elementos, podemos utilizar el método Collection.Add, mientras que para eliminarlos podemos utilizar el método Collection.Remove. Existen colecciones genéricas para agrupar objetos de tipo indeterminado. Este tipo de colecciones no requiere la especificación de un determinado tipo de objeto, lo que implica mucha flexibilidad; sin embargo, también implica pérdida de desempeño de las aplicaciones, ya que es necesaria la realización de conversiones en tiempo de ejecución (boxing, unboxing). Se habla de boxing cuando un tipo de dato primitivo es convertido en su equivalente a objeto (pasa de ser ByVal a ser ByRef), con lo cual podrá disponer de toda la funcionalidad de la clase, como lo son los métodos y propiedades intrínsecos de la clase que le dio origen. Se habla de unboxing en el caso contrario, cuando un objeto pasa de ser un objeto a su equivalente en dato primitivo (de ByRef a ByVal). No sólo existen colecciones genéricas; hay algunas de tipo objeto que refieren a un tipo de objeto determinado y que, por tanto, tienen la ventaja de evitar las conversiones en tiempo de ejecución, lo cual las hace más eficientes.

12

362

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA Las colecciones serán aludidas en este libro con el siguiente estilo tipográfico: Collection, a fin de que las distinga de las propiedades comunes.

Las colecciones y la programación de aplicaciones Windows Es importante entender el concepto de colecciones si se desea desarrollar aplicaciones Windows, pues la interfaz gráfica generalmente utiliza objetos contenedores para ser integrada. Un objeto contenedor es aquel que puede contener otros objetos. En el caso de las aplicaciones Windows, se tienen tres objetos contenedores básicos: Form, GroupBox y Panel. Cada uno de ellos posee una colección Controls, a través de la cual se controlarán los objetos de la interfaz como un todo. La integración de un formulario basado en Windows que actuará como interfaz es muy sencilla: 1. 2. 3. 4. 5. 6.

Se declara y se instancia un objeto contenedor (por ejemplo, Form). Se declaran e instancian los objetos de la interfaz (derivados de la clase Control). Se proporciona el estado requerido a los objetos de la interfaz (asignación de valores a las propiedades de los objetos). No olvide que algunos objetos contenedores pueden estar dentro de un formulario y que algunos objetos poseen sus propias colecciones. Se agregan los objetos declarados a la colección Form.Controls del objeto contenedor aplicando el método Collection.Add sobre la colección. Se muestra el formulario en forma modal, utilizando Form.ShowDialog.

For Each El ciclo For taxis de For For Each

Each Each

es una estructura de control que sirve para explorar colecciones. La sines la siguiente:

Variable In Colección

«proceso en donde Variable se establece como referencia del elemento en la colección» Next

Variable

Capítulo 12. Desarrollo de Aplicaciones Windows

363

Donde Variable es una variable de trabajo del mismo tipo de dato que los elementos contenidos en la colección. Colección será la colección de objetos a explorar.

NOTA En la tabla de miembros más utilizados se incluyen sólo aquellos que sean inherentes al control que se está documentando; se omitirá mencionar propiedades, métodos y eventos que sean derivados de las clases Control y Object, que ya fueron documentados en el capítulo anterior.

Enfoque (Focus) Se entiende por enfoque (focus) la capacidad de interactuar a través del teclado con un objeto. Por lógica, en tiempo de ejecución sólo un objeto puede poseer el enfoque en un momento determinado. Hay algunos objetos que no pueden tener el enfoque debido a su incapacidad de interactuar con el usuario (por ejemplo, los objetos invisibles como ToolTip). Los objetos que sí permiten la interacción del usuario tienen una propiedad denominada Control.TabIndex que indica el orden en que el control del programa navegará de un objeto a otro al presionar la tecla TAB. Inicialmente, en la ejecución de un programa, el enfoque lo tendrá el objeto que, teniendo la capacidad de poseer el enfoque, tenga el valor menor en la propiedad Control.TabIndex, siempre y cuando se encuentre habilitado (propiedad Control.Enabled establecida a True) y visible (propiedad Control.Visible establecida en True). Cuando es posible manipular el valor de un objeto con el teclado se dice que dicho objeto tiene el enfoque. Si el objeto, teniendo el enfoque, lo traslada a otro objeto, se dice que pierde el enfoque; si un objeto, no teniendo el enfoque lo recibe, se dice que adquiere el enfoque. El orden para adquirir y perder el enfoque está determinado por la propiedad Control. Este orden se respeta sólo si se traslada el enfoque presionando la tecla TAB; es posible trasladar el enfoque de otras formas, como haciendo clic en un objeto, y en tales casos no importa el orden determinado en Control.TabIndex. Al orden en que los objetos van pasando el enfoque se le llama orden de tabulación (Tab Order).

TabIndex.

Hay varios métodos y eventos relacionados estrechamente con el enfoque. El método Control.Focus, por ejemplo, proporciona el enfoque a un objeto. Cuando un objeto deja de tener el enfoque, se produce para ese objeto el evento Control.LostFocus. Cuando un objeto adquiere el enfoque, le sucede el evento Control.GotFocus.

12

364

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Como puede darse cuenta, el simple hecho de oprimir la tecla TAB o señalar con el puntero del ratón a un objeto que no posee el enfoque, propicia una buena cantidad de eventos, tanto para el objeto que recibe el enfoque como para el que lo pierde. Aquí se genera confusión: ¿Cuál ocurre primero? A continuación le mostramos todos los eventos que suceden si un objeto adquiere el enfoque y lo pierde: 1. 2. 3. 4. 5. 6.

Cuando entramos a un objeto, se provoca primero el evento Control.Enter. Ya que entramos, comenzamos a disponer de la capacidad de interactuar con él, por lo que se provoca el evento Control.GotFocus. Si estando en el objeto presionamos TAB, indicamos que queremos dejar el objeto, provocando el evento Control.Leave. Antes de poder dejar el objeto, es necesario saber si es válido o no hacerlo; se provoca el evento Control.Validating. Si la validación se lleva a cabo, se provoca el evento Control.Validated. Ya que comprobamos que fue válido dejar el objeto, se pierde la capacidad de interactuar con él, por lo que se provoca el evento Control.LostFocus.

Definir un adecuado orden de tabulación es indispensable para construir una buena interfaz. Si el orden es caótico, el usuario se perderá. No trate de ser innovador con respecto al orden de tabulación: analice el orden en que el usuario del programa acostumbra capturar los datos o analice el documento a partir del cual realiza la captura, y proporcione el orden necesario. Créamelo, se lo van a agradecer mucho.

Ejercicio 12.2 Interfaz multipágina con manejo avanzado de cuadros de texto, barra de menús y botones de comando

Aprenderá a crear una aplicación de interfaz Windows utilizando los controles gráficos proporcionados por .NET Framework. 1. 2.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado Empresa. Deberá aparecer un formulario en el diseñador de formularios, que por omisión recibe el nombre de Form1.

Capítulo 12. Desarrollo de Aplicaciones Windows

365

➤ Establecimiento de valores generales de formulario 3.

Cambie el nombre del formulario, de Form1 a frmEmpresa. Los cambios de nombre se realizan utilizando Properties (tecla F4), localizando la propiedad Name y especificando como valor el nuevo nombre que se desea asignar.

NOTA En términos de notación, cuando hagamos referencia a Clase.Miembro, por ejemplo Form.Name, nos referiremos al miembro de la clase; la explicación será válida para todas las instancias que de dicha clase se generen. Cuando hagamos referencia a Instancia.Miembro, por ejemplo frmEmpresa.Name, especificaremos valores y condiciones que se le apliquen sólo a un objeto en particular. En todos los casos, los controles pertenecen a Windows.Forms.Controls.

4.

5.

Modifique las siguientes propiedades: Propiedad

Valor a asignar

frmEmpresa.Text

Registro de empresa

frmEmpresa.Size.Width

450

frmEmpresa.Size.Height

350

Cuando encuentre este tipo de tablas en los ejercicios, lo que debe hacer es lo siguiente: a) En la columna de propiedad se encuentra una referencia que se compone de Objeto.Propiedad. En la herramienta Properties debe asegurarse que tiene seleccionado el objeto al cual desea modificar las propiedades; eso se comprueba si el objeto aparece en el cuadro combinado de selección de objetos de Properties. Una forma de seleccionar el objeto es haciendo un solo clic sobre él. b) En algunos casos la propiedad tendrá en la tabla dos referencias (Propiedad1.Propiedad2), lo que indica que la primera propiedad engloba a la segunda. c) A fin de cuentas debe encontrarse en la columna izquierda de la rejilla de propiedades la propiedad especificada (Propiedad), y debe establecer el valor de la misma en la columna derecha de la rejilla (Valor a asignar). d) Los valores de las propiedades no se asignan hasta oprimir la tecla Intro al terminar la edición.

6.

La propiedad Form.Text permite asignar el título que ha de mostrarse en la barra de título del formulario; Form.Width permite asignar el ancho en píxeles del formulario, mientras que Form.Height permite asignar el alto en píxeles.

12

366

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7.

En Properties busque la propiedad frmEmpresa.Icon, y haga clic en el botón de asistencia de introducción de valores . Aparecerá la ventana de selección de archivos. Seleccione el archivo WindowsApp.ico, que se encuentra en los archivos complementarios al capítulo, en C:\APVBNETVS\Cap11. La propiedad Form.Icon permite seleccionar el icono del programa. Como puede ver, el icono que aparece en la barra de título de la aplicación ha cambiado por el que hemos especificado. Por el momento nuestra interfaz luce como sigue:

➤ Adición de un sistema de menús usando Menu Designer 8.

9.

Visual Studio posee controles y herramientas llamados ToolStrip Designer, que permiten la modificación de propiedades textuales en modo de diseño. Uno de ellos es MenuStrip. Agregue en modo de inserción un objeto MenuStrip; para ello haga doble clic en el control MenuStrip, que se encuentra en el grupo Menu & Toolbars de Toolbox. En el formulario se integrará un sistema de menú, que podrá ser complementado de forma totalmente visual. En la parte inferior de Form Designer aparecerá un panel donde se muestran todos los objetos que visualmente no constituyen un elemento de la interfaz, como es el caso de MenuStrip.

Capítulo 12. Desarrollo de Aplicaciones Windows

367

Form Designer debe lucir como sigue:

10. Vea cómo se ha integrado una barra de menúa que muestra el texto Type Here. Esta herramienta se llama Menu Designer, que permite ir diseñando sistemas de menú con suma facilidad. Por definición, un sistema de menú es un conjunto de opciones que se distribuyen visualmente de forma jerárquica y que al ser seleccionadas desencadenan acciones. FIGURA 12.6 Menu Designer.

11. En Menu Designer cada opción constituye un elemento de menú (menu item). Se tienen elementos de primer nivel, que son aquellas opciones que aparecen de forma permanente en la barra de menús, y que no dependen de ningún elemento de menú. También pueden insertarse elementos de segundo nivel, que son los que dependen de un elemento de primer nivel; elementos de tercer nivel, cuarto nivel, y así sucesivamente.

12

368

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. En el área de edición donde aparece Type Here se escribe la etiqueta de elemento; si como etiqueta del elemento emplea un verbo, procure utilizar uno en infinitivo. Al comenzar a editar una etiqueta de elemento, automáticamente se proponen elementos latentes, que son aquellos que pudieran existir siempre y cuando se edite su etiqueta de elemento. Aparecerá siempre un elemento latente abajo y otro a la derecha: los elementos latentes que aparecen en la parte inferior generan opciones de menú al mismo nivel, mientras que las opciones que se editan hacia la derecha constituyen la formación de un nuevo nivel de elementos (salvo en el caso de los elementos de primer nivel, donde lo que se genera es un nuevo elemento de primer nivel). 13. Escriba como etiqueta del elemento de primer nivel la palabra Acciones. En el elemento latente inferior escriba Limpiar campos; en el elemento latente inferior escriba un guión (-), y finalmente en el elemento latente inferior escriba Cerrar. Nuestro sistema de menús debe lucir como sigue (observe que al aplicar un guión como etiqueta se genera una línea separadora):

14. El sistema de menús es para Visual Basic un objeto de tipo MenuStrip; los elementos de un sistema de menús constituyen objetos ToolStripMenuItem. Lo que escribimos en la etiqueta de elemento realmente constituye la propiedad ToolStripMenuItem.Text de cada elemento.

➤ Líneas guía en tiempo de diseño para la alineación de objetos 15. Ahora trabajaremos con objetos basados en el control Button, que se encuentra en el grupo Common controls de Toolbox. Agregue un objeto Button a la interfaz y cambie su nombre Button1 por btnAceptar. Agregue otro objeto Button y cambie su nombre Button2 por btnCancelar. Trate de colocarlos en la parte inferior izquierda, como usualmente Windows ubica los botones de aceptar y cancelar.

Capítulo 12. Desarrollo de Aplicaciones Windows

369

16. Al mover los objetos en la interfaz para colocarlos en el sitio que queremos, podremos usar las líneas guía (snaplines) que Visual Basic muestra; éstas permiten una alineación y distribución estética de los controles.

FIGURA 12.7 Líneas guía de Form Designer.

17. Existen diferentes líneas guía: las guías de proximidad, que son las que conectan a objetos entre sí, indicando la distancia recomendada entre objetos para una interfaz gráfica Windows (también pueden asociarse a bordes del espacio de trabajo). Además existen las guías de alineación, que permiten evaluar la posición de un objeto en relación con otros objetos y elementos del entorno. 18. Mueva btnCancelar de tal forma que se ubique en la esquina inferior derecha. No deje de acomodar el botón hasta que vea las guías de proximidad con el borde derecho e inferior. Eso garantiza las medidas estándar de una interfaz Windows.

19. Mueva btnAceptar de tal manera que se muestren las guías de proximidad, tanto con el borde inferior como con btnCancelar; además deberá buscarse que aparezca la guía de alineación que garantice que el texto interno de los botones estén alineados en su límite inferior.

12

370

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

20. Modifique las siguientes propiedades: Propiedad

Valor a asignar

btnAceptar.Text

&Aceptar

btnCancelar.Text

&Cancelar

frmEmpresa.CancelButton

btnCancelar

21. La propiedad Button.Text permite asignar el texto que aparecerá en la cara del botón. Si se antepone el carácter & a una de las letras en Button.Text, automáticamente se forma una tecla de atajo (shortcut); esto permite que oprimir la combinación de teclas Alt-A equivalga a hacer clic en btnAceptar, y presionar Alt-C sea equivalente a hacer clic en btnCancelar. 22. La propiedad Form.AcceptButton permite definir a un botón existente en la interfaz como acción de aceptación, por lo cual oprimir la tecla Intro equivale a hacer clic en el botón especificado. Por otro lado, Form.CancelButton permite definir a un botón existente en la interfaz como acción de cancelación, por lo cual oprimir la tecla Esc equivale a hacer clic en btnCancelar. En nuestra interfaz se asigna btnCancelar como botón de cancelación. 23. Nuestra interfaz debe lucir como sigue:

➤ Cómo agregar imágenes a objetos Button 24. Asigne un valor a btnAceptar.Image; para ello haga clic en el botón de asistencia de introducción de valores . Recuerde que todas las asignaciones de valores se realizan desde Properties (tecla F4). Aparecerá la ventana Select Resource:

Capítulo 12. Desarrollo de Aplicaciones Windows

371

25. El valor que ha de recibir btnAceptar.Image es de tipo Image, y no puede representarse mediante código. Para ese tipo de valores y contenidos cada proyecto posee un archivo de recursos, de extensión .RESX; en ese archivo se almacenan diversos elementos externos que deseamos sean considerados como parte integral de la aplicación. 26. Haga clic en Import..., y seleccione el archivo ok.png que se encuentra en el directorio de archivos complementarios del capítulo. Haga clic nuevamente en Import... y seleccione el archivo Error.png. En la lista de recursos tendrá entonces a Ok y Error. Seleccione Ok de la lista de recursos y acepte haciendo clic en el botón Ok. La imagen seleccionada aparecerá en el centro del objeto. 27. Modifique btnCancelar.Image; seleccione el recurso Error de la lista de recursos cuando ésta aparezca. Haga clic en Ok para aceptar. La imagen aparecerá al centro del botón. 28. Como puede ver, las imágenes al centro de los botones no son las más adecuadas. Modifique btnAceptar.ImageAlign asignando el valor MiddleLeft. Al hacer la modificación aparecerá una ayuda visual que indica la posición en donde deseamos colocar la imagen.

12

372

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

29. Asigne también el valor de MiddleLeft a btnCancelar.ImageAlign. 30. La propiedad Button.Image representa la imagen que un botón presentará en su cara, mientras que Button.ImageAlign representa la posición que la imagen ocupará en la cara del botón. 31. Nuestros botones deben lucir de la siguiente manera:

32. Como puede ver, los botones están muy compactados, por lo que deberá incrementar sus dimensiones utilizando los delimitadores de tamaño. Incremente el tamaño de btnAceptar hasta que el texto y la imagen se ajusten correctamente. Aunque la tentación sea mucha, no modifique por el momento el tamaño de btnCancelar.

FIGURA 12.8 Modificando dimensiones de botón

➤ Opciones de formato para grupos de objetos 33. Un grupo de objetos es la selección de varios objetos en tiempo de diseño. Cuando se tiene un grupo de objetos en Properties aparecerán sólo las propiedades que son compartidas por todos ellos; modificar el valor de una propiedad cuando se trabaja con un grupo de objetos equivale a modificar el valor de dicha propiedad para todos los objetos del grupo. 34. Al trabajar con un grupo de objetos, en todos ellos se colocarán delimitadores de tamaño. Sólo uno de ellos tendrá los delimitadores de tamaño en color blanco, mientras que el resto de los objetos tendrá los delimitadores en color negro. El objeto que tiene los delimitadores en color blanco es el objeto principal de referencia; es decir, que las opciones de formato aplicables al grupo van en función a dicho objeto. Teniendo seleccionado un grupo, basta con hacer clic sobre alguno de los objetos del mismo para que asuma el rol de objeto principal de referencia. 35. Las opciones de menú pertinentes para el objeto principal de referencia son las siguientes:

Capítulo 12. Desarrollo de Aplicaciones Windows

Icono en barra de herramienta/Opción de menú

373

Acción

Format – Align – Lefts

Alinea todos los objetos del grupo con el borde izquierdo del objeto principal de referencia.

Format – Align – Centers

Alinea todos los objetos del grupo con el eje central vertical del objeto principal de referencia.

Format – Align – Rights

Alinea todos los objetos del grupo con el borde derecho del objeto principal de referencia.

Format – Align – Tops

Alinea todos los objetos del grupo con el borde superior del objeto principal de referencia.

Format – Align – Middles

Alinea todos los objetos del grupo con el eje central horizontal del objeto principal de referencia.

Format – Align – Bottoms

Alinea todos los objetos del grupo con el borde inferior del objeto principal de referencia.

Format – Make same size - Width

Establece a los objetos del grupo con el mismo ancho que el objeto principal de referencia.

Format – Make same size - Height

Establece a los objetos del grupo con el mismo alto que el objeto principal de referencia.

Format – Make same size - Both

Establece a los objetos del grupo con el mismo tamaño que el objeto principal de referencia.

Format – Horizontal spacing – Make equal

Establece una misma distancia entre los objetos, sobre el eje horizontal.

Format – Horizontal spacing – Increase

Incrementa de forma proporcional la distancia entre los objetos, sobre el eje horizontal.

Format – Horizontal spacing – Decrease

Disminuye de forma proporcional la distancia entre los objetos, sobre el eje horizontal.

Format – Horizontal spacing – Remove

Elimina la distancia entre los objetos, sobre el eje horizontal, dejándolos contiguos.

Format – Vertical spacing – Make equal

Establece una misma distancia entre los objetos, sobre el eje vertical.

Format – Vertical spacing – Increase

Incrementa de forma proporcional la distancia entre los objetos, sobre el eje vertical.

Format – Vertical spacing – Decrease

Disminuye de forma proporcional la distancia entre los objetos, sobre el eje vertical.

Format – Vertical spacing – Remove

Elimina la distancia entre los objetos, sobre el eje vertical, dejándolos contiguos.

12

374

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

36. Otras opciones de formato aplicables tanto para los objetos en grupo como para un objeto individual, son las siguientes: Icono en barra de herramienta/Opción de menú

Acción

Format – Center in form – Horizontally

Centra los objetos respecto al ancho del formulario.

Format – Center in form – Vertically

Centra los objetos respecto al alto del formulario.

Format – Order – Bring to front

Coloca el objeto al frente de los demás, de tal forma que tendrá prioridad en la selección.

Format – Order – Send to back

Coloca el objeto atrás de los demás, dándoles menor prioridad de selección.

37. Trace un rectángulo imaginario que toque los dos botones del formulario.

38. Al soltar el ratón se habrán seleccionado los objetos en modo grupo.

39. El objeto primario de referencia es btnCancelar, dado que tiene delimitadores de tamaño en color blanco. Haga, en btnAceptar, a fin de que se establezca como objeto primario de grupo. 40. Seleccione Format – Make same size – Both . Los botones asumirán el tamaño del objeto principal de referencia, es decir, btnAceptar. 41. Apoyándose en las líneas guía, vuelva a distribuir los botones de tal manera que tengan una distribución estética. Nuestro formulario debe lucir como sigue:

Capítulo 12. Desarrollo de Aplicaciones Windows

375

➤ Cómo establecer páginas de controles (TabControl) 42. En modo trazo agregue un objeto TabControl, que se encuentra en el grupo Containers de Toolbox. Trace el objeto de tal forma que quede entre la barra de menú y los botones, abarcando casi hasta los bordes el ancho del formulario. 43. Aparecerá el objeto TabControl, mostrando dos fichas (tabs). FIGURA 12.9 TabControl.

12

376

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

44. Lo que se agrega a la interfaz es un objeto TabControl que contiene dos objetos TabPage; cada TabPage posee su pestaña de selección, de tal forma que se pueda alternar entre ellas. Si hacemos clic sobre el área superior del control, es decir, en el área donde se encuentran las pestañas de selección de página, estaremos trabajando con el objeto TabControl en su calidad de contenedor de objetos TabPage. Por otro lado, si hacemos clic en la pestaña de algún TabPage y luego hacemos clic en el cuerpo de la página, estaremos trabajando con el objeto TabPage. 45. Haga clic en cualquiera de las pestañas de selección de página, a fin de seleccionar el TabControl. Cambie el nombre del objeto de TabControl1 a tcDatos. 46. TabControl proporciona herramientas a nivel objeto para la manipulación de su comportamiento y apariencia (figura 12.09). A través de los delimitadores de tamaño es posible extender o contraer el control, simplemente arrastrando el delimitador en la dirección en que queremos que se expanda o contraiga. También está el icono para mover el objeto de lugar, a través del cual podemos arrastrar un control hacia otro sitio en la interfaz. Finalmente tenemos el icono de tareas de objeto (smart tag) que proporciona una liga rápida hacia las acciones más comunes a realizar con el control, y además permite la modificación rápida de las propiedades más comunes; si bien las acciones son generalmente posibles en el menú de contexto, smart tag es más específico. 47. Haga clic en el smart tag del objeto y seleccione el vínculo Add Tab.

48. Se agregará un TabPage más a tcDatos. En el plano subyacente, lo que ocurrió es que se agregó un elemento más a la colección TabPages. 49. Si seleccionamos la pestaña de un TabPage y luego hacemos clic en el área del cuerpo del TabPage estaremos trabajando con la página. Seleccione la ficha TabPage1 y haga clic en el cuerpo de la página; en Properties cambie la propiedad Name, de TabPage1 a tpGenerales. Modifique también el nombre de TabPage2 por tpContacto, y el de TabPage3 por tpSitio. 50. Modifique las siguientes propiedades: Propiedad

Valor a asignar

tpGenerales.Text

Datos generales

tpContacto.Text

Persona de contacto

tpSitio.Text

Sitio en Internet

btnAceptar.Enabled

False

Capítulo 12. Desarrollo de Aplicaciones Windows

377

51. Seleccione tpGenerales y agregue 5 etiquetas (Label), 1 cuadro de texto con máscara (MaskedTextBox), 3 cuadros de texto (Textbox) y un objeto para selección de fecha (DateTimePicker). Todos los controles se encuentran en el grupo Common Controls de Toolbox. 52. Distribuya los objetos de la siguiente forma:

53. Modifique las siguientes propiedades. Un consejo rápido: si al seleccionar un objeto su propiedad por omisión es Text, se puede comenzar a escribir el valor de la propiedad Text sin seleccionarla en Properties. Tal es el caso de Label: haga clic en los objetos Label y escriba simplemente lo que la etiqueta ha de mostrar, automáticamente se actualizará Text. Los controles se relacionan en orden de lectura de izquierda a derecha, de arriba abajo: Propiedad

Valor a asignar

Label1.Text

ID Empresa:

MaskedTextBox1.Name

mtbIDEmpresa

mtbIDEmpresa.Mask

, seleccionar y escribir 9999999999 en Mask

12

378

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 12.10 Input Mask.

Propiedad

Valor a asignar

Label1.Text

ID Empresa:

Label2.Text

Nombre:

TextBox1.Name

txtNombre

txtNombre.CharacterCasing

Upper

txtNombre.MaxLength

40

Label3.Text

Dirección:

TextBox2.Name

txtDireccion

txtDireccion.AcceptsReturn

True

txtDireccion.MaxLength

200 True (aumentar el alto del objeto, una vez modificada esta propiedad)

txtDireccion.Multiline

Label4.Text

NIP de acceso:

TextBox3.Name

txtNIP

txtNIP.MaxLength

10

txtNIP.PasswordChar

*

DateTimePicker1.Name

dtpClienteDesde

Capítulo 12. Desarrollo de Aplicaciones Windows

379

54. La interfaz debe lucir de la siguiente manera:

55. Las propiedades Text de los controles indican la parte textual visible de los objetos. La propiedad MaskedTextBox.Mask sirve para representar la máscara o patrón de entrada que aceptará el control; en nuestro caso, el número de empresa es un número de máximo diez posiciones, por lo que la máscara de entrada es 9999999999. La propiedad TextBox.CharacterCasing determina si el contenido del cuadro de texto será convertido a minúsculas, mayúsculas, o será mixto; en nuestro caso pedimos que el nombre de la empresa esté en mayúsculas. La propiedad TextBox.MaxLength permite especificar el número máximo de caracteres que podrán ser ingresados en el cuadro de texto. La propiedad TextBox.AcceptsReturn permite que se incluya Intro dentro del contenido, sin darle significado especial. La propiedad TextBox.MultiLine establece que el cuadro de texto puede incluir varias líneas de escritura; al establecer esta propiedad como True, automáticamente aparecen delimitadores de tamaño que permiten no sólo incrementar el ancho del objeto, sino también el alto. La propiedad TextBox.PasswordChar permite establecer un símbolo a través del cual lo que uno escribe en un cuadro de texto queda oculto a la vista. 56. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Ejecute la aplicación y verifique que en el ID de la empresa sólo se puedan capturar números, hasta un total de diez; que lo capturado en el nombre siempre esté en mayúscula, que en dirección se pueda capturar más de una línea; que se admita el uso de Intro; que el NIP aparezca como oculto a la vista, y que se pueda seleccionar una fecha distinta a la mostrada como antigüedad del cliente. FIN DEL EJERCICIO*

12

380

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 12.3 Uso de grupos de controles, combos y selectores de número Aprenderá a utilizar grupos de controles, combos y selectores de números en una interfaz Windows. 1.

4.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Continúe trabajando con el proyecto Empresa, iniciado en el ejercicio anterior. Seleccione tpContacto y agregue cuatro etiquetas (Label), un cuadro de texto (TextBox), un cuadro de texto con máscara (MaskedTextBox), un cuadro combinado (ComboBox), un selector de número (NumericUpDown) y un cuadro de grupo (GroupBox), dentro del cual se deberán agregar en modo arrastre dos botones de opción (RadioButton). Al seleccionar el cuadro de grupo y moverlo de lugar, los botones de radio deberán moverse junto con él. Distribuya los objetos de la siguiente manera:

5.

Modifique las siguientes propiedades:

2. 3.

Propiedad

Valor a asignar

Label6.Text

Nombre:

TextBox1.Name

txtNombreCon

txtNombreCon.MaxLength

50

Capítulo 12. Desarrollo de Aplicaciones Windows

txtNombreCon.CharacterCasing

Upper

Label7.Text

Teléfono:

MaskedTextBox1.Name

mtbTelefono

mtbTelefono.Mask

99 (99) 9999-9999

Label8.Text

Título:

ComboBox1.Name

cboTitulo

cboTitulo.Items

, y escribir las opciones del combo, una en cada línea.

381

FIGURA 12.11 String Collection Editor.

12 Propiedad

Valor a asignar

Label9.Text

Sucursales:

NumericUpDown1.Name

nudSucursales

nudSucursales.Maximum

50

nudSucursales.Minimum

1

GroupBox1.Text

Sexo

RadioButton1.Name

rbtnMasculino

rbtnMasculino.Checked

True

rbtnmasculino.Text

Masculino

RadioButton2.Name

rbtnFemenino

rbtnFemenino.Text

Femenino

382

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6.

La interfaz debe lucir de la siguiente manera:

7.

Las propiedades Text de los controles indican la parte textual visible de los controles. La propiedad NumericUpDown.Maximum sirve para indicar el número máximo hasta donde permitirá el selector de números llegar, mientras que NumericUpDown.Minimum determina el mínimo. La propiedad GroupBox.Text permite establecer el texto de encabezado que ha de aparecer en un cuadro de grupo de controles. La propiedad RadioButton.Checked indica si el botón de opción está seleccionado o no; sólo puede haber un botón de opción seleccionado en un grupo de controles a un tiempo. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Ejecute la aplicación y verifique que aparecen todos los elementos que haya agregado en String Collection Editor para el cuadro combinado; que los límites máximos y mínimos del selector de números se respete, y que al seleccionar un botón de opción dentro de un grupo, los demás dejan de estar seleccionados.

8.

FIN DEL EJERCICIO*

Ejercicio 12.4 Orden de tabulación y activación dinámica de controles Aprenderá a manipular la activación dinámica de controles en una interfaz, dependiendo del cumplimiento de condiciones. Aprenderá también el manejo de la herramienta Tab Order.

Capítulo 12. Desarrollo de Aplicaciones Windows

1.

383

4.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Continúe trabajando con el proyecto Empresa, iniciado en el ejercicio 12.2. Seleccione tpSitio y agregue un objeto de casilla de verificación (CheckBox), un cuadro de texto (TextBox), un botón de comando (Button), un control de navegación en Internet (WebBrowser) y un control de ayuda fugaz (ToolTip). Este último es invisible en tiempo de ejecución, por lo que no se agrega a la interfaz; la forma en que deberá incluirlo es arrastrando el control desde ToolBox hasta el cuadro de texto de la interfaz. Distribuya los objetos de la siguiente forma:

5.

Modifique las siguientes propiedades:

2. 3.

12

Propiedad

Valor a asignar

CheckBox1.Name

chkSitio

chkSitio.Text

Tiene sitio Web?

TextBox1.Name

txtURL

txtURL.Enabled

False

Button1.Name

btnVerSitio

btnVerSitio.Text

&Ver

btnVerSitio.Enable

False

WebBrowser1.Name

webPagina

txtURL.ToolTip on ToolTip1

Coloque aquí la ruta http del sitio

ToolTip1.ToolTipTitle

Mensaje del sistema

384

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6.

La interfaz debe lucir de la siguiente forma:

7.

Las propiedades Text de los controles indican la parte textual visible de los objetos. La propiedad ToolTip.ToolTipTitle sirve para especificar el título de encabezado que aparecerá con el mensaje de ayuda fugaz, que se especifica en la propiedad TextBox.ToolTip. La propiedad Control.Enabled de los controles indica si están o no disponibles para su uso en tiempo de ejecución, no obstante de que estén visibles.

➤ Lanzamiento de tareas desde la barra de menús 8.

Una de las tareas más comunes en el desarrollo de interfases es la de limpiar los datos existentes en los campos para iniciar una nueva captura. En nuestro ejemplo, colóquese en cualquier parte del formulario en tiempo de diseño, despliegue el menú contextual y seleccione la opción View Code para ver el código del programa. Como no hemos codificado nada, aparecerá la declaración de una clase en blanco. Codifique la siguiente rutina que limpiará todos los campos que podemos editar en nuestra interfaz (debe ir entre el inicio y el fin de la declaración de la clase). Codificación de Empresas

1 2 3 4 5

– Form1.vb - LimpiaCampos

Sub LimpiaCampos() ‘ Campos del primer TabPage mtbIDEmpresa.Text = “” txtNombre.Text = “” txtDireccion.Text = “”

Capítulo 12. Desarrollo de Aplicaciones Windows

6 7 8 9 10 11 12 13 14 15 16 17 18 19

385

txtNIP.Text = “” ‘ Campos del segundo TabPage txtNombreCon.Text = “” mtbTelefono.Text = “” rbtnMasculino.Checked = True cboTitulo.SelectedIndex = 0 ‘ Campos del tercer TabPage chkSitio.Checked = False txtURL.Text = “” txtURL.Enabled = False btnVerSitio.Enabled = False End Sub

9.

Como puede ver, se limpian todos los campos textuales y se reestablecen los valores iniciales del formulario. 10. Vaya a Form Designer y en tiempo de diseño seleccione la opción Limpiar Campos, haciendo doble clic sobre la opción. Aparecerá nuevamente el código, pero habrá agregado un procedimiento de evento que se lanzará cuando el usuario seleccione la opción en tiempo de ejecución. El procedimiento se llama LimpiarCamposToolStripMenuItem_Click. En dicho procedimiento mande llamar el procedimiento LimpiaCampos, que acabamos de desarrollar.

Codificación de Empresas

– Form1.vb – LimpiarCamposToolStripMenuItem_Click

12 1 2 3

Private Sub LimpiarCamposToolStripMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LimpiarCamposToolStripMenuItem.Click Call LimpiaCampos() End Sub

11. Aunque la instrucción Call para mandar a ejecutar un procedimiento puede omitirse, se incluye para mejorar la claridad del código. 12. Vaya a Form Designer y en tiempo de diseño seleccione la opción Cerrar, haciendo doble clic sobre la opción. Aparecerá nuevamente el código, que deberá complementar de la siguiente manera:

386

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de Empresas 1 2 3

– Form1.vb – CerrarToolStripMenuItem_Click

Private Sub CerrarToolStripMenuItem_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CerrarToolStripMenuItem.Click Me.Close() End Sub

13. Al aplicar el método Close() sobre el formulario (que se reconoce a sí mismo como Me), se cierra el formulario. 14. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Ejecute la aplicación, escriba en los campos textuales del formulario y seleccione la opción de menú Limpiar Campos. Luego compruebe que al utilizar la opción de menú Cerrar, el formulario se cierra. Con ello habrá aprendido cómo enviar comandos a través del menú.

➤ Procedimiento para el evento de arranque (Load) 15. Un formulario tiene un procedimiento de evento de arranque, denominado Load. El evento Form.Load sucede antes de que el formulario sea desplegado por primera vez, y es ahí donde podemos especificar aquellas cosas que sean establecidas antes que cualquier cosa suceda en la interfaz. Una cosa que nos gustaría es que los campos estuvieran limpios antes de comenzar a trabajar con la interfaz. Para lograrlo podemos ejecutar el procedimiento LimpiaCampos en el procedimiento de evento de arranque. 16. Un evento por omisión (default event), es el procedimiento de evento más común para un determinado tipo de objeto; al estar en Form Designer y hacer doble clic sobre un determinado objeto, Visual Studio abrirá Text Editor y preconstruirá la estructura del procedimiento del evento por omisión. Cuando hacemos doble clic sobre un botón, por ejemplo, se precodificará el procedimiento de evento para el evento Button.Click, dado que Button.Click es el evento más común del tipo de objeto. 17. Para codificar el evento Form.Load de nuestro formulario bastará hacer doble clic en cualquier parte no ocupada dentro del formulario, dado que Form.Load es el evento por omisión de Form. Desde Form Designer, haga doble clic en cualquier parte no ocupada del formulario. 18. Aparecerá la codificación del procedimiento de evento frmEmpresa.Load. Edite el programa de tal manera que el procedimiento quede de la siguiente forma:

Capítulo 12. Desarrollo de Aplicaciones Windows

Codificación de Empresas 1 2 3 4 5

387

– Form1.vb - frmEmpresa_Load

Private Sub frmEmpresa_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Call LimpiaCampos() End Sub

19. De esta manera, antes de que el formulario se muestre por primera vez, será ejecutado el procedimiento que iniciará los valores del formulario.

➤ Uso de Tab Order para establecer el orden de tabulación 20. El orden de tabulación es el orden en que los objetos adquieren el enfoque de manera secuencial al presionar la tecla TAB. Lo ideal es que el orden de tabulación obedezca a la forma natural en que el usuario de la aplicación está acostumbrado a ordenar los datos de entrada. En tiempo de diseño procuramos ser ordenados, pero no siempre podemos agregar los objetos en el orden de tabulación que deseamos. Eso no nos debe preocupar, dado que es posible modificar el orden de tabulación utilizando la propiedad Control.TabIndex de los objetos. 21. Otra opción es hacer clic en el botón Tab Order de la barra de herramientas de formato en tiempo de diseño. Seleccione tpContacto y haga clic en el botón Tab Order. Aparecerá una interfaz muy parecida a la siguiente: FIGURA 12.12 TabOrder.

12

388

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

22. Los números que aparecen en los controles son los índices de orden, e indican el orden y la profundidad del mismo. De acuerdo con la figura 12.12, el menú es el punto de donde parte el orden de tabulación (0), siguiendo el botón Aceptar (1), luego el botón Cancelar (2) y finalmente el TabControl (3). Como TabControl es contenedor, su contenido tendrá un orden 3.x.y.z, donde x es el orden de las páginas, y es el orden de los controles dentro de la página, y z sería el orden de los controles dentro de un control contenedor dentro de la página. 23. Se recomienda que las etiquetas (Label) sean las primeras en el orden, dado que no reciben el enfoque. Después debe darse el orden de acuerdo a como se desee el orden de tabulación. Para modificar el orden sólo se requiere hacer clic sobre el control hasta que tenga el índice de orden que queremos. Al tener activada la herramienta de Tab Order, al posicionar el puntero del ratón sobre el control, aparece un borde sombreado y el puntero cambia a cruz. Al hacer clic en ese momento, el índice de orden cambia, y cambia el orden del resto de los controles de tal manera que no haya dos iguales.

24. Modifique el orden de tabulación de tal manera que quede de la siguiente manera:

Capítulo 12. Desarrollo de Aplicaciones Windows

389

25. Al terminar de colocar el orden deseado, basta hacer clic en el botón Tab Order nuevamente para dar por aceptados los cambios. Se recomienda aplicar el orden de tabulación cuando ya se está bastante seguro de que no modificará la interfaz.

➤ Bloqueo de controles (Lock Controls) 26. Cuando ya la interfaz está bastante depurada y en orden, lo conveniente es aplicar el bloqueado de controles, que consiste en inhabilitar la posibilidad de modificaciones a los controles en tiempo de diseño; se permitirá sólo la codificación. Para bloquear los controles sólo se tiene que seleccionar la opción Format – Lock Controls; aparecerá un pequeño candado en la esquina superior izquierda de los controles, lo que indica que están bloqueados.

➤ Activación dinámica de elementos 27. Una de las principales actividades preventivas que una interfaz puede realizar es no permitir la ejecución de trabajos si los datos para un proceso no son completos y correctos. Una forma de hacerlo es que el botón de comando que ejecute el procesamiento o el almacenamiento se mantenga inhabilitado, en tanto no se cuente con todos los datos requeridos. 28. En nuestro caso, deseamos que antes de que se pueda presionar el botón Aceptar los objetos siguientes tengan un valor: mtbIDEmpresa, txtNombre, txtDireccion, txtNIP, txtNombreCon, mtbTelefono. El valor de todos ellos está representado por la propiedad Text. 29. En Form Designer, despliegue el menú contextual y seleccione View Code. En Text Editor codifique el siguiente procedimiento dentro de la clase: Codificación de Empresas 1

2 3 4 5 6 7 8 9

– Form1.vb - ActivaAceptar

Sub ActivaAceptar(ByVal sender As Object, ByVal e As EventArgs) Handles mtbIDEmpresa.LostFocus, txtNombre.LostFocus, txtDireccion.LostFocus, txtNIP.LostFocus, txtNombreCon.LostFocus, mtbTelefono.LostFocus If mtbIDEmpresa.Text = “” Or txtNombre.Text = “” _ Or txtDireccion.Text = “” Or txtNIP.Text = “” _ Or txtNombreCon.Text = “” Or mtbTelefono.Text = “” Then btnAceptar.Enabled = False Else btnAceptar.Enabled = True End If End Sub

12

390

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

30. En la línea 1 del bloque anterior se declara el procedimiento. Después del nombre del procedimiento (ActivaAceptar) se abren paréntesis declarando dos argumentos. Estos argumentos se denominan argumentos implícitos, dado que CLR en tiempo de ejecución provee los datos a los argumentos sin que el usuario tenga que enviarlos mediante una llamada Call. La mayoría de los eventos manejados en .NET requieren de dos argumentos implícitos: sender, que puede ser cualquier tipo de objeto (Object) transferido en modo value type y que hace referencia al objeto desde el cual se desencadena el evento; y e que es de tipo EventArgs (manejador de argumentos de eventos), que también es pasado en modo value type. En la misma declaración del procedimiento se agrega la referencia Handles, que indica qué eventos controlará el procedimiento codificado. En nuestro caso, el procedimiento se ejecutará cuando se cause el evento Control.LostFocus para los objetos mtbIDEmpresa, txtNombre, txtDireccion, txtNIP, txtNombreCon, mtbTelefono. En todo el código no verá un llamado a ejecución de ActivaAceptar; CLR lo lanzará a ejecución y será quien también le dirá qué objeto es el que provocó, así como los argumentos pertinentes del evento. 31. En la líneas 2 a la 4 se evalúa si alguno de los objetos no ha sido capturado (Text=””), en cuyo caso inhabilita el botón Aceptar. De lo contrario, es decir, si todos tienen valor, el botón Aceptar se habilita. 32. Otra activación automática que podemos hacer es que, en la tercera página, sólo se pueda capturar información de URL y ver la página en Internet si la casilla de verificación está marcada. En Form Designer haga doble clic en chkSitio. Se precodificará el procedimiento por omisión aplicable al cuadro de verificación. Se trata del evento CheckBox.CheckedChanged, que se lanzará cuando se cambie el estado de marcado de la casilla de verificación. Codifique lo siguiente:

Codificación de Empresas 1 2 3 4

– Form1.vb – chkSitio_CheckedChanged

Private Sub chkSitio_CheckedChanged( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkSitio.CheckedChanged txtURL.Enabled = chkSitio.Checked btnVerSitio.Enabled = chkSitio.Checked End Sub

33. Nos aprovechamos de que la propiedad que almacena si la casilla de verificación está o no marcada es Boolean. Si la casilla de verificación no está marcada, la propiedad CheckBox.Checked es False, y si está marcada la propiedad CheckBox.Checked es True. Asigne el valor de CheckBox.Checked a las propiedades Control.Enabled de los objetos dependientes: al marcar la casilla de verificación, los objetos se activarán, y al desmarcarla se inhabilitarán (líneas 2 y 3).

Capítulo 12. Desarrollo de Aplicaciones Windows

391

34. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Ejecute la aplicación y verifique que el botón Aceptar está disponible sólo si todos los campos requeridos tienen datos. Verifique que el cuadro de verificación gobierna la disponibilidad del cuadro de texto en el que se solicita el URL y el botón de ver sitio. FIN DEL EJERCICIO*

Ejercicio 12.5 Uso de controles para la visualización de páginas Web

Aprenderá a utilizar los controles para la visualización de contenidos Web desde formularios Windows. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Continúe trabajando con el proyecto Empresa del ejercicio anterior. En Form Designer seleccione tpSitio y haga doble clic en btnVerSitio para editar el procedimiento que ha de ejecutarse al hacer clic en el botón Ver. Codifique lo siguiente:

Codificación de Empresas 1 2 3

4.

5.

– Form1.vb - btnVerSitio_Click

Private Sub btnVerSitio_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerSitio.Click webPagina.Navigate(New Uri(txtURL.Text)) End Sub

La línea 2 se encarga de ir, en el objeto WebBrowser, a la dirección en Internet que se haya proporcionado en txtURL. La liga no puede proporcionarse de forma textual, y por ello tiene que ser una nueva instancia de la clase WebBrowser.Uri, que permite especificar recursos en Internet. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Ejecute la aplicación, active la casilla de verificación que pregunta si tiene sitio Web, escriba como liga http://www.aprendapracticando.com y haga clic en Ver. La página debe aparecer en el formulario.

FIN DEL EJERCICIO*

12

392

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 12. Desarrollo de Aplicaciones Windows

393

TERMINOLOGÍA AcceptButton, 370 AcceptReturn, 378 Add, 361 BackgroundWorker, 358 Barra de herramientas, 357 BindingNavigator, 358 BindingSource, 358 Bloqueo de controles, 389 Boxing, 361 Button, 355 Call, 385 CancelButton, 370 CharacterCasing, 378 CheckBox, 355 CheckedListBox, 355 Child, 346 Close, 386 Colección, 361 ColorDialog, 360 ComboBox, 355 Common Controls, 355 Containers, 357 ContextMenuStrip, 357 Controles, 347 Controles comunes, 355 contenedores, 357 de impression, 359-60

de menú, 357 Controls, 362 Count, 361 Cuadros de diálogo, 360 DataGridView, 358 DataSet, 358 DateTimePicker, 355 Default event, 386 Delimitadores de tamaño, 372 Dialogs, 360 Directory Searcher, 359 DirectoryEntry, 358 Elemento de menu, 367 Elementos gráficos de interfaz, 346 Enabled, 363 Enfoque, 363 Enter, 364 ErrorProvider, 359 Etiqueta de elemento, 368 EventLog, 359 Evento por omisión, 386 FileSystem Watcher, 359 FlowLayoutPanel, 357 Focus, 363 FolderBrowserDialog, 360 FontDialog, 360

For Each, 362 GotFocus, 364 Graphic User Interface, 344 GroupBox, 357 Grupo(s) de controles, 347 de objetos, 372 GUI, 344 Guías de alineación, 369 de proximidad, 369 HelpProvider, 359 Image, 370 ImageAlign, 371 ImageList, 359 Input Mask, 378 Interfaz de usuario, 344 Interfaz gráfica de usuario, 344 Item(s), 361, 381 Label, 356 Leave, 364 Líneas guía, 369 LinkLabel, 356 ListBox, 356 ListView, 356 Load, 386 Lock Controls, 389 LostFocus, 364 Mask, 377 MaskedTextBox, 356 MaxLength, 378 Menu item, 367

Menús, 357 MenuStrip, 357 MenuStrip, 366 MessageQueue, 359 Modo arrastre, 348 inserción, 348 trazo, 348 MonthCalendar, 356 Multiline, 378 NotifyIcon, 356 NumericUpDown, 356 Objeto contenedor, 346 hijo, 346 padre, 346 principal de referencia, 372 OpenFileDialog, 360 PageSetupDialog, 360 Páginas de controles, 375 Panel, 357 Parent, 346 PasswordChar, 378 Performance Counter, 359 PictureBox, 356 Pointer, 355 PrintDialog, 360 PrintDocument, 360 Printing, 359-60 PrintPreview Control, 360

12

394

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

PrintPreview Dialog, 360 Procedimiento de evento de arranque, 386 Process, 359 ProgressBar, 356 RadioButton, 356 Remove, 361 ReportViewer, 358 RESX, 371

RichTextBox, 356 SaveFileDialog, 360 SerialPort, 359 Service Controller, 359 Smart tag, 376 Snaplines, 369 SplitContainer, 357 StatusStrip, 357 TabControl, 357, 375

TabIndex, 363 TableLayoutPanel, 357 Tareas de objeto, 376 Tecla de atajo, 370 Text, 370 TextBox, 356 Timer, 359 Toolbars, 357 ToolStrip, 358

Container, 358 Designer, 366 ToolTipTitle, 383 ToolTrip, 356 TreeView, 356 Unboxing, 361 Uri, 391 Validated, 364 Validating, 364 Visible, 363 WebBrowser, 356

PREGUNTAS 12.1 ¿Cuál es el principal propósito de una interfaz? 12.2 Explique qué son los objetos contenedores y cuándo se da una relación padre-hijo entre objetos. 12.3 ¿Cuáles son las tres formas de agregar objetos en Form Designer? 12.4 Mencione los pasos que integran la estrategia para el estudio efectivo de controles. 12.5 ¿Qué importancia tiene que los controles deriven de la clase Control y Object? ¿En qué nos beneficia? 12.6 Seleccione 15 controles que considere que utilizará en sus interfases Windows.

Capítulo 12. Desarrollo de Aplicaciones Windows

395

Notas:

12

396

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Elemento a través del cual un programa recibe datos: a) Formulario b) Control c) Interfaz de usuario 2. Es un objeto que contiene a otros objetos: a) Formulario b) Objeto contenedor c) Objeto receptor 3. Las propiedades, métodos y eventos, son: a) Argumentos b) Elementos de interfaz c) Miembros 4. Todos los controles de Windows.Forms.Controls derivan de:p a) Namespace b) Enumeraciones c) Clases Object y Control 5. Es la forma de agregar controles en donde mayor control se tiene de la posición y las dimensiones de los objetos: a) Inserción b) Arrastre c) Trazo

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Los objetos no pueden anidarse.

7.

Los manejadores permiten asociar un procedimiento con un evento.

8.

En unboxing, un objeto pasa a ser un tipo de dato primitivo.

9.

Un grupo de controles puede tener sólo objetos de un mismo tipo.

10.

La clase Object deriva de la clase Control.

CAPÍTULO

13

Desarrollo de aplicaciones Web con ASP.NET Objetivos: Aprender la estructura general de una página Web codificada en ASP.NET. 1. Conocer los requerimientos para el desarrollo de aplicaciones Web en .NET. 2. Identificar los elementos que pueden integrarse en una página Web ASP.NET para guardar compatibilidad con desarrollos pasados. 3. Identificar las directivas y conocer cómo se agregan a una página Web. 4. Aprender qué son los formularios del servidor y cómo se agregan a una página Web. 5. Conocer los controles del servidor, qué tipos hay y cómo se agregan a una página Web. 6. Aprender qué es el código declarativo y cómo se agrega a una página Web.

397

398

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Motivos del auge de las aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . Requerimientos para el desarrollo de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . Entorno operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Procesamiento de páginas Web en .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Características de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementos de una página Web ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estructura básica de una página ASP.NET . . . . . . . . . . . . . . . . . . . . . . . Contenido HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloques proveedores de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formulario del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controles del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Adición de código a una página: Código declarativo . . . . . . . . . . . . . . Controles comunes en aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles estándar (Standard) . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles de validación (Validation) . . . . . . . . . . . . . . . . . . . Grupo de controles de navegación (Navigation) . . . . . . . . . . . . . . . . . Grupo de controles de acceso (Login) . . . . . . . . . . . . . . . . . . . . . . . . . . Grupo de controles HTML (HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creación de una página Web ASP.NET, prueba e identificación de sus elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Configuraciones iniciales del diseñador de páginas Web para las vistas y el posicionamiento de controles . . ➤ Adición de elementos a un sitio Web . . . . . . . . . . . . . . . ➤ Establecimiento de valores generales de formulario . . . ➤ Revisión del código generado por el servidor . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

399 400 400 401 402 403 410 410 411 411 412 414 415 417 419 419 421 422 422 423 423 424 425 427 427 437 439 440 441 443

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

399

El tema de ASP.NET es suficientemente amplio para dedicarle un libro aparte. Dado que es una de las formas más populares en que se consume código en Visual Basic, este capítulo se ocupa del tema desde la perspectiva más amplia de la programación orientada a objetos.

Motivos del auge de las aplicaciones Web Quizá el futuro inmediato de las aplicaciones distribuidas esté en el desarrollo de aplicaciones Web. Conforme la tecnología de desarrollo Web avanza (y lo hace a pasos agigantados), las plataformas son cada vez más sencillas, confiables, seguras y escalables. A continuación se explican algunas de las principales razones por las cuales la Web se ha convertido en un campo fructífero para el desarrollo. Uso de Internet como red privada corporativa. A medida que los negocios se globalizan, la Internet cobra importancia como red privada corporativa. Dos son los detonadores: por un lado, las organizaciones requieren comunicar datos con sus socios comerciales; por otro, instalar redes privadas para hacerlo sería demasiado costoso, incluso ocioso, ya que no hay razones para intentar la instalación de una red global nueva cuando ya existe una. Evolución en la confiabilidad de la Web. Ciertamente, cada nueva alternativa tiene sus ventajas y desventajas. Tópicos como la seguridad en Internet, la disponibilidad de servicios de telecomunicaciones, la compatibilidad entre diversas plataformas operativas, la complejidad de la técnica de desarrollo de aplicaciones Web, entre otros problemas, deberán ser resueltos gradualmente. Afortunadamente, las nuevas técnicas de cifrado, la existencia de protocolos universales reconocidos por todas las plataformas y el desarrollo basado en lenguajes de alta portabilidad, garantizan que los paquetes de datos que deben ser enviados de un lado a otro del globo, lleguen completos y seguros, utilizando para ello programas cada vez más sencillos, rápidos y estables. Posibilidad de desarrollo profesional. La evolución de las operaciones de datos de los negocios nos llevará poco a poco hacia un esquema de aplicaciones que utilicen los servicios de Internet para la comunicación de datos. Esto abre un campo inmenso para los servicios de desarrollo de aplicaciones basadas en la Web; en consecuencia, los desarrolladores deberán buscar las herramientas que les permitan brindar soluciones estables, fáciles de generar y con posibilidades de crecimiento. No será extraño saber que programadores, desarrolladores gráficos y administradores de bases de datos formen pequeñas organizaciones dedicadas al desarrollo profesional de aplicaciones para su uso en la Web, con una cartera respetable de clientes ansiosos.

13

400

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Lo más interesante de todo es que la comunidad de desarrolladores, a la vez que es proveedora de servicios, se convierte al mismo tiempo en promotora, generando un nicho económico en el que es mejor estar dentro. Plataformas de desarrollo estandarizadas y disponibles. La nueva plataforma de desarrollo, Microsoft.NET, maximiza el uso de Internet como medio de comunicación al tiempo que resuelve los problemas inherentes al desarrollo en ambiente Web, facilitando como nunca antes el proceso de desarrollo, y logrando un equilibrio entre simplicidad, consistencia y potencia. El respaldo de Microsoft hacia la tecnología .NET Framework asegura la máxima penetración de los productos en las organizaciones, lo cual permite generar un círculo virtuoso entre productos y servicios relacionados (market share). Esto promueve que cada vez más empresas y desarrolladores la adopten como su plataforma de desarrollo y operación, lo que gradualmente garantizará el máximo conocimiento sobre la tecnología, servicios de desarrollo y consultoría disponibles, así como precios justos de productos y servicios. Ese fenómeno ya se vivió con Visual Basic. Ahora es el turno de .NET. Antes de adentrarnos en la programación de ASP.NET, es conveniente analizar de manera breve algunos conceptos de programación Web.

Requerimientos para el desarrollo de ASP.NET Los requerimientos para desarrollar con ASP.NET varían un poco respecto a los demás tipos de aplicaciones. Éstas son algunas de las particularidades del desarrollo en ASP.NET:

Entorno operativo ❑ Motor de ejecución Web. Es el que se encargará de recibir las peticiones de páginas y resolverlas, entrando en contacto con los componentes involucrados por la página Web requerida, así como con los componentes de .NET Framework, tales como CLR y BCL. En el caso de una plataforma Microsoft, el motor de ejecución Web se llama Internet Information Server, conocido también como IIS. Para verificar que IIS esté disponible en su equipo, trate de desplegar la siguiente página: http://localhost

Con ello deberá aparecer la página de presentación de IIS. Se recomienda ampliamente contar con la versión 5.5 o superior.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

401

IIS sólo está disponible en las versiones Server de Windows (2000, 2003 y posteriores), así como las versiones Professional de los sistemas de escritorio de Windows (XP, 2000, etcetéra). No siempre se instala de manera predeterminada, y por ese motivo es necesario verificar la disponibilidad de IIS. En caso de que no lo tenga instalado, proceda a instalarlo; es indispensable. ¡No olvide que deberá tener instalado IIS y levantar los servicios Web antes de instalar .NET Framework SDK! Si instala .NET Framework SDK y luego instala y habilita IIS, las aplicaciones ASP.NET no funcionarán, dado que no hay manera que se registre la articulación entre herramientas. Si ya instaló .NET Framework SDK y después instala IIS, será necesario que establezca el registro de articulación con la siguiente instrucción en línea de comandos: aspnet_regiis.exe -i

❑ Privilegios de depuración. Para depurar páginas en ASP.NET es necesario que la cuenta con la que esté desarrollando pertenezca al grupo de usuarios de depuración (Debugger Users). Los trabajos de depuración sostienen un diálogo intenso con el sistema operativo y es necesario que el desarrollador tenga los permisos necesarios para interactuar con los servicios de monitoreo de problemas del equipo. ❑ .NET Framework. Es necesario que el equipo sea capaz de resolver el contenido Web ASP.NET, y para ello es necesario que disponga de .NET Framework instalado, lo que permitirá acceder a CLR y BCL. El código ASP.NET es compilado al momento de realizar peticiones a páginas ASP.NET, y los ensamblados que se generan en el proceso son administrados y requieren de CLR para funcionar. Además, los controles Web del servidor son clases de BCL (que debe estar presente en el entorno operativo del equipo de desarrollo).

Herramientas de desarrollo ❑ Visual Studio. Definitivamente la mejor opción para el desarrollo profesional de páginas ASP.NET es Visual Studio, que integra facilidades de diseño y depuración de páginas Web. Aunque no es necesario para el desarrollo de páginas Web ASP.NET, sí agiliza enormemente la labor de desarrollo. ❑ Visual Web Developer Express Edition. Es un entorno integrado de desarrollo de aplicaciones Web, para uso semiprofesional. Similar a Visual Studio, incluye diseñadores y asistentes interesantes, pero es más limitado respecto de la producción de software y el trabajo en equipo.

13

402

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Procesamiento de páginas Web en .NET Forma en que se resuelven las páginas ASP.NET

El hecho de que ASP sea “.NET”, pone de manifiesto que las páginas activas operan ahora bajo las reglas de funcionamiento de la plataforma .NET. No se trata de mejoras sobre la misma forma de funcionar; esto implica cambios radicales que producen mejoras. En ASP clásico (ASP antes de .NET) las páginas se resolvían de modo interpretado; es decir, cada vez que se solicitaba una página ASP al servidor, ésta debía ser analizada, interpretada y transformada en código HTML equivalente, el cual finalmente era remitido al cliente. En ASP.NET la forma de ejecución es distinta, dado que trabaja bajo el modelo petición - respuesta dinámico orientado a eventos, en donde hay contenidos que se resuelven en el servidor. Además el código remitido al cliente está preparado para la captura de eventos y la ejecución automática de procesos, sin necesidad de que el usuario haga peticiones explícitas. Al hacer la petición, el servidor se percata de que la página requerida es ASP.NET (ASPX); la página, que es tratada como un programa, primeramente es procesada por un analizador de código (Parser), que verifica que el programa esté bien escrito y que no presente errores de sintaxis o referencias perdidas (uso de variables, procedimientos, o miembros inexistentes). Si el programa no tiene errores de sintaxis o referencias perdidas, el programa es puesto a disposición del compilador de páginas de .NET Framework; el compilador se encargará de generar un ensamblado de extensión DLL, de nombre único, que define una clase capaz de generar el código HTML que ha de ser devuelto al navegador del cliente. Este ensamblado se almacena en un área denominada caché de ensamblados (Assembly Cache), donde se almacenan todos los ensamblados generados por el compilador de páginas. Ya que está generado el ensamblado capaz de producir el contenido Web que ha de ser devuelto al cliente, un elemento denominado HTTP Runtime se encarga de solicitar la ejecución de la clase generada, para crear la instancia del objeto generador y producir el contenido Web. El contenido Web generado por la clase es almacenado en una área denominada caché de salida (Output Cache); en ese espacio se almacenan los contenidos HTML, los guiones de ejecución de parte del cliente e incluso los datos generados como parte de la salida. De ahí, el contenido es enviado al cliente solicitante. Si posteriormente se solicita la misma página, se buscará primeramente en el caché de salida; si el contenido Web se encuentra todavía ahí, no se realizará procesamiento alguno, por lo cual la respuesta es extremadamente rápida.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

403

En el peor de los casos, si el contenido Web no se encuentra en el caché, se producirá la ejecución de la clase creándose un nuevo contenido Web, lo cual de todas maneras es mucho más rápido que utilizar código interpretado. FIGURA 13.1 Procesamiento de páginas Web ASP.NET.

Características de ASP.NET ASP.NET es la implementación en plataforma Microsoft para aplicaciones bajo el modelo petición-respuesta dinámica orientada a eventos. En sí se trata de un modelo de servicios necesarios para construir aplicaciones empresariales en plataforma Web. Antes de ASP.NET contábamos con lo que ahora se ha dado en llamar ASP Clásico, que operaba bajo el modelo petición-respuesta dinámico. Esta tecnología está perdiendo vigencia rápidamente, ya que ASP.NET es más potente, sencillo y organizado; en términos generales, hay ciertas características de ASP.NET que lo están convirtiendo rápidamente en el estándar para el desarrollo Web. Las características particulares más relevantes de ASP.NET son las siguientes: ❑ ❑ ❑ ❑ ❑

Aceptación de varios lenguajes Desempeño mejorado Código compilado Manejo automático de estado Código separado del diseño (Code Behind)

13

404

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

❑ ❑ ❑ ❑ ❑ ❑ ❑ ❑ ❑ ❑ ❑

Uso de bibliotecas de clase de .NET Framework Controles Web del servidor Independencia del navegador Servicios Web XML Seguridad mejorada Mayor escalabilidad Permite sesiones cookie-less Fácil configuración Fácil implementación (Copy Deployment) Personalización basada en Web Parts Recursos de personalización: Master pages, Skins y Themes

Aceptación de varios lenguajes. ASP Clásico permitía desarrollar en un solo lenguaje llamado código ASP, que era más bien un subconjunto de Visual Basic. Si usted tenía experiencia en algún otro lenguaje, por ejemplo Java o C, de nada le servía. Era necesario que aprendiera código ASP para poder instruir al servidor en cualquier tarea. ASP.NET es la alternativa de desarrollo de aplicaciones Web para la plataforma .NET y por ese motivo posee muchas de las características que hacen de .NET la plataforma de desarrollo más fuerte del mercado; una de ellas es que acepta varios lenguajes de .NET, como Visual Basic, C#, JScript .NET y J#, entre muchos otros. No importa qué lenguaje .NET sea el que domine: podrá desarrollar procedimientos en cualquier lenguaje .NET aceptado, e integrar la funcionalidad a sus páginas Web. Si es desarrollador de aplicaciones de consola o aplicaciones Windows, no tendrá que cambiar de lenguaje por el simple hecho de cambiar de ambiente. Una ventaja adicional es que toda la programación Web puede hacerse bajo el enfoque orientado a objetos; el desarrollador usa etiquetas para controlar propiedades y desde el código puede manejar eventos y ejecutar métodos. Desempeño mejorado. En ASP Clásico, los bloques de código de parte del servidor debían ser interpretados y ejecutados cada vez que se invocaba la página; la acción de interpretar el código una y otra vez degradaba el desempeño de las aplicaciones. En ASP.NET el código se compila hasta terminar siendo código ejecutable para el servidor. Es interpretado una sola vez y a partir de ahí, cada vez que ejecutemos la página Web invocaremos la versión interpretada y depurada de la página. El hecho de que ya no tengamos que interpretar código de manera recurrente hace que las aplicaciones tengan un mejor desempeño; si además consideramos que el código compilado es más rápido que el código interpretado, la ventaja en velocidad es significativa. Código compilado. En ASP Clásico los bloques de código que el servidor resolvía terminaban siendo código interpretado; es decir, cada vez que se tenía acceso a la página ASP,

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

405

IIS debía interpretar el código, buscar errores de sintaxis, generar el código HTML correspondiente y resolver la página. En el caso de ASP.NET, el código se compila en el servidor. La primera vez que acceda a la página probablemente tarde un poco, pero a partir de ahí el ensamblado que generará el código HTML a remitir al navegador ya estará disponible en un área de caché. En ese sentido, después de la primera vez que se entra a una página, el servidor ya no resuelve nada, sólo ejecuta el programa ya existente. En virtud de que el servidor mantiene el caché, no importa qué usuario haya llamado por primera vez la página; la versión compilada del código estará disponible para todos los que la requieran posteriormente. Otra ventaja es que .NET Framework se encarga de realizar las compilaciones y ejecuciones cuando son necesarias de manera automática; el desarrollador sólo requiere intentar cargar la página en un navegador. .NET Framework decidirá el tratamiento óptimo de la solicitud realizada. Al ejecutar una página ASP.NET se genera un ensamblado de extensión DLL que se alojará en el directorio \Bin del sitio, desde donde se consumirá su funcionalidad. Manejo automático del estado. En ASP Clásico mantener el estado de los formularios (Form-state) era un suplicio. Si se querían trasladar datos de una página a otra de manera confiable era necesario realizar una labor intensa que consistía en declarar objetos ocultos (hidden objects), así como variables de sesión, que generalmente en un momento dado de la ejecución perdían vigencia y arruinaban todo el proceso. Otra alternativa era manejar los valores mediante cookies; el problema es que con tantos ataques a la privacidad realizados en Internet, inhabilitar la admisión de cookies es una práctica común. Ese hecho, obviamente, dejaba a la aplicación sin una función completa. En ASP.NET, el estado de formulario se mantiene de manera automática a través de un objeto oculto y cifrado; las páginas ya no llaman a otras páginas para hacer un mismo proceso en partes. En lugar de ello, las páginas se mandan llamar a sí mismas y realizan el traslado de datos de manera transparente para el usuario. Código separado (Code Behind). En ASP Clásico, los programas eran una verdadera ensalada de tecnologías que confundía a los inexpertos y dificultaba el mantenimiento de los programas a los expertos. En un mismo programa era común encontrar etiquetas HTML (lenguaje de marcas), llamadas a componentes (objetos COM), bloques de código de parte del cliente codificados en VBScript, bloques de código de parte del cliente codificados en JavaSctipt y bloques de código de parte del servidor (código ASP).

13

406

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

En ocasiones, los encargados del diseño de las páginas modificaban código ASP o código de los guiones; a su vez, los programadores de procedimientos modificaban la codificación de diseño, etcétera. En resumen, era un caos. Con ASP.NET el código puede estar separado del diseño de la página (capacidad llamada Code Behind). En su totalidad, se trata de código de parte del servidor, y las etiquetas HTML se reducen al mínimo. Como producto obtenemos programas más limpios y estructurados. Tranquilamente se puede encargar a un grupo de diseño que trabaje sobre la forma de la página, mientras que los programadores podrán estar desarrollando procedimientos de manera independiente. Como en Visual Studio el código se maneja en modo Code Behind, por cada aplicación se tendrá la página Web ASPX, que será la página en donde se encuentren las etiquetas ASP.NET; por otro lado, se tendrá un programa de extensión VB o CS (dependiendo el lenguaje que decidamos utilizar), en donde se encontrará la programación de una clase que provee la funcionalidad de orientación a eventos de la página. Al ejecutarse la página, la clase se compilará generando un ensamblado que después se puede consumir. Uso de BCL. Con ASP Clásico era posible utilizar los componentes registrados en el servidor y, aunque se empleaba una buena cantidad de ellos, este uso era de alguna manera ajena al código ASP y no estaba plenamente integrada. En ASP.NET, en virtud de que codificamos con lenguajes .NET, podemos hacer uso de la biblioteca de clases de .NET Framework, lo que permite agregar funcionalidad sin precedentes a las aplicaciones Web. Como sabe, la biblioteca de clases de .NET Framework posee un gran número de clases disponibles para su uso en los programas; aunque probablemente no pueda utilizarlas todas en ambiente Web, la cantidad de elementos que puede utilizar es bastante amplia. Controles Web del Servidor. En ASP Clásico desarrollábamos con Front Page o con Visual InterDev; aunque dichas herramientas poseían una caja de herramientas con “controles”, realmente se trataba de vínculos a generadores de código que implementaban un determinado objeto utilizando código HTML y DHTML. En ASP.NET se tienen verdaderos controles Web de parte del servidor. Al agregar un elemento gráfico en Visual Studio se agregan etiquetas que serán resueltas en el servidor y se traducirán en objetos plenamente funcionales de parte del cliente, capaces de percibir eventos y realizar llamadas automáticas al servidor. Otra ventaja de los controles Web del servidor es que son objetos de BCL que pueden ser identificados y utilizados de forma programática. Independencia del navegador. En ASP Clásico terminábamos de codificar las páginas y las probábamos; cuando comprobábamos que todo funcionaba bien hacíamos la publicación. El problema surgía cuando el usuario revisaba nuestras aplicaciones en un navegador

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

407

distinto al que nosotros utilizamos (por ejemplo, Netscape Navigator). La aplicación perdía la estética y algunos elementos ya no funcionaban. El problema era que la funcionalidad de nuestras aplicaciones dependía del navegador; en un mundo de aplicaciones globales no podemos obligar a nuestros clientes a que tengan tal o cual navegador. Eso hacia necesario indagar qué navegador utilizaba el cliente, a fin de proporcionarle un resultado funcional acorde al mismo. Prácticamente se desarrollaban dos programas para dos diferentes navegadores. En ASP.NET, los controles Web del servidor son capaces de determinar por sí mismos qué navegador utiliza el cliente para que el servidor genere el código correspondiente. En otras palabras, las aplicaciones serán independientes de la plataforma que las lea. Servicios Web XML. En ASP Clásico no existían los servicios. Para poder distribuir funcionalidad era necesario desarrollar componentes, registrarlos en el servidor y esperar que no se dieran problemas técnicos y de permisos para poder utilizarlos en aplicaciones Web desde estaciones remotas. Los componentes son paquetes binarios ejecutables, por lo cual no son afines a los firewalls y los servidores proxy; otro problema adicional: sólo funcionan para la misma plataforma operativa, es decir, Windows. En ASP.NET se puede hacer uso de Servicios Web XML, componentes funcionales que pueden ser utilizados mediante peticiones Web y facilitan el intercambio de funcionalidad utilizando Internet como medio. Los Servicios Web XML utilizan protocolos estándar como SOAP (Simple Object Access Protocol) y XML (eXtensible Markup Language) para trabajar, por lo que permiten la interacción con plataformas operativas distintas a Windows. Seguridad mejorada. De manera predeterminada, el ambiente Web proporciona acceso anónimo a los sitios; no obstante ello, es posible que se desee restringir el acceso de alguna manera. En ASP Clásico sólo se tenía un tipo de seguridad: Autenticación Windows. Bajo este esquema, el IIS podía ejecutar una validación de seguridad, dando acceso de acuerdo con el sistema de usuarios y roles de usuarios de Windows. En ASP.NET, además de la autenticación Windows, se emplea la autenticación de formularios, a través de la cual usted puede restringir el acceso por medio de programación. ASP.NET también proporciona seguridad mediante los servicios de Microsoft Passport, que es un servicio centralizado de autenticación brindado por Microsoft. Además, ASP.NET cuenta con un nuevo mecanismo, denominado membresía ASP.NET (ASP.NET membership), que es una funcionalidad interconstruida de ASP.NET que permi-

13

408

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

te crear y administrar un esquema de control de usuarios y puede ser utilizada a través de controles de Login disponibles en Toolbox. Si se implementa el esquema basado en membresía ASP.NET, llevar a cabo las labores de registro de usuarios y cambios de contraseña, entre otras, será tan sencillo como arrastrar y colocar. Mayor escalabilidad. En ASP Clásico los estados de las sesiones eran mantenidos en el mismo servidor en donde se encontraba el motor de ejecución Web (IIS); esto provocaba que para poder utilizar información relativa a las sesiones era necesario invocarla en el mismo servidor. En caso de que se presentara un incremento en el tráfico de transacciones, la única opción para manejarlas era incrementar la capacidad del servidor. Una de las consecuencias de esta situación era la potencial sobrecarga del servidor, debido a que el procesamiento y el estado de sesiones no se podían distribuir. En ASP.NET el estado de las sesiones puede ser mantenido en un proceso separado, en una máquina o base de datos aparte, lo que permite la existencia de una sesión con servidores combinados (cross-server session). La ventaja de esto es que se pueden conectar servidores adicionales para absorber los incrementos de tráfico de transacciones. Sesiones cookie-less. Algunas ocasiones, en ASP Clásico se desarrollaban aplicaciones que hacían uso de cookies; el problema sobrevenía cuando el usuario inhabilitaba la capacidad de su navegador de admitirlas, en cuyo caso las aplicaciones dejaban de funcionar normalmente. Con ASP.NET es posible mantener el estado de las sesiones incluso si la capacidad del navegador para manejar Cookies está inhabilitada. A este funcionamiento se le ha dado el nombre de cookie-less. ASP.NET maneja de manera cifrada la información que se manejaría a través de Cookies (SessionID), trasladando los valores por medio del URL (Uniform Resource Locator). Fácil configuración. Con ASP Clásico la configuración de las aplicaciones era un poco oscura; era necesario conocer bien el ambiente de la aplicación y Visual InterDev. Con ASP.NET la configuración se mantiene en un archivo textual XML, llamado Web.config, que es entendible si se lo quiere leer. Fácil implementación (Copy Deployment). Con ASP Clásico copiar una aplicación Web a otro servidor requería precisión. Las razones eran simples: los archivos del sitio se encontraban en la carpeta del sitio, las librerías se encontraban en la carpeta \SYSTEM del sistema operativo, y se encontraban registradas en el Registro de Windows del equipo origen. Para migrar una aplicación había que estar seguro de copiar la carpeta de la aplicación y además verificar que todas las librerías de un equipo estuvieran debidamente copiadas y registradas en el equipo destino. Lo peor de todo, si la aplicación requería una librería que

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

409

no estaba registrada en el servidor destino, era necesario dar de baja el servidor Web para poder integrar la nueva librería; este escenario es el peor de todos para las aplicaciones que requieren la máxima disponibilidad. Con ASP.NET todos los archivos que una aplicación necesita se encuentran en la carpeta del sitio. Para copiar un sitio a otro servidor basta con copiar la carpeta del sitio en su totalidad. A este tipo de implementación se le ha dado el nombre de Copy Deployment. Recursos de personalización: Master pages, Skins y Themes. En ASP.NET se pueden utilizar recursos adicionales para la personalización y estandarización de los sitios desarrollados. Las páginas maestras (master pages) son páginas generales que definen la apariencia, el comportamiento y el enfoque del sitio en general. Las variaciones se manejan a través de páginas de contenido (content pages). Para definir este tipo de páginas es necesario crear una página de extensión .master que contendrá una apariencia predefinida (layout) compuesta en HTML y controles Web del servidor; esta página contendrá, en lugar de directivas @ Page, una directiva @ Master. Una página maestra puede tener dos o más controles delimitadores de contenido (ContentPlaceHolder), que no son otra cosa que regiones en la página Web en donde se pueden integrar elementos de contenido. Las páginas de contenido dispondrán de la directiva @ Page, en donde el argumento MasterPageFile permite el enlace con la página maestra; en la página de contenido se agregan controles de contenido que permiten especificar el ContentPlaceHolder en donde el contenido ha de integrarse. En tiempo de ejecución, las páginas maestra y de contenido se enlazan para producir un resultado coherente y estandarizado. Las páginas de apariencia (skins) son archivos con extensión .skin que definen las propiedades de apariencia para las páginas ASP.NET; junto con las páginas de cascadas de estilos (.CSS) determinan el look de las páginas Web. Se definen escribiendo una página con los controles Web del servidor a los que se les desea establecer propiedades de apariencia predeterminadas junto con las propiedades que se desea establecer como predeterminadas. No se especifica la propiedad Id, dado que no se utilizarán más que como referencia para indicar a ASP.NET que aplique determinados valores en sus propiedades de apariencia a un determinado tipo de controles. Los temas (themes) son conjuntos de recursos adicionales, como imágenes, código de parte del cliente (scripting) y sonido, que se pueden integrar a un sitio Web para darle mayor calidad. Personalización de la interfaz: Web Parts. En ASP.NET es posible dividir el contenido de una página en partes autónomas, denominadas Web Parts, que el usuario puede personalizar. Con base en las Web parts es posible reubicar contenido en la página, ocultar o mostrar partes, e incluso modificarlas dinámicamente respecto de su contenido.

13

410

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Elementos de una página Web ASP.NET En muchos sentidos, una página Web desarrollada en ASP.NET es una página común que, al ser invocada en el servidor, será interpretada y ejecutada por el motor de ejecución Web (IIS) y por .NET Framework. Las páginas Web desarrolladas en ASP.NET tienen la extensión ASPX, y son archivos de código textual que no requieren de ninguna herramienta especial para ser desarrollados; basta con un editor de texto simple para desarrollarlas. En el presente texto el término páginas Web se refiere a a páginas Web ASP.NET con extensión ASPX. Al invocar una página ASP.NET, el servidor resuelve los elementos que componen la página en sus equivalentes funcionales codificados en HTML, VBScript y JScript. Ya que la página ha sido resuelta se envía al cliente que la solicitó.

Estructura básica de una página ASP.NET Inicialmente, es exactamente igual que una página Web HTML:





A medida que introducimos elementos en el área de encabezado y el cuerpo de la página (que serán resueltos en el servidor), la página comienza a ponerse interesante. En una página ASPX podemos incluir lo siguiente: ❑ ❑ ❑ ❑ ❑

Contenido HTML Bloques proveedores de código Directivas Formulario del servidor Controles del servidor ❍ Controles Web (Web Controls) ❍ Controles HTML (HTML Controls) ❍ Controles de validación (Input Validation Controls) ❍ Rich Controls ❑ Código declarativo

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

411

Contenido HTML Las páginas ASP.NET tienen las capacidades anteriores de ASP Clásico; en ese sentido, siguen aceptando contenido HTML . Tan es así que la página básica contiene las etiquetas de estructura básicas HTML. Una diferencia importante es que las páginas ASP.NET son rigurosas en el manejo de etiquetas, pues cuidan que cada una de ellas se abra y cierre debidamente, además de que su sintaxis sea correcta en estricto sentido. Anteriormente, las páginas equivocadas simplemente no funcionaban como debían; en ASP.NET, no sólo no funcionarán, sino que marcarán error. Por contenido HTML nos referimos a etiquetas HTML, manejo de estilos, bloques de código de parte del cliente, declaración de objetos COM, etcétera. Esto implica que sus páginas funcionarán como funcionaban antes. En caso de que utilicen componentes COM, éstos no necesariamente tendrán que ser codificados y compilados en su forma equivalente para .NET. En ese sentido, la inversión realizada en componentes y codificación se mantiene.

Bloques proveedores de código Los bloques proveedores de código son los que el motor de ejecución Web (IIS) convierte a su equivalente en HTML. Son el equivalente a los bloques de código que se utilizaban en ASP Clásico, delimitados entre . Un ejemplo de este tipo de contenido sería el siguiente: 12 and Hora < 20 then Response.Write(“Buenas tardes”) else if Hora > 20 then Response.Write(“Buenas noches”) else Response.Write(“Buenos días”) end if end if %>

En este ejemplo, el servidor dará un saludo (“Buenos días”, “Buenas tardes”, “Buenas noches”), considerando la fecha y hora del servidor (no la fecha y hora de parte del cliente). Todo este código deriva en el saludo apropiado según la hora del servidor.

13

412

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA Tanto el contenido HTML como los bloques proveedores de código se mantienen por compatibilidad con los desarrollos pasados. En ASP.NET es deseable utilizarlos lo menos posible, a fin de darle mayor simplicidad y funcionalidad a los desarrollos.

Directivas Las directivas son especificaciones de valores que utiliza la página y los compiladores de controles de usuario al procesar páginas Web en ASP.NET. Para declararlas se utiliza la siguiente sintaxis, que se coloca al inicio de la página Web:

Donde NombreDirectiva es el nombre de la directiva que se desea incluir y Atributos son los atributos y sus valores, expresados en pares igualados (propiedad = valor); los atributos se separan entre sí por espacios en blanco. Las directivas más importantes son las siguientes: ❑ @Page. Define atributos específicos de página utilizados por el analizador sintáctico y el compilador de páginas ASP.NET. Puede incluirse sólo en archivos .ASPX (formularios Web de ASP.NET). ❑ @Control. Define atributos específicos de control utilizados por el analizador sintáctico y el compilador de páginas ASP.NET. Sólo puede incluirse en archivos .ASCX (controles de usuario de ASP.NET). ❑ @Assembly. Vincula un ensamblado de forma declarativa con la página o el control de usuario actual. ❑ @Implements. Indica de forma declarativa que una página o un control de usuario implementa una interfaz .NET Framework especificada. ❑ @Import. Importa explícitamente un espacio de nombres en una página o un control de usuario. ❑ @OutputCache. Controla de forma declarativa la normativa de caché de resultados de una página o control de usuario. ❑ @Reference. Vincula de forma declarativa una página o un control de usuario a la página o control de usuario actual. ❑ @Register. Asocia alias a nombres de espacios de nombres y clases, que permiten la representación de controles de usuario y controles de servidor personalizados cuando se incluyen en una página o un control de usuario solicitados.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

413

Una de las directivas de más útilidad es la directiva @Page. Algunos atributos importantes de esta directiva son los siguientes. ❑ AutoEventWireUp. (Boolean). Indica si los eventos de la página están interconectados de manera automática (True indica que la conexión está habilitada). Los eventos producidos por los controles Web trabajan de manera diferente a los eventos en los formularios de cliente tradicionales o en aplicaciones Web basadas en cliente. La diferencia se basa principalmente en la separación existente entre el propio evento y el lugar donde éste se controla. En las aplicaciones basadas en cliente (Windows o ASP Clásico), los eventos se producen y controlan en el cliente; en las páginas ASP.NET, los eventos se producen en el cliente, pero son controlados en el servidor. ❑ Buffer. (Boolean). Determina si el búfer de respuestas HTTP está habilitado. ❑ CodeBehind. (String). Especifica el nombre del archivo que contiene el código asociado a la página. Este código será un programa que contendrá una clase que le dará comportamiento a la página Web; de esta forma puede separarse el código de la interfaz. El diseñador de formularios de Visual Studio .NET usa este atributo al desarrollar una página Web utilizando dicha herramienta. ❑ CompilerOptions. (String). Cadena que contiene opciones del compilador para compilar la página; se trata de la secuencia de modificadores que utilizaríamos al compilar desde línea de comandos. ❑ Debug. (Boolean). Indica si la página se debe compilar con símbolos de depuración o no. En ocasiones sólo se obtiene información relevante a los errores aplicando este atributo. Por omisión tiene el valor False. ❑ EnableViewState. (Boolean). Indica si se mantiene el estado entre solicitudes de página de manera automática. Si el valor es True, el estado entre las páginas se manejará a través del objeto oculto _VIEWSTATE. ❑ ErrorPage. (String). Define una dirección URL de destino para la redirección cuando se produce una excepción de página no controlada. ❑ Inherits. (String). Define la clase de código en segundo plano que hereda la página. Ésta puede ser cualquier clase derivada de la clase Page. ❑ Language. (String). Especifica el lenguaje utilizado cuando se compilan todos los bloques de procesamiento en línea ( y ) y de declaraciones de código dentro de la página. Los valores pueden representar cualquier lenguaje compatible con .NET, incluidos Visual Basic (vb), C# (C#) o JScript .NET. Otra de las directivas útiles es la directiva @Import, que permite importar espacios de nombres para nuestras páginas. Veamos ejemplos del uso de @Page y @Import.

13

414

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Para determinar a Visual Basic como el lenguaje para la codificación de código declarativo:

Para, además, especificar la depuración avanzada:

Para determinar el programa MiCodigo.vb como repositorio de nuestro código:

Para importar el espacio de nombres que se requiere para trabajar con datos:

Formulario del servidor En ASP Clásico incluíamos los objetos para introducción de datos en una etiqueta Form. Los objetos estaban codificados mediante etiquetas HTML que eran resueltas por el cliente; al remitir la información (submit), ésta se trasladaba a la página que la utilizaría. En ASP.NET la cosa cambia. Ahora los objetos para introducción de datos no los codifica el desarrollador nosotros; realmente los genera IIS con la ayuda de .NET Framework, al resolver controles de ASP.NET. Como los objetos son generados de parte del servidor y no del cliente, el formulario de parte del cliente no es relevante; es necesario contar con un formulario que maneje los objetos de parte del servidor. Para que los controles de ASP.NET que introduzcamos en una página puedan utilizarse, es necesario que se encuentren en lo que se conoce como formulario del servidor, que consiste en un bloque Form con la especificación runat=server, como todo en ASP.NET. El bloque, en su forma primitiva, luce de la siguiente forma:



Ya que contamos con un formulario del servidor, podemos colocar diversos objetos dentro de él. Un formulario del servidor permitirá especificar controles Web del servidor, de tal manera que puedan ser procesados por .NET Framework en el servidor. A una página de extensión ASPX que contiene un formulario del servidor dentro del cual se definen diversos controles del servidor, se le conoce como Web Form.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

415

Controles del servidor Los controles del servidor son instrumentaciones de funcionalidad basada en etiquetas, a través de las cuales se le ordena al motor Web y a .NET Framework que construyan contenido HTML dinámico, sensible a eventos y aplicable a un navegador dado. Los controles del servidor se invocan en las páginas Web a través de etiquetas y pueden ser de los siguientes tipos básicos: ❑ Controles Web del Servidor (Web Controls). Llamados también intrínsecos; son los que poseen la máxima funcionalidad brindada por ASP.NET para la construcción de código HTML dinámico, sensible a eventos. ❑ Controles HTML del Servidor (HTML Controls). Constituyen aquellos cuyo único propósito es generar una equivalencia estándar de código HTML, en el servidor. ❑ Controles de validación (Input Validation Controls). Son una forma de control Web complementario, que tiene como objeto validar la entrada de datos en otro control que consume sus servicios. ❑ Rich Controls. Representan una forma de control Web de alta funcionalidad y complejidad, que pueden incluso estar conformados por varias etiquetas. Este es el caso del control Calendar. Los controles Web tienen comportamiento interconstruido (built-in), lo que significa que poseen sus propios métodos, propiedades y eventos, mismos que se pueden utilizar en programación orientada a objetos en la codificación de las páginas. Las propiedades, métodos y eventos de todos los controles son estándar, por lo que aprender a manejar un control equivale conocer el manejo de casi todos. A continuación se verá cómo se integra cada uno de estos controles. Integrando un control Web (Web Control). La sintaxis que deberá reunir la etiqueta que llame a un control Web del servidor es la siguiente:

En tal declaración encontramos los siguientes elementos:

❑ Selección del control. Se deberá abrir la etiqueta normal. En el caso de los controles Web y los controles de validación, deberá agregarse la especificación asp:; de esta

13

416

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

forma, el analizador de la página asociará la etiqueta con el espacio de nombre System. Posteriormente se agrega el nombre del control del servidor que se desea utilizar. En el ejemplo, NombreControl es el nombre del control del servidor que se desea invocar. Es necesario especificar qué control del servidor es el que queremos que el servidor resuelva. Identidad del objeto. Se deberá identificar a cada uno de los controles, a fin de que sean utilizables de manera programática; esto se logra a través de la propiedad Id, a la cual se le asigna un nombre válido de objeto (NombreObjeto). No se admiten espacios en blanco y caracteres especiales; por regla general, inicie los nombres con una letra o un guión bajo. Propiedades. Se podrán asignar a un control del servidor diversas propiedades (propiedades), colocando el nombre de la propiedad y su valor, en pares igualados (propiedad = valor); las propiedades se separarán entre sí por espacios en blanco. Referencia de ejecución en el servidor. Es muy importante que al final se incluya la referencia runat=server, ya que de otra manera el servidor no se dará por enterado de la existencia de la etiqueta, tratará de resolverla de parte del cliente, sin ningún efecto. Cerrado de la etiqueta. Se puede cerrar la etiqueta de un control del servidor aplicando el cerrado estilo XML (/>), en el caso de los controles Web y de los controles de validación, y utilizando cerrado tipo HTML (>) en el caso de los controles HTML, siempre y cuando la etiqueta no vaya seguida por contenido. Para aquellas etiquetas que afectan un contenido determinado, es decir, que tienen una etiqueta de inicio y una etiqueta de conclusión, y donde todo lo que está entre ambas se ve afectado por ellas, se deberá aplicar el cerrado estilo HTML ().

Web.UI.WebControls.









Sólo siguiendo la sintaxis correcta las etiquetas serán reconocidas como controles. El siguiente ejemplo muestra cómo sería utilizar un control Web para la creación de un cuadro de texto: asp:TextBox id=”Entrada” runat=”server” />

Integración de un control HTML (HTML Control). Integrar un control HTML del servidor es muy similar a integrar una etiqueta HTML; la única variación es que debe agregarse la especificación runat=server dentro de la etiqueta. Se agrega dicha especificación para garantizar que el servidor IIS, en conjunto con .NET Framework, se encargue de producir el equivalente HTML funcional para todos los navegadores. Si desarrolla ASP.NET y prueba usando Internet Explorer no notará beneficio, pero si desea que sus aplicaciones sean globales y funcionales en muchos navegadores, el uso de controles HTML es casi obligado.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

417

El siguiente ejemplo muestra cómo sería utilizar un control HTML para la creación de un vínculo (Link/Anchor):

Ir al sitio Aprenda Practicando

Esta liga generaría un vínculo específico hacia la página determinada para el navegador que hizo la petición. Integrando un control de validación (Input Validation Control). Un control de validación es un tipo especializado de control Web; la diferencia con un control Web es que los de validación siempre se subordinan a un control Web definido previamente. Un control de validación generalmente cuenta con una propiedad llamada ControlToValidate, que contiene el nombre del control que es validado a través del control de validación.

Este tipo de control provoca la generación de etiquetas HTML y scripts en JScript y VBScript, que se encargarán de garantizar, de parte del cliente, que la entrada de datos sea válida. El siguiente ejemplo muestra cómo se generaría un control de validación, que no permitiera omitir el valor del objeto al que llamamos Entrada:

Adición de código a una página: Código declarativo Una de las ventajas de ASP.NET es que separa el código de las etiquetas de la página Web, de tal forma que procesamiento y diseño estético se complementan pero no se revuelven. Esto permite una forma más estructurada de programación. Lo ideal es que el código se encuentre en un archivo independiente, y que sólo sea referido a través de directivas. A esta capacidad se le llama código separado (code behind, aunque la traducción literal no sea exacta).

13

418

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Las páginas no siempre funcionan con código separado. En este caso, los bloques de código están inmersos en la misma página Web. En ASP.NET el ideal es que los procedimientos estén claramente diferenciados, a fin de que el código no pase de porciones ejecutadas por el cliente a porciones ejecutadas por el servidor. Se le llama código declarativo al código que se declara en una página ASP.NET definiendo scripts que se ejecutan de parte del servidor. Los scripts se definen en el área de encabezado de la página, utilizando para ello la etiqueta script, que será interpretada y ejecutada de parte del servidor; dentro del script podrán definirse procedimientos en el lenguaje que se haya seleccionado (VB.NET o C#, por ejemplo). La sintaxis para definir código declarativo es la siguiente:

La forma de los procedimientos de código declarativo dependerá de los controles Web que se estén utilizando. Generalmente, la estructura de los procedimientos será muy similar a la que tienen los procedimientos de eventos en Visual Basic (Sub – End Sub); los argumentos implícitos corresponden generalmente al objeto que produce el evento (sender As Object), así como a un manejador de eventos (e As EventArgs). Obviamente, dependiendo del objeto y el evento que se provoca el manejador de eventos puede cambiar. Éste sería un ejemplo típico de un procedimiento de código declarativo, que ocurre al hacer clic (evento Click) en un botón: Sub Aceptar_Click(sender As Object, e As EventArgs) ‘ Código a ejecutar End Sub

En la mayoría de los casos es necesario especificar qué procedimiento es el que se utilizará para manejar un determinado evento; esto se realiza generalmente utilizando las propiedades On...; en el caso de nuestro ejemplo, como se está capturando el evento Click, se utilizaría una propiedad llamada OnClick en la definición del objeto que provoca el evento.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

419

Controles comunes en aplicaciones Web Al igual que las aplicaciones Windows, Visual Studio provee de muchos controles para el diseño de páginas Web. En Toolbox los grupos más importantes de desarrollo Web son los siguientes:

Grupo de controles estándar (Standard) Expone los controles generales de interfaz de usuario de una aplicación Web. Control

Nombre

Uso

Label

Representa una etiqueta para el mostrado de datos.

TextBox

Representa un cuadro de texto para introducción de datos.

Button

Representa un botón de comando que ejecuta un procedimiento.

LinkButton

Representa un botón con estilo de vínculo.

ImageButton

Representa una imagen que ejecuta un procedimiento al hacer clic en ella.

HyperLink

Representa un vínculo hacia un recurso Web.

DropDownList

Representa un cuadro combinado para la selección de opciones.

ListBox

Representa una lista de opciones de selección.

CheckBox

Representa una casilla de verificación.

CheckBoxList

Representa una lista de opciones en donde cada una de ellas es una casilla de verificación.

RadioButton

Representa un botón de opción.

RadioButtonList

Representa una lista de botones de opción.

Image

Representa una imagen.

13

420

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

ImageMap

Representa una imagen con regiones sensibles.

Table

Representa una tabla de contenido (filas/columnas).

BulletedList

Representa una lista de viñetas.

HiddenField

Representa un campo oculto.

Literal

Representa un espacio estático para texto en una página.

Calendar

Representa un calendario de selección dinámica de fecha.

AdRotator

Representa un control para el desplegado aleatorio de contenido (publicidad en banners).

FileUpload

Representa un cuadro de texto y un botón que permiten cargar un archivo al servidor.

Wizard

Representa controles de navegación entre varias páginas.

Xml

Representa un documento XML.

MultiView

Representa un contenedor de objetos View.

Panel

Representa un contenedor de controles Web.

PlaceHolder

Representa un almacén de controles que pueden ser integrados de forma dinámica a una interfaz.

View

Representa un contenedor de controles Web que forman parte de un contenedor MultiView.

Substitution

Representa una sección de la página cuyo contenido puede ser reemplazado dinámicamente.

Localize

Representa un espacio reservado para desplegar texto estático.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

421

Grupo de controles de datos (Data) Expone los controles a través de los cuales se puede interactuar con bases de datos. A través de estos controles se puede disponer del modelo de objeto ADO.NET desde la Web. Control

Nombre

Uso

GridView

Representa una rejilla de datos, donde mediante un patrón bidimensional línea-columna, se representa el contenido de un origen de datos.

DataList

Representa un control enlazado de datos (data bound control) que despliega los elementos con base en una plantilla.

DetailsView

Representa los valores de un solo registro, tomado de un origen de datos.

FormView

Representa los valores de un solo registro, tomado de un origen de datos, atendiendo a una plantilla definida por el usuario. Este objeto permite la adición, borrado o edición de registros.

Repeater

Representa un control enlazado de datos que permite dar un formato basado en plantillas a cada elemento del conjunto de registros proporcionados por el origen.

SqlDataSource

Representa una conexión de enlace para bases en SQL Server.

AccessDataSource

Representa una conexión de enlace para bases en Access.

ObjectDataSource

Representa un objeto de negocios que provee los datos a los controles enlazados, en una aplicación multicapa.

XmlDataSource

Representa un origen de datos XML para controles enlazados.

SiteMapDataSource

Representa un origen de datos útil para el enlazado con los datos de la estructura jerárquica de un mapa de sitio.

13

422

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Grupo de controles de validación (Validation) Expone los controles que ayudan a garantizar que los datos introducidos en la interfaz de usuario sean correctos y estén completos. Control

Nombre

Uso

RequiredFieldValidator

Representa un validador para la no omisión de un dato.

RangeValidator

Representa un validador que comprueba que un valor se encuentre dentro de un intervalo.

Regular ExpressionValidator

Representa un validador que comprueba que un valor obedezca a una máscara de expresión regular.

CompareValidator

Representa un validador que verifica un valor comparativamente con otro valor o con un tipo de dato.

CustomValidator

Representa un validador persona lizado que actúa tanto de parte del cliente como del servidor.

ValidationSummary

Representa un resumen de los resultados de las validaciones de una interfaz.

Grupo de controles de navegación (Navigation) Expone los controles que permiten la navegación entre datos y páginas Web, necesarios para dar forma a un mapa de sitio. Control

Nombre

Uso

SiteMapPath

Representa un conjunto de hipervínculos e imágenes que permiten la navegación entre las páginas del sito, con el mínimo consumo de espacio de trabajo en la pantalla.

Menu

Representa un menú en una página Web.

TreeView

Representa un árbol jerárquico de datos.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

423

Grupo de controles de acceso (Login) Permiten la implementación visual de los elementos de autenticación y autorización incluidos en ASP.NET Membership. Control

Nombre

Uso

Login

Representa una interfaz preconstruida que permite la autenticación de usuarios.

LoginView

Representa la visualización de la información de usuarios registrados y usuarios anónimos.

PasswordRecovery

Representa la interfaz para recuperación de contraseña, utilizando el correo electrónico proporcionado al momento del registro del usuario.

LoginStatus

Representa un control informativo que indica el estado de un usuario registrado, proporcionando medios para el ingreso (LogIn) y la salida (LogOut).

LoginName

Representa un control informativo que muestra el nombre del usuario actual.

CreateUserWizard

Representa la recolección de información de usuarios nuevos.

ChangePassword

Representa la interfaz a través de la cual los usuarios registrados pueden cambiar su contraseña.

Grupo de controles HTML (HTML) Contiene los controles HTML del servidor. Control

Nombre

Uso

Login

Representa una interfaz preconstruida que permite la autenticación de usuarios.

Input (Button)

Representa un botón de comando.

13

424

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Input (Reset)

Representa un botón de comando de tipo Reset.

Input (Submit)

Representa un botón de comando de tipo submit, que provoca una petición al servidor.

Input (Text)

Representa un cuadro de texto.

Input (File)

Representa un cuadro de texto para selección de un archivo.

Input (Password)

Representa un cuadro de texto con entrada oculta.

Input (Checkbox)

Representa una casilla de verificación.

Input (Radio)

Representa un botón de opción.

Input (Hidden)

Representa un control oculto.

Textarea

Representa un cuadro de texto multilínea.

Table

Representa una tabla.

Image

Representa una imagen.

Select

Representa un cuadro combinado.

Horizontal Rule

Representa una línea horizontal.

Div

Representa un espacio de contenido que es reservado en el espacio de trabajo.

Ejercicio 13.1 Creación de una página Web ASP.NET, prueba e identificación de sus elementos Desarrollará una aplicación Web que solicita datos generales de los usuarios de un servicio en Internet. Se pregunta el nombre de una persona, su correo electrónico y su edad. La edad deberá estar entre 0 y 100 años. También preguntará la fecha en que utilizó el sistema por primera vez. Los datos no pueden omitirse, el correo electrónico debe tener un formato de correo electrónico, y debido a que el negocio habría iniciado el 1 de enero de 2002, y ade-

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

425

más estuvo sin operar todo el 2004, las fechas en que se utilizó el sistema por primera vez debe estar dentro de rangos válidos. En caso de errores, se debe mostrar un resumen de errores encontrados en la página que deberá aparecer en un cuadro de diálogo. 1.

Abra la solución Ejercicios, que debe encontrarse en (archivo de extensión sln).

C:\APVBNETVS\Ejercicios

➤ Configuraciones iniciales del diseñador de páginas Web para las vistas y el posicionamiento de controles 2.

3.

4.

El diseñador de páginas Web (HTML Designer, también llamado Web Forms Designer) tiene dos vistas de trabajo: vista de código fuente (source view) y vista de diseño (design view). En vista source se puede desarrollar una página manipulando directamente las etiquetas de controles de ASP.NET; la vista design, por su parte, permite trabajar en un ambiente visual con las páginas. Generalmente es más sencillo trabajar en vista design, pero será frecuente que tengamos que alternar entre una y otra. La forma de alternar entre una y otra es a través de la barra de trabajo que aparece en la parte inferior de HTML Designer, en la cual aparecen botones de selección de vistas y las etiquetas en las que nos encontremos trabajando.

Podemos predeterminar la vista en que queremos que inicie HTML Designer cada vez que abrimos una página Web. Seleccione la opción de menú Tools – Options, el nodo HTML Designer, y en Start pages in, seleccione el botón de opción Design view. Con ello, cada nueva página que abramos mostrará inicialmente la vista de diseño.

13

426

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5.

6.

En vista de diseño, se entiende por posicionamiento de controles a la forma en que los controles adquieren una posición física en la interfaz para mostrarse en tiempo de ejecución. Los controles pueden posicionarse de diferentes maneras: posición absoluta, si la posición en la interfaz no cambia dependiendo del contenido, dado que se establecen las propiedades HTML z-index, left y top respecto del elemento contenedor; posición relativa, es similar a la posición absoluta, sólo que las propiedades left y top se asignan respecto del flujo de la página; posición estática, si el control se coloca de acuerdo con el flujo de la página; y no posicionado, si no se especifican atributos y la posición se determina por los atributos por omisión correspondientes al elemento en cuestión. Dar a los controles posición absoluta es lo más parecido a trabajar en ambiente de interfaz Windows, aunque no se recomienda cuando hay objetos de dimensión variable, como podrían ser campos con enlazado de datos. Para las interfaces que contienen objetos con dimensión dinámica, recomendamos el posicionamiento relativo, que por una parte permite el acomodo a discreción en tiempo de diseño, pero en tiempo de ejecución ajusta las posiciones para que los objetos no se empalmen unos con otros y mantengan la distancia original entre ellos. Podemos predeterminar el posicionamiento de los controles en HTML Designer. Seleccione la opción de menú Tools – Options, el nodo HTML Designer – CSS Positioning, marque la casilla de verificación Change positioning to the following for controls added using the Toolbox, paste or drag and drop, y en el cuadro combinado seleccione Absolutely positioning. Con ello, cada nuevo control integrado a la interfaz quedará posicionado de forma absoluta. Esto es muy conveniente para el tipo de interfaz que deseamos desarrollar, puesto que no tiene objetos de longitud variable.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

427

➤ Adición de elementos a un sitio Web 7.

En el capítulo 3 (ejercicio 03.03) ya realizamos una página Web básica. El sitio tiene el nombre http://localhost/APVBNETVS. Seleccione el nodo del sitio APVBNETVS y despliegue el menú contextual, seleccionando la opción Add New Item. Aparecerán todos los elementos que pueden agregarse a una aplicación Web. Seleccione Web Form; en Name escriba Usuario.aspx. Asegúrese de que la casilla de verificación Place code in separate file esté seleccionada. Haga clic en Add.

8.

Con ello se habrá generado una nueva página Web ASPX en el proyecto. En Server Explorer seleccione el nodo que acaba de agregar (Usuario.aspx), invoque el menú de contexto y seleccione la opción Set As Start Page, para obligar a que la nueva página sea la página de arranque del proyecto.

➤ Establecimiento de valores generales de formulario 9.

Agregue a la interfaz los siguientes elementos: cuatro etiquetas (Label), cuatro cuadros de texto (TextBox), cuatro validadores de campo requerido (RequiredFieldValidator), un validador de expresión regular (RegularExpressionValidator), un validador de rango (RangeValidator), un validador de comparación (CompareValidator), un calendario (Calendar), un validador personalizado (CustomValidator) un botón de comando (Button), una línea horizontal (Horizontal Row) y un hipervínculo (HyperLink).

13

428

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La interfaz deberá lucir de la siguiente manera:

NOTA Por cuestión de notación, cuando hacemos referencia a Clase.Miembro, por ejemplo Form.Name, nos referimos al miembro de la clase; la explicación será válida para todas las instancias que se generen de dicha clase. En caso de que un miembro sea aplicable a todos los objetos que se deriven de una misma clase base, se colocará la referencia de la clase base pertinente; por ejemplo, BaseValidator.Display. Cuando hagamos referencia a Instancia.Miembro, por ejemplo txtNombre.MaxLength, especificaremos valores y condiciones aplicables a un objeto en particular. En la mayoría de los casos los controles pertenecen a Web.UI.WebControls.

10.

Modifique las siguientes propiedades desde Properties (oprima la tecla F4).

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

429

Propiedad

Valor a asignar

Label1.Text

Nombre:

Textbox1.ID

txtNombre

txtNombre.MaxLength

40

txtNombre.ToolTip

Capture aquí su nombre

RequiredFieldValidator1.ControlToValidate

txtNombre

RequiredFieldValidator1.Display

Dynamic

RequiredFieldValidator1.ErrorMessage

El nombre no debe omitirse

RequiredFieldValidator1.Text

*

Label2.Text

Correo:

TextBox2.ID

txtCorreo

txtCorreo.MaxLength

40

txtCorreo.ToolTip

Capture aquí su correo electrónico

RequiredFieldValidator2.ControlToValidate

txtCorreo

RequiredFieldValidator2.Display

Dynamic

RequiredFieldValidator2.ErrorMessage

El correo no puede omitirse

RequiredFieldValidator2.Text

*

RegularExpressionValidator1.ControlToValidate

txtCorreo

RegularExpressionValidator1.Display

Dynamic

RegularExpressionValidator1.ErrorMessage

Formato de correo electrónico incorrecto.

RegularExpressionValidator1.Text

*

RegularExpressionValidator1.ValidationExpression

Seleccione el formato de correo electrónico:

Haga clic en Ok.

13

430

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se incluirá la expresión siguiente, que representa una dirección de correo electrónico en Internet: \w+([-+.’]\w+)*@\w+([.]\w+)*\.\w+([-.]\w+)* Label3.Text

Edad:

TextBox3.ID

txtEdad

txtEdad.MaxLength

3

txtEdad.ToolTip

Capture su edad (0 a 100)

RequiredFieldValidator3.ControlToValidate

txtEdad

RequiredFieldValidator3.Display

Dynamic

RequiredFieldValidator3.ErrorMessage

La edad no puede omitirse

RequiredFieldValidator3.Text

*

RangeValidator1.ControlToValidate

txtEdad

RangeValidator1.Display

Dynamic

RangeValidator1.ErrorMessage

La edad no está dentro del rango permitido

RangeValidator1.MaximumValue

100

RangeValidator1.MinimumValue

0

RangeValidator1.Text

*

RangeValidator1.Type

Integer

CompareValidator1.ControlToValidate

txtEdad

CompareValidator1.Display

Dynamic

CompareValidator1.ErrorMessage

La edad debe ser un número entero

CompareValidator1.Operator

DataTypeCheck

CompareValidator1.Text

*

CompareValidator1.Type

Integer

Label4.Text

Inicio:

TextBox4.ID

txtInicio

RequiredFieldValidator4.ControlToValidate

txtInicio

RequiredFieldValidator4.Display

Dynamic

RequiredFieldValidator4.ErrorMessage

La fecha de inicio de servicios no debe omitirse

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

431

RequiredFieldValidator4.Text

*

CustomValidator1.ControlToValidate

txtInicio

CustomValidator1.Display

Dynamic

CustomValidator1.ErrorMessage

La fecha de inicio de uso es incorrecta

CustomValidator1.Text

*

Calendar1.ID

calInicio

Button1.ID

btnAceptar

btnAceptar.Text

Aceptar datos

Hyperlink1.NavigateURL

http://www.aprendapracticando.com

Hyperlink1.Text

Ir al sitio de Aprenda Practicando

ValidationSummary1.DisplayMode

BulletList

ValidationSummary1.ShowMessageBox

True

ValidationSummary1.ShowSummary

False

11. Realice los reacomodos necesarios para que la interfaz luzca de la siguiente manera:

13

432

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Haga doble clic en RequiredFieldValidator4. Codifique lo siguiente:

Codificación de Usuario.aspx.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

– CustomValidator1_ServerValidate

Partial Class Usuario Inherits System.Web.UI.Page Protected Sub CustomValidator1_ServerValidate( ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate If Year(args.Value) < 2002 Or Year(args.Value) = 2004 Then args.IsValid = False Else args.IsValid = True End If End Sub End Class

13. Observe cómo en la pestaña se hace referencia al programa Usuario.aspx.vb; en sí es un programa en Visual Basic, independiente de la página Web ASPX. Al hecho de que el código no esté en la misma página se le conoce como code behind. Tener el código separado del diseño es muy útil, sobre todo para evitar la modificación involuntaria de trabajo entre diseñadores y codificadores. Vea cómo Visual Studio le asigna el mismo nombre que la página y le agrega la extensión VB. Al momento de cargar la página la primera vez, el programa VB se compila formando un DLL que deberá colocarse en el directorio \BIN de la aplicación cuando se instale en ambientes de producción; este directorio es especial, dado que por omisión IIS realiza la búsqueda de componentes y controles en él, sin necesidad de hacer referencias explícitas en el proyecto. La página permanece sin cambios, mientras que el código queda oculto. 14. Estando en Text Editor, en el cuadro combinado de objetos seleccione calInicio, y en el de miembros seleccione SelectionChanged, con el fin de que se precodifique el procedimiento de evento que ha de ocurrir cuando se seleccione una fecha en el calendario.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

Codificación de PrimeraPagina.aspx.vb 1 2 3 4

433

– calInicio_SelectedDate

Protected Sub calInicio_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles calInicio.SelectionChanged txtInicio.Text = calInicio.SelectedDate End Sub

15. En el procedimiento asignará al control txtInicio la fecha que se seleccione en calInicio. Esto permite la validación del control, dado que Calendar no puede validarse directamente. Ejecución guiada de PrimeraPagina.aspx 16. La propiedad WebControl.Id de los controles Web es el equivalente a la propiedad Name de los controles para Windows Forms, y sirve para identificar los controles; cambiar el Id de los controles es especialmente útil si se van a utilizar programáticamente. 17. El control típico de captura de información es TextBox, pues permite ingresar un valor de tipo String que puede ser convertido en cualquier otro tipo de dato. La propiedad TextBox.MaxLength permite limitar el número de caracteres que ha de admitir un cuadro de texto, independientemente del tamaño del control en la pantalla. La propiedad TextBox.ToolTip permite asignar una ayuda textual fugaz para los objetos, que aparecerá en tiempo de ejecución al colocar el puntero del ratón sobre el control. 18. Los controles de validación son especialmente útiles dado que verifican que los datos de entrada sean correctos antes de realizar funciones de procesamiento en el servidor. Los controles de validación derivan de la clase BaseValidator, que define las principales propiedades comunes para todos los validadores. Fundamentalmente debe especificarse en dichos controles la propiedad BaseValidator.ControlToValidate, que indica qué control será validado; la propiedad BaseValidator.ErrorMessage permite establecer el texto que ha de mostrarse en el resumen de errores, mientras que BaseValidator.Text permite establecer el mensaje de error que aparece en la interfaz si el control a validar no cumple con los criterios de validación. En caso de que se asigne BaseValidator.ErrorMessage pero no BaseValidator.Text, el valor de BaseValidator.ErrorMessage será asignado a BaseValidator.Text de forma automática. La propiedad BaseValidator.Display de los controles de validación permite establecer la forma en que se muestran los mensajes de error, que puede ser de forma dinámica (Dynamic), estática (Static) o no mostrarse (None).

13

434

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Es importante mencionar que no todos los controles pueden ser validados a través de los controles de validación. Una forma sencilla de saber si el control permite validación es comprobar si la clase posee la propiedad WebControl.CausesValidation; esta propiedad indica si se desea que el control cause validaciones, por lo cual de existir para el control, indica que las admite. También es importante saber que un mismo control puede ser sujeto a varias validaciones al mismo tiempo. 20. En lo particular los controles de validación tienen diversas propiedades inherentes a la función que realizan. Por su simpleza, RequiredFieldValidator es el más sencillo, ya que realiza la verificación de si un control tiene contenido en su propiedad de valor. Este validador es el primero que se comprueba, dado que los demás tienen sentido sólo cuando el control ya tiene un valor. En caso que RequiredFieldValidator reporte error, las demás validaciones no se realizan. 21. Un control que sí tiene sus propiedades particulares es RangeValidator, ya que utiliza la propiedad RangeValidator.MinimumValue para especificar el umbral del rango, y utiliza la propiedad RangeValidator.MaximumValue para especificar el valor más alto dentro del rango. Es muy importante especificar el tipo de dato sobre el que está basado el rango, dado que de lo contrario se asumirá un rango de valores String que puede diferir mucho de un comportamiento numérico, por ejemplo. El tipo de dato a utilizar se especifica utilizando la propiedad RangeValidator.Type. 22. El control CompareValidator por su parte se ocupa de comparar el valor que posee el control a validar respecto de un valor fijo, el valor que tenga otro control, o verificar si el dato de entrada pertenece a un tipo de dato específico. a) Si se desea la comparación sobre un valor fijo, éste se debe especificar a través de la propiedad CompareValidator.ValueToCompare. b) Si la comparación es con el valor de otro control, éste debe especificarse en la propiedad CompareValidator.ControlToCompare. c) La comparación a realizar se hace en términos de un operador de comparación, representado por la propiedad CompareValidator.Operator y que puede asumir los siguientes valores: Equal (igual), GreaterThan (mayor que), GraterThanEqual (mayor o igual), LessThan (menor que), LessThanEqual (menor o igual), NotEqual (distinto). d) En caso de que la comparación sea respecto de un tipo de dato (saber si el control a validar posee un valor de un determinado tipo de dato), sólo se requiere establecer en CompareValidator.Operator el valor DataTypeCheck, y especificar el tipo que esperamos en la propiedad CompareValidator.Type. 23. En el caso de RegularExpressionValidator, la comparación se realiza contra una expresión regular. Las expresiones regulares son una notación estandarizada para la definición de patrones de coincidencia; en el caso de la implementación de Microsoft .NET, los patrones guardan mucha semejanza con las reglas definidas en Perl y awk.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

24.

25.

26.

27.

435

La herramienta Regular Expression Editor permite simplificar la determinación de algunos patrones estándar, aunque también es posible construir expresiones regulares propias. En el caso de CustomValidator la validación está determinada por un procedimiento que nosotros codificamos. Este tipo de validación se utiliza cuando los demás controles de validación no son suficientes para representar un criterio. En nuestro caso, la fecha de inicio de uso del servicio no puede ser anterior al año 2002, ni dentro de 2004; como el rango no es continuo, se requiere de programación para manejarla. Una de las mejores características de este control de validación es que además permite la validación utilizando procedimientos de parte del cliente, definida a través de la propiedad CustomValidator.ClientValidationFunction. En el procedimiento de evento de la validación se puede tener acceso del valor del control a validar mediante la propiedad args.Value del argumento implícito ServerValidateEventHandler.args. Para indicar la existencia de errores, podemos recurrir a la propiedad args.IsValid del argumento implícito ServerValidateEventHandler.args. El código del procedimiento de evento para CustomValidator (CustomValidator1– ServerValidate()) hace lo siguiente: En la línea 8 se evalúa si la propiedad de valor del control validado (args.Value) es menor a 2002 o igual a 2004, se considera que el dato no es válido (args.IsValid=False), o de lo contrario si lo es. La propiedad args. Value asumirá el valor de calInicio.DateSelected, dado que es la propiedad de valor del control que se está validando. El código del procedimiento de evento para la selección de fecha de Calendar (calInicio_SelectionChanged()) simplemente asigna la propiedad de valor de calInicio a la propiedad de valor de txtInicio. El control ValidationSummary permite mostrar el resumen con todos los errores que contravienen las restricciones marcadas por los controles de validación de la página. Una de las propiedades importantes es la propiedad ValidationSummary.Display-Mode, que puede tener los siguientes valores: BulletList (lista con viñetas), List (lista sin viñetas), y SingleParagraph (párrafo sencillo). El resumen mostrará en el modo especificado el conjunto de valores de las propiedades BaseValidator.ErrorMessage de todos los controles de validación que no se hayan cumplido satisfactoriamente; la posición donde los resultados aparecerán es donde el control se haya colocado. También es posible que los errores aparezcan en un cuadro de diálogo y no en la página; esta modalidad está disponible si se asigna el valor de True a la propiedad Validation Summary.ShowMessageBox. Para el caso en que no queramos ver en la página los errores de manera textual, se puede suprimir la visualización colocando la propiedad ValidationSummary.ShowSummary en False. El control Calendar sirve para seleccionar fechas en un ambiente gráfico. La propiedad de valor de este control es Calendar.SelectedDate, que es de tipo DateTime. Es posible seleccionar más de una fecha; para ello se debe establecer un modo de selección a través de la propiedad Calendar.SelectionMode, que puede tener los siguientes valores: Day (día), DayWeek (una fecha o toda una semana), DayWeekMonth (una

13

436

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

28.

29.

30.

31.

fecha, una semana o un mes), o None (no se puede seleccionar nada). En caso de que se seleccione más de una fecha, éstas son accesibles a través de la colección Calendar.SelectedDates. Por omisión la selección es de tipo Day. Finalmente, el control HyperLink establece un vínculo hacia un recurso Web. El texto del vínculo está representado por la propiedad HyperLink.Text, y el vínculo hacia el que se envía el control del navegador se establece en la propiedad HyperLink. NavigateURL. Cuando se involucran controles de validación en un programa, es posible saber si en la página se tuvieron errores. Para ello podemos recurrir a la propiedad Page.IsValid de la página, que está representada por el objeto Page. El objeto Button simplemente ejecutará el procedimiento de evento Button.Click cuando se haga clic en él. El texto que aparece en la cara del botón está representado por la propiedad Button.Text. Guarde todos los cambios realizados en su solución e inicie la depuración (tecla F5). Para empezar haga clic en el botón sin ingresar datos. Vea cómo aparecen asteriscos rojos (propiedades BaseValidator.Text) al lado de los campos que presentan error. Sólo se muestra el correspondiente a la validación de campos requeridos, dado que no intenta realizar más validaciones por ausencia de datos. Los mensajes de error (Base Validator.ErrorMessage) aparecerán en la ventana de diálogo, como una lista con viñetas.

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

437

32. Introduzca datos válidos para cada uno de los campos, pero procure causar un solo error a la vez de la siguiente lista, a fin de observar el comportamiento del programa: a) Colocar un correo electrónico que no tiene el formato adecuado (una palabra, por ejemplo). b) Colocar una edad negativa. c) Escribir letras en la edad. d) Seleccionar una fecha del 2004. e) Seleccionar una fecha antes del 2002. Para asegurarse de que la validación se hace, no olvide hacer clic en el botón. Si vemos la interfaz de usuario quiere decir que .NET Framework en conjunto con IIS ya nos enviaron el código HTML y los bloques de código script correspondientes a los controles Web y los controles de validación que indicamos en la página; esto permite que de parte del cliente se realicen validaciones antes de lanzar la petición. Si no hay errores de validación esto provoca una petición HTTP al servidor.

➤ Revisión del código generado por el servidor 33. Las validaciones suceden porque el motor de ejecución de ASP.NET, en conjunto con .NET Framework en el servidor, se encargan de devolver al cliente una página que contiene bloques de código de parte del cliente para reproducir el comportamiento deseado. No es necesario que sepa VBScript o JavaScript: ASP.NET se encarga de codificar y enviar el código de parte del cliente. 34. En Internet Explorer seleccione la opción Ver – Código Fuente. Vea todo lo que ASP.NET codifica por usted. En la página encontrará código de parte del cliente en Java Script, así como etiquetas HTML optimizadas para su navegador.

13

438

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

35. El código para crear un vínculo que permita ir al sitio de Aprenda Practicando es el siguiente. Ir al sitio de Aprenda Practicando

Sin embargo, sólo tuvimos que agregar un control a la interfaz y modificar propiedades en tiempo de diseño. ¿Qué forma de desarrollo preferiría? Aunque la programación directa es en ocasiones necesaria, si programar de forma artesanal no le agrega valor al programa, ¿para qué hacer las cosas difíciles? 36. Cierre la aplicación. FIN DEL EJERCICIO*

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

MAPA

439

MENTAL DEL CAPÍTULO

13

440

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA .css, 409 .master, 409 .skin, 409 @ Master, 409 @ Page, 409 @Assembly, 412 @Control, 412 @Implements, 412 @Import, 412 @OutputCache, 412 @Page, 412 @Reference, 412 @Register, 412 AccesDataSource, 421 AdRotator, 420 Analizador de código, 402 ASP clásico, 402 ASP.NET, 400 membership, 407 asp:, 415 ASPX, 402 Assembly Cache, 402 Autenticación de formularios, 407 Windows, 407 AutoEventWireUp, 413 Bloques proveedores de código, 411 Buffer, 413 BulletedList, 420 Button, 419 Caché de ensamblados, 402 de salida, 402 Calendar, 420, 435 Cascadas de estilos, 409 ChangePassword, 423 CheckBox, 419 CheckBoxList, 419

CodeBehind, 406, 413, 417 Código declarativo, 417 separado, 417 CompareValidator, 422, 434 CompilerOptions, 413 Content pages, 409 ContentPlaceHolder, 409 Control(es) de acceso, 423 de datos, 421 de navegación, 422 de validación, 415, 422 de validación, 416 del servidor, 415 HTML 423 Web del Servidor, 406, 415 ControlToValidate, 429 Cookie-less, 408 Cookies, 408 Copy Development, 408 CreateUserWizard, 423 Cross-server session, 408 CustomValidator, 422 CustomValidator, 435 DataList, 421 Debug, 413 Delimitadores de contenido, 409 DetailsView, 421 Directivas, 412 Display, 429 DisplayMode, 431

Div, 424 DropDownList, 419 EnableViewState, 413 ErrorMessage, 429 ErrorPage, 413 Estado de los formularios, 405 Expresiones regulares, 434 eXtensible Markup Language (XML), 407 FileUpload, 420 Form-state, 405 Formulario del servidor, 414 FormView, 421 GridView, 421 HiddenField, 420 Horizontal Rule, 424 HTML, 423 http Runtime, 402 HyperLink, 419 IIS, 400 Image, 419, 424 ImageButton, 419 ImageMap, 420 Inherits, 413 Input Button, 423 Checkbox, 424 File, 424 Hidden, 424 Password, 424 Radio, 424 Reset, 424 Submit, 424 Text, 424 Validation Control, 417 Internet Information Server (IIS), 400 IsValid, 435 Label, 419 Language, 413

LinkButton, 419 ListBox, 419 Literal, 420 Localize, 420 Login, 423 LoginName, 423 LoginStatus, 423 LoginView, 423 Master pages, 404, 409 MasterPageFile, 409 MaximumValue, 430 Membresía ASP.NET, 407 Menu, 422 Microsoft Passport, 407 MinimumValue, 430 Modelo peticiónrespuesta dinámico orientado a eventos, 402 Motor de ejecución Web, 400 MultiView, 420 NavigateURL, 431 Navigation, 422 ObjectDataSource, 421 Operator, 430 Output Cache, 402 Páginas de apariencia, 409 de contenido, 409 maestras, 409 Panel, 420 Parser, 402 PaswordRecovery, 423 PlaceHolder, 420 RadioButton, 419 RadioButtonList, 419

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

RangeValidator, 422, 434 RegularExpression Validator, 422, 434 Repeater, 421 RequiredFieldValidator, 422 RequiredFieldValidator, 434 Rich controls, 415 runat=server, 414 Scripting, 409

Select, 424 Servicios Web XML, 407 Servidores combinados, 408 ShowMessageBox, 431 ShowSummary Simple Object Access Protocol (SOAP), 407 SiteMapDataSource,

421 SiteMapPath, 422 Skins, 404, 409 SOAP, 407 SqlDataSource, 421 Substitution, 420 Table, 420, 424 Temas, 409 Text, 429 Textarea, 424 TextBox, 419 Themes, 404, 409 TreeView, 422

441

Type, 430 Validation, 422 ValidationExpression, 429 ValidationSummary, 422, 435 View, 420 Web Parts, 404, 409 Wizard, 420 XML, 407 Xml (control), 420 XmlDataSource, 421

PREGUNTAS 13.1 ¿Cuáles son los motivos que han provocado el auge de las aplicaciones Web? 13.2 Mencione los requerimientos que se tienen para el desarrollo en ASP.NET. 13.3 Enumere las características de ASP.NET. 13.4 Enumere los elementos de una página ASP.NET, y explique para qué sirve cada una. 13.5 Mencione cuáles son los grupos de controles en las aplicaciones ASP.NET. 13.6 ¿Cuales son los 15 controles que usted cree que utilizará con más frecuencia?

13

442

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:

Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET

EXAMEN

443

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta. 1. Es el modelo de petición utilizado por ASP.NET a) Modelo de petición respuesta b) Modelo de petición respuesta dinámico c) Modelo de petición respuesta dinámico orientado a eventos 2. Característica que permite separar el código de las etiquetas en ASP.NET a) Code Behind b) Managed code c) Assembly Cache 3. Componentes funcionales que pueden ser utilizados mediante peticiones Web. a) Servicios Web XML b) Web Components c) DHTML 4. Cantidad de esquemas de seguridad que soporta ASP.NET a) 1 b) 2 c) 3 5. Son implementaciones funcionales basadas en etiquetas, a través de las cuales se obtiene HTML dinámico, sensible a eventos. a) Código declarativo b) Controles Web c) HTML.NET

Parte 2: Coloque en la línea la letra «F» si la sentencia es falsa, y «V» si la sentencia es verdadera. 6.

ASP.NET soporta el modelo orientado a eventos.

7.

El código que se utilliza en las páginas Web ASP.NET es código interpretado.

8. Con ASP.NET se puede indicar que las etiquetas HTML se resuelvan del lado del servidor. 9.

Las directivas permiten especificar valores a ser considerados al momento de la compilación que realiza .NET Framework.

10.

Los equipos desde los que se llama una página ASP.NET deben tener .NET Framework instalado.

13

CAPÍTULO

14

Servicios Web XML Objetivos: Aprender en qué consisten los servicios Web XML, y cómo crearlos y consumirlos. 1. Conocerá los Servicios Web XML y sus ventajas. 2. Sabrá qué son UDDI, Web Service Discovery y WSDL. 3. Aprenderá a crear un Servicio Web XML. 4. Aprenderá a descubrir un Servicio Web XML. 5. Aprenderá a consumir un Servicio Web XML.

445

446

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funcionalidad antes de los servicios Web XML . . . . . . . . . . . . . . . . . . . Funcionalidad con servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . Características de los servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . ¿Cuándo utilizar servicios Web XML? . . . . . . . . . . . . . . . . . . . . . . . . . . UDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Web Service Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Infraestructura de operación de los Servicios Web . . . . . . . . . . . . . . . . . . . . Elementos para la creación de un Servicio Web XML . . . . . . . . . . . . . . . . . . Procedimiento de consumo desde el navegador . . . . . . . . . . . . . . . . . Creación de un Servicio Web XML y demostración de su uso desde el navegador . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Creación de un Servicio Web XML . . . . . . . . . . . . . . . . . ➤ Prueba del Servicio Web XML desde el navegador . . . . Consumo programático de un Servicio Web XML desde una aplicación Windows . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Estableciemiento de la referencia a un Servicio Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Consumo programático de un Servicio Web XML . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

447 447 448 448 449 450 451 452 453 454 454 455 455 457 459 460 461 463 464 464 466

Capítulo 14. Servicios Web XML

447

A medida que los negocios se globalizan, las redes de computadoras se han constituido en un elemento indispensable de las aplicaciones. Las cosas ya no suceden sobre un solo escritorio, sino sobre muchos escritorios dispersos geográficamente. Conforme pasa el tiempo, el alcance de las redes ha ido variando; hasta hace algunos años la comunicación era entre equipos de la misma organización, a distancias relativamente manejables. Ahora, las distancias son globales y podemos estar comunicándonos con un equipo que se encuentra en un punto distante del planeta. No sólo el alcance de las redes ha cambiado; también aquello que viaja por ellas. Al principio, lo que se transmitía por las redes eran datos, y la funcionalidad radicaba en un servidor o en clientes específicos funcionando en alguna plataforma determinada. En el nuevo escenario global ya no se puede garantizar que equipos y servidores dispongan de las mismas plataformas operativas; ahora no sólo se requiere que los datos viajen, sino que la funcionalidad pueda distribuirse de manera remota, sin importar las plataformas que tengan los equipos. Atendiendo a estas necesidades surgen los servicios Web XML.

Servicios Web XML Los servicios Web XML (XML Web Services) son componentes que funcionan a través de protocolos estándar para su uso en la Web (XML/SOAP). El nombre puede ser engañoso. Se dice que son servicios “Web” por la forma en que se consumen; no porque se trate de aplicaciones Web. El bloque de código que compone un servicio Web XML se parece más a un programa de consola sin interfaz; se trata de una clase pública que define principalmente métodos de servicio Web XML (XML Web service method), que podrán ser invocados por aquellos programas que consuman el servicio. En cierta forma son la evolución del trabajo basado en componentes COM/DCOM. Tan es así, que los servicios Web XML han sido llamados con mucha frecuencia “COM basado en la Web”, aunque ello no sea del todo exacto.

Funcionalidad antes de los servicios Web XML Anteriormente, cuando se trabajaba en el esquema de Windows DNA, la funcionalidad de las aplicaciones se desarrollaba en forma de componentes COM. A través de dichos componentes se codificaban algoritmos y reglas que satisfacían las demandas de la capa de negocios en ambientes multicapa.

14

448

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Si la aplicación requería un funcionamiento distribuido se utilizaba tecnología DCOM (Distributed Component Object Model), que permitía el intercambio de paquetes de datos y la ejecución remota de componentes sin la necesidad de registrarlos en los equipos clientes. El esquema era bueno, pero tenía la limitante de tratarse de tecnología propietaria que requería una homologación de plataforma entre el cliente y el servidor. En el nuevo ambiente globalizado, dicha homologación resulta un problema ya que no podemos obligar a nuestro socio de negocios en otra parte del mundo a utilizar la misma plataforma operativa que nosotros (Windows, por ejemplo). En otras palabras, seguimos necesitando que la funcionalidad de los componentes sea distribuida, pero sin la necesidad de homologación de plataforma.

Funcionalidad con servicios Web XML Los servicios Web XML, al igual que COM/DCOM, permiten el manejo distribuido de componentes; la diferencia con aquéllos radica en que la comunicación entre cliente y servidor se lleva a cabo utilizando protocolos estándar de la Web, tales como HTML, XML y SOAP; de esa forma todo equipo que funcione con esos protocolos estándar podrá admitir servicios Web XML. Dicho de manera más contundente, un equipo en Unix o Linux ya podrá consumir funcionalidad alojada en componentes desarrollados bajo plataforma Windows. Los servicios Web XML permiten aprovechar la infraestructura de Internet para la distribución de funcionalidad y paquetes de datos, eliminando los problemas que se daban por diferencias entre plataformas operativas, lenguajes de programación utilizados o los modelos de objetos de programación empleados. Los servicios Web XML son una caja negra que recibe peticiones y devuelve respuestas, todo ello usando protocolos estándar para la Web.

Características de los servicios Web XML Las características principales de los servicios Web XML son las siguientes: ❑ Están basados en protocolos estándar para la Web. Los servicios Web XML

realizan las peticiones y proporcionan las respuestas utilizando protocolos estándar de la Web, como HTTP (Hyper Text Transfer Protocol), XML (eXtensible Markup Language) y SOAP (Simple Object Access Protocol). Toda plataforma que maneje dichos protocolos podrá aprovechar la funcionalidad de los servicios Web XML. ❑ Comunicación aplicación a aplicación basada en Internet. Al utilizar un servicio Web XML no se tiene una interfaz de usuario visible; realmente se trata de un componente que puede ser consumido de manera programática de aplicación a aplicación.

Capítulo 14. Servicios Web XML









449

Los servicios Web XML proporcionan una interfaz estándar para la recepción de peticiones y envío de respuestas, denominada contrato (contract); dicho contrato pone a disposición de los usuarios la información requerida por el componente, describe los comportamientos del mismo y relaciona los datos de entrada/salida del componente. Mediante el contrato, un servicio Web XML informa a otras aplicaciones cómo interactuar con él. Independencia de lenguaje. Los servicios Web XML pueden ser consumidos desde programas escritos en cualquier lenguaje .NET, por lo que no es necesario aprender un lenguaje determinado para tener acceso a su funcionalidad. Independencia de la plataforma. Independientemente de la plataforma que dispongan los clientes de una aplicación, el contrato se encarga de hacer la petición en un formato estándar y recibir la respuesta correspondiente. Arquitectura libre del manejo de estados (stateless architecture). Los servicios Web XML no manejan estados de objetos; cada respuesta brindada por un servicio Web XML es una nueva instancia de un objeto con su estado particular. Lo que una petición realiza no afecta lo realizado por otras peticiones. Comunicación sincrónica/asincrónica. El requerimiento de ejecución de un método de servicio Web XML y el requerimiento de la respuesta son independientes. La aplicación que consume el servicio Web XML y el servicio Web XML mismo pueden operar con mayor disponibilidad, ya que liberan recursos mientras se está en tiempo de espera.

¿Cuándo utilizar servicios Web XML? Cuando se requiere compartir funcionalidad libre de interfaz de usuario. Los servicios Web son útiles cuando se desea consumir la funcionalidad de un componente sin la intermediación de una interfaz de usuario. Ejemplo de esto es el consumo de servicios que proporcionan información como tipos de cambio, estado del clima, precios de productos, disponibilidad de lugares en eventos, etcétera; en muchas ocasiones queremos la información sin tener que responder a ninguna interfaz de usuario. Cuando se quiere comercializar un servicio de uso de software y no un producto de software. En la actualidad, adquirir software implica adquirir medios físicos (CD/DVD) en cajas de cartón. Pero si lo que realmente necesitamos no es el paquete en sí, incluso no necesitamos los programas: lo que requerimos es lo que los programas hacen, es decir, sus servicios. También tenemos que lidiar con su instalación, el espacio en disco que la instalación demanda, los prerrequisitos de instalación, las comprobaciones de convivencia con otras aplicaciones, etcétera. Todo ello no le agrega valor a nuestro trabajo, sino complejidad. En el futuro no se venderá software; la funcionalidad que el software brinde estará disponible como servicio en la Web; si requerimos de un procesador de palabras, nos enlazare-

14

450

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mos a un procesador de palabras en línea y pagaremos sólo por el tiempo que utilizamos dicho procesador; probablemente no almacenaremos los archivos en nuestro disco duro sino en un servicio de almacenamiento, en línea también, y así poco a poco requeriremos sólo un equipo con buen nivel de comunicaciones y no uno con mucha memoria, procesador y espacio de almacenamiento. Microsoft ha empleado con éxito el concepto a través de Microsoft Passport, que es un esquema de seguridad y perfiles que puede ser utilizado y contratado por cualquier aplicación. Hay otros ejemplos: el sistema de seguimiento de paquetes de Federal Express (FedEx Tracker) está disponible como servicio para rastrear un envío con sólo proporcionar el número de guía; Barnes & Noble cuenta con un servicio que proporciona el precio de venta de un libro, si se proporciona un ISBN (Barnes & Noble Price Quote). De esas maneras se podrá obtener vía Web servicios como cotizaciones y tipos de cambio, pronósticos del clima, ofertas de productos, etcétera. Cuando cliente y servidor requieren compartir funcionalidad en Internet, pero difieren en su plataforma operativa. Sucede cuando los equipos no operan con la misma plataforma. En la actualidad, por ejemplo, el esquema basado en COM/DCOM utiliza tecnología de propietario, que no es compatible con otros equipos en Internet, lo que limita la distribución de la funcionalidad. Si se requiere disponer de funcionalidad entre plataformas distintas compatibles con los protocolos estándar de la Web, los servicios Web XML son la solución.

UDDI Uno de los puntos más importantes de un servicio es su publicidad. De nada sirve un servicio Web XML que nadie conoce. Así como las empresas de servicios a los consumidores tienen la necesidad de darse a conocer, un servicio Web XML requiere comunicar, de alguna forma, que existe y para qué sirve. Pensando en ello se ha definido un mecanismo para darles publicidad a los servicios Web XML que las empresas desarrollan, denominado UDDI (Universal Description Discovery and Integration). UDDI está formado por un registro distribuido de información de los servicios Web XML; dicho registro está implementado en un formato XML y en él se pueden encontrar los negocios que ofrecen servicios Web XML, así como la descripción de los mismos. Cada negocio que desarrolla servicios Web XML registra su información a través de un sitio Web (http://www.uddi.org/), o a través de herramientas y programas comerciales o que se desarrollen para tal efecto. Una vez registrado, el servicio Web XML queda expuesto a la comunidad de desarrolladores para su consumo.

Capítulo 14. Servicios Web XML

451

Una buena recomendación es que, antes de desarrollar un servicio Web XML, revise los servicios Web XML ya desarrollados y disponibles; quizá entre ellos encuentre la solución de procesamiento con un costo menor.

Web Service Discovery Si queremos utilizar en un programa la funcionalidad de una clase, es necesario especificarle la forma de localizarla. En el caso de las aplicaciones Web no es práctico establecer referencias a clases utilizando su ruta física. Es necesario disponer de un mecanismo que permita encontrar las clases que nuestras páginas necesitan de la manera más independiente posible con respecto a su implementación física. Se conoce como descubrimiento de servicio Web (Web Service Discovery) al proceso por medio del cual se localiza un servicio Web XML y su descripción, de tal manera que esté disponible para los programas que consumen los servicios Web XML. Disco es un mecanismo que enumera los servicios Web XML disponibles y sus contratos; este mecanismo es de tecnología propietaria de Microsoft, aunque no se descarta que en el futuro cercano surja un estándar de la industria, cuando los servicios Web XML tengan mayor demanda. La forma de descubrir un servicio Web XML y crear archivos que permitan agrupar las referencias de los recursos ocupados por el servicio, es mediante la utilería Disco.exe, desde línea de comandos. Desde luego, si se trabaja con Visual Studio, las labores de descubrimiento se hacen de forma automática: disco

URL_Servicio

Donde URL_Servicio es el URL del servicio Web XML. La ejecución de disco.exe sobre el servicio Web XML producirá archivos de extensión y .DISCO. El archivo de extensión .DISCO contiene la información que permite localizar el Servicio Web XML y sus componentes requeridos. A este archivo se le denomina discovery document. .WSDL

Es muy importante realizar el descubrimiento del servicio Web XML antes de generar la clase proxy usando wsdl.exe, debido a que si no se hace el descubrimiento antes, la descripción del servicio no tendrá la suficiente información para crear una clase proxy. Es necesario consultar algunos otros parámetros para usar la utilería en las referencias técnicas del producto; también aparecen si se ejecuta la utilería sin argumentos.

14

452

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

WSDL No sólo basta encontrar qué servicios Web XML están disponibles; es muy importante conocer también cómo funcionan y cómo los podemos consumir. Un WSDL (Web Service Description Language) es la especificación estándar de funcionamiento y datos de un servicio Web XML. WSDL se maneja a través de un contrato, conocido también como Service Description, que es un documento XML que contiene información relacionada con el servicio Web XML y los paquetes de datos que el servicio Web XML maneja, tanto de entrada como de salida. En cierta forma, WSDL especifica los datos requeridos por el servicio, su comportamiento y sus datos de retorno; actúa como un contrato de intercambio de paquetes de datos entre el consumidor de servicios Web XML (Web Service Consumer) y el servicio Web XML. WSDL también contiene las referencias a las direcciones asociadas con el servicio Web XML, mismas que dependerán del protocolo utilizado para consumir el servicio (HTTP, SMTP, etcétera). El documento WSDL es un documento XML; el elemento raíz es llamado definitions y contiene cinco nodos hijos que muestran la forma en que está definido el servicio Web XML. Dichos elementos hijo son los siguientes: ❑ types. Define los tipos de datos utilizados para el intercambio de mensajes entre el

consumidor y el servicio. ❑ message. Describe los mensajes que serán comunicados entre el consumidor y el ser-

vicio. ❑ portType. Identifica el conjunto de operaciones que realiza el servicio y los mensajes

involucrados en dichas operaciones. ❑ binding. Especifica los detalles de protocolo para el intercambio de mensajes entre las

operaciones, describiendo cómo traducir contenido abstracto a un formato estándar. ❑ service. Agrupa aquellos puertos que estén relacionados.

Para generar un WSDL, se utiliza la utilería wsdl.exe, desde la línea de comandos, con la siguiente sintaxis. Si trabaja en Visual Studio esto se realiza automáticamente: wsdl /l:Lenguaje /n:NombreNamespace

URL_Servicio

Donde Lenguaje es el lenguaje que se desea utilizar, NombreNamespace es el nombre del espacio de nombres a generarse en el WDSL, y URL_Servicio es el URL del servicio Web XML a partir del cual se generará WSDL. La ejecución de wsdl.exe sobre el servicio Web XML producirá un programa generado en el lenguaje especificado que deberá ser compilado como librería para su uso programáti-

Capítulo 14. Servicios Web XML

453

co. Dicho programa alojará una clase con la misma programación contenida en el servicio Web XML original, pero además contendrá especificaciones descriptivas que permitirán el consumo de la funcionalidad de la clase utilizando protocolos abiertos. A esta nueva versión del programa se le conoce como clase proxy. Es necesario consultar algunos otros parámetros para usar la utilería en las referencias técnicas del producto; también aparecen si se ejecuta la utilería sin argumentos.

Infraestructura de operación de los Servicios Web Los Servicios Web XML utilizan una infraestructura que permite localizar y descubrir los servicios, proporcionar una descripción pública de su funcionalidad, así como proveer los mecanismos para el uso de protocolos abiertos de comunicación para la distribución de funcionalidad. La forma en que un Servicio Web XML expone su funcionalidad a los clientes solicitantes es la siguiente: FIGURA 14.1 Infraestructura de los Servicios Web XML.

1. 2.

El equipo que consume el Servicio Web XML intenta localizar un Servicio Web XML que le proporcione una funcionalidad específica. Como no sabemos si alguien ya desarrolló un Servicio Web XML que brinde la funcionalidad que requerimos, buscamos en un servidor UDDI; en caso de que ya exista el ser-

14

454

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

3. 4.

5. 6. 7.

vicio buscado, el servidor enviará la dirección URL en donde se puede solicitar información del Servicio Web XML pertinente, que está contenida en discovery document. En caso de que ya sepa dónde encontrar el Servicio Web XML no es necesario acudir al servidor UDDI para hacer una localización inicial. El consumidor utiliza la información de la ubicación de discovery document y lo recupera. Este documento contiene las referencias a los recursos requeridos por el Servicio Web XML. El documento informa respecto a la funcionalidad del servicio con lo que podemos saber si en términos generales nos sirve o no; también proporciona los elementos para solicitar la descripción del servicio. Si el Servicio Web XML proporciona la funcionalidad que deseamos, se requiere la descripción del servicio para saber cómo se utiliza y qué información devuelve. Ya con esta información se consume el servicio en los términos que especifica la descripción del servicio. Se recibe la respuesta del servicio.

Elementos para la creación de un servicio Web XML Los servicios Web XML, desde el punto de vista de programación, son muy parecidos a un programa, mientras que en su consumo son más orientados al ambiente Web; de ahí que proporcionen lo mejor de los dos mundos. Su creación es muy sencilla. Todo servicio Web XML debe estar constituido por un archivo de extensión .ASMX, y este archivo debe contener como mínimo lo siguiente: 1. 2. 3. 4.

La directiva @WebService. Importar el espacio de nombres System.Web.Services Crear una clase, ya sea dentro de la página o en modo Code Behind. Declarar como las funciones del servicio Web XML.

Procedimiento de consumo desde el navegador Para consumir un servicio Web XML se siguen tres pasos a) publicar; el servicio debe estar disponible; b) encontrar; se debe tener forma de localizar el servicio; c) enlazar; se debe tener forma de establecer enlace entre el servicio Web XML y la aplicación que lo consume. A este modelo se le llama Publish/Find/Bind model. Cuando se realiza el consumo desde el navegador, éste se encarga de todo el proceso: 1.

Se debe hacer una solicitud del servicio Web XML utilizando HTTP.

Capítulo 14. Servicios Web XML

2. 3. 4. 5.

455

Aparecerá la página de descripción, que expone todos los métodos del servicio. Se selecciona un método del servicio. Se proporcionan los datos que el método requiere. Se reciben los resultados del método en formato XML.

El protocolo HTTP es textual y es incapaz de manejar objetos complejos. Como este tipo de consumo del servicio Web XML se realiza utilizando el protocolo HTTP, la respuesta sólo puede ofrecerse mediante XML. Si se desea que el servicio Web XML devuelva objetos complejos, como lo es un DataSet, por ejemplo, se requerirá el manejo del protocolo SOAP, para lo cual se necesitará la intermediación de un proxy.

Ejercicio 14.1 Creación de un Servicio Web XML y demostración de su uso desde el navegador Desarrollará un servicio Web XML que contenga un método. En sí el ejercicio es bastante pequeño, pues sólo trata de explicar las formalidades de la construcción de un servicio Web XML; ya tendrá la oportunidad de codificar algoritmos más complejos en los servicios que desarrolle. Se demostrará la forma en que se puede probar el Servicio Web XML desde el navegador. En el caso del desarrollo de Servicios Web XML con Visual Studio, todo el proceso de descubrimiento, generación del proxy y exposición se realizan de forma automática.

➤ Creación de un Servicio Web XML 1. 2.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). En el Solution Explorer seleccione la solución, invoque el menú de contexto y seleccione la opción Add – New Web Site. En la ventana Add New Web Site seleccione la plantilla ASP.NET Web Service. En Location debe especificar el protocolo HTTP y la página http://localhost/Aritmetica. Haga clic en Ok.

14

456

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

3.

4.

Como sabe, los Servicios Web XML no tienen interfaz de usuario, dado que son un componente de consumo vía protocolos de Internet. En ese sentido, realmente se trata de una clase especial que permite su consumo a través de peticiones Web. En Visual Studio la página ASMX, aunque existe, sirve sólo para definir la directiva @WebService y hacer referencia al código en donde realmente se programa el servicio. Codifique lo siguiente:

Codificación de Aritmetica 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

– App_Code/Service.vb

Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols _ _ _ Public Class Service Inherits System.Web.Services.WebService txtInicio.Text = calInicio.SelectedDate _ Public Function Suma(ByVal N1 As Integer, ByVal N2 As Integer) _ As Integer Return (N1 + N2) End Function End Class

Capítulo 14. Servicios Web XML

Ejecución guiada de 5.

6.

7.

457

Aritmetica.asmx

De la línea 1 a la 3 se establecen los espacios de nombre requeridos por el Servicio Web XML; queda claro que es un servicio que está basado en Web y que utilizará protocolos de Internet para el transporte. La clase tiene el nombre Service de manera predeterminada. El nombre de clase puede cambiarse siempre y cuando la referencia en el archivo ASMX también se modifique (línea 8). En la línea 12 se define un método Web al cual le especificamos una descripción informativa de lo que hace. El método Web (WebMethod) se compone por una función que recibe dos argumentos (números enteros) y devuelve un número entero, producto de la suma de los dos argumentos que se proporcionen. En lugar de una simple suma, usted puede recibir otro tipo de datos e incluso devolver objetos completos, como puede ser un arreglo o una base de datos en memoria (DataSet).

➤ Prueba del Servicio Web XML desde el navegador 8.

En Solution Explorer seleccione la página Service.asmx, del proyecto http:// Despliegue el menú contextual y seleccione View in browser. Aparecerá una página de consumo del servicio, que muestra el nombre de la clase y una lista de los métodos codificados.

localhost/Aritmetica/.

14

458

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9.

Aparecerá una lista de los métodos expuestos por el servicio, de acuerdo con la descripción del mismo. Vea cómo aparece Suma con la descripción que colocamos en el código para el método. Haga clic en el vínculo Suma. Aparecerá una interfaz que pregunta los argumentos requeridos por el servicio.

10. En N1 proporcione el número 20, y en N2 proporcione el número 30. Haga clic en Invoke. Con ello se realizará el procesamiento correspondiente y la respuesta se devolverá utilizando un paquete de datos mediante XML.

FIN DEL EJERCICIO *

Capítulo 14. Servicios Web XML

459

Ejercicio 14.2 Consumo programático de un Servicio Web XML desde una aplicación Windows En este ejercicio comprobará la forma en que se puede consumir programáticamente un Servicio Web XML desde una aplicación que no es Web. Se requiere haber desarrollado el ejercicio anterior. 1. 2.

3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado ConsumeWS. Deberá aparecer un formulario en el diseñador de formularios, que de manera predeterminada recibe el nombre de Form1. Diseñe una interfaz con los siguientes elementos: tres etiquetas (Label), tres cuadros de texto (TextBox) y un botón (Button). Modifique las propiedades necesarias para que la interfaz luzca de la siguiente manera:

Propiedad

Valor a asignar

Form1.Text

Consumo de servicio

Label1.Text

N1:

Label2.Text

N2

Label3.Text

Suma:

TextBox3.ReadOnly

True

Button1.Text

Invocar Servicio Web XML

14

460

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Establecimiento de la referencia a un Servicio Web XML 4.

Seleccione el proyecto ConsumeWS en Solution Explorer. Despliegue el menú contextual y seleccione Add Web Reference, con lo que aparecerá la ventana Add Web Reference.

5.

Desde la ventana Add Web Reference se pueden agregar referencias a Servicios Web que se encuentran en la misma solución, en el equipo local o en los servidores UDDI de la red local. Haga clic en el vínculo Web services in this solution. Con ello aparecerán los servicios Web disponibles en la solución.

Capítulo 14. Servicios Web XML

6.

461

Cómo sólo tenemos definido un servicio en la solución, es lo único que aparece. Haga clic en el vínculo del nombre del servicio, que se llama Service. Aparecerá el vínculo hacia el servicio, la lista de métodos, así como el nombre de referencia del servidor Web (localhost). Haga clic en el botón Add Reference para establecer la referencia al recurso Web.

➤ Consumo programático de un Servicio Web XML 7.

En modo de diseño, haga doble clic en el botón Invocar Servicio Web XML, a fin de codificar el procedimiento de evento del botón. La codificación debe quedar como sigue:

Codificación de ConsumeWS 1 2 3 4 5 6 7 8 9 10 11 12 13

– Form1.vb

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim wsAritmetica As New localhost.Service() TextBox3.Text = wsAritmetica.Suma( _ CType(TextBox1.Text, Integer), _ CType(TextBox2.Text, Integer) ) End Sub End Class

14

462

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de

ConsumeWS

8.

En la línea 6 se declara una variable objeto (wsAritmetica) a través de la cual podremos utilizar la funcionalidad de la clase Service, que está disponible a través de la referencia localhost. 9. Ya que declaramos la variable, utilizamos a través de ella el método Web Suma(). Para ello le asignamos el resultado del método a la propiedad Text de TextBox3 (línea 7). Vea cómo se coloca la variable de trabajo, el método Web y, entre paréntesis, los argumentos que requiere el servicio. 10. Establezca el proyecto como proyecto de arranque. Guarde todos los cambios realizados en su solución e inicie la depuración (oprima la tecla F5). Proporcione los valores 20 y 30 en N1 y N2, y haga clic en Invocar Servicio Web XML.

11. Al hacer clic se invoca el Servicio Web XML, se le proporcionan los argumentos al método Web y se utiliza el resultado del servicio. 12. Cierre la aplicación. FIN DEL EJERCICIO *

Capítulo 14. Servicios Web XML

MAPA

463

MENTAL DEL CAPÍTULO

14

464

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Add Web Reference, 460 .ASMX, 454 binding, 452 Clase proxy, 453 definitions, 452 Descubrimiento de servicio Web, 451 Disco, 451

Disco.exe, 451 Discovery document, 454 message, 452 portType, 452 service, 452 Servicios Web XML, 447 types, 452

UDDI, 450 Universal Description Discovery and Integration (UDDI), 450 Web Service Description Language, 452

Discovery, 451 , 454 WSDL, 452 wsdl.exe XML Web Service, 447

PREGUNTAS 14.1 ¿Qué son los Servicios Web XML y cuáles son sus características principales? 14.2 ¿En qué consiste UDDI y para qué sirve? 14.3 ¿En qué consiste WSDL y para qué sirve? 14.4 ¿En qué casos se recomienda el uso de los Servicios Web XML? 14.5 Mencione en qué casos cree usted que podría utilizar Servicios Web XML en su ámbito profesional.

Capítulo 14. Servicios Web XML

Notas:

465

14

466

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Son bloques de código ejecutable expuestos a través de protocolos estándar para su uso en la Web (XML / SOAP). a) Servicios Web XML b) XML Web Forms c) Métodos de Servicio XML 2. Es un registro distribuido de información de los servicios Web XML ofrecidos por las compañías desarrolladoras. a) WSDL b) DDL c) UDDI 3. Proceso por medio del cual se localiza un Servicio Web XML y su descripción, de tal manera que esté disponible para los programas que consumen los Servicios Web XML. a) Contrato Service Description b) Descubrimiento del Servicio Web c) DDL 4. Es el tipo de archivo que se genera al aplicar WSDL.EXE sobre un Servicio Web XML. a) .wsdl b) .wsdl y .disco c) .vb y .cs 5. Es una entidad que actúa como intermediaria de otra entidad. a) Service Description b) Class c) Proxy

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6.

Los Servicios Web XML pueden ser ejecutados desde aplicaciones de Consola, Windows y Web.

7.

Los Servicios Web XML aprovechan el protocolo HTTP, SOAP y TCP/IP para distribuir la funcionalidad y paquetes de datos.

8.

Para utilizar un Servicio Web es necesario registrarlo primero en UDDI.

9.

Un Servicio Web sólo puede ser ejecutado desde el navegador de Internet.

10.

Los Servicios Web son ideales para compartir, vía Web, funcionalidad sin necesidad de interfases.

Capítulos: 15 Manejo de bases de datos con ADO.NET 16 Manejo de bases de datos desde aplicaciones Windows 17 Manejo de bases de datos desde aplicaciones Web 18 Colecciones genéricas (generics)

Herramientas de Visual Studio revisadas: 1. 2. 3. 4. 5.

Server Explorer Query Designer Output Data Sources Command and Parameter Editor 6. Query Builder

Otras herramientas: 1. ildasm.exe 2. Visual Studio 2005 Command Prompt

Parte 5 Manejo de Bases de datos con ADO.NET En esta parte del libro aprenderemos a desarrollar aplicaciones que manejen bases de datos de alto rendimiento. El objetivo principal es que aprenda a desarrollar aplicaciones capaces de actualizar almacenes de datos físicos, aprovechando al máximo las herramientas que proporciona Visual Studio. En esta parte culmina todo lo aprendido en el libro: utilizamos la programación general en Visual Basic para la elaboración de los procesos y procedimientos, además de dar la estructura a las aplicaciones; también utilizamos las técnicas para el desarrollo de interfaces complejas Windows y Web; trabajamos con Visual Studio al máximo, y ponemos en práctica la capacidad de entender el código que la herramienta genera, gracias a nuestro conocimiento del modelo de programación orientada a objetos. Desarrollar actualizadores que insertan, modifican, eliminan y muestran registros desde los tres principales tipos de interfaz (Consola, Windows y Web) puede parecer pretencioso. La ventaja es que, en cierta forma, es necesario ser pretencioso para llegar hasta este punto. Si en este mundo globalizado somos simples datos, garantizar el almacenamiento fiel de los datos de éstos significa garantizarnos un poco de perpetuidad.

CAPÍTULO

15

Manejo de bases de datos con ADO.NET Objetivos: Aprenderá las generalidades del modelo de objetos de ADO.NET, y aprenderá los diversos modos en que podemos trabajar con dicho modelo para manipular y recuperar información de bases de datos. 1. Revisará el proceso evolutivo de las bases de datos, desde las librerías nativas hasta ADO.NET 2. Conocerá las diferencias entre bases de datos conectadas y desconectadas, y podrá decidir cuál es la estrategia óptima para sus aplicaciones. 3. Se familiarizará con el modelo de objetos ADO.NET 4. Conocerá las particularidades de los Data Provider Objects. 5. Conocerá las particularidades de los DataSet Objects. 6. Aprenderá a desarrollar aplicaciones de actualización de bases de datos en forma conectada.

469

470

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Historia del acceso a los almacenes de datos . . . . . . . . . . . . . . . . . . . . . . . . . Formas de trabajo con bases de datos en .NET . . . . . . . . . . . . . . . . . . . . . . . Bases de datos conectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bases de datos desconectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modos de trabajo con ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proveedores de datos de .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de consultas y procedimientos almacenados con Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Adiciónde una conexión a Server Explorer . . . . . . . . . . . ➤ Visualización de los datos de una tabla desde Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Adición de una vista a la base de datos con Query Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Adición y prueba de un stored procedure con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelo de objetos de ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DataSet Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cómo realizar la conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objeto Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros más utilizados en Connection . . . . . . . . . . . . . . . . . . . . . . . Propiedad ConnectionString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cerrado de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Proceso de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Establecimiento de una conexión a base de datos de forma programática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros más utilizados en Command . . . . . . . . . . . . . . . . . . . . . . . . Tipos de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos de ejecución de los comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uso de comandos para ejecutar procedimientos almacenados y uso de DataReader . . . . . . . . . . . . . . . . . . . . . . . Altas, bajas, cambios y consultas en modo conectado . . . . . . . . Consumo de cadenas de conexión de app.Config . . . . . . . . . . . . ➤ Compilación de un proyecto para liberación (Release) . ➤ Crackeado de un usuario y contraseña usando ILDASM . ➤ Adición de un archivo de configuración para la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Consumo de valores desde el archivo de configuración . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

471 472 477 477 478 480 481 482 482 485 486 488 491 492 494 496 496 497 499 499 500 500 501 503 504 505 506 506 507 510 514 515 516 517 518 521 522 523 525

Capítulo 15. Manejo de bases de datos con ADO.NET

471

ADO.NET ADO.NET es un conjunto de clases que forman parte de la biblioteca de .NET Framework y permite a las aplicaciones tener acceso a bases y otros almacenes de datos con fines de lectura, adición o actualización, ya sea de manera conectada o desconectada. ADO.NET no es un producto en sí mismo; forma parte de .NET Framework, pero es tal su importancia que merece ser estudiado de manera particular. Antes de entender la forma en que ADO.NET trabaja es necesario comprender que una base de datos sirve para almacenar y recuperar información. Surgen entonces dos preguntas: ¿Almacenarla dónde?, ¿recuperarla de dónde? Independientemente de si trabajamos con Access, SQL Server, Oracle, Informix, MySQL o cualquier otra base de datos del mercado, los datos terminan siempre en archivos que se almacenan en diversos medios de almacenamiento permanente (disco duro, cinta, cartucho, etcétera). Los manejadores de bases de datos permiten administrar y organizar la estructura de las bases de datos, facilitando la labor de almacenamiento, actualización y recuperación; sin embargo, a fin de cuentas siempre terminamos con un archivo al que debemos leer y en el que debemos escribir de una manera específica. A estos archivos les damos el nombre de almacén de datos u orígenes de datos. Los almacenes de datos pueden estar a nuestra disposición ya sea mediante el uso de sistemas manejadores de bases de datos (DBMS/Data Base Management System), programas que proporcionan una interfaz de acceso al almacén de datos y que en la actualidad poseen incluso lenguajes de manipulación de datos (DML/Data Manipulation Language), e interfaces gráficas intuitivas, llenas de asistentes y generadores de código. Ejemplos de este tipo de sistemas son Access, Visual FoxPro, SQL Server, Oracle, etcétera. Otra forma de acceder a estos archivos es mediante programación, a través de componentes y librerías que permiten el enlace con los almacenes de datos, así como su manipulación y recuperación. Dependiendo de la tecnología que estemos utilizando, hablamos de librerías, controladores y proveedores de datos. Ejemplos de esto son DAO, ADO, ADO.NET, OLEDB, ODBC, etcétera.

15

472

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 15.1 Manejo de bases de datos mediante programación.

Dado el carácter de este libro, nos interesa el acceso a los almacenes de datos de manera programática, a través de componentes y librerías, y específicamente utilizando ADO.NET. Para todo desarrollador profesional, en su labor de desarrollo de aplicaciones amplias para organizaciones, es indispensable saber hacer que una interfaz de usuario se comunique con almacenes de datos mediante programación; esto lleva a la necesidad de conocer los elementos del lenguaje que permitan manipular las bases de datos. En el caso de .NET, es necesario familiarizarse con el modelo de objetos ADO.NET, que precisamente sirve para eso. A través de programación es posible crear accesos rápidos, eficientes y confiables. Ciertamente no seremos los primeros en intentarlo, pero sí los que menos problemas enfrentaremos para hacerlo, ya que ADO.NET es una plataforma sorprendentemente potente y sencilla; además, si disponemos de Visual Studio, la codificación se realiza prácticamente sola. La historia nos dice que somos afortunados; muchos quisieron ver lo que nuestros ojos están por ver.

Historia del acceso a los almacenes de datos Realicemos un breve recorrido por las diferentes formas en que hemos tenido acceso a los datos desde una interfaz de usuario.

Capítulo 15. Manejo de bases de datos con ADO.NET

473

FIGURA 15.2 Cronología de los manejadores de base de datos.

15

Historia de acceso a los almacenes de datos

Década de 1990

Década de 2000

Librerías nativas de acceso a datos. Al principio, la diferencia entre plataformas y la diversidad de medios de conexión no era problema porque no había alternativas. El acceso a las bases de datos se realizaba a través de librerías nativas que funcionaban sólo para un manejador de base de datos específico en una plataforma operativa específica. Ejemplos de ello fueron DBLib para SQL Server y OCI (Oracle Call Interface) para Oracle. Las librerías nativas son librerías ejecutables de tecnología propietaria que sirven para enlazar a un solo tipo de almacén de datos en particular en una plataforma específica. El enlace con las bases de datos era tan rápido como limitado; en virtud de que no había intermediación entre base de datos y código nativo, el acceso a la base de datos era directo y, por tanto, muy veloz. Sin embargo, las librerías funcionaban sólo con el manejador de base de datos específico en una plataforma operativa; otra desventaja era que el desarrollador debía aprender a manejar tantas librerías nativas como manejadores de bases de datos utilizara en su aplicación. Si por alguna razón el usuario decidía usar otro manejador de bases de datos, no sólo se tenía que cambiar el manejador, sino también era necesario modificar el código fuente de las aplicaciones, lo que en ocasiones generaba una inversión alta en tiempo y dinero. Ésa fue la razón por la que muchas empresas no cambiaban manejador de base de datos, aun cuando no fuera el más adecuado para su negocio. ODBC. Al inicio de la década de 1990, Microsoft y otras empresas desarrollaron un estándar, denominado ODBC (Open Data Base Connectivity/Conectividad abierta de bases de datos). La idea era proporcionar una capa de acceso a datos común a través de la cual

474

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

pudiera tenerse acceso a cualquier motor de base de datos, siempre y cuando estuviera basada en el modelo relacional. Dichos motores, llamados motores de base de datos relacionales (RDBMS/Relational Data Base Management System), tales como SQL Server, Oracle, e Informix, utilizarían para el enlace unos controladores ODBC (ODBC drivers) que servían como protocolos de comunicación entre las aplicaciones y la base de datos. ODBC agregó un elemento intermedio entre la base de datos y las aplicaciones, llamado Manejador de controladores ODBC (ODBC Driver Manager), que se ocupaba de cargar y administrar los controladores ODBC. En ese contexto, la aplicación se comunicaba mediante instrucciones de bajo nivel con el manejador de controladores ODBC, quien a su vez se comunicaba con la base de datos a través de las API (Application Programming Interface), que constituyen un conjunto de definiciones que permiten a un programa comunicarse con otro. En teoría, si se cambiaba el manejador de base de datos, por ejemplo de Oracle a SQL Server, ya no sería necesario cambiar el código de la aplicación, dado que bastaría con utilizar un controlador distinto. Cambiar de manejador de base de datos sería como cambiar la impresora o el monitor: se conecta el dispositivo, se instalan los controladores y listo.

NOTA Esto es sólo en teoría, ya que los manejadores de base de datos admiten diferentes dialectos del lenguaje SQL, como ya veíamos en el capítulo anterior, lo que no permite una compatibilidad tan transparente.

Con ODBC nace el concepto de orígenes de datos, que vienen siendo el acceso a almacenes de datos por intermediación de un manejador de controladores, y el uso de un controlador. Con respecto a la velocidad de acceso, el que se agregara una capa de intermediación entre la aplicación y la base de datos, naturalmente, redujo un poco la rapidez. DAO. Lenguajes como C++ facilitaban el trabajo de bajo nivel que requería ODBC. En cierta forma, el proceso de interacción con el manejador de controladores ODBC era algo natural. Sin embargo, con la aparición de Visual Basic surgió la necesidad de comunicarse con las bases de datos en un ambiente más orientado a objetos, capaz de asumir muchas cosas. ODBC era demasiado complejo de implementar en un ambiente de desarrollo cuyo principal atractivo era la simplicidad. En la versión 3 de Visual Basic apareció DAO (Data Access Objects), que proporcionaba un modelo de objetos que permitía tener acceso con el motor de base de datos Jet, la tecnología utilizada por Microsoft Access.

Capítulo 15. Manejo de bases de datos con ADO.NET

475

Aun cuando era posible tener acceso a bases de datos en Access a través de ODBC, DAO rápidamente cobró popularidad; en primer lugar, porque era mucho más sencillo, de acuerdo con la filosofía de desarrollo de Visual Basic, y segundo, debido a que por ser un motor optimizado para Jet, era (y sigue siendo) la forma más rápida de tener acceso a las bases de datos en Access. Aunque está optimizado para bases de datos basadas en Jet (Access), DAO también acepta otras bases de datos a través de ODBC. De esa forma, se dispone de la simplicidad de DAO y el poder de ODBC. RDO. El problema con DAO es que al querer utilizarlo con bases de datos no basadas en Jet, es decir, cuando utilizaba orígenes de datos ODBC, se volvía muy lento.

Buscando remediar eso, Microsoft creó RDO (Remote Data Objects), que es un modelo de objetos similar a DAO pero optimizado para ODBC. No obstante los cambios, la velocidad de conexión no mejoró mucho. Sólo se logró tener un poco menos de los mismos problemas. OLE DB. Para resolver el problema de la velocidad, ya en un contexto lleno de diferentes manejadores de bases de datos y condiciones de conectividad, surgió OLE DB. OLE DB es similar a ODBC, en el sentido de que utiliza una especie de controladores, llamados proveedores de datos (OLE DB Providers), que implementaban un conjunto de interfaces COM que permitían el acceso a las bases de datos en un formato estándar de línea-columna. A las aplicaciones que utilizan OLE DB se les denomina OLE DB Consumer. En un esquema COM, OLE DB extendió el número de servicios disponibles para el manejo de los datos a través de librerías de fácil utilización, permitiendo el manejo de transacciones, persistencia de datos, manipulación de parte del cliente, conjuntos de registros jerárquicos, etcétera. Con OLE DB, Microsoft estableció su estrategia UDA (Universal Data Access), que por primera vez reconocía que los datos no sólo pueden estar en bases de datos, sino en muchos otros lugares y formatos como mensajes de correo electrónico, hojas electrónicas, archivos de texto simple, etcétera.

NOTA En este libro optamos por enfocarnos en los almacenes de datos por esta razón. No siempre hablamos de bases de datos; podemos hablar también de archivos de texto u hojas electrónicas, por ejemplo. Todas las bases de datos son almacenes de datos, pero no todos los almacenes de datos son bases de datos.

15

476

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

La desventaja de OLE DB es que seguía siendo complejo; por tratarse de una interfaz basada en COM, su manejo implicaba la interacción con librerías y no con un modelo de objetos sencillo, que formara parte del sistema operativo. ADO.ADO (ActiveX Data Objects) es un OLE DB Consumer que proporciona acceso a los orígenes de datos OLE DB a través de un modelo de objetos sencillo. Brinda la velocidad de OLE DB, sin la complejidad derivada de lidiar con librerías COM, ya que proporciona un modelo de objetos tan sencillo como DAO. La desventaja de ADO, no obstante su potencia, flexibilidad y sencillez sigue siendo la velocidad; no debemos olvidar que agrega una capa de intermediación, adicional a la que agrega OLE DB, por lo que entre la aplicación y la base de datos está ADO y OLE DB, que hacen más lento el enlace. ADO.NET. Como ya lo definimos, es un conjunto de clases que forman parte de la biblioteca de clases de .NET Framework, y que permiten a las aplicaciones tener acceso a bases de datos y otros almacenes de datos con fines de lectura, adición o actualización de datos, ya sea de manera conectada o desconectada. ADO.NET permite el enlace con los almacenes de datos a través de los proveedores de datos de .NET (.NET Data Providers). Estos controladores están diseñados para aligerar el peso de las capas que hay entre el almacén de datos y la interfaz, lo que mejora el desempeño. Dentro de las ventajas que ofrece ADO.NET, están las siguientes: ❑ ❑ ❑ ❑ ❑ ❑

Maneja copias locales de datos y permite el manejo de bases de datos desconectadas. Utiliza XML como formato para la transmisión de datos entre el almacén de datos y la copia local de datos; esto garantiza que los datos son autodescriptivos. Proporciona un modelo de objetos que permite programar de manera sencilla el manejo de bases de datos. La capacidad de manejar bases de datos desconectadas permite sustentar de manera eficiente las aplicaciones de computación móvil. El esquema de bases de datos desconectadas permite una mayor escalabilidad debido a que el uso de recursos es por petición, y no constante y concurrente. Maneja sus propios controladores de datos, que con el tiempo se irán mejorando para que su rendimiento sea mejor.

Además, la versión 2.0 de ADO.NET ofrece lo siguiente: ❑



MARS (Multiple Active Result Sets). Permite tener abiertos más de un conjunto de registros en una misma conexión abierta (no sólo uno, como sucedía en versiones 1.0 y 1.1). Operaciones asíncronas. A través de nuevos métodos disponibles para las cases Connection y Command, es posible ejecutar operaciones de dos vías (asíncrónicas).

Capítulo 15. Manejo de bases de datos con ADO.NET



477

Actualizaciones por lotes (batch updates). Es posible reproducir en el almacén de datos físico las afectaciones realizadas a un conjunto de registros de una base de datos desconectada. Anteriormente los cambios se reproducían registro por registro.

Formas de trabajo con bases de datos en .NET Bases de datos conectadas Durante mucho tiempo, las aplicaciones de bases de datos podían ser de una sola forma: conectadas. Una base de datos conectada es la forma de acceso a base de datos en la cual la aplicación está continuamente conectada al almacén de datos. Este modo de trabajo obedece al modelo petición respuesta, clásico del esquema Cliente/Servidor. Las ventajas de una base de datos conectada son: ❑ ❑ ❑

La seguridad del acceso a los datos es fácil de mantener. El acceso concurrente a los datos es fácil de controlar. Los datos se encuentran actualizados todo el tiempo.

Las desventajas de una base de datos conectada son: ❑ ❑

La conectividad entre la aplicación y la base de datos debe ser permanente. Cada conexión a la base de datos requiere recursos para ser mantenida, lo que implica que la escalabilidad no es muy buena. Cada conexión utiliza recursos, independientemente de si se están realizando operaciones con la base de datos o no.

Las bases de datos conectadas se recomiendan para aquellas aplicaciones en donde los datos actualizados en tiempo real son críticos, en donde se tienen usuarios concurrentes y donde la información debe estar actualizada para todos todo el tiempo, como puede ser un sistema bancario, un sistema de control de la producción o un sistema financiero para el control de movimientos en la bolsa.

15

478

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

FIGURA 15.3 Forma de trabajo con bases de datos conectadas.

La forma de trabajo es muy similar a la forma en que trabaja actualmente el modelo cliente/servidor: 1. 2. 3. 4.

En el momento en que se requiere interactuar con el almacén de datos se establece una conexión. Al abrir una conexión, se envía al manejador de bases de datos una instrucción SQL u otra que se desee ejecutar en el servidor. El servidor ejecuta la instrucción y, en su caso, devuelve datos a través de la conexión que se encuentra todavía abierta. Al haberse concluido el trabajo, la conexión se cierra.

Bases de datos desconectadas Con el uso de Internet, la escalabilidad se vio comprometida en los esquemas de bases de datos conectadas; simplemente, no era posible escalar los servidores de base de datos debido a que el modelo de base de datos no era eficiente en el manejo de conexiones concurrentes. En una aplicación en Internet no sabemos cuántos usuarios desearán conectarse (y mantenerse conectados). De esto derivan las bases de datos desconectadas, aplicaciones de base de datos en las cuales la aplicación y el almacén no están permanentemente conectados. En este esquema, la aplicación toma sólo el conjunto de datos mínimos que requiere para trabajar y los almacena en una memoria temporal (caché) en su equipo. Sobre esos datos, la aplicación realiza consultas y modificaciones; cuando termina, se procede a actualizar el almacén de datos. Las ventajas del esquema desconectado son: ❑ ❑ ❑

Se puede trabajar todo el tiempo, sin la preocupación de estar consumiendo recursos en el servidor, pues el acceso a las bases de datos es por petición. Mientras no utilizamos la conexión, otros usuarios pueden hacer uso de ella. La escalabilidad se mantiene de manera eficaz, ya que el uso concurrente de la base de datos se mantiene al mínimo.

Capítulo 15. Manejo de bases de datos con ADO.NET

479

Las desventajas de las bases de datos desconectadas son: ❑ ❑

Los datos no están permanentemente actualizados. Los conflictos relacionados con la modificación de los mismos datos por diferentes usuarios deben resolverse, de tal forma que no se pierdan transacciones.

Las bases de datos desconectadas se recomiendan para aquellas aplicaciones donde la actualización de datos que realizan los usuarios no es necesariamente concurrente, donde no se requiere la información actualizada todo el tiempo y donde se tienen pocos recursos de cómputo y almacenamiento. Por ejemplo, en el caso de una agenda en línea, correo electrónico, control de gastos personales y en toda la gama de aplicaciones ideales para dispositivos móviles, como celulares o palm-tops.

FIGURA 15.4 Forma de trabajo con bases de datos desconectada.

La forma en que trabaja el esquema desconectado es muy distinta a la forma de trabajar bajo el modelo cliente/servidor. Para empezar, no es necesario que exista un almacén de datos, aunque lo común es que sí exista. En este esquema: 1. 2. 3.

Se realiza una conexión, de igual forma que en esquema conectado. La aplicación, en lugar de ejecutar instrucciones sobre el almacén de datos, toma el conjunto de datos mínimos que la aplicación requiere para trabajar. Se cierra la conexión.

15

480

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

4. 5. 6.

Los datos extraídos se almacenan en una memoria temporal (caché) en el equipo que hizo la petición (copia local de datos). Sobre la copia local de datos, la aplicación realiza consultas y modificaciones. Cuando así se considere oportuno, se reproducen en el almacén de datos las modificaciones realizadas en la copia local.

Modos de trabajo con ADO.NET Dependiendo el uso que hagamos de los Data Provider Objects y los DataSet Objects, podemos distinguir los siguientes modos de trabajo con ADO.NET: ❑





Modo conectado. Si trabajamos sólo con objetos que pertenecen a Data Provider Objects, utilizando una conexión a un almacén de datos para cada operación que realicemos. En este esquema no se aprovechan los principios del modelo relacional, ya que sólo se trabaja con matrices bidimensionales de datos (filas/columnas); la definición de llaves, relaciones y dependencias entre tablas debe ser manejada de manera programática. Modo parcialmente conectado. Cuando trabajamos con Data Provider Objects y DataSet Objects; en este modo se establece una conexión con el almacén de datos para leer datos y definiciones, y cargarlos en DataSet; una vez que tenemos una copia de los datos en memoria local, trabajamos con los datos ya en el DataSet. Cuando hemos concluido las modificaciones a los datos, actualizamos el almacén de datos, de tal forma que considere las modificaciones realizadas en el DataSet. En este esquema se aprovecha la capacidad de almacenamiento de los manejadores de bases de datos, así como sus definiciones del modelo de datos; además, se aprovecha la compatibilidad de DataSet con el modelo relacional por parte del cliente, por lo que las llaves, relaciones y dependencias que se tienen en el manejador de bases de datos pueden ser reproducidas de manera local. Modo totalmente desconectado. Es cuando trabajamos sólo con objetos que pertenecen a DataSet Objects y no establecemos conexión alguna con los almacenes de datos. Generalmente el trabajo en este modo es virtual, para efectos de procesamiento. En este esquema se aprovecha la compatibilidad con el modelo relacional que tiene DataSet, pero como no hay enlace con ningún almacén de datos, no se pueden adquirir definiciones y se hace necesario programar todas las especificaciones del modelo de datos de manera local.

Los capítulos siguientes se especializan en cada uno de los diferentes modos de trabajo; se hará especial énfasis en el modo parcialmente conectado, pues es el modo más frecuente de trabajo, tanto en aplicaciones Web como en aplicaciones de escritorio y cliente/servidor.

Capítulo 15. Manejo de bases de datos con ADO.NET

481

Esta preferencia por el modelo parcialmente conectado no es una casualidad, ya que en él convive el manejador de bases de datos y ADO.NET, obteniéndose lo mejor de los dos mundos.

Proveedores de datos de .NET Framework Un proveedor de datos .NET Framework (.NET Framework Data Provider) es un conjunto de clases de .NET Framework que permiten la conexión a una base de datos en particular, así como la ejecución de comandos sobre ésta y la recuperación de datos. El acceso a las bases de datos a través de ADO.NET se lleva a cabo de manera optimizada, de tal manera que se utiliza la mínima intermediación posible, al mismo tiempo que se proveen recursos para el manejo de datos en un esquema orientado a objetos. .NET Framework incluye los siguientes proveedores de datos:

Proveedor

.NET Framework Data Provider for SQL

Uso en

Server proporciona el acceso a bases de datos Microsoft SQL Server 7.0 y posteriores. Namespace: System.Data.SqlClient

.NET Framework Data Provider for OLE DB

Proporciona el acceso a bases de datos expuestas a través de OLE DB. Se recomienda para el acceso a SQL Server 6.5 y Access. Namespace: System.Data.OleDb

.NET Framework Data Provider for ODBC

Proporciona el acceso a bases de datos expuestas a través de ODBC. Namespace: System.Data.Odbc

.NET Framework Data Provider for Oracle

Proporciona el acceso a bases de datos Oracle versión 8.1.7 y posteriores. Namespace: System.Data.OracleClient

Prácticamente es posible conectarse desde .NET a cualquier plataforma de bases de datos. Los proveedores de datos de .NET Framework permiten interactuar con los manejadores de bases de datos utilizando Visual Studio como herramienta de desarrollo y depuración, incluso en ambientes que no son de programación.

15

482

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 15.1 Uso de consultas y procedimientos almacenados con Server Explorer

Aprenderá a utilizar la herramienta Server Explorer. 1.

Abra la solución Ejercicios, que debe encontrarse en (archivo de extensión sln).

C:\APVBNETVS\Ejercicios

➤ Adición de una conexión a Server Explorer 2.

Abra la herramienta Server Explorer, que permite establecer conexión a bases de datos en tiempo de diseño. Seleccione la opción View - Server Explorer (oprima las teclas CTRL-ALT-S). Aparecerá la siguiente herramienta:

FIGURA 15.5 Server Explorer.

3.

4.

5.

La herramienta tiene su propia barra de herramientas, que incluye botones para refrescar el árbol de conexiones, detener el proceso de refrescado y establecer la conexión a una base de datos. Suponga que tiene una instancia de SQL Server de nombre APRENDAWS. Imagine que quiere establecer una conexión con la base de datos de prueba Pubs y que se enlazará utilizando la cuenta de administración sa, cuya contraseña es secreto. Ésta es una parte del diagrama de entidad relación de la base de datos Pubs:

Capítulo 15. Manejo de bases de datos con ADO.NET

483

15

6.

Las tablas contienen lo siguiente: Tabla

Resumen de contenido

titles

Contiene información de los títulos (libros) que pueden ser comercializados.

publishers

Contiene la información de las casas editoriales que comercializan los títulos.

employee

Contiene la información de los empleados de las casas editoriales.

jobs

Contiene la información de los puestos de trabajo que los empleados de las editoriales pueden tener.

authors

Contiene la información de los autores que tienen obras publicadas.

titleauthor

Contiene la información de qué autores escribieron qué títulos.

sales

Contiene la información de las ventas de los títulos.

stores

Contiene la información de los establecimientos (tiendas/librerías) en donde se realizan las ventas de los títulos.

484

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

7.

Haga clic en el botón Connect to Database de la barra de herramientas de Server Explorer. Aparecerá un asistente para la conexión.

8.

En Data source especifique el tipo de proveedor de datos con el que desee trabajar. En este caso utilizaremos SqlClient, dado que nos estamos enlazando a una base de datos SQL Server 2000. En Server name especifique el nombre de la instancia a la que desea enlazarse, que en este caso es APRENDAWS. En Log on to the server seleccione el uso de autenticación basada en SQL Server (Use SQL Server Authentication); escriba en User name la cuenta sa y en Password secreto. En Connect to a database, especifique en Select or enter a database name el nombre de la base, Pubs. Proporcionados estos datos, haga clic en el botón Test Connection, con lo que comprobará si la información que ha proporcionado es correcta. Si todo es correcto, aparecerá un mensaje de alerta como el siguiente:

Capítulo 15. Manejo de bases de datos con ADO.NET

9.

485

La base de datos y todos los elementos manejables a través de Visual Studio son mostrados en el árbol de conexiones.

➤ Visualización de los datos de una tabla desde Visual Studio 10. Uno de los aspectos más sobresalientes de Visual Studio es que se integra de manera plena con algunos manejadores de bases de datos, como es el caso de SQL Server. 11. Seleccione en el árbol de conexiones el nodo correspondiente a la tabla authors de la base de datos Pubs. Despliegue el menú contextual y seleccione Show Table Data. Con ello se deberá mostrar y editar los datos de la tabla seleccionada.

15

486

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

12. Cierre el documento donde aparecen los resultados de la consulta.

➤ Adición de una vista a la base de datos con Query Designer 13. En el árbol de conexiones seleccione el nodo Views de la base de datos Pubs. Despliegue el menú contextual y seleccione Add New View. Realizaremos una vista que contenga la consulta de un listado de ventas, en donde aparezca el nombre de la tienda (stores. stor_name), el título vendido (titles.title), el precio unitario (titles. price), la cantidad vendida (sales.qty) y el monto de la venta (sales.qty * titles.price) de las ventas realizadas en el estado de California (stores.state=’CA’). Inicialmente aparecerá la ventana Add Table, en donde se seleccionan todas las tablas involucradas; en nuestro caso son stores, titles y sales. Seleccione cada una de las tablas haciendo clic sobre el nombre de la misma y luego en Add. Cuando haya agregado todas, haga clic en Close. También puede presionar la tecla Ctrl mientras selecciona las tres tablas. Haga clic en los botones Add y Close.

Capítulo 15. Manejo de bases de datos con ADO.NET

487

14. Aparecerá el asistente de consultas (Query Designer), en el que se seleccionarán sólo los campos que nos interesan: stores.stor_name, titles.title, stores.state, titles.price, sales.qty. FIGURA 15.6 Query Designer.

15

15. Los cambios que realice en la selección visual de columnas se reflejarán de manera automática en los atributos de columna y en la instrucción SQL. 16. En los atributos de columna, en el atributo Filter del campo state, escriba la condición «= ‘CA’». Vea cómo la instrucción SQL cambia automáticamente.

17. Ahora agregaremos el campo calculado a nuestra consulta. En los atributos de columna, después de la columna state, escriba sales.qty*titles.price en Column y VentasTotales en el atributo Alias.

488

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Revise la sintaxis, haciendo clic en el botón Verify SQL Syntax

.

19. Ejecute la consulta haciendo clic en el botón Execute SQL , para ver si los resultados son correctos. Los resultados deben aparecer en el área de resultados.

20. Si todo está correcto, guarde la vista en la base de datos, oprimiendo las teclas Ctrl-S y asignando el nombre de VentasCA.

21. Cierre Query Designer. 22. Compruebe que en la base de datos ya se ha agregado una vista más.

➤ Adición y prueba de un stored procedure con Visual Studio 23. Visual Studio es una excelente herramienta para la edición de procedimientos almacenados, conocidos también como Stored Procedures, que son instrucciones precompiladas de SQL que se almacenan en la misma base de datos. Una de sus mayores ventajas es que podemos agregar puntos de interrupción en el código, así como probar los procedimientos de una manera sencilla. 24. Realizaremos un procedimiento almacenado que devuelva las ventas realizadas en un estado determinado. 25. Seleccione en el árbol de conexiones el nodo Stored Procedures de la base de datos Pubs. Despliegue el menú contextual y seleccione Add New Stored Procedure. 26. Aparecerá, precodificado en Text Editor, un procedimiento almacenado.

Capítulo 15. Manejo de bases de datos con ADO.NET

489

15

27. Modifique el código para que quede como el siguiente. Vea cómo Text Editor delimita las instrucciones SQL mientras codifica.

Codificación de dbo.StoredProcedures.AprendaWS.Pubs. 1 2 3 4 5 6 7 8 9 10 11 12 13 14

CREATE PROCEDURE dbo.TitulosVendidosEstado ( @state char(2) ) AS BEGIN select titles.title from sales, titles, stores where titles.title_id = sales.title_id and sales.stor_id = stores.stor_id and stores.state = @state END RETURN

28. El procedimiento espera que se proporcione como parámetro el estado del que se desea obtener información (línea 3). Con base en ello, se extraerán los nombres de los títulos que hayan sido vendidos en el estado proporcionado. Al guardar el procedimiento almacenado (oprima las teclas Ctrl-S) se realizará una verificación de sintaxis y se almacenará el procedimiento en la base de datos. La instrucción cambiará automáticamente, de CREATE PROCEDURE a ALTER PROCEDURE, para futuros cambios.

490

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

NOTA Para adquirir el dominio en la codificación de procedimientos almacenados, adquiera el libro Aprenda Practicando Microsoft SQL Server 2000, del mismo autor de esta obra, en donde se aborda la programación avanzada de Transact SQL, así como la administración básica de bases de datos SQL Server.

29. Colóquese en cualquier parte del procedimiento almacenado que esté editando y despliegue el menú contextual, seleccionando la opción Execute.

30. Como el procedimiento almacenado requiere valores en los parámetros, se desplegará la ventana Run Stored Procedure, solicitando los valores correspondientes. Proporcione como valor CA y haga clic en Ok.

Capítulo 15. Manejo de bases de datos con ADO.NET

491

31. La consulta se realizará, mostrando el resultado en Output de Visual Studio.

15

32. Cierre Text Editor. FIN DEL EJERCICIO *

Modelo de objetos de ADO.NET El modelo de objetos de ADO.NET se divide en dos grandes bloques: ❑ Data Provider Objects. Son aquellos objetos que se encargan del manejo eficiente del flujo de datos desde el almacén de datos hasta la copia local de datos (caché). ❑ DataSet Objects. Son aquellos objetos que, una vez que se tiene la copia local de datos, permiten agregar, modificar o recuperar información de la copia local de manera desconectada. Para el uso de estos objetos se requiere la compatibilidad con XML de .NET Framework. Los DataSet Objects son útiles sólo si pretende manejar bases de datos desconectadas (lo que no es siempre necesario en una aplicación). La primera decisión que debe llevar a cabo al momento de desarrollar una aplicación con manejo de base de datos es determinar si requiere o no manejar bases de datos desconectadas. En caso de optar por la respuesta afirmativa, identifique en qué funciones de la aplicación serán utilizadas. El manejo de bases de datos desconectadas es muy potente, pero también es complejo y exige un volumen considerable de recursos.

492

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Data Provider Objects Los objetos relacionados con los controladores de datos .NET, llamados Data Provider Objects, son aquellos que se encargan de la comunicación de paquetes de datos entre el almacén de datos y la copia local de datos (a utilizar de manera desconectada). Estos objetos se encargan de respetar los convencionalismos de la base de datos, de comunicarse con ella en el formato en que ésta reconozca los paquetes de datos, generando una copia local de datos en el cliente de la aplicación. FIGURA 15.7 DataProvider Objects.

Básicamente, los Data Provider Objects de ADO.NET son los siguientes: Objeto Connection

Función

Permite establecer la conexión con un almacén de datos. Se debe definir un objeto Connection por cada enlace a almacén de datos requerido por la aplicación. Los objetos DataReader, DataAdapter y Command requieren de un objeto Connection para funcionar.

Command

Ejecuta comandos SQL y, opcionalmente, devuelve datos del almacén de datos. Se requiere un objeto Command para cada instrucción a enviar al almacén de datos. DataReader requiere de un objeto Command para realizar la lec-

Capítulo 15. Manejo de bases de datos con ADO.NET

493

tura; DataAdapter requiere un objeto Command por cada operación a realizar (SELECT, INSERT, UPDATE y DELETE). En caso de que Data Adapter no realice alguna de las operaciones de actualización, no será necesario definir Command. DataReader

Permite generar un flujo de datos (data stream) de sólo lectura con el almacén de datos. El objeto DataReader se puede utilizar para lecturas sólo hacia delante; no es requerido por ningún objeto, por lo que su uso es opcional.

DataAdapter

Permite generar un flujo de datos (data stream) de lectura/escritura entre la copia local de datos y el almacén de datos. Se encarga de cargar datos del almacén de datos en el DataSet (SELECT) y de reproducir en el almacén de datos los cambios realizados en el DataSet (INSERT, UPDATE, DELETE) de manera desconectada. Se requiere si se desea la interacción entre un DataSet y un almacén de datos.

En el momento en que DataReader o DataAdapter poseen datos, ya se tiene una copia local de datos en el equipo cliente. Los Data Provider Objects son llamados así porque, dependiendo del proveedor o controlador de datos que se utiliza, se les antepone un prefijo que determina su origen.

Objeto

Para SQL Server (SqlClient)

Para otras bases de datos (OleDb)

Para Oracle (Oracle)

Connection

SqlConnection

OleDbConnection

OracleConnection

DataReader

SqlDataReader

OleDbDataReader

OracleDataReader

DataAdapter

SqlDataAdapter

OleDbDataAdapter

OracleDataAdapter

Command

SqlCommand

OleDbCommand

OracleCommand

En manuales y guías de estudio, suele referirse a los objetos como xxxCommand o xxxDataReader, de tal forma que, en caso de que aparezcan nuevos controladores y proveedores de datos, usted sólo tenga que aprender el prefijo que desea aplicar, aprovechando así el conocimiento del modelo de objetos que ya tiene. Dependiendo del controlador de datos .NET que se desee utilizar, el nombre de los objetos varía.

15

494

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Además de estos objetos, .NET Framework también provee los siguientes objetos relacionados con el proveedor de datos (dependiendo del manejador de bases de datos utilizados, estarán disponibles o no). Objeto

Función

Transaction

Permite listar comandos como parte de una transacción para el origen de datos.

CommandBuilder

Permite generar automáticamente propiedades de comandos y parámetros, con base en la información de DataAdapter.

ConnectionStringBuilder

Permite crear y manejar cadenas de conexión.

Parameter

Define valores de entrada, salida y retorno para comandos y procedimientos almacenados.

Exception

Representa errores que ocurren en el origen de datos.

Error

Expone información de los errores que ocurren en el origen de datos.

ClientPermission

Permite establecer los atributos de seguridad y control de acceso a los recursos de datos.

DataSet Objects El hecho de que se tenga un flujo de datos con el almacén de datos no implica que podamos manejar los datos tal y como si dispusiéramos de la base de datos en nuestro equipo. Para poder hacerlo, requerimos de un conjunto de objetos que nos permitan disponer de la copia local de datos, con todas las particularidades de una base de datos; nos referimos a DataSet Objects. se compone de un conjunto de datos locales de parte del cliente y permite operar sobre ellos con toda la funcionalidad de un manejador de base de datos, lo cual posibilita la adición y modificación de registros, y la realización de consultas, por ejemplo, respetando las reglas de las bases de datos originales y con la ventaja de que todo sucede de manera desconectada.

DataSet

Si lo que vamos a desarrollar son aplicaciones conectadas, tal y como lo habíamos hecho siempre, probablemente DataSet no nos resultará tan maravilloso. Sin embargo, creemos que al igual que todo el mundo, usted tiene interés en las aplicaciones Web y, por tanto, le interesan las bases de datos desconectadas.

Capítulo 15. Manejo de bases de datos con ADO.NET

495

Si usted conoce las bases de datos relacionales, verá que DataSet y sus objetos asociados son prácticamente una base de datos relacional. FIGURA 15.8 DataSet Objects.

15

Básicamente, los DataSet Objects son los siguientes: Objeto DataSet

Función

Representa la copia local y desconectada de datos, residentes en memoria. Se requiere un objeto de manera local.

DataTable

DataSet

por cada modelo de datos a representar

Representa una tabla dentro del modelo de datos. Se organiza a través de la colección Tables, que depende de DataSet. Se requiere un objeto DataTable por cada tabla del modelo de datos a representar de manera local.

DataView

Representa una vista personalizada de los datos de un DataTable, permitiendo ordenamiento, filtrado, búsqueda, edición y navegación.

DataColumn

Representa una columna o campo perteneciente a una tabla determinada. Se organiza a través de la colección Columns, que depende de DataTable. Se requiere un objeto DataColumn por cada columna o campo del modelo de datos a representar de manera local.

DataRow

Representa una fila o un registro perteneciente a una tabla determinada. Se organiza a través de la colección Rows, que depende de DataTable.

496

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Se requiere un objeto DataRow por cada registro del modelo de datos a representar de manera local. Constraint

Representa una restricción de valor único o llave foránea, que se aplica a una tabla determinada. Se organiza a través de la colección Constraints, que depende de DataTable. Se requiere un objeto Constraint por cada restricción de valor único (generalmente, esto es aplicable a las llaves primarias, aunque no necesariamente), y también uno por cada llave foránea definida en el modelo de datos a representar de manera local.

DataRelation

Representa una relación entre tablas. Se organiza a través de la colección Relations, que depende de DataSet. Se requiere un objeto DataRelation por cada relación entre tablas existente en el modelo de datos a representar de manera local.

se apoya fuertemente en el manejo de colecciones. Como todas las colecciones, se puede referir el contenido a través de Items o bien, señalando el identificador de elemento que corresponda de manera explícita.

DataSet

Cómo realizar la conexión Realizar la conexión consiste en establecer un enlace para el flujo de datos entre el almacén de datos y el modelo de objetos de ADO.NET. Para realizarlo, requerimos el objeto Connection, que forma parte de los Data Provider Objects.

Objeto Connection El objeto Connection sirve para establecer y abrir un flujo de datos entre la interfaz de usuario y el almacén de datos de un determinado tipo. Cuando utilizamos el objeto Connection, debemos especificar a qué tipo de almacén de datos nos vamos a conectar y proporcionar toda la información necesaria para establecer el enlace. Cuando establecemos el enlace, se dice que tenemos una conexión abierta. Otros objetos pertenecientes a Data Provider Objects, como DataReader y DataAdapter, dependen de la existencia previa de una conexión abierta; esto resulta lógico si consideramos que si no hay una conexión abierta con un almacén de datos, no puede haber lectura ni intercambio de datos e instrucciones.

Capítulo 15. Manejo de bases de datos con ADO.NET

497

El objeto Connection tiene diferentes implementaciones y varía dependiendo del tipo de almacén de datos con el que nos queramos conectar; sin embargo, tiene un cuadro de miembros básicos aplicables a todas las diferentes implementaciones. A continuación se mencionan los miembros comunes a todos los diferentes tipos de almacén de datos.

Miembros más utilizados en Connection Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes miembros:

Propiedades Propiedad

Utilidad

ConnectionString

Devuelve o establece la cadena utilizada para abrir una base de datos.

ConnectionTimeout

Devuelve el tiempo de espera para intentar establecer una conexión antes de detenerse y generar un error. El tiempo es expresado en segundos.

Database

Devuelve el nombre de la base de datos actual o de la que se va a utilizar una vez que se abre la conexión.

DataSource

Devuelve el nombre de la instancia de SQL Server con la que se va a establecer la conexión.

ServerVersion

Obtiene una cadena que contiene la versión del servidor a la que se conecta el cliente.

State

Obtiene el estado actual de la conexión.

Métodos Método BeginTransaction

Acción que realiza BeginTransaction()

Inicia una transacción de base de datos. BeginTransaction(aislamiento)

Inicia una transacción de base de datos con el valor IsolationLevel actual. El argumento aislamiento es el nivel de aislamiento de transacción de la conexión.

15

498

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Close

Close()

Cierra la conexión al origen de datos. Éste es el método recomendado para cerrar conexiones abiertas. CreateCommand

CreateCommand()

Crea y devuelve un objeto Command asociado con Connection. Dispose

Dispose()

Libera los recursos utilizados. Open

Open()

Abre una conexión de base de datos con los valores de propiedad que especifica ConnectionString.

Eventos Evento

Causas que lo originan

Disposed

Se produce cuando el objeto ha sido eliminado.

StateChanged

Se produce cuando el estado de la conexión cambia.

Se requiere al menos una conexión por cada almacén de datos utilizado por nuestro programa, aunque los almacenes de datos pertenezcan a distintos tipos. Para establecer un enlace, es necesario que se proporcione información relativa al almacén de datos a través de la cadena de conexión, representada por la propiedad ConnectionString; una vez especificada la cadena de conexión se puede intentar establecer el enlace utilizando para ello el método Open. Para no saturar los canales de comunicación, el enlace se intenta establecer en un tiempo determinado en segundos, que se puede especificar a través de la propiedad ConnectionTimeout; si no se especifica el tiempo, de manera predeterminada será de 15 segundos. Cuando se utilizan modelos de datos específicos para una base de datos, como SqlClient y OracleClient, no queda duda del tipo de almacén de datos con el cual nos queremos conectar; el caso de OleDb es diferente, ya que se puede intentar un enlace con todas aquellas bases de datos compatibles con OLE DB. De esto deriva la necesidad de aclararle al sistema qué comportamiento deseamos para el proveedor de datos (Provider).

Capítulo 15. Manejo de bases de datos con ADO.NET

499

Propiedad ConnectionString La más importante propiedad de Connection es ConnectionString, ya que proporciona información que identifica al almacén de datos y le proporciona información requerida para la conexión, utilizando para ello parámetros textuales, en forma de igualaciones separadas por punto y coma («;»). Al valor asignado a ConnectionString se le ha llamado cadena de conexión. El formato sería el siguiente: Connection.ConnectionString=”parámetro=valor;parámetro=valor…;”

El valor de la propiedad puede cambiarse sólo si no se tiene la conexión abierta. Los parámetros a utilizar al elaborar una cadena de conexión son: Parámetro

Función

Provider

Es útil sólo si se está utilizando OleDb. Establece el nombre del controlador que sustenta la conexión.

Connection Timeout

Establece el tiempo en segundos que se intentará establecer conexión con el almacén de datos. Initial Catalog Establece el nombre de de la base de datos o almacén de datos con el que nos queremos conectar. En el caso de bases de datos basadas en archivo físico, como Access, es el nombre físico del archivo de bases de datos.

Data Source

Nombre del almacén de datos. En el caso de SQL Server, es el nombre del servidor de base de datos; en el caso de otras bases de datos (por ejemplo una base de datos en Access), es el nombre físico del archivo que constituye el almacén de datos.

Password

Contraseña de la cuenta SQL Server, para permitir el acceso a la base de datos.

User ID

Cuenta de SQL Server, para permitir el acceso a la base de datos.

Integrated Security

Establece si la conexión será segura o no. Acepta los valores True y False.

Connection Pooling ADO.NET administra las conexiones de manera eficiente, pues posee un concepto denominado Connection Pooling, que se encarga de revisar constantemente el uso que se le da a

15

500

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

una conexión. En caso de que una conexión no sea utilizada, procederá a la desconexión automática, reactivándola en el momento en que se intente la utilización del flujo de datos, siempre y cuando los objetos sigan vigentes. Se recomienda, sin embargo, cerrar las conexiones de manera explícita, ya que no hay más eficiencia que eso. Connection Pooling se encarga de nuestro trabajo si somos descuidados en nuestra técnica de programación; como no lo somos, no tendrá mucho trabajo con nuestra forma de programar. Si desea ir más allá, puede no sólo cerrar la conexión; también puede liberar los recursos utilizados en el servidor para mantener la conexión a través del método Dispose.

Cerrado de conexión Aunque ADO.NET cerrará las conexiones que estén inactivas durante cierto tiempo, dejando latente la conexión mediante Connection Pooling, no hay nada más preciso que hacer uno mismo la tarea de cerrado de conexión. Para cerrar una conexión abierta puede utilizar el método Close. La conexión se cerrará y reducirá considerablemente los recursos utilizados en el equipo para mantener la conexión. Sin embargo, se mantiene la conexión en estado latente (connection pooling) hasta que el objeto es desechado por completo. El mantener la conexión en estado latente consume recursos, aunque pocos. Si definitivamente ya no utilizará la conexión, lo recomendable es cerrarla y desechar el objeto definitivamente, utilizando para ello el método Dispose.

Proceso de conexión Generalmente el proceso consiste en lo siguiente: 1. 2. 3. 4. 5. 6. 7.

Asegurarse de que se ha importado el namespace requerido para tener acceso al proveedor de datos correspondiente. Declarar variables objeto basadas en el objeto Connection del proveedor de datos seleccionado. Instanciar el objeto Connection. Establecer propiedades de conexión; la propiedad indispensable es ConnectionString, que especificará el almacén de datos con el cual nos enlazaremos. Abrir la conexión, aplicando el método Open. Abierto el flujo de datos se hace lo que se requiere hacer con los datos: adición, modificación, eliminación o consulta de registros. Se cierra la conexión usando el método Close.

Capítulo 15. Manejo de bases de datos con ADO.NET

501

Ejercicio 15.2 Establecimiento de una conexión a base de datos de forma programática En este ejercicio realizaremos una conexión a una base de datos SQL Server mediante programación. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Imagine que desea establecer una conexión con la base de datos de prueba Pubs y que se enlazará utilizando la cuenta de administración sa, cuya contraseña es secreto. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Console Application, llamado Conecta. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de Conecta – Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = “Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

Ejecución guiada de Conecta – Module1.vb

4.

Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-

15

502

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5.

6. 7.

lizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). En la línea 4 se importa el espacio de nombres requerido para un enlace a una base de datos en SQL Server. El procedimiento de conexión se realiza de la siguiente forma: se declara una variable a través de la cual se manejará programáticamente la conexión (línea 9), se genera una instancia de Connection sobre la variable (línea 10), se establece la cadena de conexión (línea 11) y se abre el flujo de datos con el almacén de datos (línea 14). La línea 15 muestra de forma textual el estado de la conexión. Si la conexión fue exitosa, se desplegará Open. Finalmente se cierra la conexión (línea 16) para evitar el consumo innecesario de recursos. Si todo ocurrió como se esperaba, la salida será la siguiente:

Open Pulse INTRO para continuar

8.

Aprovechando la flexibilidad de Visual Basic, se puede hacer más compacto el código. Vea las siguientes equivalencias posibles:

Declaración, instanciación y asignación de cadena de conexión por separado. 1

Dim conn As SqlConnection

2

conn = New SqlConnection()

3

conn.ConnectionString = “CadenaDeConexión”

4

conn.Open()

Declaración, instanciación y asignación de cadena de conexión por separado. 1

Dim conn As New SqlConnection()

2

conn.ConnectionString = “CadenaDeConexión”

3

conn.Open() Declaración, instanciación y asignación de cadena de conexión juntas.

1

Dim conn As New SqlConnection(“CadenaDeConexión”)

2

conn.Open()

Capítulo 15. Manejo de bases de datos con ADO.NET

503

La versión más compacta de nuestro programa sería la siguiente:

Codificación de Conecta – Module1.vb

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

9.

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As New SqlConnection(“Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

Para implementar la conexión en cualquier otro manejador basta con especificar el espacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y colocar una cadena de conexión apropiada.

FIN DEL EJERCICIO *

Command Comando. El objeto Command permite ejecutar comandos sobre un almacén de datos sobre el cual mantenemos conexión; opcionalmente, un comando puede también retornar datos extraídos del almacén de datos. Un objeto Command siempre actúa sobre una conexión abierta (Connection), es de una naturaleza o tipo específico (CommandType), ejecuta una instrucción determinada (CommandText) y realiza la ejecución de una manera específica que determina los efectos producidos por el comando.

15

504

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Miembros más utilizados en Command Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes miembros:

Propiedades Propiedad

Utilidad

CommandText

Devuelve o establece el procedimiento almacenado, la instrucción de SQL o la tabla de la que se extraerán datos. Su contenido depende de lo que se especifique en la propiedad CommandType.

CommandType

Obtiene o establece un valor que indica cómo se interpreta la propiedad CommandText.

Connection

Obtiene o establece el objeto tancia de objeto Command.

Parameters

Obtiene el objeto ParameterCollection.

Transaction

Obtiene o establece del objeto la Transaction en la que se ejecuta el objeto Command.

UpdateRowSource

Obtiene o establece la manera en que se aplican los resultados de comando a DataRow cuando lo utiliza el método Update del DataAdapter.

Connection

que utiliza esta ins-

Métodos Método Cancel

Acción que realiza Cancel()

Intenta cancelar la ejecución del objeto Command. CreateParameter

CreateParameter ()

Crea una nueva instancia de un objeto Parameter. Dispose

Dispose()

Libera los recursos utilizados por Component.

Capítulo 15. Manejo de bases de datos con ADO.NET

505

Eventos Evento Disposed

Causas que lo originan

Se produce cuando el objeto ha sido eliminado.

La siguiente sección describe algunas particularidades de los comandos para cada uno de los proveedores de datos más comunes. También muestra el control por medio del cual los podemos invocar desde Toolbox en Visual Studio.

Tipos de comandos Los tipos de comando que se tienen son los siguientes: Tipo de comando StoredProcedure

Descripción

Si lo que se va a ejecutar es un procedimiento almacenado (Stored Procedure) de SQL Server o de Oracle, en la propiedad CommandText debe especificarse el nombre del procedimiento almacenado a ejecutar. El procedimiento almacenado puede devolver o no valores.

TableDirect

Si se desea recuperar el contenido de una tabla o tablas, en la propiedad CommandText debe especificarse el nombre de la tabla o tablas a recuperar. Si son más de una, debe proporcionarse la lista de tablas, separadas por comas, lo que producirá como resultado su unión (Join).

Text

Si se desea ejecutar una instrucción SQL, en CommandText debe especificarse una instrucción SQL válida. Dependiendo del manejador de base de datos, es posible que el dialecto SQL cambie; deberá ajustarse a las instrucciones SQL reconocidas por el manejador de bases de datos que esté utilizando.

En caso de que un comando devuelva valores, es necesario que éstos se almacenen en un objeto contenedor de datos. Un objeto contenedor de datos es aquél que puede almacenar datos extraídos a través de un flujo de datos en una conexión abierta. Son objetos contenedores de datos DataSet y DataReader.

15

506

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Tipos de ejecución de los comandos Los tipos de ejecución que permite Command son: Tipo de comando

Descripción

ExecuteReader

Método que ejecuta una consulta que retorna un flujo de datos en forma de registros. Este tipo de ejecución utiliza a DataReader como contenedor de datos.

ExecuteScalar

Método que ejecuta una consulta de valor simple, es decir, un solo dato. Este tipo de ejecución devuelve sólo una fila y una columna; al igual que ExecuteReader, utiliza a DataReader como contenedor de datos.

ExecuteNonQuery

Método que ejecuta una instrucción SQL que no devuelve valores, como puede ser INSERT, DELETE o UPDATE.

DataReader Lector de datos. Los Data Provider Objects proporcionan un objeto que permite la lectura de datos sólo hacia delante, llamado DataReader. En virtud de que ADO.NET es muy extenso, no profundizaremos en las particularidades de DataReader más allá de lo que requerimos en este momento para comprobar nuestro trabajo con las bases de datos. DataReader es específico para cada proveedor de datos, por lo cual tendremos SqlDataReader, OleDbDataReader, OracleDataReader y así sucesivamente. DataReader trabaja sobre una conexión abierta a través de un comando que deberá ser ejecutado bajo el método ExecuteReader. En el caso de SQL Server 2000, se puede ejecutar ExecuteXMLReader, aprovechando la compatibilidad con XML que provee el manejador de bases de datos. Cuando ya tenemos el DataReader trabajando en conjunto con una conexión y un comando, podemos leer los datos a través de un método llamado Read. lee registros de un almacén de datos uno tras otro. Cada registro que lee es puesto en un área temporal de caché, desde donde los datos pueden ser tomados proporcionando el nombre de los campos a recuperar.

DataReader

El método Read tiene una doble función: primero, evalúa si es posible cargar un registro al área de caché; de ser así, carga el registro, y al mismo tiempo devuelve True. Si no es posible cargar un registro al área de caché, significa que ya hemos llegado al fin de archivo; en ese caso Read no cargará nada al caché y devolverá False.

Capítulo 15. Manejo de bases de datos con ADO.NET

507

Un aspecto importante es que DataReader utiliza totalmente la conexión, de tal forma que no se puede ejecutar sobre la conexión ninguna otra operación mientras DataReader está en proceso de lectura.

Ejercicio 15.3 Uso de comandos para ejecutar procedimientos almacenados y uso de DataReader En este ejercicio realizaremos una conexión a una base de datos SQL Server mediante programación y ejecutaremos un comando con el fin de poblar un DataReader y mostrar el contenido. Utilizará gran parte del código del ejercicio anterior y además consumiremos el procedimiento almacenado TitulosVendidosEstado. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Console Application, llamado LeeDatos. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de LeeDatos – Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim Estado As String Console.Write(“Siglas del estado: “) Estado = Console.ReadLine() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = “Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Dim cmd As SqlCommand cmd = New SqlCommand() cmd.CommandText = _ String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, Estado)

15

508

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

cmd.Connection = conn Dim Lector As SqlDataReader Lector = cmd.ExecuteReader Do While Lector.Read() Console.WriteLine(Lector(“title”)) Loop Lector.Close() conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

Ejecución guiada de LeeDatos – Module1.vb

4.

5. 6.

7.

8. 9.

Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). La conexión se realiza de la misma forma que en el ejercicio anterior. En la línea 21 se declara la variable a través de la cual se ha de manejar el comando. En la línea 22 se asigna una instancia de SqlCommand a la variable que acabamos de declarar. En la línea 23 se asigna la instrucción SQL que deseamos que se ejecute a través del comando, y en la línea 25 especificamos sobre qué conexión se ha de ejecutar el comando. En la línea 27 se declara una variable para el manejo del lector de datos (DataReader) que, como podrá observar, no requiere ser instanciado de forma explícita. En la línea 28 decimos que el resultado de ejecutar el comando provee de datos al lector. En la línea 30 comienza la exploración del lector de datos. Mientras el lector pueda leer un registro de datos, se estará mostrando la columna title. Proporcione como dato de entrada CA. Al ejecutarse el procedimiento almacenado, devolverá todos los títulos vendidos en el estado de California; los datos se asignarán al DataReader. Se muestra el contenido en el Do While. Si todo ocurrió como se esperaba, la salida será la siguiente: Siglas del estado: CA Secrets of Silicon Valley Is Anger the Enemy? Is Anger the Enemy?

Capítulo 15. Manejo de bases de datos con ADO.NET

509

Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean Fifty Years in Buckingham Palace Kitchens Sushi, Anyone? Straight Talk About Computers Silicon Valley Gastronomic Treats You Can Combat Computer Stress! Pulse INTRO para continuar

10. Aprovechando la flexibilidad de Visual Basic se puede hacer más compacto el código. Vea las siguientes equivalencias posibles: Declaración, instanciación y asignación de cadena de conexión por separado. 1 2 3

Dim cmd As SqlCommand cmd = New SqlCommand() cmd.CommandText = _ String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, Estado) cmd.Connection = conn Dim Lector As SqlDataReader Lector = cmd.ExecuteReader()

4 5 6

Declaración, instanciación y asignación de comando y conexión juntas. 1

Dim cmd As New SqlCommand( _ String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, _ Estado),conn) Dim Lector As SqlDataReader = cmd.ExecuteReader()

2

La versión más compacta de nuestro programa sería la siguiente:

Codificación de LeeDatos – Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As New SqlConnection(“Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Dim cmd As New SqlCommand( _ String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, _ Estado),conn) Dim Lector As SqlDataReader = cmd.ExecuteReader() Do While Lector.Read()

15

510

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19 20 21 22 23 24 25 26 27 28 29 30

Console.WriteLine(Lector(“title”)) Loop Lector.Close() conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

11. Para implementar la conexión en cualquier otro manejador basta con especificar el espacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y colocar una cadena de conexión apropiada. FIN DEL EJERCICIO *

Ejercicio 15.4 Altas, bajas, cambios y consultas en modo conectado En este ejercicio realizaremos un actualizador (Alta, Baja, Cambio, Consulta) para la tabla Jobs. Aprovecharemos lo que hemos aprendido para realizar operaciones en modo conectado. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Console Application, llamado ActPuestos. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de ActPuestos – Module1.vb 1 2 3 4 5 6 7 8

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Dim conn As SqlConnection

Capítulo 15. Manejo de bases de datos con ADO.NET

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

Dim Dim Dim Dim

511

mJob_id As Integer mJob_desc As String mMin_lvl As Byte mMax_lvl As Byte

Sub Main() Try Call AbreConexion() Dim Opcion As String Do While Opcion “X” Console.WriteLine(“**************************”) Console.WriteLine(“Opciones de la aplicación:”) Console.WriteLine(“A - Alta de registros”) Console.WriteLine(“M - Modificación de registros”) Console.WriteLine(“E - Eliminación de registros”) Console.WriteLine(“C - Consulta de registros”) Console.WriteLine(“X - Salir del programa”) Console.Write(“Qué opción desea:”) Opcion = Console.ReadLine() Select Case Opcion Case “A” Call AgregarRegistro() Case “M” Call ModificarRegistro() Case “E” Call EliminarRegistro() Case “C” Call ConsultarRegistros() Case “X” Exit Do End Select Console.WriteLine(“**************************”) Loop Call CerrarRecursos() Catch ex As Exception Console.WriteLine(“Ha ocurrido un error”) Console.WriteLine(ex.Message) Exit Sub End Try End Sub Sub AbreConexion()

15

512

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

conn = New SqlConnection(“Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto”) conn.Open() End Sub Sub AgregarRegistro() Console.Write(“Descripción de puesto:”) mjob_desc = Console.ReadLine() Console.Write(“Nivel mínimo:”) mMin_lvl = CType(Console.ReadLine(), Byte) Console.Write(“Nivel máximo:”) mMax_lvl = CType(Console.ReadLine(), Byte) Dim OrdenSQL As String OrdenSQL = String.Format(“INSERT INTO Jobs (Job_desc, “ & _ “Min_lvl, Max_lvl) VALUES (‘{0}’, {1}, {2})”, _ mJob_desc, mMin_lvl, mMax_lvl) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub ModificarRegistro() Console.Write(“ID de puesto:”) mJob_id = CType(Console.ReadLine(), Integer) Console.Write(“Descripción de puesto:”) mJob_desc = Console.ReadLine() Console.Write(“Nivel mínimo:”) mMin_lvl = CType(Console.ReadLine(), Byte) Console.Write(“Nivel máximo:”) mMin_lvl = CType(Console.ReadLine(), Byte) Dim OrdenSQL As String OrdenSQL = String.Format(“UPDATE Jobs SET Job_desc=’{0}’,” & _ “Min_lvl={1}, Max_lvl={2} WHERE Job_id={3}”, _ mJob_desc, mMin_lvl, mMax_lvl, mJob_id) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub EliminarRegistro() Console.Write(“ID de puesto:”) mJob_id = CType(Console.ReadLine(), Integer) Dim OrdenSQL As String OrdenSQL = String.Format(“DELETE Jobs WHERE Job_id={0}”, _ mJob_id) Dim cmd As New SqlCommand(OrdenSQL, conn) cmd.ExecuteNonQuery() End Sub Sub ConsultarRegistros()

Capítulo 15. Manejo de bases de datos con ADO.NET

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

513

Dim Lector As SqlDataReader Dim OrdenSQL As String OrdenSQL = “SELECT * FROM Jobs” Dim cmd As New SqlCommand(OrdenSQL, conn) Lector = cmd.ExecuteReader Do While Lector.Read Console.WriteLine(String.Format(“{0}, {1}, {2}, {3}”, _ Lector(0), Lector(1), Lector(2), Lector(3))) Loop Lector.Close() End Sub Sub CerrarRecursos() If conn.State = ConnectionState.Open Then conn.Close() End If End Sub End Module

Ejecución guiada de ActPuestos – Module1.vb 4.

5.

6. 7.

8. 9.

Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). El procedimiento principal se encarga de llamar al procedimiento AbreConexion(), que se encarga de abrir la conexión a la base de datos. Posteriormente, utilizando un Do While propone un menú de opciones. Dependiendo de la selección que se haga, se ejecutará el procedimiento AgregarRegistro(), que se encarga de agregar un registro a la tabla Jobs; ModificarRegistro() que se encarga de modificar los datos de un registro existente; EliminarRegistro(), que se encarga de eliminar un registro existente, y ConsultarRegistros(), que se encarga de mostrar el contenido de la tabla Jobs. Dependiendo de la operación a realizar, se preguntarán los datos necesarios, y se construirá la sentencia SQL apropiada. Seleccione la opción C y vea los registros que actualmente tiene la tabla. Seleccione la opción A y agregue el puesto Vendedor Senior, con nivel mínimo 100 y nivel máximo 175. Vea cómo no se proporciona valor de ID, dado que es Identity y el manejador SQL Server lo asignará automáticamente. Seleccione la opción C y compruebe que el programa agregó el registro. Vea cómo no se proporciona valor de ID, dado que es Identity y el manejador SQL Server lo asignará automáticamente.

15

514

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Seleccione la opción M y cambie la descripción por Vendedor Senior Jr, con nivel mínimo 120 y nivel máximo 175. Deberá proporcionar el número de ID que automáticamente el manejador le proporcionó a su registro. 11. Seleccione la opción C y compruebe que el programa modificó el registro. 12. Seleccione la opción E y elimine el registro que acaba de agregar. Tendrá que proporcionar el número de ID que automáticamente le asignó el manejador. 13. Seleccione la opción C y compruebe que el programa eliminó el registro. 14. Esta misma interfaz puede realizarse en Windows o en Web. Finalmente las operaciones terminarán siendo ADO.NET y el manejo es el mismo. 15. Cierre su aplicación. FIN DEL EJERCICIO *

Ejercicio 15.5 Consumo de cadenas de conexión de app.Config En este ejercicio analizaremos la forma en que se consumen las cadenas de conexión en aplicaciones Windows y Consola, con la finalidad de asegurar el código. Trabajará con el ejercicio 15.2, realizado con anterioridad. 1. 2. 3.

4.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Uno de los problemas de seguridad es la exposición de información delicada en una cadena de conexión, principalmente nombre de usuario y contraseña. La recomendación general es que utilice la seguridad integrada de Windows; de esa manera, los procesos de autenticación (reconocer al usuario) y autorización (darle permisos al usuario reconocido) quedan bajo el control del sistema operativo. Para implementar este tipo de autenticación es necesario agregar en la cadena de conexión el argumento: Integrated Security=SSPI;

En lugar de: User ID=usuario;password=contraseña;

5.

La desventaja es que se debe realizar trabajo de asociación de cuentas de sistema operativo con las bases de datos y sus objetos. Eso implica que todos los que se conectan a los datos deben poder firmarse en el equipo, lo cual abre otras posibilidades de inseguridad, además de que se requiere una minuciosa administración de cuentas. Como podrá imaginarse, en Web ese esquema no es funcional.

Capítulo 15. Manejo de bases de datos con ADO.NET

6.

515

Otra desventaja de integrar textualmente la cadena de conexión en nuestros programas es que en caso de que cambie el nombre del servidor, del usuario o la contraseña, tendrán que modificarse todos los programas, y recompilarse. Lo ideal es tener la información en un archivo externo de configuración, que en el caso de aplicaciones de consola y Windows se llama app.config; desde ahí la información puede consumirse a través de programación. En caso de cambios, se modifica el archivo de configuración que se aplica para todos los programas y automáticamente todo se actualiza sin necesidad de recompilar.

➤ Compilación de un proyecto para liberación (Release) 7.

Nuestro proyecto Conecta está escrito como sigue. Como vemos, expone de forma textual la cadena de conexión, y con ello el usuario y la contraseña:

Codificación de Conecta – Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

8.

Option Explicit On Option Strict On Imports System.Data.SqlClient Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = “Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

Generalmente, Visual Studio compila en modo depuración las aplicaciones (Debug) con lo cual nos asiste en la corrección de problemas. Cuando el programa ya no causa errores y estamos listos para liberarlo, se recomienda construir el programa (Build) en modo liberación (Release), para proceder a la distribución.

15

516

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

9.

En Solution Explorer haga doble clic en el nodo Conecta – de herramientas cambie el modo de compilación a Release.

Module1.vb.

En la barra

10. En Solution Explorer seleccione el nombre del proyecto Conecta. Despliegue el menú contextual y seleccione Rebuild, para reconstruir el ensamblado en modo Release. 11. El ensamblado para distribución habrá quedado en el directorio Bin\Release del proyecto. Como el ensamblado ya es un archivo EXE y no se puede abrir desde un editor de texto, podemos sentirnos seguros de que nadie conocerá la información de usuario y contraseña de la base de datos ¿No es cierto?

➤ Crackeado de un usuario y contraseña usando ILDASM 12. Nuestro ensamblado es un ensamblado .NET, y existe una herramienta de línea de comando, llamada ILDASM.EXE, que permite desensamblar los programas. Veamos qué tan fácil sería descifrar el usuario y la contraseña de nuestra base. 13. En Windows, en el grupo de programas de Visual Studio 2005, seleccione Visual Studio Tools – Visual Studio 2005 Command Prompt. Escriba lo siguiente en la línea de comandos: 1 2 3

cd\ cd\APVBNETVS\Ejercicios\Conecta\Bin\Release ildasm Conecta.exe

14. Aparecerá la herramienta de desensamblado de .NET.

Capítulo 15. Manejo de bases de datos con ADO.NET

517

15. Expanda el árbol de elementos hasta que ubique el elemento method Main: void(), que es el procedimiento en el que habíamos codificado la cadena de conexión. Haga doble clic sobre el elemento y se mostrará el código en su forma administrada (managed).

15

16. Vea en la ilustración la línea IL_0007, en donde aparece la cadena de conexión, totalmente legible para el ojo curioso, no siempre bien intencionado. 17. Cierre ILDASM.

➤ Adición de un archivo de configuración para la aplicación 18. Los archivos de configuración (Configuration Files) son archivos en formato XML que contienen elementos reconocidos por la plataforma .NET, y son utilizados por CLR en tiempo de ejecución para producir los efectos del programa y definir los apoyos de depuración y seguridad. En el caso de aplicaciones Windows (Consola y Windows), el archivo tiene el nombre app.Config, mientras que en las aplicaciones ASP.NET tiene el nombre Web.Config. 19. Generalmente, al crear una aplicación de consola no se genera en automático el archivo de configuración. Para crearlo, seleccione el nodo Conecta en Solution Explorer, despliegue el menú contextual y seleccione Add – New Item, con lo que aparecerá la ventana Add New Item. Seleccione la plantilla Application Configuration Template y haga clic en Add. Con ello se agregará al proyecto Conecta un archivo de configuración.

518

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

20. En Solution Explorer haga doble clic sobre el nodo app.config del proyecto Conecta. Con ello se editará el archivo de configuración. 21. Dentro del elemento agregue un elemento y dentro de éste, una cadena de conexión. Las primeras líneas del archivo deben quedar así:

Codificación de Conecta – app.config (parte) 1 2 3 4 5 6 7 8 9





...

22. El nombre conn asignado al valor de configuración podrá ser invocado programáticamente.

➤ Consumo de valores desde el archivo de configuración 23. Para consumir un valor del archivo de configuración, éste debe encontrarse en el mismo directorio que el ensamblado. En el programa lo que debe hacerse es importar el espacio de nombres System.Configuration. Para obtener todas las clases del espacio de nombres es necesario hacer referencia a System.Configuration.dll.

Capítulo 15. Manejo de bases de datos con ADO.NET

519

24. Seleccione el nodo Conecta en Solution Explorer y despliegue el menú contextual. Seleccione Add Reference y en la pestaña .NET de la ventana Add Reference seleccione System.Configuration; haga clic en Ok. Con ello se agrega la referencia a System.Configuration.dll. 25. Modifique el programa para que quede de la siguiente forma:

Codificación de Conecta – Module1.vb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Option Explicit On Option Strict On Imports System.Data.SqlClient Imports System.Configuration

Module Module1 Sub Main() Dim conn As SqlConnection conn = New SqlConnection() Dim Settings As ConnectionStringSettings Settings = ConfigurationManager.ConnectionStrings(“connStr”) conn.ConnectionString = Settings.ConnectionString conn.Open() Console.WriteLine(conn.State.ToString()) conn.Close() Console.Write(“Pulse INTRO para continuar”) Console.ReadLine() End Sub End Module

26. En la línea 5 se importó el espacio de nombres System.Configuration, necesario para poder disponer de los elementos de app.config. 27. En la línea 14 se declara una variable que nos servirá para leer los valores almacenados en el archivo de configuración. A la variable le asignamos el valor almacenado en un elemento llamado connStr, dentro de la sección connectionString del archivo de configuración (línea 15). Todos los elementos que hayan sido agregados en la sección a través de Add podrán ser recuperados del archivo de configuración. En la línea 16, finalmente, se recupera la cadena de conexión de la variable de trabajo, y se le asigna

15

520

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

28.

29.

30.

31.

32.

a la propiedad Connection.ConnectionString del objeto de conexión conn. Sobra decir que es posible almacenar más de una cadena de conexión. Suponga que diez programas utilizan la misma cadena de conexión y ya han sido compilados. Si cambia cualquier cosa en la cadena de conexión, sólo basta con modificarla en el archivo de configuración para que todos los programas funcionen sin modificaciones; en este caso, no sería necesario recompilar los programas. Construya en modo Release el proyecto Conecta, establézcalo como proyecto de inicio (StartUp Project) e inicie la depuración. El programa debe ejecutarse sin problemas. En la ventana Visual Studio 2005 Command Prompt (línea de comandos), aplique el comando Dir y vea cómo en modo Release se agregó un archivo de configuración específico para el proyecto, llamado Conecta.exe.config. La conexión se realiza, sin que la cadena de conexión esté expuesta en el ejecutable. Queda claro que ahora está expuesta en el archivo de configuración, que es un archivo textual XML, y que puede ser encriptado utilizando las clases del espacio de nombres System.Security.Cryptography.Xml. Cierre su aplicación, así como Visual Studio 2005 Command Prompt.

FIN DEL EJERCICIO*

Capítulo 15. Manejo de bases de datos con ADO.NET

MAPA

521

MENTAL DEL CAPÍTULO

15

522

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Actualizaciones por lotes, 477 ADO, 476 ADO.NET, 476 app.config, 515 Base de datos conectada, 477 desconectada, 478 Batch updates, 477 BeginTransaction, 497 Cancel, 504 Client, 494 Close, 498 Command, 492, 503 Builder, 494 CommandText, 504 CommandType, 504 Connection, 492, 504 Pooling, 499 StringBuilder, 494 Timeout, 499 ConnectionString, 497 ConnectionTimeout, 497 Constraint, 496 CreateCommand, 498 CreateParameter, 504 DAO, 474 Data Provider Objects, 491

Motor de base de datos Jet, 474 DataAdapter, 493 Multiple Active Database, 497 Result Sets, DataColumn, 495 476 DataReader, 493, .NET Data 506 Provoders, 476 DataRelation, 496 .NET Framework DataRow, 495 Data Provider, DataSet Objects, 481 491 OCI, 473 DataSet, 495 ODBC, 473 Datasource, 497 OLE DB, 475 DataTable, 495 Consumer, 475 DataView, 495 OleDbCommand, DBLib, 473 493 Dispose, 498, 504 OleDbConnection, Disposed, 498, 505 493 Error, 494 OleDbDataAdapter, Exception, 494 493 ExecuteNonQuery, OleDbDataReader, 506 493 ExecuteReader, 506 Open, 498 ExecuteScalar, 506 OracleCommand, ILDASM.EXE, 516 493 Integrated Security, OracleConnection, 499 493 Lector de datos, OracleData 506 Adapter, 493 Liberación, 515 OracleDataReader, MARS, 476 493 Modo Parameter, 494 conectado, 480 Parameters, 504 parcialmente Password, 499 conectado, 480 Permission, 494 totalmente Procedimientos desconectado, almacenados, 480 488 Source, 499

Proveedor de datos .NET Framework, 481 Proveedores de datos de .NET, 476 Provider, 499 Query Designer, 487 RDO, 475 Release, 515 Remote Data Objects, 475 Server Explorer, 482 SqlCommand, 493 SqlConnection, 493 SqlDataAdapter, 493 SqlDataReader, 493 State, 497 StateChanged, 498 Stored Procedures, 488 StoredProcedure, 505 SuperVersion, 497 TableDirect, 505 Text, 505 Transaction, 494, 504 UDA, 475 Universal Data Access, 475 UpdateRowSource, 504 User ID; 499 Web.Config, 517

Capítulo 15. Manejo de bases de datos con ADO.NET

523

PREGUNTAS 15.1 ¿Cuáles son las fases evolutivas del acceso a las bases de datos en forma programática? 15.2 Explique cuáles son las diferencias entre el esquema conectado y el esquema desconectado de bases de datos. 15.3 Explique los objetos Data

Provider Objects.

15.4 Explique los objetos DataSet

Objects.

15.5 Explique los tipos de comando y los tipos de ejecución del objeto Command. 15.6 ¿Para qué sirve DataReader?

15

524

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:

Capítulo 15. Manejo de bases de datos con ADO.NET

EXAMEN

525

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Es el motor de base de datos óptimo para manejar bases de datos en Access: a) DAO b) ADO c) RDO 2. Es el tipo de acceso en donde la aplicación mantiene una conexión permanente con el almacén de datos: a) Bases de datos de conexión persistente b) Bases de datos conectadas c) Bases de datos desconectadas 3. Son los espacios de nombre asociados con ADO.NET: a) .Data-Related Namespaces b) .ADO.NET Namespaces c) System.Data y System.Xml 4. Es la opción ideal para las aplicaciones que requieren manejo de bases de datos centralizadas y en tiempo real: a) Bases de datos de conexión persistente b) Bases de datos conectadas c) Bases de datos desconectadas 5. Es el modelo de objetos que permite tener un manejo total y flexible de la copia local de los datos: a) Data Provider Objects b) DataSet Objects c) Command Objects Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6. Las librerías nativas de acceso a datos son más rápidas que ODBC. 7. Una desventaja de las bases de datos desconectadas es que los datos no están permanentemente actualizados. 8. Los sistemas manejadores de bases de datos son componentes y librerías que nos permiten tener acceso a los almacenes de datos mediante programación. 9. RDO es la tecnología que permite la simplicidad de programación de DAO, pero con mejor desempeño en comparación con bases de datos que utilizan un motor de datos distinto a JET. 10. A los DataSet Objects se les debe anteponer un prefijo que indique el tipo de base de datos con el cual se establece conexión.

15

CAPÍTULO

16

Manejo de bases de datos desde aplicaciones Windows Objetivos: Aprender el manejo de bases de datos en modo parcialmente conectado usando DataSet para el desarrollo de aplicaciones de base de datos. 1. Conocerá los objetos que forman el modelo de objetos DataSet. 2. Entenderá cómo se organizan los objetos de DataSet en colecciones. 3. Aprenderá a utilizar las colecciones de manera directa y a través de la estructura de control For Each. 4. Aprenderá a utilizar el objeto DataSet con datos.

DataAdapter

y la forma de poblar un

5. Aprenderá a utilizar el objeto DataSet para crear actualizadores usando Visual Studio.

527

528

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Modelo de objetos DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funcionalidad de las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For Each y la lectura de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . Independencia de DataSet respecto del almacén de datos . . . . . . . . . Alternativas para poblar de datos un DataSet . . . . . . . . . . . . . . . . . . . . . . . . DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros más utilizados en DataAdapter . . . . . . . . . . . . . . . . . . . . . . DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Miembros más utilizados en DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . Categorías de objetos de DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DataSet y XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cargado de datos en un DataSet de forma programática . . . . . Uso de Data Sources, Typed Datasets y relaciones padre-hijo . . ➤ Creación de un origen de datos (Data Source) . . . . . . . . ➤ Creación de una aplicación de navegación de datos desde Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ➤ Adición de registros en modo desconectado y duplicación de modificaciones al almacén de datos . . ➤ Generación de interfaz con registros padre-hijo en tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actualizador de registros con Data Sources y enlazado de datos a un cuadro combinado . . . . . . . . . . . . . . . . . . . . . . . . ➤ Personalización de cuadros combinados de tablas relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

529 531 533 534 534 535 536 538 539 541 541 542 545 545 550 554 555 556 557 562 563 564 566

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

529

Uno de los rasgos que caracteriza a toda base de datos es la forma en que maneja las relaciones entre sus tablas. El concepto es tan importante que permite clasificarlas en las que son relacionales y las que no lo son. El manejo de relaciones es fundamental e implica el reconocimiento de llaves primarias y foráneas, la existencia de campos de coincidencia y la existencia de reglas de integridad entre las tablas. Si no somos capaces de trabajar todos esos conceptos al momento de programar, podemos decir que estamos desarrollando aplicaciones de bases de datos, pero no podremos decir que programamos aplicaciones de bases de datos relacionales. No obstante que las bases de datos, bajo el esquema conectado, permiten un manejo directo y sencillo de los datos, tienen una desventaja que resulta crítica: no tienen la capacidad de manejar bases de datos en su dimensión relacional. Si lo analiza detenidamente, se dará cuenta de que trabajamos sólo con matrices bidimensionales de datos (tablas, filas/columnas), y que todo manejo relativo a la dependencia entre tablas, restricciones de integridad, manejo de llaves, etcétera, debemos controlarlo a través de programación. Esto equivale a desperdiciar la capacidad de control que el manejador de base de datos relacional posee, por lo que sería igual cargar los datos en Access, SQL Server, un archivo en Excel o un archivo de texto simple. Para aprovechar todo el poder de las bases de datos relacionales es necesario utilizar el objeto DataSet, sobre el que recae la posibilidad de manejo de bases de datos desconectadas en ADO.NET. Al usar DataSet dispondremos automáticamente de un modelo de base de datos relacional de parte del cliente, independiente del almacén de datos.

Modelo de objetos DataSet La figura 16.1 muestra los objetos que componen el modelo de objetos DataSet (DataSet Objects). FIGURA 16.1 DataSet Objects.

16

530

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Exploraremos cada uno de los objetos que componen el modelo de objetos DataSet de manera detallada. A nivel modelo de objetos es importante lo siguiente: 1.

2.

En resumen, tenemos un modelo de base de datos (DataSet) que se compone de tablas (DataTable) relacionadas entre sí (DataRelation); las tablas se componen a su vez de campos (DataColumn), de los cuales tendremos ocurrencias o filas (Rows) que deberán atender algunas restricciones (Constraint). En el plano específico la organización está basada en colecciones: a) Todo el modelo se subordina al DataSet. b) Las tablas se almacenan en una colección perteneciente a DataSet llamada DataTable Collection. c) Cada tabla contiene su colección para almacenar sus columnas (DataColum Collection), filas (DataRowCollection) y restricciones (ConstraintCollection). d) Las relaciones entre tablas pertenecen al modelo de datos, no a las tablas, y se almacenan en una colección llamada DataRelationCollection. e) Aunque no son parte necesaria del modelo, se pueden tener vistas parciales de las tablas, especificando columnas y filtros específicos, utilizando el objeto DataView.

Un DataSet puede tener muchas tablas (objetos DataTable), que se organizan en una colección llamada DataTableCollection; cada tabla se compone de un conjunto de campos (objetos DataColumn), que se organizan en una colección llamada DataColumCollection. Cada tabla puede contener uno, varios o ningún registro; sin importar cuantos registros se tengan, cada registro es un objeto DataRow que se almacena en una colección llamada DataRowCollection asociado a la tabla. Una vez que existen las tablas es posible establecer restricciones aplicables a sus campos (objetos Constraint), a efecto de que se respete la integridad referencial del modelo de datos. Las restricciones se organizarán en una colección llamada ConstraintCollection. También es posible establecer dependencia padre/hijo entre tablas (DataRelation) al especificar relaciones entre ellas; éstas se organizarán en una colección llamada DataRelationCollection. Si se desea tener una vista parcial de los datos de una tabla, se puede utilizar el objeto DataView.

Para mayor simplicidad en el código, las colecciones tienen alias.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

Colección

531

Alias

DataTableCollection

Tables

DataColumnCollection

Columns

DataRowCollection

Rows

DataRelationCollection

Relations

Funcionalidad de las colecciones Si no entiende el concepto de las colecciones, el modelo de objetos DataSet será como pasar caminando por todos los círculos del Infierno de Dante, ya que las colecciones lo son todo en DataSet. Aprenderlas no es difícil; conocer cómo funciona una colección permite saber cómo funcionan todas. Las colecciones comparten propiedades y métodos comunes para todas las colecciones en Visual Basic; aquí reseñamos algunos de los miembros más comunes, a fin de que los utilice en el presente capítulo. Propiedades

Eventos

Métodos

Count

Add

Item

Clear Contains CopyTo Remove

Con el uso de propiedades podemos saber cuántos elementos componen la colección (Collection.Count), así como extraer cualquiera de ellos y disponer de sus propiedades particulares (Collection.Item). Mediante el uso de métodos podemos agregar objetos a la colección (Collection.Add), eliminar todos los elementos de la colección (Collection.Clear), copiar los elementos a un arreglo (Collection.CopyTo), y eliminar cualquier elemento (Collection.Remove). Si queremos saber si un elemento existe o no, podemos utilizar (Collection.Contains). Las colecciones almacenan referencias a un determinado tipo de objeto; cada objeto referido a una colección constituye un elemento (Item), que se organiza en la colección en forma de un arreglo de base cero. Suponga que tiene un DataSet de nombre dsBasica; suponga también que dicho DataSet se compone de cuatro tablas llamadas Clientes, Proveedores, Movimientos e Histórico.

16

532

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Todo es un objeto en .NET: dsBasica es un objeto DataSet y cada una de las tablas es un objeto DataTable. En ese sentido, la colección Tables almacena la referencia de los cuatro objetos DataTable. La siguiente línea nos despliega en la consola cuántos elementos existen en la colección de dsBasica:

Tables

Console.WriteLine(dsBasica.Tables.Count())

La salida sería la siguiente: 4

Devuelve un valor de 4 pues existen cuatro objetos DataTable referidos en la colección. Como la colección almacena los elementos con base cero, los subíndices de referencia serían 0, 1, 2 y 3. Para conocer el nombre de cada una de las tablas almacenadas en Tables podríamos recurrir al siguiente código: Console.WriteLine(dsBasica.Tables.Item(0).TableName) Console.WriteLine(dsBasica.Tables.Item(1).TableName) Console.WriteLine(dsBasica.Tables.Item(2).TableName) Console.WriteLine(dsBasica.Tables.Item(3).TableName)

La salida sería la siguiente: Clientes Proveedores Movimientos Histórico

Cada una de las líneas mostró la propiedad TableName del elemento especificado a través del subíndice proporcionado, que deberá estar entre 0 y el máximo subíndice posible, es decir, el número de elementos menos uno. Como puede ver es una forma poco adecuada para examinar la colección; si la colección hiciera referencia a 1000 objetos en lugar de 4, el código sería bastante ineficaz. NOTA Un error común es utilizar el número de elementos (Count) como subíndice, lo que provoca error en tiempo de ejecución. Si la colección tiene cinco elementos (n), y el primero tiene un subíndice de cero que aumenta progresivamente sobre base entera, el máximo subíndice posible será el total de elementos menos uno (n-1).

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

533

También podemos recurrir al siguiente código, que sería la automatización del anterior, y que proporcionaría los mismos resultados: Dim i As Integer For i=0 To (dsBasica.Tables.Count() – 1) Console.WriteLine(dsBasica.Tables.Item(i).TableName) Next i

Es sencillo, con la salvedad de que el código puede ser bastante complejo y las líneas bastante largas. Podemos simplificar un poco más el código asignando la colección a un objeto: Dim i As Integer Dim MisTablas As DataTableCollection = dsBasica.Tables For i=0 To (MisTablas.Count() – 1) Console.WriteLine(MisTablas.Item(i).TableName) Next i

El hecho de que un objeto haga las veces de una colección permite ver al código en términos más sencillos. Esa posibilidad da paso a la estructura de control For Each.

For Each y la lectura de colecciones La estructura de control For

Each

trabaja sobre colecciones.

Para poder trabajar, For Each requiere de una variable de trabajo de la misma naturaleza que los objetos referidos por la colección. Continuando con nuestro ejemplo, el código para mostrar el nombre de cada uno de los elementos de la colección sería el siguiente: Dim TablaEnColeccion As DataTable For Each TablaEnColeccion In dsBasica.Tables Console.WriteLine(TablaEnColeccion.TableName) Next TablaEnColeccion

Lo que hace For Each es que cada elemento de la colección se asigna a la variable de trabajo; dentro del bloque de código entre For Each y Next se puede utilizar la variable de trabajo como si estuviéramos trabajando con el elemento de la colección. Si la colección tiene 1 o 1000 elementos, el código es el mismo. El código anterior es equivalente al siguiente, que es marcadamente más complejo:

16

534

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dim TablaEnColeccion As DataTable TablaEnColeccion = dsBasica.Tables.Item(0) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(1) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(2) Console.WriteLine(TablaEnColeccion.TableName) TablaEnColeccion = dsBasica.Tables.Item(3) Console.WriteLine(TablaEnColeccion.TableName)

Escoja la forma más conveniente. Imagine que son 500 elementos en la colección, ¿cuál opción le conviene?

Independencia de DataSet respecto del almacén de datos Contrario a lo que sucedía con los Data Provider Objects, el modelo de objetos DataSet tiene sólo una implementación totalmente independiente al proveedor de datos que se utilice. El modelo de objetos DataSet y los datos contenidos en el modelo se representan en la memoria del equipo local mediante lenguaje XML. Para DataSet no es relevante si utilizamos OleDbClient, SQLClient, OracleClient u otro, ya que en realidad DataSet no se entiende con dichos objetos. El encargado de resolver las particularidades de cada almacén de datos es el objeto DataAdapter; habrá un DataAdapter por cada proveedor de datos que se tenga en .NET.

Alternativas para poblar de datos un DataSet Antes de analizar los objetos DataSet es importante saber que éstos son independientes de un almacén de datos; es decir, que se puede tener un modelo de bases de datos en memoria aunque no se disponga de un manejador de base de datos o un almacén de datos físico en el equipo. Los datos de un DataSet pueden provenir de diferentes partes: 1. 2.

Interfaz de usuario. Por la utilización de una interfaz de usuario que, a través de programación, se encarga de agregar, modificar o eliminar registros o filas. Almacén de datos. De un almacén de datos compatible con ADO.NET; en ese caso, es necesario extraer los datos del almacén con el apoyo de un objeto de tipo DataAdapter, que es un objeto Data Provider, y que se encarga del diálogo entre el DataSet y el almacén de datos resolviendo discrepancias.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

3.

535

XML. Si los datos provienen de estructuras de datos XML válidas. Este tipo de almacén de datos es muy utilizado en aplicaciones de cómputo móvil, ya que no es necesario consumir recursos para almacenar y recuperar datos.

Dependiendo de las necesidades de la aplicación, se puede tener una combinación de diferentes orígenes a fin de incrementar la confiabilidad y el tiempo de respuesta de la aplicación.

DataAdapter Adaptador de datos. El objeto DataAdapter, es un conjunto de comandos y conexiones que sirve de interfaz entre el almacén de datos y DataSet. no interactúa de ninguna forma con el almacén de datos de manera directa; Data actúa como puente entre DataSet y el almacén de datos para efectuar cualquier operación de recuperación o escritura. DataSet

Adapter

En caso de que los datos que han de poblar un DataSet provengan de un almacén de datos, primero se cargan en el DataAdapter para luego trasladarse al DataSet mediante el uso del método Fill. Fill define una tabla dentro del DataSet, trasladando los datos contenidos en la tabla más la definición básica de los campos. Inicialmente, la definición de los campos incluye sólo el nombre del campo y el tipo de dato, dejando fuera importantes cuestiones como la longitud máxima permitida, la capacidad de permitir valores nulos, etcétera. Debido a lo básico de la definición de campos realizada por Fill, se dice que se tiene un DataSet sin tipos (Untyped DataSet). El método FillSchema se emplea para trasladar las especificaciones de tipo, longitud y restricciones al DataSet, de tal manera que la representación de la base de datos en memoria y en el almacén físico de datos concuerde. Cuando DataSet representa de manera completa los atributos del modelo de datos en el almacén físico, se dice que se tiene un DataSet con tipos (Typed DataSet). La especificación generalmente se hace a través de XML y XSD. Es importante aclarar que los datos que han de poblar un objeto DataSet no siempre provienen de un almacén de datos; es posible, incluso, que DataSet pueda generarse de manera programática en forma totalmente independiente de cualquier almacén de datos. En ese entendido, es posible utilizar DataSet sin su correspondiente objeto DataAdapter, si es que la aplicación nada tiene que ver con un almacén de datos; en ese escenario, también saldría sobrando una conexión.

16

536

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dependiendo del proveedor de datos se utilizará un diferente DataAdapter (SqlDataAdapter, OleDbDataAdapter, OracleDataAdapter). En este libro lo consideraremos de forma genérica.

Miembros más utilizados en DataAdapter Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes miembros:

Propiedades Propiedad

Utilidad

AcceptChangesDuringFill

Obtiene o establece un valor que indica si debe llamarse al método AcceptChanges en DataRow después de agregarse a DataTable durante cualquiera de las operaciones Fill.

DeleteCommand

Obtiene o establece un procedimiento almacenado o una instrucción de Transact-SQL para eliminar registros de un conjunto de datos.

InsertCommand

Obtiene o establece un procedimiento almacenado o una instrucción de Transact-SQL para insertar nuevos registros en el origen de datos.

SelectCommand

Obtiene o establece un procedimiento almacenado o una instrucción de Transact-SQL para seleccionar registros en el origen de datos.

UpdateCommand

Obtiene o establece un procedimiento almacenado o una instrucción de Transact-SQL para actualizar los registros del orien de datos.

Las propiedades DeleteCommand, InsertCommand, SelectCommand y UpdateCommand son denominadas propiedades de ejecución; usualmente se debe definir como mínimo Select Command (propiedad por omisión de DataAdapter); el resto de las propiedades de ejecución se pondrán en funcionamiento al aplicar el método Update, mismo que reproducirá las modificaciones realizadas en DataSet en el almacén de datos.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

537

Métodos Método Dispose

Acción que realiza Dispose()

Libera los recursos utilizados por Component. Fill

Fill(dataSet As DataSet)

Agrega filas a DataSet o las actualiza para que coincidan con las filas del origen de datos. Este método devuelve el número de filas actualizadas correctamente en el DataSet. Fill(dataset As DataSet, nombre As String)

Agrega filas a DataSet o las actualiza para que coincidan con las filas del origen de datos. dataSet es el nombre del objeto DataSet al cual se le agregarán los datos, mientras que nombre es el nombre bajo el cual se identificará en DataTable en el que se cargarán los datos. Este método devuelve el número de filas actualizadas correctamente en el DataSet. FillSchema

FillSchema(dataSet, esquema As SchemaType)

Agrega un DataTable a un DataSet y configura el esquema para hacerlo coincidir con el del origen de datos. El esquema determina la fuente de definiciones para los elementos de la base de datos de parte del cliente. Puede ser SchemaType. Mapped,

si se desea que se apliquen las asignaciones del DataAdapter; esta es la opción por omisión, y hace coincidir el modelo de datos entre el almacén de datos y la copia local. También puede ser SchemaType.Source, si se desea hacer caso omiso a las definiciones en DataAdapter. GetFillParameters

GetFillParameters()

Obtiene los parámetros establecidos por el usuario al ejecutar una instrucción SELECT de SQL. Update

Update(dataSet)

Llama a las instrucciones INSERT, UPDATE o DELETE respectivas para cada fila insertada, actualizada o eliminada en DataSet. Este método devuelve el número de filas actualizadas correctamente en el almacén de datos.

16

538

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Finalize

Finalize()

Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. OnFillError

OnFillError()

Provoca el evento FillError.

Eventos Evento

Causas que lo originan

Disposed

Se produce cuando el objeto ha sido eliminado.

FillError

Se devuelve cuando se produce un error durante una operación de relleno.

RowUpdated

Se produce durante Update después de que se ejecute un comando en el origen de datos. Se hace un intento de actualización, de manera que se inicia el evento.

RowUpdating

Se produce durante Update antes de que se ejecute un comando en el origen de datos. Se hace un intento de actualización, de manera que se inicia el evento.

DataSet Conjunto de datos. El objeto DataSet es el elemento más poderoso de ADO.NET y representa la copia local y desconectada, residente en memoria, de datos organizados bajo el modelo relacional.

Al área en memoria donde se almacena la copia local y desconectada de los datos del DataSet se le llama caché. En dicho espacio, DataSet permite almacenar un pequeño modelo relacional en la memoria del equipo local; su organización se basa en colecciones Tables, Rows, Columns, Constraints y Relations que simulan lo que en los manejadores de base de datos relacional se almacena en las tablas del sistema. A toda la información que especifica cómo se han de almacenar los datos en memoria y a las restricciones pertinentes se le denomina esquema (schema). Mantener el control del es-

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

539

quema produce muchos beneficios en el ámbito relacional, pero hace que trabajar con DataSet sea más complejo que trabajar con DataReader. DataSet agrega una capa más de objetos, lo que exige más recursos del equipo; si su aplicación no amerita trabajar con bases de datos desconectadas, procure evitar el uso de DataSet.

Miembros más utilizados en DataSet Al utilizar este tipo de control, los desarrolladores generalmente utilizan los siguientes miembros:

Propiedades

16

Propiedad

Utilidad

CaseSensitive

Obtiene o establece un valor que indica si las comparaciones de cadena en los objetos DataTable distinguen entre mayúsculas y minúsculas.

EnforceConstrains

Obtiene o establece un valor que indica si se siguen las reglas de restricción al intentar realizar cualquier operación de actualización.

Relations

Obtiene la colección de relaciones que vincula las tablas y permite el desplazamiento desde las tablas primarias a las secundarias.

Tables

Obtiene la colección de tablas incluidas en DataSet.

Métodos Método Clear

Acción que realiza Clear()

Borra cualquier dato de DataSet mediante el procedimiento de quitar todas las filas de todas las tablas. Clone

Clone()

Copia la estructura de DataSet, incluidos todos los esquemas, relaciones y restricciones de DataTable. No copia ningún dato.

540

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Copy

Copy()

Copia la estructura y los datos para este DataSet. Dispose

Dispose()

Libera los recursos utilizados por MarshalByValueComponent. GetXml

GetXml()

Devuelve la representación XML de los datos almacenados en DataSet. GetXmlSchema

GetXmlSchema()

Devuelve el esquema XSD para la representación XML de los datos almacenados en DataSet. ReadXml

ReadXml()

Lee el esquema y los datos XML del DataSet. ReadXmlSchema

ReadXmlSchema()

Lee un esquema XML en el DataSet. Reset

Reset()

Restablece el estado original del DataSet. Las subclases deben reemplazar a Reset para restaurar el estado original de un DataSet. WriteXml

WriteXml()

Escribe datos XML y, de forma opcional, el esquema del DataSet. WriteXmlSchema

WriteXmlSchema()

Escribe la estructura del DataSet como un esquema XML.

Eventos Evento Disposed

Causas que lo originan

Se produce cuando el objeto ha sido eliminado.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

541

Categorías de objetos de DataSet Las colecciones involucradas con DataSet permiten organizar los objetos para el manejo de los datos que se encuentran en memoria; dichos objetos se dividen en dos categorías: ❑ Objetos de esquema. Son los que tienen por objeto definir la estructura que almacenará los datos. Se responde a la pregunta, ¿dónde y cómo se guardarán los datos? a) b) c) d)

DataTable DataColumn Constraint Relation

❑ Objetos de datos. Son los que tienen por objeto almacenar los datos. e) DataRow

DataSet y XML está muy vinculado a XML por ser éste el convencionalismo utilizado para comunicar paquetes de datos y organizar el contenido de los objetos en caché. Los datos en DataSet no se almacenan en formato binario o en tecnología propietaria, sino en lenguaje XML. Ese hecho permite una universalidad que sin duda facilitará la implementación de los lenguajes .NET en plataformas distintas a los sistemas operativos de Microsoft.

DataSet

Esta vinculación hace necesario establecer la referencia hacia la librería System.Xml.dll al momento de compilar cualquier programa que haga uso de intercambio de datos con DataSet. Sobra decir que al trabajar con Visual Studio no es necesario establecer las referencias manualmente, dado que al detectarse el uso de elementos que requieren la librería, ésta es incluida. Los métodos que permiten la funcionalidad XML de DataSet son los siguientes: ❑ GetXML. Devuelve la representación XML de los datos almacenados en DataSet. ❑ GetXMLSchema. Devuelve el esquema XSD para la representación XML de los datos almacenados en DataSet. ❑ ReadXML. Lee el esquema y los datos XML del DataSet. ❑ ReadXMLSchema. Lee un esquema XML en el DataSet. ❑ WriteXML. Escribe datos XML y, de forma opcional, el esquema del DataSet. ❑ WriteXMLSchema. Escribe la estructura del DataSet como un esquema XML.

16

542

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 16.1 Cargado de datos en un DataSet de forma programática En este ejercicio realizaremos la carga de datos de un objeto DataSet utilizando un adaptador de datos. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Imagine que desea establecer una conexión con la base de datos de prueba Pubs y que se enlazará utilizando la cuenta de administración sa, cuya contraseña es secreto. La tabla de la que queremos ver los datos es la tabla Jobs. 1.

3. 4.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado VerPuestos. Agregue una rejilla de datos (DataGridView). Distribuya los objetos de la siguiente forma:

5.

Modifique las siguientes propiedades:

2.

Propiedad

Valor a asignar

Form1.Text

Catálogo de Puestos

DataGridView1.Name

dgvPuestos

dgvPuestos.ReadOnly

True

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

543

La propiedad DataGridView.ReadOnly hace que los objetos sean de sólo lectura, con lo que evitamos modificaciones inesperadas en el programa. Haga doble clic en la barra de herramientas del formulario y modifique el programa para que luzca de la siguiente manera:

Codificación de VerPuestos 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

– Module1.vb

Option Explicit On Option Strict On Imports System.Data.SqlClient Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As SqlConnection conn = New SqlConnection() conn.ConnectionString = “Data Source=aprendaws;” & _ “Initial Catalog=pubs;Persist Security Info=True;” & _ “User ID=sa;Password=secreto” conn.Open() Dim Datos As New DataSet Dim Adaptador As New SqlDataAdapter( _ “select * from jobs”, conn) Adaptador.Fill(Datos, “Puestos”) conn.Close() dgvPuestos.DataSource = Datos.Tables(“Puestos”) dgvPuestos.Refresh() End Sub End Class

Ejecución guiada de VerPuestos 8.

9.

16

– Module1.vb

Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). De la línea 12 a la 17 se hace una conexión común a la base de datos.

544

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. En la línea 19 se declara un objeto DataSet. En la línea 20 se declara un objeto DataAdapter, que se encargará de resolver las discrepancias entre la forma en que DataSet y SQL Server representan el mismo modelo de datos. El constructor recibe dos parámetros: primeramente se proporciona una consulta de referencia que se almacena directamente en la propiedad SelectCommand de DataAdapter y determina el contenido de un miembro contenido en DataSet; posteriormente se proporciona la conexión sobre la que se intentarán las operaciones. DataSet constituye para nuestro objeto DataGridView un origen de datos (data source) en sí mismo y todas sus tablas constituyen un miembro de datos (data member), que en caso de ser más de uno, deberá especificarse de manera explícita. 11. Al aplicar el método DataAdapter.Fill de nuestro adaptador (línea 22), se cargan los datos contenidos en el almacén de datos a la copia local (DataSet). El constructor recibe dos argumentos: el nombre del DataSet al que será agregado el resultado de la consulta y el nombre de miembro que se desea asignar a dicho resultado. A fin de cuentas, al DataSet llamado Datos se le agregó un DataTable que representa el miembro Puestos. 12. Vea cómo la conexión se cierra en la línea 24, pero eso ya no importa, dado que ya tenemos los datos de la base en nuestra copia local. Todas las operaciones que podíamos realizar con el almacén de datos también son posibles ahora en nuestra copia local. 13. En la línea 26 se especifica que el origen de datos de nuestra rejilla es el miembro Puestos de nuestro DataSet. 14. En la línea 27 se refresca la rejilla de datos a fin de que muestre los datos finales. Si todo funcionó bien, nuestro programa mostrará los datos.

15. Cierre la aplicación. FIN DEL EJERCICIO *

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

545

Ejercicio 16.2 Uso de Data Sources, Typed Datasets y relaciones padre-hijo

En este ejercicio realizaremos un actualizador de puestos utilizando las facilidades visuales que Visual Studio nos ofrece para el trabajo con bases de datos desconectadas. La tabla de la cual queremos editar los datos es la de puestos (Jobs); cada registro de la tabla puede estar siendo utilizado por empleados que tienen asignado un puesto (employee), por lo que entre las tablas existe una relación padre-hijo. Este ejercicio requiere que se haya realizado el ejercicio 16.1, que definía una conexión a base de datos, que en nuestro caso se llama aprendaws.pubs.dbo, y en su caso se llamará instancia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado Puestos. Modifique las siguientes propiedades: Propiedad Form1.Text

Valor a asignar

Actualizador de puestos

➤ Creación de un origen de datos (Data Source) 4.

Los orígenes de datos (Data Sources) son orígenes de datos basados en DataSet con tipos (typed DataSet), que pueden ser definidos en tiempo de diseño. Para agregar un origen de datos, seleccione la opción Data – Show Data Sources (oprima las teclas Mayús-Alt-D) y fije la herramienta en el área de trabajo de Visual Studio. Al crear un origen de datos se agrega al proyecto un archivo XSD, que contendrá la representación formal del modelo de datos que queremos utilizar en nuestro programa, en formato XML. Por el momento, nuestro proyecto no posee ningún origen de datos.

16

546

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

5.

En Data Sources haga clic en el vínculo Add New Data Source..., o seleccione la opción Data – Add New Data Source, para agregar un origen de datos al proyecto. Aparecerá el asistente Data Source Configuration Wizard, que permite seleccionar entre diferentes fuentes de datos para el origen de datos: Database, si se trata de una conexión a un almacén físico de datos; Web Service, si se trata de una petición de datos vía Web, u Object, si se trata de cualquier contenedor de datos reconocido y existente, como podría ser un objeto de negocio. Lo más común es una base de datos. Seleccione Database y haga clic en Next>.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

6.

547

El asistente nos permitirá seleccionar una conexión de las definidas en nuestra solución. Seleccione la conexión instancia.pubs.dbo. Nuestra conexión se realiza utilizando la cuenta sa y la contraseña secreto. En producción es una muy mala práctica utilizar la cuenta sa de SQL Server; pero peor aún es incluir la contraseña de dicha cuenta en la cadena de conexión. Por cuestiones de simplicidad incluimos esta práctica, pero en entornos reales no lo haga (más adelante le diremos cómo manejar la conexión en forma segura). Haga clic en el botón de opción Yes, include sensitive data in the connection string. Si hace clic en [+] Connection String se dará cuenta de que la cadena de conexión expone información sensible (usuario y contraseña). Haga clic en el botón Next.

16

7.

El asistente permitirá almacenar la cadena de conexión en el archivo de configuración de la aplicación. Por lo pronto tome nota del nombre que le asigna a la conexión en el archivo de configuración: pubsConnectionString. Haga clic en el botón Next.

548

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

8.

9.

El asistente mostrará los elementos de la base de datos que se pueden representar en un Data Source. Expanda el nodo Tables y seleccione las tablas Employee y Jobs. Vea cómo el DataSet recibirá el nombre de pubsDataSet. Haga clic en el botón Finish.

Al hacer clic Visual Studio generará un Data Source y lo incluirá en su proyecto bajo la extensión XSD. Además de eso, agregará un archivo de configuración de la aplicación llamado, en el caso de las aplicaciones Windows, app.config. En ese archivo se agregará la cadena de conexión, para en un futuro poder utilizar la referencia a la constante que determinamos (pubsConnectionString), y que el usuario y la contraseña de la conexión no estén expuestos en el código. 10. Vaya a Solution Explorer, identifique el archivo pubsDataSet.xsd y haga doble clic en él. Aparecerá la representación gráfica del modelo de datos que actualmente tenemos en memoria. Como vemos, incluye los campos de las tablas seleccionadas, pero no sólo eso, ya que además reconoce una relación entre ellas; esto es un gran paso, ya que en el esquema conectado la representación de relaciones no era posible, dado que todo era un arreglo bidimensional de datos. Vea cómo también hay reconocimiento de llaves primarias.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

549

16

11. En Solution Explorer haga doble clic sobre el nodo app.config y compruebe que en el elemento existe otro elemento llamado , que incluye la definición de nuestra cadena de conexión. 12. Vea cómo Data Sources ha experimentado cambios.

550

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

➤ Creación de una aplicación de navegación de datos desde Data Sources 13. Haga doble clic en Puestos – Form1.vb para regresar al formulario en modo de diseño. 14. Vea cómo al agregar un origen de datos al proyecto, Data Sources obtiene contenido. FIGURA 16.2 Data Sources.

15. En Data Sources aparece el DataSet que se definió y, en forma jerárquica, aparecerán las tablas y las columnas que lo componen. Cada nodo de tabla y campo posee un selector de estilo que permite determinar la forma en que el objeto aparecerá en una interfaz gráfica. En el caso de los nodos que representan tablas, se puede seleccionar entre vista de rejilla (DataGridView), detalle de registro individual (Details) o no darle forma en interfaz (None). 16. Seleccione el nodo Jobs y especifique el estilo Details.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

551

16

17. En el caso de los nodos que representan columnas, los estilos disponibles son los siguientes: a) b) c) d) e) f) g)

TextBox, para un cuadro de texto ComboBox, para una lista desplegable de opciones Label, para que aparezca como etiqueta LinkLabel, para que aparezca como vínculo ListBox, para que aparezca como una lista de selección DateTimePicker, en el caso de campos de fecha None, en caso de que no queramos que aparezca en la interfaz.

18. Seleccione Jobs.min_lvl y el estilo NumericUpDown. Haga lo mismo con Jobs. max_lvl. Finalmente seleccione Job_id y seleccione el estilo Label para asegurarnos que no se modificará directamente la llave primaria. Es recomendable proteger las llaves primarias, particularmente cuando su modificación implica la necesidad de cambiar también datos en tablas relacionadas.

552

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

19. Arrastre el nodo Jobs de Data Sources a su formulario y vea lo que pasa.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

553

20. Acaba de crear una interfaz de edición y navegación de datos sin haber utilizado una sola línea de código. Por cada columna se agregaron objetos que permiten la visualización y edición de datos; a partir de estos objetos puede modificar propiedades. Por ejemplo, para el caso de la ilustración anterior, seleccionamos el objeto tipo Label en el que se mostrará Job_id y le cambiamos la propiedad Label.BorderStyle a Fixed3D. 21. Vea cómo en la parte baja aparecen los objetos que no tienen representación gráfica en la interfaz. Se colocó el DataSet que ya teníamos creado (PubsDataSet) y se creó un manejador de enlace de datos (BindingSource) de nombre JobsBindingSource. Se creó también un BindingNavigator, de nombre JobsBindingNavigator, que permite la navegación entre registros. Finalmente tenemos un DataAdapter que permitirá que los cambios que realicemos en el DataSet de forma desconectada puedan ser enviados al almacén de datos al aplicar el método DataAdapter.Update. 22. Se le llama data bound controls a los elementos de la interfaz involucrados en operaciones de enlazado de datos con una fuente de datos; a esto se le conoce como Data Binding. Al proporcionar un estilo a los elementos en Data Sources, cada elemento puede ser integrado con un simple arrastrar y colocar en la interfaz; dependiendo del estilo, se asumirán propiedades estándar que pueden ser modificadas. Si ya se tiene un control y se desea que opere como data bound control, basta con arrastrar el elemento a enlazar al control, para que la asociación se realice. 23. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 24. La barra de navegación (BindingNavigator) sirve para la navegación entre los registros de un DataSet y se compone de la siguiente manera: FIGURA 16.3 Binding Navigator.

16

554

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

25. Vaya al final, retroceda cuatro registros y vaya al inicio. Compruebe la forma en que los registros están asociados a la barra de navegación. 26. Cierre la aplicación.

➤ Adición de registros en modo desconectado y duplicación de modificaciones al almacén de datos 27. Todo lo que haga con los registros en su interfaz sucederá en la copia local de datos, es decir, en el DataSet. Cada registro en su DataSet es en realidad un objeto DataRow que se integra en la colección Rows de algún objeto DataTable. Cada DataRow tiene una propiedad DataRow.RowState, que puede tener los siguientes valores: Added, si el registro fue agregado; Deleted, si el registro fue borrado del DataSet; Modified, si el registro ha sido modificado, y Unchanged, si el registro se mantiene sin cambios. 28. Las tablas de un DataSet pueden reproducir los cambios hechos de forma desconectada a través de un DataAdapter. El DataAdapter posee cuatro propiedades de comando: a) b) c) d)

DataAdapter.SelectCommand DataAdapter.UpdateCommand DataAdapter.DeleteCommand DataAdapter.InsertCommand

Al aplicar el método DataAdapter.Update se hará una revisión de los objetos DataRow de la tabla; si DataRow.RowState es Added, se ejecutará el comando establecido en DataAdapter.InsertCommand sobre el almacén de datos; si es Deleted, se ejecutará el comando DataAdapter.DeleteCommand; si es Modified, se ejecutará el comando DataAdapter.UpdateCommand. 29. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 30. Vea el número de registros que reporta la barra de navegación. 31. Haga clic en agregar (Add new) , en la barra de navegación. Vea cómo en la barra de navegación se reporta un nuevo registro. En Job desc, coloque Vendedor Senior, en min lvl coloque 70 y en max lvl coloque 100. Este nuevo registro (DataRow) tendrá un estado (RowState) de agregado (Added). 32. Haga clic en guardar cambios (Save data) , en la barra de navegación. Se disparará el método DataAdapter.Update del adaptador que controla la información de la tabla; el proceso revisará el estado de todos los registros que tienen el estado Unchanged.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

555

Sólo encontrará un registro con estado Added, que provocará que se ejecute sobre el almacén de datos el comando guardado en DataAdapter.InsertCommand. El almacén de datos estará actualizado, y no hemos tenido la necesidad de codificar nada. 33. Cierre la aplicación.

➤ Generación de interfaz con registros padre-hijo en tiempo de diseño 34. Colóquese en tiempo de diseño en el formulario. 35. Vea cómo en Data Sources, en la tabla Jobs aparece un nodo que hace referencia a Employees. Esto quiere decir que de acuerdo con el modelo de datos existe una relación padre-hijo entre Jobs y Employees. 36. Para incluir en nuestra interfaz la información de los empleados que tienen un determinado puesto, basta con arrastrar a la interfaz el nodo Employee que se encuentra en Jobs. Es importante notar que el estilo que tiene asignado el nodo corresponde a DataGridView, por lo que se agregará a la interfaz en forma de rejilla. 37. Desde Data Sources, arrastre el nodo Employee que se encuentra en Jobs, abajo de los controles de detalle que la interfaz ya tiene. Acomode los objetos de su interfaz de tal forma que luzca de la siguiente manera: 38. Vea cómo se agregó un manejador de enlace de datos de empleados (EmployeeBin-

16

556

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

dingSource), así como un DataAdapter, por si se editan los datos desde la rejilla de datos que acabamos de agregar. 39. Construya la solución (oprima las Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (F5). 40. Utilice la barra de navegación a discreción y vea la manera en que se enlazan dinámicamente los registros de ambas tablas. En caso de que existan empleados con un determinado puesto, se mostrarán en la rejilla, cuando el puesto que tiene esté en los campos de detalle. 41. Nuestra interfaz se ve de la siguiente manera:

FIN DEL EJERCICIO *

Ejercicio 16.3 Actualizador de registros con Data Sources y enlazado de datos a un cuadro combinado En este ejercicio realizaremos un actualizador de ventas de títulos, utilizando Data Sources. Se verá la forma en que se pueden agregar expresiones a un origen de datos. Este ejer-

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

557

cicio requiere que se haya realizado el ejercicio 16.1, que definía una conexión a base de datos, que en nuestro caso se llama aprendaws.pubs.dbo, y en su caso se llamará instancia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server. 1. 2. 3.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). Agregue a su solución un proyecto Windows – Windows Application, llamado Ventas. Modifique las siguientes propiedades: Propiedad Form1.Text

4.

5.

6. 7. 8.

Valor a asignar

Registro de ventas

Agregue el origen de datos que requiere el programa. Abra la herramienta Data Sources, con la opción Data – Show Data Sources (oprimas las teclas Mayús-Alt-D); fije la herramienta en el área de trabajo de Visual Studio. En Data Sources haga clic en el vínculo Add New Data Source..., o seleccione la opción Data – Add New Data Source, para agregar un origen de datos al proyecto. Aparecerá el asistente Data Source Configuration Wizard. Seleccione Database y haga clic en Next>. Seleccione la conexión instancia.pubs.dbo. Haga clic en el botón de radio Yes, include sensitive data in the connection string. Haga clic en el botón Next. El asistente permitirá almacenar la cadena de conexión en el archivo de configuración de la aplicación. Deje el nombre que se propone por omisión y haga clic en el botón Next. El asistente mostrará los elementos de la base de datos que se pueden representar en un Data Source. Expanda el nodo Tables y seleccione las tablas Sales, Stores y Titles. Vea cómo el DataSet recibirá el nombre de pubsDataSet. Haga clic en el botón Finish.

➤ Personalización de cuadros combinados de tablas relacionadas 9.

En Data Sources deberán aparecer las tablas que se seleccionaron. Modifique el estilo de Sales a Detail y modifique el estilo de sales.stor_id a ComboBox. Los estilos deben quedar de la siguiente manera:

16

558

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Arrastre Sales a la interfaz, que deberá lucir de la siguiente forma:

11. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 12. Vea cómo en el cuadro combinado asociado a stor id aparecen los códigos, y no las descripciones, de la tienda. Por un lado eso es correcto, ya que en la tabla se almacena la clave y no la descripción; por otro lado, es antiestético y poco claro. Lo ideal es que se vean las descripciones, pero que se manejen internamente las claves. 13. Cierre la aplicación. 14. Cuando trabajamos con datos enlazados a un almacén de datos, estamos ante lo que se conoce como Data Binding. Las principales propiedades que entran en juego en operaciones de enlazado de datos son las siguientes: Propiedad

Función

DataSource

Representa el objeto que actuará como fuente de datos. Puede ser un elemento de datos en memoria (DataSet, DataTables, etc.) o flujos de datos (DataReader).

DisplayMember

Representa el objeto que provee el contenido a mostrar en el objeto.

ValueMember

Representa el objeto que provee el dato que internamente constituye el valor del control, para su utilización en procesamiento.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

559

DataBindings

Representa la colección de enlaces que se llevan a cabo a través del objeto.

SelectedIndex

Representa el subíndice del elemento seleccionado.

SelectedValue

Representa el valor del elemento seleccionado.

15. En tiempo de diseño seleccione el cuadro combinado asociado a stor id y despliegue el menú de acciones del control. Marque la casilla de verificación Use data bound items.

16

16. Al activar la casilla de verificación aparecen las propiedades involucradas en el enlazado de datos. 17. Seleccione en Data Sources el nodo Other Data Sources – Project Data Sources – pubsDataSet – stores.

560

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

18. Al hacer la selección se genera un nuevo enlace, al que se le da el nombre de storesBindingSource. Cada enlace que hacemos tendrá su propio identificador. 19. Para Display Member seleccione stor_name, y en Value Member seleccione stor_id. En Selected Value seleccione salesBindingSource – stor_id, que es el id que le corresponde al registro. 20. Finalmente, en Properties busque el grupo de propiedades DataBindings y seleccione None para que el texto que aparezca en el cuadro combinado sea el que le corresponde de acuerdo con los datos enlazados.

21. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas CTRL-MAYÚS-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 22. Navegue entre los registros y vea cómo en lugar de stor_id aparece stor_name. Si hacemos clic en el combo, aparecerán todas las tiendas de las cuales podemos seleccionar alguna.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

561

23. Cierre la aplicación. FIN DEL EJERCICIO *

16

562

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

563

TERMINOLOGÍA AcceptChanges, 536 Adaptador de datos, 535 Add, 531 CaseSensitive, 539 Clear, 531, 539 Clone, 539 Constraint, 530, 541 ConstraintCollection, 530 Contains, 531 Copy, 540 CopyTo, 531 Count, 531 Data Binding, 553 bound controls, 553 Source Configuration Wizard, 546 Sources, 550 DataAdapter, 535

DataBindings, 559 DataColumn, 530, 541 DataColumnCollection, 530 DataRelation, 530 DataRelationCollection, 530 DataRow, 541 DataRowCollection, 530 DataSet sin tipos, 535 DataSource, 558 DataTable, 530, 541 DataTableCollection, 530 DataView, 530 Datos, objetos de, 541 DeleteCommand, 536 DisplayMember, 558

Dispose, 537, 540 Disposed, 538, 540 DuringFill, 536 EnforceConstraints, 539 Esquema, 538 objetos de, 541 Fill, 535, 537 FillSchema, 535, 537 Finalize, 538 GetFillParameters, 537 GetXml, 540-1 GetXmlSchema, 540-1 InsertCommand, 536 Item, 531 Objetos de esquema, 541 de datos, 541 OnFillError, 538 ReadXml, 540-1

ReadXmlSchema, 540-1 Relation(s), 539, 541 Remove, 531 Reset, 540 Rows, 530 RowUpdated, 538 RowUpdating, 538 Schema, 538 SelectCommand, 536 SelectedIndex, 559 SelectedValue, 559 Tables, 539 Untyped DataSet, 535 Update, 537 UpdateCommand, 536 ValueMember, 558 WriteXml, 540-1 WriteXmlSchema, 540-1

16

564

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

PREGUNTAS 16.1 Mencione los objetos que componen el modelo de objetos DataSet. 16.2 Mencione qué colecciones permiten la organización de objetos Data

Set.

16.3 Mencione para qué sirve DataAdapter y cuáles son sus miembros más importantes. 16.4 Mencione cuáles son los miembros más importantes de DataSet. 16.5 Mencione qué métodos de DataSet permiten la integración de XML.

Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows

565

Notas:

16

566

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Es el objeto más importante del Modelo de Objetos DataSet: a) DataAdapter b) DataSet c) DataRow 2. No forma parte del Modelo de Objetos DataSet: a) DataAdapter b) DataTable c) DataRow 3. La colección Rows tiene dependencia con el objeto: a) DataSet b) DataTable c) DataAdapter 4. La variable de trabajo utilizada por For Each debe ser: a) .De la misma naturaleza (tipo) que los objetos referidos por la colección que se desea explorar b) .Un Object genérico c) .DataTable 5. En una aplicación de base de datos, es necesario incluir la siguiente librería sólo si se trabaja con DataSet: a) System.Data.dll b) System.Windows.Forms.dll c) System.Xml.dll

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6. Para leer información, DataSet es más rápido que DataReader. 7. Cada objeto DataTable posee su propia colección Rows. 8. El uso de DataAdapter es opcional cuando se quiere cargar información de un almacén de datos a un DataSet. 9. DataSet utiliza HTML para la comunicación de paquetes de datos autodescriptivos. 10. Sólo a través de DataSet podemos disponer de un modelo de datos relacional en memoria local (caché).

CAPÍTULO

17

Manejo de bases de datos desde aplicaciones Web Objetivos: Aprender el manejo de bases de datos en modo parcialmente conectado utilizando ASP.NET. 1. Conocerá los Data Source Controls y su función. 2. Conocerá los Data Bound Controls. 3. Aprenderá la forma en que conviven los Data Source Controls y Data Bound Controls. 4. Aprenderá a desarrollar aplicaciones de actualización de bases de datos con el máximo uso de las herramientas de Visual Studio.

567

568

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Data Source Controls y Data Bound Controls. . . . . . . . . . . . . . . . . . . . . . . . . Data Source Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data Bound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Establecimiento de un enlazado de datos hacia un GridView . . ➤ Adición y configuración de un SqlDataSource . . . . . . . . ➤ Adición y configuración de un GridView . . . . . . . . . . . . Actualizador de bases de datos desconectadas con ASP.NET . . . ➤ Adición y configuración de un objeto DetailsView . . . . ➤ Personalización de campos en DetailsView . . . . . . . . . . ➤ Análisis de las plantillas de los campos en DetailsView . ➤ Establecimiento de los comandos para la afectación de datos vía SqlDataSource . . . . . . . . . . . . . . . . . . . . . . ➤ Especificación de la funcionalidad disponible en DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

569 569 570 572 572 576 579 580 581 584 587 592 596 597 597 599

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

569

Uno de los aspectos que mayores cambios experimentó .NET Framework, con respecto a la versión 1.1, es el desarrollo en ASP.NET. Son tantos los cambios introducidos en la versión 2.0 de .NET Framework que se ha dado la diferencia en nombre: ASP.NET 2.0. ASP.NET redujo la cantidad de programación al máximo, permitiendo la mayor cantidad de funcionalidad con un mínimo de líneas de código escritas por el desarrollador. En el caso del soporte a las aplicaciones de base de datos, el cambio es exponencial. Si además de eso estamos desarrollando en Visual Studio, el código es, prácticamente, cosa del pasado (al menos en la capa de presentación de las aplicaciones y el enlazado de datos).

Data Source Controls y Data Bound Controls En ASP.NET se aceptan todos los objetos de acceso a datos ADO.NET para el trabajo en modo conectado; sin embargo, podemos aprovechar la simplicidad que ofrece ASP.NET para el manejo complejo de datos. Esto significa que de forma declarativa, es decir con base sobre todo en etiquetas de hipertexto en una página, se pueden especificar tareas que con anterioridad requerían de programación. En ASP.NET no se requiere codificar nada para realizar las siguientes actividades relacionadas con los datos: 1. 2. 3. 4. 5.

Seleccionar y desplegar datos. Ordenar, paginar y guardar datos en caché. Actualizar, insertar y eliminar datos. Aplicar filtros de datos en tiempo de ejecución. Crear escenarios de registro maestro–detalle.

Data Source Controls Se conoce como Data Source Controls a los controles Web que permiten la conexión con un almacén de datos, así como a las operaciones de lectura y escritura. Los principales Data Source Controls son los siguientes: Data Source Control

Descripción

ObjectDataSource

Representa un origen de datos basado en objetos de negocio. Es cuando los datos no se reciben de un proveedor de datos .NET, sino de un objeto o clase.

SqlDataSource

Representa un acceso a bases de datos vía los proveedores de datos ADO.NET (managed data providers como OleDbClient, SQLClient, OracleClient, etcétera)

17

570

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

AccessDataSource

Representa un acceso a una base de datos en Microsoft Access.

XMLDataSource

Representa el consumo de datos desde un archivo XML, especialmente diseñado para su utilización desde controles Web jerárquicos como TreeView o Menu.

SiteMapDataSource

Representa un conjunto de datos utilizable en el mecanismo de navegación entre páginas de ASP.NET

Data Bound Controls Se conoce como Data Bound Controls a los controles que sirven como un canal de acceso directo a un origen de datos desde el navegador; este tipo de controles se enlazan a una determinada fuente de datos y mantienen los contenidos actualizados de forma dinámica, conforme el usuario hace variaciones en los apuntadores de datos y registros. Los Data Bound Controls guardan una estrecha relación con los Data Source Controls, ya que de éstos obtienen los datos a enlazar. Es necesario especificar el Data Source Control que alimenta de datos al Data Bound Control a través de la propiedad DataSourceId. Algunos de los Data Bound Controls principales son los siguientes: Data Source Control

Descripción

BulletedList

Muestra los datos en forma de una lista de viñetas.

CheckBoxList

Muestra los datos en forma de una lista de selección, en donde cada elemento es una casilla de verificación.

DropDownList

Muestra los datos en forma de una lista desplegable de selección (combo).

ListBox

Muestra los datos en forma de una lista de selección de tamaño fijo.

RadioButtonList

Muestra los datos en forma de un conjunto de botones de opción.

AdRotator

Muestra anuncios publicitarios.

DataList

Muestra los datos en forma de tabla. Cada elemento es mostrado de acuerdo a una plantilla (template) que es definida por el usuario.

DetailsView

Muestra un registro de datos en forma tabular y permite la edición, eliminación e inserción de registros.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

571

FormView

Muestra un registro de datos en forma personalizada y permite la edición, eliminación e inserción de registros.

GridView

Despliega datos en una tabla y permite edición, actualización, ordenación y paginado.

Menu

Muestra un menú dinámico.

Repeater

Muestra datos en forma de una lista cuyo formato puede personalizarse usando plantillas.

TreeView

Muestra datos en forma de un árbol jerárquico de nodos.

Dependiendo del objeto de que se trate serán las propiedades que se deban establecer para el manejo de datos desde la Web. En el caso de objetos de lista de selección (BulletedList, CheckBoxList, DropDownList, ListBox y RadioButtonList) cada registro de la fuente de datos (Row) representará un elemento (Item) del objeto. Los elementos se almacenarán en una colección llamada Items. Cada registro de la fuente de datos contendrá campos (Fields), que pueden jugar un papel importante en el manejo enlazado; por ejemplo, generalmente la información textual que se ve en la interfaz no es lo que deseamos que internamente se maneje para los procesos y el almacenamiento. Para especificar el campo que queremos que se muestre en la interfaz utilizamos la propiedad ListControl.DataTextField; para especificar el campo que el programa utiliza para efectos de procesamiento y almacenamiento, utilizamos la propiedad ListControl.DataValueField. Cuando se selecciona un elemento, el índice del elemento se almacena en la propiedad ListControl.SelectedIndex, el elemento se almacena en ListControl.SelectedItem y el valor del elemento se almacena en la propiedad ListControl.SelectedValue. El evento predeterminado de este tipo de objetos es ListControl.SelectedIndexChanged, que sucede cuando el elemento seleccionado cambia. El método WebControl.DataBind es el que realiza el enlazado entre el Data Source Control y el Data Bound Control.

17

572

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 17.1 Establecimiento de un enlazado de datos hacia un GridView En este ejercicio se realiza un enlazado a un objeto GridView, para mostrar el contenido de un origen de datos de forma tabular, con paginación y con posibilidad de ordenamiento. El enlazado que se realiza es de una vía, ya que sólo se realizan actividades de lectura. 1. 2.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, invoque el menú de contexto, seleccione la opción Add New Item y agregue una Web Form de nombre Enlazado01.aspx.

➤ Adición y configuración de un SqlDataSource 3.

Agregue a la interfaz un objeto SqlDataSource. El objeto se agregará a la interfaz. Utilice la smart tag del control y seleccione la opción Configure Data Source.

4.

Aparecerá el asistente de configuración de Data Source. Haga clic en New Connection, a fin de definir una nueva conexión para nuestros proyectos Web.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

5.

573

Aparecerá el asistente de conexión. Coloque el nombre de su servidor en Server Name. En nuestro caso es APRENDAWS, aunque usted deberá especificar el pertinente. Se elige Use SQL Server Authentication y se proporciona el usuario y la contraseña de acceso. Elija Select or enter a database name y especifique pubs como base de datos de trabajo. Presione Test connection para comprobar que la conexión es posible. Si la conexión es satisfactoria, haga clic en el botón Ok, con lo que aparecerá nuevamente el asistente de configuración de conexión.

17

574

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6.

El nombre que se le asignó a su conexión es aprendaws.pubs.dbo. Haga clic en el botón Next.

7.

Se recomienda que la conexión se almacene como variable en el archivo de configuración, que en el caso de Web se trata de Web.config. El asistente solicitará el nombre que deseamos darle a la conexión en el archivo de configuración. Asegúrese de que la casilla de verificación Yes, save this connection as esté seleccionada, y escriba en el cuadro de texto el nombre ConexionDBWeb.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

8.

575

La conexión nos servirá para trabajar con datos de alguna tabla de la base de datos pubs. Seleccione la opción Specify columns from a table or view y en el cuadro combinado de nombres de tabla seleccione sales (ventas). Al hacer esto aparecerán las columnas de la tabla en el espacio Columns; marque la casilla de verificación que muestra un asterisco con el fin de que se incluyan todas las columnas de la tabla. Haga clic en el botón Next.

17

9.

Aparecerá en el asistente una ventana de prueba. Haga clic en Test query y vea si los datos se extraen satisfactoriamente. En caso de que así sea, haga clic en el botón Finish.

576

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

10. Con esto ya ha quedado configurada una conexión que puede ser utilizada por nuestra aplicación a través del objeto SqlDataSource1, y que mostrará las ventas de libros que se encuentran almacenadas en la base de datos pubs.

➤ Adición y configuración de un GridView 11. Agregue a la interfaz un objeto GridView. Organice los objetos en la página de tal manera que luzca de la siguiente manera:

12. Utilice la smart tag de GridView y modifique Choose Data Source, eligiendo SqlDataSource1, que es el nombre de nuestro objeto de origen de datos.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

577

13. Al seleccionar el origen de datos, automáticamente cambiará el contenido del DataView, mostrando un contenido ajustado a la información contenida en el Data Source.

14. En la smart tag de GridView seleccione Auto Format. En la lista Select a scheme, seleccione la opción Rainy Day y haga clic en el botón Ok. De esa forma le habremos proporcionado un formato a nuestros datos.

17

15. En la smart tag de GridView marque las casillas de verificación Enable paging y Enable sorting, para que sea posible paginar el contenido y ordenar los datos cuando hagamos clic en el encabezado de la rejilla de datos.

Ejecución guiada de http://localhost/apvbnetvs/

– Enlazado01.aspx

16. Utilice Solution Explorer para establecer http://localhost/apvbnetvs/ como proyecto de inicio de la solución (StartUp Project). Seleccione la página Enlaza-

578

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

como página de inicio (Set as Start Page). Guarde todos los cambios que ha realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5).

do01.aspx

17. En la barra inferior del GridView aparecen vínculos que refieren a las páginas de datos. Haga clic en dichos vínculos para que aprecie cómo el contenido de la tabla sales se ha distribuido en varias páginas; seguramente la última página posee menos elementos que las demás. 18. En la parte superior de GridView aparecen los encabezados en forma de vínculos. Al hacer clic en ellos los datos se ordenarán por dicha columna. 19. Cierre la aplicación. 20. En este ejercicio vimos cómo se generó un Data Source Object (SqlDataSource) y cómo se utilizó a través de un Data Bound Control (GridView). FIN DEL EJERCICIO *

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

579

Ejercicio 17.2 Actualizador de bases de datos desconectadas con ASP.NET Este ejercicio realiza un actualizador de registros (altas, bajas, cambios y consultas), utilizando las facilidades que Visual Studio provee a ASP.NET. En este ejercicio se realiza un enlazado de datos de dos vías, dado que se realizan operaciones de lectura y escritura. 1. 2.

3. 4.

Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). En Solution Explorer seleccione el proyecto http://localhost/apnetspvs, despliegue el menú contextual, seleccione la opción Add New Item y agregue una Web Form de nombre Enlazado02.aspx. Agregue a la interfaz un objeto SqlDataSource. Utilice la smart tag del control y seleccione la opción Configure Data Source. En el asistente, seleccione ConexionDBWeb en la pregunta Which data connection should your application use to connect to the database? y haga clic en el botón Next.

17

5.

Seleccione la tabla jobs y especifique que desea trabajar con todos los campos de la tabla (*). Haga clic en el botón Next.

580

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6.

Haga clic en el botón Finish para concluir con la definición del nombre del origen de datos será SqlDataSource1.

SqlDataSource.

El

➤ Adición y configuración de un objeto DetailsView 7.

Agregue un objeto DetailsView a la interfaz. Se le asignará el nombre DetailsView1 de manera predeterminada. 8. La clase DetailsView permite definir un objeto que muestra un registro a la vez proveniente de un origen de datos; con este objeto es posible proporcionar formato estándar basado en plantillas (templates) e instrumentar acciones de edición, borrado e inserción de registros. 9. En conjunto con SqlDataSource, DetailsView se encarga de crear internamente un DataSet, construir objetos de recopilación de datos y lanzar comandos de actualización al almacén físico de datos. 10. Utilizando la smart tag de DetailsView, en Choose Data Source elija SqlDataSource1, que es el origen de datos que ya definimos.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

581

11. Automáticamente se habrán colocado los campos que contiene SqlDataSource en forma de parejas de valores. En términos generales, cada línea del objeto DetailsView es un campo (Field), se pueden agregar campos que no están definidos en SqlDataSource e incluso se pueden agregar campos relacionados con el comportamiento de DetailsView con respecto a las actividades de edición, eliminación e inserción de registros nuevos. 12. Utilizando los delimitadores de tamaño, aumente el ancho del objeto DetailsView1. 13. Utilizando la smart tag de DetailsView1 seleccione Auto Format... y luego el formato Slate.

17 14. Nuestra interfaz debe lucir de la siguiente forma:

➤ Personalización de campos en DetailsView 15. Utilizando la smart tag de DetailsView1, seleccione la opción Edit Fields.., para editar los campos involucrados en la interfaz. Aparecerá la ventana Fields. Esta herra-

582

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

mienta se compone de tres elementos principales: la lista de campos disponibles (Available fields), que permite seleccionar los objetos que han de verse en la interfaz que representa DetailsView1; la lista de campos seleccionados (Selected fields), que permite seleccionar los campos que ya han sido integrados a la interfaz a través de DetailsView1; y las propiedades de campos enlazados (BoundField properties), que permite modificar las propiedades de los campos enlazados.

16. El vínculo Convert this field into a TemplateField es un elemento fundamental de la ventana Fields, dado que permite manejar un campo de DetailsView como objeto TemplateField. Los objetos TemplateField son campos personalizados que permiten la visualización y el uso de un control enlazado, habilitando comportamientos variados a partir de plantillas (templates). Esto implica que un mismo control enlazado puede verse y comportarse de diferente manera, de acuerdo con la plantilla que le apliquemos en un momento dado. 17. Al seleccionar un campo en Selected fields, las propiedades de este elemento se muestran y editan en BoundField properties. En nuestro caso, los campos devueltos por SqlDataSource1 aparecen en la lista Selected fields (éstos fueron agregados automáticamente). 18. Elija en Selected Fields el campo job_id. En BoundField properties busque la propiedad HeaderText y coloque el valor Id del puesto: oprima la tecla Intro para aceptar. Haga clic en el vínculo Convert this field into a TemplateField, para disponer de varias máscaras de comportamiento para job_id. Vea cómo la referencia del campo cambia en Selected Fields, tanto en la descripción como en el icono.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

583

19. Repita el procedimiento para los demás campos. Elija en Selected Fields el campo job_desc. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Descripción:, y haga clic en el vínculo Convert this field into a TemplateField. 20. Elija en Selected Fields el campo min_lvl. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Nivel mínimo:, y haga clic en el vínculo Convert this field into a TemplateField. 21. Elija en Selected Fields el campo max_lvl. Modifique en BoundField properties la propiedad HeaderText, colocando el valor Nivel máximo:, y haga clic en el vínculo Convert this field into a TemplateField. 22. En Available fields seleccione el nodo CommandField. Haga clic Add. CommandField permitirá controlar las operaciones de su interfaz. 23. Elija en Selected Fields el campo CommandField, y en BoundField properties, cambie las siguientes propiedades: Propiedad

Valor a asignar

ButtonType

Button Cancelar Borrar registro Modificar datos Insertar Nuevo registro Consulta Actualizar

CancelText DeleteText EditText InsertText NewText SelectText UpdateText

17

584

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

24. Haga clic en el botón Ok. Nuestra interfaz debe lucir de la siguiente forma:

➤ Análisis de las plantillas de los campos en DetailsView 25. Ya ha preparado su objeto DetailsView para el manejo de datos y el diálogo con el objeto SqlDataSource. Para que las operaciones que realicemos en DetailsView se trasladen al almacén de datos, es necesario que definamos las instrucciones SQL que han de aplicar al momento de presionar tal o cual botón de la interfaz (además, seguramente las instrucciones SQL que proporcionemos requieren los valores que estamos manejando en la interfaz). 26. Lo primero que debemos saber es el nombre de los objetos a través de los cuales DetailsView manejará los campos de SqlDataSource. Para ello, en la smart tag de

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

DetailsView1

585

seleccione Edit Templates, con lo cual se mostrará un selector de plan-

tillas.

27. En el cuadro combinado Display de la smart tag seleccione Field[0]

- Id del puesto:.

17

28. Con ello se mostrarán todas las vistas y comportamientos disponibles para el campo Id del puesto. Vea cómo existen distintas formas en que el campo puede verse y comportarse. ItemTemplate será la vista general del campo, AlternatingItemTemplate es la forma en que lucirá el campo en caso de alternado de colores, EditItemTemplate es la forma en que lucirá en caso de que se proceda a la edición del campo, InsertItemTemplate es la forma en que se manejará el campo en caso de inserción de registros y HeaderTemplate es la forma en que aparecerá el encabezado del campo.

586

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

29. Visual Studio ha detectado que jobs_id (campo al que se enlaza el campo de DetailsView1) es de tipo identity en la base de datos, por lo que no puede hacer otra cosa que mostrar el dato de dicho campo. 30. Utilizando la smart tag de DetailsView1, en Display, seleccione Field[1] – Descripción. Vea cómo este campo admite operaciones de edición en la base de datos e incluye cuadros de texto en los escenarios de edición e inserción.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

587

31. Haga clic sobre el cuadro de texto (TextBox) del escenario EditItemTemplate. Despliegue Properties (oprima la tecla F4) y vea cuál es el valor de la propiedad Id del cuadro de texto donde se manejará el campo job_desc. El objeto se llama TextBox1. Si revisáramos todos los objetos que manejan los campos, tendríamos lo siguiente: Campo en la base de datos

Campo en DetailsView1

Control en Templates

job_id

Id del Puesto

Label1

Descripción

TextBox1

min_lvl

Nivel mínimo

TextBox2

max_lvl

Nivel máximo

TextBox3

job_desc

32. Despliegue la smart tag de DetailsView1 y seleccione el vínculo End Template Editing.

➤ Establecimiento de los comandos para la afectación de datos vía SqlDataSource 33. En tiempo de diseño seleccione el objeto SqlDataSource1. Abra Properties (oprima la tecla F4). 34. Modifique el valor de la propiedad DeleteQuery, haciendo clic en el botón que despliega el Command and Parameter Editor .

35. Haga clic en el botón Query Builder para que Command and Parameter Editor le asista en la elaboración de la instrucción de eliminado de datos. Aparecerá la ventana

17

588

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Add Table, en la cual se especifican las tablas involucradas en la instrucción SQL a construir. Seleccione jobs y haga clic en Add. Se integrarán las tablas a Query Builder, por lo que puede cerrar Add Table haciendo clic en Close.

36. Query Builder se divide en cuatro secciones o paneles (panes): el de diagrama, el de selección y asignación, el de instrucción textual y el de los resultados de la ejecución del comando. En el panel de selección y asignación seleccione en Column el campo job_id, en Table escriba jobs y en Filter escriba =@job_id. Haga clic en el botón Ok. para regresar a Command and Parameter Editor. Automáticamente se actualizará la instrucción SQL, quedando como sigue: FIGURA 17.1 Estructura de Query Builder – Panes.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

589

37. La instrucción SQL que auxiliará a SqlDataSource en la eliminación de datos ha quedado como sigue: DELETE FROM jobs WHERE (job_id = @job_id)

38. Como puede darse cuenta, se está haciendo uso de un parámetro que no ha sido declarado en ninguna parte (@job_id). 39. Haga clic en el botón Add Parameter de Command and Parameter Editor. Se agregará un parámetro en Parameters. Escriba en la columna Name el nombre del parámetro @job_id. En el cuadro combinado Parameter source seleccione Form, lo que indica que se tomará el valor que se tenga en el formulario que dinámicamente creará DetailsView1. Finalmente, escriba en FormField el nombre del campo que en las plantillas contiene la información de job_id, es decir Label1. Haga clic en el botón Ok.

17

40. De esta forma, el comando interactúa con DetailsView1 para construir la instrucción SQL que se ejecutará sobre el almacén de datos vía SqlDataSource1. El comando, obviamente, eliminará el registro en que nos encontremos. 41. Modifique el valor de la propiedad InsertQuery, haciendo clic en el botón que invoca el Command and Parameter Editor . Utilice Query Builder para la construcción de la instrucción INSERT. Seleccione la tabla jobs nuevamente y seleccione sólo los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado que la llave primaria es identity. Vea cómo al seleccionar los campos en el diagrama, éstos se agregan en el panel de selección y asignación. Para cada una de las columnas se deberá especificar un parámetro con el mismo nombre, anteponiendo el símbolo de arroba. Los parámetros se colocarán en la columna New Value. Presione el botón Ok.

590

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

42. La instrucción SQL que auxiliará a SqlDataSource en la inserción de datos ha quedado de la siguiente manera: INSERT INTO jobs(job_desc, min_lvl, max_lvl) VALUES (@job_desc, @min_lvl, @max_lvl)

43. Agregue los parámetros que acabamos de definir en la instrucción (@job_desc, @min_lvl, y @max_lvl). Al igual que el parámetro @job_id, estos parámetros recibirán los datos de la forma (Form), con los Form fields siguientes: TextBox1, TextBox2 y TextBox3, respectivamente.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

591

44. Modifique el valor de la propiedad UpdateQuery, haciendo clic en el botón que invoca el Command and Parameter Editor . Utilice Query Builder para la construcción de la instrucción UPDATE. Seleccione la tabla jobs nuevamente y seleccione sólo los campos que no forman la llave primaria (job_desc, min_lvl, max_lvl), dado que la llave primaria es identity y no se puede modificar. Vea cómo al seleccionar los campos en el diagrama, éstos se agregan en el panel de selección y asignación; para cada una de las columnas se deberá especificar un parámetro con el mismo nombre, anteponiendo el símbolo de arroba. Los parámetros se colocarán en la columna New Value . Oprima el botón Ok. 45. En este caso es muy importante no olvidar el filtro de modificación en el panel de selección y asignación para evitar la sustitución de valores para todos los registros. Después de los campos que se han agregado automáticamente agregue manualmente job_id en Columns y jobs en Table; no seleccione la casilla de verificación Set y en Filter escriba =@job_id.

17

46. La instrucción SQL que auxiliará a SqlDataSource en la modificación de datos ha quedado como sigue. UPDATE jobs SET job_desc = @job_desc, min_lvl = @min_lvl, max_lvl = @max_lvl WHERE (job_id = @job_id)

47. Agregue los parámetros que acabamos de definir en la instrucción (@job_desc, @min_lvl, @max_lvl y @job_id). Estos parámetros recibirán los datos de la forma (Form) con los siguientes Form fields: TextBox1, TextBox2, TextBox3 y Label1, respectivamente.

592

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

48.

ya es capaz de ejecutar instrucciones SQL sobre el almacén de datos, en coordinación con los valores que recopilará DetailsView.

SqlDataSource

➤ Especificación de la funcionalidad disponible en DetailsView 49. Ya que hemos realizado las definiciones que hacen posible que DetailsView y SqlDataSource manejen todas las opciones de un actualizador, es necesario indicarle a la página qué funciones queremos disponibles. 50. Desde la smart tag de DetailsView1, marque las casillas de verificación Enable Paging para que la muestra de registros admita paginación; Enable Inserting, para que se permita insertar nuevos registros; Enable Editing, para que se permita la modificación de datos; y finalmente Enable Deliting, para que se permita la eliminación de registros.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

Ejecución guiada de http://localhost/apvbnetvs/

593

– Enlazado02.aspx

51. Utilizando Solution Explorer establezca el proyecto http://localhost/apvbnetvs/ como proyecto de inicio de la solución (StartUp Project); seleccione la página Enlazado02.aspx como página de inicio (Set as Start Page). Guarde todos los cambios que ha realizado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 52. Inicialmente se puede observar que DetailsView está haciendo el enlazado y la información se muestra en el formato especificado.

17

53. Haga clic en los vínculos numerados de la parte baja de DetailsView. Esos vínculos son de paginación; corresponde un vínculo a cada uno de los registros extraídos del origen de datos. Lo que vemos está en memoria, en un objeto DataSet (estamos trabajando de forma desconectada). 54. Haga clic en el botón Nuevo registro. Cambiará la interfaz, mostrando los campos en el contexto de inserción de datos, InsertItemTemplate. Escriba en Descripción el dato Programador AP; en Nivel mínimo escriba 60; en Nivel máximo escriba 100. Haga clic en el botón Insertar.

594

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

55. Al hacer clic en Insertar, DetailsView le proporciona los valores de parámetro al comando SQL asignado a la propiedad InsertQuery de SqlDataSource1, e intenta el método Update sobre el DataSet de trabajo. Al hacerlo, el comando de inserción reproduce la instrucción SQL de agregado de datos sobre el almacén de datos físicos. En resumen, hemos agregado un registro a una base de datos en modo desconectado. 56. Utilice la paginación hasta que vea el registro que acaba de agregar. El id asignado puede variar, dependiendo de los registros que tenga en su base.

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

595

57. Haga clic en Modificar datos. En Descripción cambie a Programador AP-DEV, en Nivel mínimo a 70 y en Nivel máximo a 120. Haga clic en el botón Actualizar.

58. Utilice la paginación para colocarse en el registro que acaba de modificar y vea cómo los datos se han actualizado.

59. Haga clic en Borrar registros. Su registro se habrá borrado. 60. Lo importante de todo es que para toda esta funcionalidad no fue necesario escribir una sola línea de código. FIN DEL EJERCICIO *

17

596

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

MAPA

MENTAL DEL CAPÍTULO

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

597

TERMINOLOGÍA AccessDataSource, 570 AdRotator, 570 BulletedList, 570 Campos, 571 CheckBoxList, 570 Command and Parameter Editor, 589 Data Bound Controls, 570 Source Controls, 569

DataBind, 571 DataList, 570 DataTextField, 571 DataValueField, 571 DetailsView, 570 DropDownList, 570 Fields, 571 FormView, 571 GridView, 570 ListBox, 570 Menu, 571 ObjectDataSource, 569

Panel de diagrama, 588 de instrucción textual, 588 de resultados de ejecución de comandos, 588 de selección y asignación, 588 RadioButtonList, 570 Repeater, 571

SelectedIndex, 571 SelectedIndexChange, 571 SelectedItem, 571 SelectedValue, 571 SelectedValueField, 571 SiteMapDataSource, 570 Smart Tag, 576 SqlDataSource, 569 TreeView, 571 XML Data Source, 570

PREGUNTAS 17.1 ¿Para qué sirven los Data Source Controls? 17.2 ¿Cuáles son los Data Source Controls más comunes? 17.3 ¿Para qué sirven los Data Bound Controls? 17.4 ¿Cuáles son los Data Bound Controls más comunes? 17.5 ¿Qué Data Source Controls y Data Bound Controls cree que utilizará en su ámbito profesional?

17

598

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Notas:

Capítulo 17. Manejo de bases de datos desde Aplicaciones Web

EXAMEN

599

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Controles ASP.NET que de forma declarativa permiten la conexión con bases de datos, además de realizar lectura y escritura de datos: a) Data Source Controls b) Data Bound Controls c) Data Provider Objects 2. Controles ASP.NET que permiten el canal de acceso directo a un origen de datos desde el navegador: a) Data Source Controls b) Data Bound Controls c) Data Provider Objects 3. Muestra un registro de una tabla en forma tabular y permite la edición, eliminación e inserción de registros: a) DetailsView b) GridView c) Repeater 4. Representa el origen de datos requeridos por TreeView y Menu: a) .ObjectDataSource b) .XMLDataSource c) .HieracySource 5. Método que establece el enlazado de datos entre el Data Bound Control y el Data Source Control: a) DataBinding b) Bind c) DataBind

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6. ASP.NET 1.1 y ASP.NET 2.0 proporcionan mecanismos para establecer de forma declarativa actividades que antes requerían codificación ADO.NET. 7. SqlDataSource sólo permite el manejo de datos almacenados en bases de datos de SQL Server. 8. AccessDataSource sólo permite el manejo de datos almacenados en bases de datos de Access. 9. Los Data Source Controls utilizan los datos que proveen los Data Bound Controls. 10. En ASP.NET 2.0 es posible realizar un actualizador de base de datos sin necesidad de codificar nada manualmente.

17

CAPÍTULO

18

Colecciones genéricas (generics) Objetivos: Aprender las generalidades de las clases para manejo de colecciones genéricas. 1. Se familiarizará con las generics y sus formas de implementación. 2. Aprenderá a instrumentar generics en bloques de código. 3. Aprenderá a instrumentar generics en colecciones. 4. Conocerá el uso de List. 5. Conocerá el uso de Queue. 6. Conocerá el uso de Stack. 7. Conocerá el uso de Dictionary.

601

602

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Contenido Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bloques de código usando generics . . . . . . . . . . . . . . . . . . . . . . . . . . Programación de un método dinámico usando Generics Colecciones genéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementación de List (Generics). . . . . . . . . . . . . . . . . . Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementación de Queue (Generics) . . . . . . . . . . . . . . . Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementación de Stack (Generics) . . . . . . . . . . . . . . . . Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Implementación de Dictionary (Generics) . . . . . . . . . . . . Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..

603 604 604 607 607 608 610 610 613 613 616 616 619 620 620 622

Capítulo 18. Colecciones genéricas (generics)

603

Generics La versión 2.0 de .NET Framework aporta múltiples mejoras a clases existentes de BCL, además de reorganizar y reclasificar algunos de los recursos. Una de las principales capacidades totalmente nuevas que introduce la versión 2.0 son las implementaciones genéricas. Las implementaciones genéricas, mejor conocidas como Generics, son la funcionalidad proporcionada por CLR con el fin de que clases, estructuras, interfaces y métodos puedan utilizar datos de entrada de tipo indeterminado (que se resolverá al llamar a ejecución). En otras palabras, son implementaciones donde no sólo los valores de los datos son intercambiables, sino también sus tipos. Este concepto es muy similar a los templates manejados por C++, que tenían, a grandes rasgos, la misma funcionalidad. Para darnos una idea de por qué es necesario introducir estos elementos a los lenguajes .NET, considere el caso hipotético descrito a continuación. Imagine que tiene una base de datos con información bibliográfica, y que cuenta con una clase para realizar una búsqueda compleja; en ella se puede proporcionar el nombre del título (de tipo String) o bien el ISBN (un dato Double). Dado que no se sabe si la información proporcionada será un String o un Double, será necesario manejar datos de tipo Object, que no son eficientes; además, la codificación de la clase tendría que anticiparse a los posibles conflictos de diferencia de tipo. Una alternativa sería hacer procedimientos distintos dependiendo del tipo de dato proporcionado o, de plano, implementar objetos con polimorfismo. Si además queremos que los programas sean type safe, el programa se complicará más dado que deberemos estar al pendiente de cualquier conversión de datos. Generics ofrece una solución práctica al problema. Con generics, el tipo de dato es intercambiable y se especifica al momento de la declaración en tiempo de ejecución. De esa forma se codifica un solo procedimiento capaz de manejar más de un tipo de dato de manera transparente. La funcionalidad de generics puede darse en dos formas generales: ❑ Bloques de código Es el tipo de uso de generics por medio del cual clases y méto-

dos se implementan con parámetros cuyo tipo de dato a utilizar es especificado al momento de llamar a ejecución. ❒ Colecciones Son colecciones preconstruidas que permiten la especificación en tiempo de ejecución del tipo de dato a almacenar.

18

604

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Bloques de código usando generics El uso de generics en bloques de código permite definir argumentos o parámetros cuyo tipo de dato no está predefinido para la clase o método sino hasta que se manda llamar a ejecución. La forma de implementar generics en esta modalidad es especificando la variabilidad de algún dato parametrizado, mediante el uso de la especificación Of T: Of T) Class MiClase(O Public Dato As T Sub Muestra() Console.WriteLine(Dato) End Sub End Class

En este ejemplo, la clase MiClase utiliza generics de tal manera que los datos útiles para el proceso pueden ser de cualquier tipo (pero que se especificará al momento de la instanciación). El método Muestra expondrá el dato proporcionado a la clase sin importar su tipo. Al momento de consumir la clase es necesario hacer referencia al tipo de datos que se desea utilizar; esto se lleva a cabo a través de la especificación Of, característica de generics. Dim A As New MiClase(Of Integer) A.Dato = 10 A.Muestra() Dim B As New MiClase(Of String) B.Dato = “Mensaje” B.Muestra()

El procedimiento no requiere de modificación alguna para funcionar con datos de diferentes tipos, pero al mismo tiempo es type safe. Este mismo procedimiento puede intentarse sin utilizar generics, pero en caso de especificar Option Strict On, quedarían al descubierto las conversiones implícitas que el programa realiza. En el caso de no realizarse las conversiones explícitas se provocaría una excepción.

Ejercicio 18.1 Programación de un método dinámico usando Generics En este ejercicio comprobaremos la funcionalidad de generics mediante un procedimiento que puede manejar información de entrada de diferentes tipos de dato. El programa será

Capítulo 18. Colecciones genéricas (generics)

605

type safe, con el fin de hacer evidente que no es necesario realizar conversiones explícitas de datos con el uso adecuado de generics. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoGenerics. 3. Edite el programa de tal forma que aparezca de la siguiente forma:

Codificación de UsoGenerics 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

– Module1.vb

Option Strict On Imports System.Console Module Module1 Sub Main() Dim X As Integer = 5 Dim Y As Integer = 7 WriteLine(“I = “ & X) WriteLine(“J = “ & Y) Intercambia(Of Integer)(X, Y) WriteLine(“I = “ & X) WriteLine(“J = “ & Y)

Dim W As String = “Juan” Dim Z As String = “María” WriteLine(“S = “ & W) WriteLine(“R = “ & Z) Intercambia(Of String)(W, Z) WriteLine(“S = “ & W) WriteLine(“R = “ & Z) Write(“Presiona INTRO”) ReadLine() End Sub Sub Intercambia(Of T)(ByRef a As T, ByRef b As T) Dim Paso As T Paso = a a = b b = Paso End Sub End Module

18

606

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejecución guiada de UsoGenerics

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. En las líneas 1 y 2 se garantiza que el programa sea type safe; con ello nos aseguraremos de que no realice conversiones implícitas (que irían en contra del concepto de uso de generics). 6. En la línea 29 se declara un procedimiento denominado Intercambia, que está preparado para manejar un tipo de dato de forma genérica (T). Este tipo de dato es indeterminado en código, pero deberá ser especificado al momento de mandar llamar a ejecución el procedimiento. 7. El procedimiento Intercambia recibirá dos argumentos (a, dato que le especifiquemos al generic (T).

b),

que serán del tipo de

8. Lo que el procedimiento hace es muy sencillo: declara una variable de paso que tendrá el mismo tipo de dato que el especificado al momento de la ejecución. El programa asigna el valor del primer argumento a la variable de paso para no perder el valor; luego asigna el valor del segundo argumento al primero, y el valor de la variable de paso al segundo argumento. Con ello se habrán intercambiado los valores. El primer argumento tendrá el valor que tenía el segundo y viceversa. 9. Al mandar a ejecutar el procedimiento (líneas 11 y 20), se especifica el tipo de dato que deberá utilizar el procedimiento, en sustitución del tipo indeterminado (T). Los valores proporcionados al procedimiento corresponden al mismo tipo de dato, dado que así fueron especificados. Si todo ocurrió como se esperaba, la salida será la siguiente: I = 5 J = 7 I = 7 J = 5 S = Juan R = María S = María R = Juan Presiona INTRO

FIN DEL EJERCICIO*

Capítulo 18. Colecciones genéricas (generics)

607

Colecciones genéricas Las colecciones genéricas son aquellas en las cuales el tipo de datos de sus elementos sólo es conocido hasta el momento de su declaración. Las colecciones genéricas o generics más importantes son las siguientes: ❑ List: Representa un conjunto de elementos común. ❑ Queue: Representa un conjunto de elementos de tipo FIFO (First In – First Out)

Primero en entrar, primero en salir. Representa un conjunto de elementos de tipo LIFO (Last In – First Out) Último en entrar, primero en salir. ❑ Dictionary: Representa un conjunto de elementos en donde una llave está relacionada con un valor determinado. ❑ Stack:

La forma de especificar este tipo de generics es, simplemente, declarándolo. Dim

MiColección As

New

ColecciónGeneric(Of

T

[,Tipo])

Donde MiColección es el nombre de la colección, ColecciónGeneric es el tipo de colección que deseamos especificar. La especificación Of T es obligatoria para generics; a través de ésta definiremos el tipo de dato que deseamos que utilice el procedimiento. Se debe sustituir la T por el tipo de dato que deseamos que el programa maneje. En el caso de Dictionary, es necesario especificar el tipo de dato a almacenar como valor de diccionario. Ese punto se verá más adelante.

List

18

Es la colección generic que representa un conjunto de elementos común; es la más sencilla, dado que no tiene comportamientos implícitos en su naturaleza. Sus miembros más importantes son los siguientes: Propiedad o método

Uso

Capacity

Número de elementos que la colección puede contener.

Count

Número de elementos en la colección.

Item

Representa un elemento de la colección.

Add

Permite agregar un elemento a la colección.

Clear

Elimina todos los elementos de la colección.

Find

Devuelve la primera ocurrencia de un elemento determinado en la colección.

Insert

Inserta un elemento en la lista.

Remove

Remueve un elemento de la colección.

608

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Ejercicio 18.2 Implementación de List (Generics) En este ejercicio comprobaremos la funcionalidad de la colección List. El programa preguntará una serie de números y los desplegará en el orden en que se capturaron. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoList. 3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de UsoList 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

– Module1.vb

Imports System.Console Module Module1 Dim lstNumeros As New List(Of Integer) Sub Main() Dim strNumero As String Do While True Write(“Capture un número (omitir para finalizar):”) strNumero = ReadLine() If strNumero = “” Then Resultados() Write(“Pulse INTRO”) ReadLine() Exit Do Else lstNumeros.Add(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For Each Entero As Integer In lstNumeros WriteLine(Entero.ToString()) Next End Sub End Module

Capítulo 18. Colecciones genéricas (generics)

Ejecución guiada de UsoList

609

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. De la línea 9 a la 20 se tiene un ciclo que estará preguntando números enteros; cuando no se proporcione información, se dará por concluido el ciclo. 6. Lo importante del programa es la implementación de List, que aparece en la línea 4. Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer. 7. Por cada iteración del ciclo se pregunta un número (líneas 10 y 11); en caso de que la captura no sea nula (línea 17) se agrega a la colección la conversión a Integer de lo capturado (línea 18). De esa forma se va poblando la colección; a diferencia de los arreglos, una colección de tipo List no requiere saber de forma predefinida el número de elementos que tendrá, por lo que constituye una mejor utilización de recursos. Esto evita un problema general de los arreglos, que al requerir la especificación predeterminada del número de elementos que lo componen, siempre se corre el riesgo de haber definido muy pocos, lo que causa excepciones de desbordamiento, o demasiados, lo que produce el uso innecesario de recursos. 8. En caso de que se omita la entrada, se asume que ya no se desea capturar más información (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la colección. 9. Capture 10, 20, 30, 40 y 50. 10.

Resultados

solamente muestra el contenido de la colección (líneas 23 a la 27).

Si todo ocurrió como se esperaba, la salida será la siguiente. Capture un número Capture un número Capture un número Capture un número Capture un número Capture un número 10 20 30 40 50 Pulse INTRO

FIN DEL EJERCICIO*

(omitir (omitir (omitir (omitir (omitir (omitir

para para para para para para

finalizar):10 finalizar):20 finalizar):30 finalizar):40 finalizar):50 finalizar):

18

610

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Queue Es la colección generic que representa un conjunto de elementos FIFO (First In – First Out / Primero en entrar, primero en salir). Sus miembros más importantes son los siguientes: Propiedad o método

Uso

Count

Número de elementos en la colección.

Clear

Elimina todos los elementos de la colección.

Dequeue

Elimina un elemento y devuelve el control al primer elemento de la cola.

Enqueue

Agrega un elemento al final de la cola.

Peek

Devuelve el control al primer elemento, sin eliminar ningún elemento.

ToArray

Copia los elementos de la colección a un arreglo.

Ejercicio 18.3 Implementación de Queue (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Queue. El programa preguntará una serie de números, pero sólo interesan los últimos tres que se capturen y que se mostrarán al final. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoQueue. 3. Edite el programa de tal forma que aparezca de la siguiente manera:

Capítulo 18. Colecciones genéricas (generics)

Codificación de UsoQueue 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

611

– Module1.vb

Imports System.Console Module Module1 Dim queNumeros As New Queue(Of Integer) Sub Main() Dim strNumero As String Do While True Write(“Capture un número (omitir para finalizar):”) strNumero = ReadLine() If strNumero = “” Then Resultados() Write(“Pulse INTRO”) ReadLine() Exit Do Else If queNumeros.Count = 3 Then queNumeros.Dequeue() End If queNumeros.Enqueue(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For Each Entero As Integer In queNumeros WriteLine(Entero.ToString()) Next End Sub End Module

Ejecución guiada de UsoQueue

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. El funcionamiento del programa es muy similar al ejercicio anterior. A través de un ciclo se preguntan datos; al omitir uno se asume que ya no se desea capturar más.

18

612

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

6. Lo importante del programa es la implementación de Queue, que aparece en la línea 4. Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer. 7. Por cada iteración del ciclo, se pregunta un número (líneas 10 y 11); en caso de que la captura no sea nula (línea 12) se agrega a la colección la conversión a Integer de lo capturado (línea 21). De esa forma se va poblando la colección. 8. En caso de que se omita la entrada, se asume que ya no se desea capturar más información (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la colección. 9. Capture 10, 20, 30, 40 y 50. 10. Como sólo vamos a permitir 3 elementos, se realiza una validación: si el número de elementos es 3 quiere decir que ya no se debe aceptar uno más, a menos de que uno de los elementos ya existentes salga. 11. Si el número de elementos es 3 (línea 18), se instruye a la colección a eliminar uno de los elementos (línea 19). Como el comportamiento de la colección es FIFO, saldrá primero el que haya entrado primero. 12. Resultados solamente muestra los últimos tres elementos capturados, dado que los primeros que se capturaron fueron saliendo al tratar de agregar un elemento más cuando ya había 3 elementos en la colección. Si todo ocurrió como se esperaba, la salida será la siguiente. Capture un número (omitir para finalizar):10 Capture un número (omitir para finalizar):20 Capture un número (omitir para finalizar):30 Capture un número (omitir para finalizar):40 Capture un número (omitir para finalizar):50 Capture un número (omitir para finalizar): 30 40 50 Pulse INTRO

FIN DEL EJERCICIO*

Capítulo 18. Colecciones genéricas (generics)

613

Stack Es la colección generic que representa un conjunto de elementos LIFO (Last In – First Out / Último en entrar, primero en salir ). Sus miembros más importantes son los siguientes: Propiedad o método

Uso

Count

Número de elementos en la colección.

Clear

Elimina todos los elementos de la colección.

Peek

Devuelve el control al primer elemento, sin eliminar ningún elemento.

Pop

Elimina un elemento y retorna el control al primer elemento de la pila (stack).

Push

Inserta un elemento al inicio de la pila.

ToArray

Copia los elementos de la colección a un arreglo.

Ejercicio 18.4 Implementación de Stack (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Stack. El programa preguntará una serie de números. Se demostrará el comportamiento LIFO de la colección. 1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoStack. 3. Edite el programa de tal forma que aparezca de la siguiente forma:

18

614

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Codificación de UsoStack 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

– Module1.vb

Imports System.Console Module Module1 Dim staNumeros As New Stack(Of Integer) Sub Main() Dim strNumero As String Do While True Write(“Capture un número (omitir para finalizar):”) strNumero = ReadLine() If strNumero = “” Then Resultados() Write(“Pulse INTRO”) ReadLine() Exit Do Else staNumeros.Push(CType(strNumero, Integer)) End If Loop End Sub Sub Resultados() For i As Integer = 0 To staNumeros.Count - 1 WriteLine(staNumeros.Pop.ToString()) Next WriteLine(“—- Elementos que quedaron en Stack —-”) For Each Entero As Integer In staNumeros WriteLine(Entero.ToString()) Next WriteLine(“—- Fin de elementos —-”) End Sub End Module

Ejecución guiada de UsoStack

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. El funcionamiento del programa es muy similar al ejercicio anterior. A través de un ciclo se preguntan datos; al omitir uno se asume que ya no se desea capturar más.

Capítulo 18. Colecciones genéricas (generics)

615

6.

Lo importante del programa es la implementación de Stack, que aparece en la línea 4. Vea cómo se decide que el tipo de dato a utilizar en la colección es Integer.

7.

Por cada iteración del ciclo, se pregunta un número (líneas 10 y 11); en caso de que la captura no sea nula (línea 12) se agrega a la colección la conversión a Integer de lo capturado (línea 18). De esa forma se va poblando la colección.

8.

En caso de que se omita la entrada, se asume que ya no se desea capturar más información (línea 12), y se procede a ejecutar el procedimiento Resultados, que muestra el contenido de la colección.

9.

Capture 10, 20, 30, 40 y 50.

10. Al ejecutarse Resultados (línea 23) se utiliza un For Next para la inspección de los elementos (línea 24). La información se extrae utilizando el método Pop, que tiene la particularidad de eliminar el elemento al mismo tiempo que lo lee. Se mostrarán los elementos, del último capturado al primero capturado. Al concluir el proceso, la colección habrá quedado sin elementos. 11. Las líneas 27 a la 31 se encargan de demostrar que ya no hay elementos en la colección, una vez que se leyeron utilizando Pop. Si todo ocurrió como se esperaba, la salida será la siguiente. Capture un número (omitir para finalizar):10 Capture un número (omitir para finalizar):20 Capture un número (omitir para finalizar):30 Capture un número (omitir para finalizar):40 Capture un número (omitir para finalizar):50 Capture un número (omitir para finalizar): 50 40 30 20 10 —- Elementos que quedaron en Stack ——- Fin de elementos —Pulse INTRO

FIN DEL EJERCICIO*

18

616

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

Dictionary Es la colección generic que representa un conjunto de elementos donde una llave está relacionada con un valor. En el caso de Dictionary, es necesario especificar el tipo de dato que tienen los valores asociados a la llave. Sus miembros más importantes son los siguientes: Propiedad o método

Uso

Count

Número de elementos en la colección.

Item

Representa un elemento de la colección.

Keys

Representa la colección de llaves.

Values

Representa la colección de valores.

Add

Agrega un elemento a la colección.

Clear

Elimina los elementos de la colección.

ContainsKey

Determina si en la colección existe un valor de llave determinada.

ContainsValue

Determina si en la colección existe un determinado valor.

Remove

Elimina un elemento de la colección.

Este ejemplo declara un diccionario, carga tres elementos y despliega el valor correspondiente en una de las llaves. Dim Pais As New Dictionary(Of T String, String) Pais.Add(“MX”, “México”) Pais.Add(“EU”, “Estados Unidos”) Pais.Add(“CN”, “Canadá”) Console.WriteLine(Pais(“MX”))

Ejercicio 18.5 Implementación de Dictionary (Generics)

En este ejercicio comprobaremos la funcionalidad de la colección Dictionary. El programa preguntará una serie de números. Se demostrará el comportamiento LIFO de la colección.

Capítulo 18. Colecciones genéricas (generics)

617

1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (archivo de extensión sln). 2. Agregue a su solución un proyecto Windows – Console Application, llamado UsoDictionary. 3. Edite el programa de tal forma que aparezca de la siguiente manera:

Codificación de UsoDictionary 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

– Module1.vb

Imports System.Console Module Module1 Dim dicPCard As New Dictionary(Of String, String) Sub Main() Dim strInicial As String dicPCard.Add(“N”, dicPCard.Add(“S”, dicPCard.Add(“E”, dicPCard.Add(“O”,

“Norte”) “Sur”) “Este”) “Oeste”)

Write(“Dame la inicial de un punto cardinal:”) strInicial = ReadLine() WriteLine(“Inicial de {0}”, dicPCard(strInicial)) Write(“Presione INTRO”) ReadLine() End Sub End Module

Ejecución guiada de UsoDictionary

– Module1.vb

4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya realizado en la solución (teclas Ctrl-Mayús-S). Inicie la depuración para comprobar el comportamiento de su programa (tecla F5). 5. Lo importante del programa es la implementación de Dictionary, que aparece en la línea 4. Vea cómo se decide que el tipo de dato a utilizar como llave es String, y que

18

618

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

el dato de valor asociado a la llave también es String. Dada la especificación Of, el tipo de dato de la llave puede ser intercambiable en un momento dado. 6. De la línea 9 a la 12 se puebla con datos la colección. Simplemente se almacenan los puntos cardinales y se les coloca una inicial como llave. 7. En las líneas 14 y 15 se pregunta por una inicial de un punto cardinal. Capture la letra N. 8. La línea 17 muestra el valor asociado a la llave proporcionada. Como puede ver, para recuperar el valor asociado a una llave sólo es necesario colocar el nombre de la colección y, entre paréntesis, el valor de la llave cuyo valor deseamos recuperar. 9. Si todo ocurrió como se esperaba, la salida será la siguiente. Dame la inicial de un punto cardinal:N Inicial de Norte Presione INTRO

FIN DEL EJERCICIO*

Capítulo 18. Colecciones genéricas (generics)

MAPA

619

MENTAL DEL CAPÍTULO

18

620

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

TERMINOLOGÍA Colecciones genéricas, 607 Dictionary, 616 Generics, 603 Implementaciones genéricas, 603 List, 607 Of, especificación, 604 Queue, 610 Stack, 613 Templates, 603

PREGUNTAS 18.1 ¿En qué consisten las generics? 18.2 ¿Cuáles son las dos formas generales de implementar generics? 18.3 ¿En qué casos se recomienda el uso de generics, en relación a los arreglos? 18.4 Mencione cuáles son las colecciones generics más usuales y explique sus diferencias.

Capítulo 18. Colecciones genéricas (generics)

621

Notas:

18

622

Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005

EXAMEN

RÁPIDO DEL CAPÍTULO

Parte 1: Marque con una cruz el inciso que responda a la pregunta. 1. Permite que clases, estructuras, interfaces y métodos utilicen datos de entrada de tipo indeterminado: a) Untyped Arrays b) Generics c) Collections 2. Es la especificación requerida por los tipos para la implementación de generics: a) Of T b) By Val c) IndexOf 3. Es la colección generic que tiene comportamiento LIFO a) Queue b) Stack c) Dictionary 4. Es la colección generic que tiene comportamiento FIFO a) Queue b) Stack c) Dictionary 5. Es el método que permite ir al primer elemento recuperable en una colección generic sin eliminarlo (puede aplicarse a Queue y Stack): a) Enqueue b) GoTop c) Peek

Parte 2: Coloque en la línea la letra «F» si el enunciado es falso y «V» si es verdadero. 6. Generics sólo funciona en .NET Framework 1.1 y 2.0. 7. Generics sólo se pueden implementar a través de alguna de las colecciones de tipo generic. 8. Generics tiene la misma filosofía que tienen los templates en el lenguaje Java. 9. Generic permite el intercambio de tipos de datos de modo type safe. 10. Generics es más eficiente que los arreglos, dado que no es necesario especificar un número de elementos predeterminado, lo que permite un manejo más eficiente de los recursos.