.Net
.Net
.Net
Descargas de la web
Aprenda a utilizar Visual Studio como los profesionales, Presentaciones profesionales
obteniendo en el menor tiempo y con la mínima codificación para exposición
las aplicaciones más robustas y eficientes.
Videos explicativos que apoyan
el aprendizaje de los temas
Código fuente de los ejercicios
Aprenda la estructura general del lenguaje Visual Basic.NET; aprenda del libro, y archivos complementarios
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. .NET Framework 2.0
Visual Studio 2005
SQL Server 2000 / 2005
Cursos / Certificaciones
Aprenda los elementos de la programación orientada a objetos
y diseño de forma gráfica clases con herencia y polimorfismo. 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 - PRESENTACIONES -
interfaces gráficas basadas en Windows y en Web Aprenda practicando CAP-Dev 2005: - VIDEOS -
usando las Windows Forms mejoradas y ASP.NET 2.0, y - EJERCICIOS -
2015
aprenda a diseñar y consumir Servicios Web XML - SOPORTE ON LINE -
Visítenos en:
www.pearsoneducacion.net
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
ISBN: 978-970-26-0912-4
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, regis-
trarse 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.
Preguntas 597
Examen rápido del capítulo 599
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 bus-
cas caminos lícitos y honestos para tender los puentes, te daráss cuenta de que resulta di-
fí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 sende-
ros. 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 Sa-
lazar, 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 re-
visión línea a línea de los programas.
Como siempre, mi agradecimiento especial a Isela Martínez por el delicado esmero que ha-
ce de un texto opaco un texto con algo de brillo. Siempre es bueno que los libros tengan un
ángel de la guarda.
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 ex-
plicaciones de nadie y por lo tanto tiene control total de su propio proceso de aprendizaje.
A ese tipo de lector le sugerimos esto:
1. 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, da-
do que están estructurados en una secuencia funcional.
2. 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 siguien-
te: 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.
3. 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 nue-
vo 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.
Al iniciar un tema…
1. El instructor/facilitador deberá dominar el tema a instruir; previo a la instrucción, de-
berá responder a las preguntas, realizar los ejercicios, realizar las prácticas individua-
les y responder a la perfección el examen rápido.
2. Los equipos en los que se pretendan demostrar los ejercicios deberán estar configura-
dos con los requerimientos mínimos que aparecen en la primera parte de esta sección.
3. 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.
4. 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.
5. Lo ideal, para demostrar que la tecnología estudiada es útil, es citar su experiencia per-
sonal en el uso de estas herramientas de desarrollo. También esto contribuye a aumen-
tar el interés en su exposición.
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
Parte 1
2 .NET como
multiplataforma de Plataforma .NET versión 2005
desarrollo
3 Técnicas de desarrollo En esta parte del libro se estudian los componentes
con Visual Studio 2005 y particularidades de la plataforma de desarrollo
Microsoft .NET, en su versión 2005.
3
4 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Definición de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Capas principales de la plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Capa de lenguajes de .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
CLS (Common Language Specification) . . . . . . . . . . . . . . . . . . . . . . . . . 9
Lenguajes .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
.NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Capa de servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Biblioteca de clases base de .NET Framework (BCL) . . . . . . . . . . . . . . . 12
Independencia de la biblioteca de clases y los lenguajes . . . . . . . . . . . 15
CLR (Common Language Runtime) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Compilador para generar código intermedio . . . . . . . . . . . . . . . . . . . . 17
Global Assembly Cache (GAC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Análisis de las entradas del Caché global para ensamblado
(GAC, Global Assembly Cache) . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
.NET PE (.NET Portable Executable) versus PE/COFF . . . . . . . . . . . . . . . 21
Identificación de diferencias en programas ejecutables,
usando el desensamblador de .NET (ildasm.exe) . . . . . . . . . . . . 23
Compiladores JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Impacto de .NET Framework en los sistemas operativos . . . . . . . . . . . . . . . . 27
Modificación al cargador de ejecutables . . . . . . . . . . . . . . . . . . . . . . . 27
Registro de biblioteca de clases base . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Prerrequisitos del sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Ventajas que brinda la infraestructura de .NET . . . . . . . . . . . . . . . . . . . . . . . 28
Convivencia de .NET y COM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Capítulo 1. Arquitectura de la plataforma .NET 5
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 Prac-
ticando.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).
Problemas que elimina .NET Algunos de los inconvenientes que se eliminan con .NET son:
Uno de los mayores retos implicados en el aprendizaje de cualquier lenguaje .NET es en-
tender la forma en que esta plataforma trabaja. Por otro lado, existen muchos tecnicismos
ligados a esta tecnología que es necesario conocer.
NOTA
FIGURA 1.1
Estructura de la
plataforma .NET
Capítulo 1. Arquitectura de la plataforma .NET 9
NOTA
HolaMundo.cs
1 using system;
2 class HolaMundo
3 {
4 static void Main()
5 {
6 Console.WriteLine(“Hola Mundo”);
8 }
9 }
Vea cómo el código es sorprendentemente parecido. Todos los lenguajes en .NET compar-
ten 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 sa-
crificar 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 implemen-
tar nuevos lenguajes nunca había sido tan atractiva. Lo ideal para mucha gente sería dispo-
ner 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 propor-
ciona interoperabilidad entre los mismos. En virtud de que todos los lenguajes .NET cum-
plen 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
.NET Framework
Capa de servicios
Con esto en mente, es fácil concluir que los programas desarrollados en .NET tienen co-
mo 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 aplicacio-
nes: algunas permiten crear objetos que desarrollan cálculos matemáticos o trigonométri-
cos, otras permiten definir objetos que permiten la realización de gráficos, otras más per-
miten crear objetos a través de los cuales es posible manipular bases de datos, etcétera.
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 com-
pone de más de 150 archivos DLL, en los cuales se encuentran diseminadas las clases que
Composición
de la
componen la biblioteca de clases base.
plataforma
.NET Espacios de nombres (Namespaces). Tratar de encontrar librerías por nombre de ar-
chivo físico es bastante problemático. Las clases, como son tantas, se han categorizado y
Capítulo 1. Arquitectura de la plataforma .NET 13
La forma más fácil de explorar la jerarquía de clases de .NET Framework es mediante la ayu-
da electrónica del producto. También está disponible una versión impresa, a través de Micro-
soft Press, a un precio no muy accesible para todos. Recomendamos el uso de los medios elec-
tró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 de-
rivan 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 utiliza-
das 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 (refe-
rencia lógica).
Para la referencia física es necesario que, al compilar, se establezca la referencia a la libre-
rí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 im-
port, using, include, etcétera, para que el programa pueda navegar sin problemas en la je-
rarquía de clases contenidas en la librería. La instrucción a utilizar varía en función al len-
guaje 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 ta-
rea determinada.
Código type safe. Cuando los métodos de los objetos y los types utilizados por el pro-
grama son reconocidos por la plataforma .NET (como consecuencia de que todas las libre-
rí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.
14 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 1.2
Organización de
clases en BCL
Capítulo 1. Arquitectura de la plataforma .NET 15
Namespace.Class[.Type]
Además, todos los lenguajes tienen el soporte de un mismo entorno integrado de desarro-
llo, llamado Visual Studio, con el cual es posible codificar al mismo tiempo múltiples pro-
yectos 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 bi-
blioteca de clases (Class Foundation), sus propias jerarquías y su propia sintaxis de invo-
cación. La experiencia que se ganaba con un lenguaje no servía de mucho al intentar desa-
rrollar 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 pro-
blemas 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 equi-
pos de desarrollo, ya que la especialización puede darse ahora en la solución de los proble-
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.
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 co-
loca 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 simplifi-
cada 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.
1
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.
ción relativa al programa y su entorno como tipos de datos, versión del programa, referen-
cias externas a librerías, etcétera.
La diferencia entre un ejecutable .NET y uno que no lo es radica en la existencia del metada-
tos. 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 computado-
ra 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 ba-
jo 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 (In-
termediate 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. Ca-
da ensamblado posee un manifiesto (assembly manifest), que es donde se almacenan los 1
metadatos.
El manifiesto es parte integral del ensamblado mismo, y en él se almacena la siguiente in-
formación:
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 compar-
tido (shared). También es posible que existan otros desarrolladores en la misma organiza-
ció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 permi-
tirlo .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 constitu-
ye un identificador único del componente.
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 re-
ferencia 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 disponi-
bles. 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 Frame-
work 2.0 Configuration. Se despliega la herramienta de configuración de .NET Frame-
work 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
5. Existe una columna llamada Public Key Token, que contiene una clave GUID (Identifi-
cador global único, Global Unique Identifier), ¿para qué cree que sirva dicha clave?
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 gene-
rados en versiones anteriores de Visual Basic 6.0 y los generados en .NET. Es muy proba-
ble 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, pe-
ro 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.
22 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 1.4
Diferencia de
ejecutables .NET
1
ildasm/TEXT NombreEjecutable/HEADER
Ejercicio 1.2
Identificación de diferencias en programas ejecutables, usando el desen-
samblador de .NET (ildasm.exe)
Desensamblará dos ejecutables para determinar cuál de los dos es un ejecutable .NET.
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?
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 sec-
ciones 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 consi-
derá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 compi-
ladores 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 en-
samblado y los recursos disponibles del sistema en que se está ejecutando el ensamblado. A 1
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, transfor-
mando el código intermedio que se encuentra en la sección de datos CLR en su equivalen-
te a código nativo de la máquina, considerando la plataforma de la misma y la disponibili-
dad de recursos.
NOTA
El hecho de que se realice la compilación JIT la primera vez que se ejecuta un programa eje-
cutable 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 deter-
mina 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 distin-
tos, 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 basa-
do 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 to-
das las plataformas, y es el CLR a través del compilador JIT el que genera el código nati-
vo 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 na-
tivo: C++.
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 eje-
cució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 estandari-
zación de sistemas de información y comunicación, un subconjunto funcional del CLR, deno-
minado 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, hacien-
do posible que las aplicaciones desarrolladas en .NET puedan ser ejecutadas en dichas plata-
formas sin modificar el código.
Proceso de Se solicita
ejecución .NET ejecución de
ensamblado
Se busca en
Assembly Cache
una imagen nativa
del Assembly
¿Se encontró
No imagen? Si
Compilador JIT
realiza la fase de ¿Es imagen
síntesis de No
vigente?
compilación
Si
Se ejecuta la
imagen nativa
Fin
Capítulo 1. Arquitectura de la plataforma .NET 27
Ya se indicó que los ejecutables de .NET no son iguales a los ejecutables PE/COFF; el sis-
tema 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.
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 algu-
na forma.
28 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
❑ 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 inteligen-
te de los componentes de una aplicación. La capa de presentación y la de reglas de ne-
gocio 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 ma-
nera 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 insta-
lar el CLI en ellas.
❑ El desarrollo de aplicaciones nunca había sido tan diverso: se pueden desarrollar aplica-
ciones 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, inclu-
1
yendo 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 en-
lazarnos a una liga en Internet; no se requerirán inversiones fuertes por compra de soft-
ware, 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 determina-
das herramientas de desarrollo podrán colaborar de manera coordinada. Los programa-
dores de C++, C#, Visual Basic y Java podrán contribuir con partes de una misma solu-
ció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 facili-
dades proporcionadas por el CLR, que gestionará por nosotros las características de ca-
da 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 pue-
de desarrollar aplicaciones.
Visual Studio no es necesario para desarrollar. Por supuesto, ayuda enormemente, pero en ca-
so de que no disponga de dicho software, puede editar el código en cualquier editor de tex-
tos, como el Bloc de Notas (NotePad.exe), compilar su programa y ejecutarlo.
TERMINOLOGÍA
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?
34 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 desarro-
llo, y los elementos de .NET:
a) ASP.NET Application Services y Windows Application Services
b) XML Web Services
c) CLR
7. Las clases de .NET Framework están disponibles para todos los lenguajes de .NET.
10. .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 apli-
caciones de consola, Windows y Web con el mismo lenguaje de programación.
35
36 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Determinación de la plataforma .NET requerida . . . . . . . . . . . . . . . . . . . . . . 37
Propósito de usar .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Tipos de aplicaciones posibles en .NET . . . . . . . . . . . . . . . . . . . . . . . . . 37
Interacción con bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Alcance operativo de la plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Tecnología de bus y procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Productos de plataforma .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
.NET Framework 2.0 Redistributable Package . . . . . . . . . . . . . . . . . . . . 40
.NET Framework 2.0 SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
.NET Compact Framework 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Visual Studio 2005 Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Selección del producto adecuado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Consideraciones respecto del idioma de los productos . . . . . . . . . . . . . 46
Comprobación del funcionamiento de la plataforma .NET . . . . . . . . . 46
Determinación de los productos .NET a instalar en un
escenario de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Desarrollo de aplicaciones en .NET usando SDK . . . . . . . . . . . . . . . . . . . . . . 49
Compilación de programas desde línea de comandos . . . . . . . . . . . . . 49
Aplicaciones de consola (Console Applications) . . . . . . . . . . . . . . . . . . 49
Aplicaciones Windows (Windows Applications) . . . . . . . . . . . . . . . . . . 50
Aplicaciones Web (Web Applications) . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Desarrollo y compilación de un programa desde la
línea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Tecnologías cubiertas en este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 nue-
vo 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 pla-
taforma 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 de-
cidir 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 2
software, así como lo que es necesario hacer para ejecutar aplicaciones desarrolladas en es-
ta 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 diferen-
tes tipos de dispositivos.
Determinación de la plataforma
.NET requerida
La primera pregunta a plantear es: ¿Para qué queremos tener la plataforma .NET en nues-
tros equipos?
.NET cubre una gama sorprendente de aplicaciones. El producto .NET a instalar, los re-
querimientos de hardware y software correspondientes, y el precio a pagar dependen de lo
que se desee hacer.
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 Pro-
fessional (Service Pack 3 o superior recomendado), Microsoft Windows 2000 Server (Ser-
vice 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 Win- 2
dows 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.
sarrollo con SDK es mucho mayor que utilizando herramientas gráficas de desarrollo. Op-
te 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 ver-
sió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 Win-
dows 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 ar-
chivo a descargar tiene el mismo nombre, debe descargarse la versión adecuada a la plata-
forma 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.
Para otras versiones de Visual Studio 2005, consulte las especificaciones técnicas en el si-
tio 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 uti-
lizar. En caso de este libro seleccionamos las preferencias para un desarrollador en Visual Stu-
dio (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 haga-
mos 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.
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 Mo-
bile Software for Pocket PC 2003, Windows Mobile 5.0 for Pocket PC and Smartphone,
Windows CE .NET 5.0 o superiores.
La versión 2.0/2005 de los productos que componen la tecnología Microsoft .NET pueden
seleccionarse atendiendo los siguientes parámetros:
46 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 2.2
Selección de
producto
NOTA
2
En su equipo ya debe estar instalado el software que requiere para trabajar. Se trabajará des-
de línea de comandos para mejorar el entendimiento de la plataforma; posteriormente se tra-
bajará con Visual Studio 2005 para mayor rapidez. Se debe tener instalado en su equipo Mi-
crosoft .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
sobre Windows Server 2003, Datacenter x64 Edition. Otro de los servidores es de aplica-
ciones y hospeda todos los objetos de lógica de negocio, así como las aplicaciones de es-
critorio 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 Ope-
raciones), 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 administra-
ció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á desarro-
llá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 desarrolla-
rá con mayor calidad y potencia.
Por el momento sólo tres usuarios utilizan SIO. Por otro lado, dos personas utilizan SI-
COM; uno de ellos es el director general, que puede enlazarse desde su equipo, cuando es-
tá 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 manteni-
miento de SIO, y otro que se ocupa del desarrollo y mantenimiento de SICOM. Los tiem-
pos 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 empre-
sa? Cuide el mayor aprovechamiento de los recursos de cómputo y el menor costo.
Producto Cantidad
.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
En esta sección se compilarán programas desde línea de comandos, por lo que es importan-
te saber cómo hacerlo. 2
La forma más sencilla de compilar un programa de Visual Basic.NET es la siguiente:
vbc NombreCódigoFuente.vb
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
Las diferentes especificaciones que se utilizan para compilar archivos en Visual Basic.NET
se irán revisando conforme los ejemplos lo vayan requiriendo.
Las aplicaciones de consola son aquellas aplicaciones textuales que reciben y muestran da-
tos en el intérprete de comandos.
50 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 don-
de 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á fun-
cionando IIS.
Capítulo 2. .NET como multiplataforma de desarrollo 51
Ejercicio 2.2
Desarrollo y compilación de un programa desde la línea de comandos
Codificación de HolaMundo.vb
1 Imports System
2 Imports System.Drawing
3 Imports System.Windows.Forms
4 Imports Microsoft.VisualBasic
5
6 Module HolaMundoB
7 Dim frmHola As New Form()
8 Dim lblMensaje As New Label()
9 Dim WithEvents btnAceptar As New Button()
10
11 Sub Estado()
12 frmHola.ClientSize = New Size(200, 100)
13 frmHola.Name = "frmHola"
14 frmHola.StartPosition = FormStartPosition.CenterScreen
15 frmHola.Text = "Hola Mundo"
16
17 lblMensaje.Location = New Point(16, 16)
18 lblMensaje.BorderStyle = BorderStyle.Fixed3D
19 lblMensaje.Name = "lblMensaje"
20 lblMensaje.Size = New Size(150, 20)
21 lblMensaje.Text = ""
22
23 btnAceptar.Location = New Point(16, 50)
24 btnAceptar.Name = "btnAceptar"
25 btnAceptar.Size = New Size(150, 32)
26 btnAceptar.Text = "Haz clic"
27
28 frmHola.Controls.Add(lblMensaje)
29 frmHola.Controls.Add(btnAceptar)
30 End Sub
31
32
33 Private Sub btnAceptar_Click(ByVal sender As System.Object,
34 ByVal e As System.EventArgs) Handles btnAceptar.Click
35 lblMensaje.Text = "Hola Mundo"
36 End Sub
37
38 Sub Main()
39 Estado()
40 frmHola.ShowDialog()
41 End sub
42
43 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
Son útiles otras versiones, superiores o más robustas, del sistema operativo, de Internet Ex-
plorer, Internet Information Server y MDAC.
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 ob-
tiene respuesta al abrir la página http://localhost.
Para simplificar el texto, se tienen las siguientes equivalencias:
2
56 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
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 me-
jor satisface sus necesidades?
Capítulo 2. .NET como multiplataforma de desarrollo 57
Notas:
2
58 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
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
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.
59
60 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Fundamentos de desarrollo con Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . 61
Soluciones y proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Recomendaciones para la creación de proyectos y soluciones en
desarrollos colaborativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Creación de aplicaciones en Visual Studio . . . . . . . . . . . . . . . . . . . . . . 65
Elementos de sintaxis en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Creación de una aplicación de Consola en Visual Basic
usando Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
➤ Creación de una solución en blanco . . . . . . . . . . . . . . . . 68
➤ Adición de un proyecto a una solución . . . . . . . . . . . . . 69
➤ Herramientas de Text Editor . . . . . . . . . . . . . . . . . . . . . . 72
➤ Colocación de números de línea en Text Editor . . . . . . . 73
➤ Intellisense y detección dinámica de errores . . . . . . . . . 74
➤ Modificación de código usando Text Editor . . . . . . . . . . 77
➤ Generación de una solución en Visual Studio . . . . . . . . 78
➤ Depuración de una solución . . . . . . . . . . . . . . . . . . . . . . 78
Creación de una aplicación Windows en Visual Basic con
Visual Studio, trabajando varios proyectos en una solución . . . 78
➤ Generación de una aplicación Windows . . . . . . . . . . . . . 79
➤ Fijación de una herramienta en el espacio de trabajo . . 80
➤ Adición de objetos de interfaz en tiempo de diseño . . . 81
➤ Navegación entre documentos de una solución . . . . . . . 83
➤ Cómo guardar documentos en una solución . . . . . . . . . 84
➤ Establecimiento del proyecto de inicio para una
solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Creación de una aplicación Web en Visual Basic con Visual
Studio, trabajando varios proyectos en una solución . . . . . . . . . 86
➤ Creación de un directorio virtual para un sitio Web . . . 86
➤ Creación de una aplicación Web ASP.NET . . . . . . . . . . . . 88
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 orga-
nizació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.
3
Las soluciones almacenan información respecto de los proyectos que agrupan las depen-
dencias 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 ar-
chivo 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 selec-
cionando 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.
62 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 3.1
Organización
de soluciones y
proyectos
> Lo nuevo
En Visual Studio 2005 se tienen las siguientes prestaciones relativas a los proyectos y las solu-
ciones. Es posible crear proyectos temporales (temporary projects) que no requieren guardar-
se con el fin de hacer pruebas sin necesidad de crear proyectos y soluciones. También es posi-
ble 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 refe-
rir archivos EXE como orígenes de clases, y no sólo archivos DLL.
Se conoce como desarrollos colaborativos a las iniciativas de desarrollo que son tan gran-
des 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 funcio-
nes 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á compi-
lar todos los programas de todos los equipos de trabajo. En términos de tiempo y procesa-
miento, 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 re-
lacionadas 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 sub-
mó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 rea-
lizará 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.
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 fue-
ra 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 cuan-
do 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 auto-
rizar 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 recur-
sos 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 gene-
rar una versión para entregar.
FIGURA 3.2
Trabajo
colaborativo
Capítulo 3. Técnicas de desarrollo con Visual Studio 2005 65
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 informa-
ció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 seccio-
nes (Open an existing project, Getting Started, Headlines y News) aparecen en una sola
página.
3
FIGURA 3.3
Start Page
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 con-
cepto 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 so-
lució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 den-
tro del entorno integrado de desarrollo.
Es indispensable saber qué lenguaje .NET se utilizará para el desarrollo (Project Type); de-
cidido 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é nom-
bre (Name). Los archivos fuente que usted genere se encontrarán en el directorio que espe-
cifique. Se generará un archivo que mantendrá la referencia de todos los archivos involu-
crados 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 so-
lució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 do-
cumentos/Proyectos de Visual Studio, lo que creaba problemas en equipos en donde traba-
jaban 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
1 Imports System
2 Imports System.Console
3
4 Module MiPrograma
5 Sub Main()
6 Write(“Pulse INTRO”)
7 ReadLine()
8 WriteLine(“Hola mundo”)
9 End Sub
10 End Module
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 “Ho-
la Mundo”.
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 com-
pilado 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.
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 interfa-
ces gráficas; de ahí que se traten como aplicaciones Windows.
13. En la sección Templates seleccione Console Application. Al seleccionar el tipo de pro-
yecto, Visual Studio se encargará de proporcionar de forma automática todos los ele-
mentos típicos de una aplicación de consola, incluyendo archivos de código fuente, da-
tos 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 ar-
chivos 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 con-
centrará 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 gene-
ren 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 conso-
la. 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 ma-
yoría de las herramientas se ubicarán en tiempo de diseño. En Document Window apa-
recerá Text Editor, que es el editor de texto simple donde se podrá modificar el códi-
go de Module1.vb.
18. En este momento Solution Explorer debe mostrar todos los elementos físicos que com-
ponen 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
FIGURA 3.5
Elementos de
Text Editor
20. Text Editor es una fascinante herramienta de edición de código, dadas todas las pres-
taciones que ofrece, como las siguientes:
a) Barra de selección de documentos. En la parte superior de Text Editor apa-
recerá 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 en-
cuentran abiertos y en la barra de selección de documentos, se les llama documen-
tos activos.
c) Selector de documentos activos. Dado que se pueden tener tantos documen-
tos activos que se llene la barra de selección de documentos, hacer clic en el Selec-
tor 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 de-
limitadoras 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 escri-
birse. 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 elemen-
tos del código. Generalmente las palabras reservadas estarán en azul, los identifica-
dores y operadores en negro, y los comentarios en verde. Esto es útil sobre todo
cuando no estamos seguros de estar escribiendo correctamente las palabras reserva-
das. Si no aparecen en azul, es porque no están bien escritas.
h) Divisores de procedimientos. Son las delimitaciones horizontales que separan 3
los procedimientos en el código.
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 especial-
mente útil en programas muy extensos, donde a veces es necesario comparar porcio-
nes de código ubicadas en distintas partes del archivo.
j) Selector de elementos. Se trata de un combo que muestra los diferentes módu-
los y elementos globales de una aplicación. En caso de que el programa posea mu-
chos 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.
21. Los números de línea son muy útiles para identificar partes del código. Muy probable-
mente, 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 si-
guiente manera: en la barra de menús seleccione Tool – Options para desplegar la ven-
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.
Esto se deberá escribir en varios tiempos. Primero escriba “Console.”. Al llegar al pun-
to, aparecerá un menú dinámico que propone los elementos del lenguaje que concuer-
dan con el código que se comenzó a escribir para que el desarrollador complete el enun-
ciado 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. Da-
do 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 es-
cribir, 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
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á.
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 en-
viará 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 Module Module1
2
3 Sub Main()
4 Console.Write(“Presione INTRO”)
5 Console.ReadLine()
6 Console.WriteLine(“Hola mundo.”)
7 End Sub
8
9 End Module
27. Realmente usted sólo tuvo que agregar las líneas 4, 5 y 6, que muestran un mensaje, es-
peran que se oprima una tecla y muestran otro mensaje, respectivamente.
78 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 gene-
ran los ensamblados correspondientes a cada uno de los proyectos, quedando listos pa-
ra 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.
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 am-
biente 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 mensa-
je «Hola Mundo».
1. En este ejercicio trabajará con la solución creada en el ejercicio anterior.
5. En Document Window aparecerá una herramienta llamada Form Designer, que permi-
te 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 herramien-
ta Toolbox, que muestra de forma clasificada los controles gráficos disponibles para
una aplicación Windows.
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 Frame-
work 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.
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áti-
ca, 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
12. En Form Designer se pueden agregar objetos de interfaz de tres maneras: Modo inser-
ció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 bo-
tó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ás-
trelos; 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 de-
terminan su apariencia y sus capacidades de comportamiento. La herramienta Proper-
ties permite modificar los valores de las propiedades de los objetos. En la barra de me-
nús seleccione View - Properties Windows (u oprima la tecla F4) para ver las
propiedades del objeto seleccionado.
20. Como tenía seleccionado el objeto Label1, Visual Studio permite la modificación de
sus propiedades.
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 cuan-
do 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 pro-
cedimiento 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 3
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
27. En este ejemplo aparecen cuatro documentos o herramientas que pueden ser seleccio-
nadas 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 De-
signer. Por otro lado, Start Page aparecerá como un navegador de páginas Web intrín-
seco de Visual Studio, dado que es una página Web.
84 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
34. Para hacer que nuestro nuevo proyecto de aplicación Windows sea el proyecto de ini-
cio, 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 se-
rí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.
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 cons-
truido 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 ini-
cio; 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 tex-
to 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, tra-
bajando 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”.
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….
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 ru-
ta física del sistema operativo (si está codificando en \InetPub\wwwroot) o un direc-
torio virtual.
14. Seleccione en el panel derecho el origen Local IIS para indicar que el desarrollo se tra-
bajará en un directorio virtual dentro de la máquina. Al seleccionar Local IIS, aparece-
rá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
15. Se generará el sitio Web ASP.NET. La página principal sobre la que se estará trabajan-
do 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 seleccio-
nando 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 Sour-
ce es necesario agregar las etiquetas en el lugar indicado.
90 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
17. Seleccione el objeto Label1 y asigne en la propiedad Name, el mismo nombre que asig-
nó 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
23. En cualquier momento puede llamar a edición cualquier elemento de la solución. De-
pendiendo 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
TERMINOLOGÍA
PREGUNTAS
3.1 ¿Cuáles son las recomendaciones generales de organización de soluciones y proyec-
tos 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?
94 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
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
10. Las plantillas (templates) permiten predefinir recursos disponibles durante la crea-
ción de una aplicación.
Capítulos:
4 Variables, arreglos y tipos
de datos
Parte 2
5 Espacios de nombres y
desarrollo de librerías Fundamentos de programación
6 Manejo de operadores en Visual Basic
7 Estructuras de decisión y
control En esta parte del libro se analizan los fundamentos
8 Manejo estructurado de de la programación en lenguaje Visual Basic.
excepciones
Utilizando al máximo las herramientas de Visual
Studio 2005, se estudia el manejo de las variables
Herramientas de Visual de memoria, así como las estructuras de decisión y
Studio revisadas: control desde las cuales se realizará el consumo de
las clases de la biblioteca de .NET Framework (BCL).
1. Debug / Breakpoints
2. Command Window
Finalmente, aprenderá a implementar esquemas de
3. Autos / Locals / Watch manejo estructurado de excepciones con el fin de
4. Immediate Window controlar, mediante programación, las acciones
procedentes en caso de que se tengan problemas
5.
6.
Comment / Uncomment
Clipboard Ring en tiempo de ejecución. 4
7. Task List
Nuestra reflexión es la siguiente: la discusión si
8. Error List Java es mejor que .NET es irrelevante. Lo impor-
tante no es el lenguaje de programación que esco-
gemos 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.
CAPÍTULO 4
Variables, arreglos y tipos
de datos
Objetivos: Conocer las generalidades del manejo de variables y arreglos, así co-
mo la definición de sus características especiales.
97
98 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Tipos de datos en Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Conversión de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Conversión implícita (Casting) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Conversión explícita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Conversión por método . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Acceso a datos Value type y Reference type . . . . . . . . . . . . . . . . . . . . . . . . . 107
Capacidades de los tipos valor y referencia . . . . . . . . . . . . . . . . . . . . . 107
Naturaleza de tipo de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
ByVal y ByRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Strong Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Option Explicit [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Option Strict [On/Off] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Demostración del alcance de las variables y la forma
en que preservan valores (I) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Manejo elemental de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Declaración de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Valores por omisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Demostración de la declaración de variables y constantes,
y la realización de conversiones . . . . . . . . . . . . . . . . . . . . . . . . . 114
➤ Construcción de un solo proyecto . . . . . . . . . . . . . . . . . . 115
Origen de las variables: clases y estructuras . . . . . . . . . . . . . . . . . . . . . 117
Alcance de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Accesibilidad de las variables (accesibility) . . . . . . . . . . . . . . . . . . . . . . 120
Demostración del alcance de las variables y la forma
en que preservan valores (II) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Arreglos unidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Arreglos multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Arreglos escalonados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Comprobación del uso de arreglos unidimensionales,
multidimensionales y escalonados . . . . . . . . . . . . . . . . . . . . . . . 129
Estructuras y enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Estructuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Enumeraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Capítulo 4. Variables, arreglos y tipos de datos 99
Los principales objetivos de toda aplicación son procesar datos para transformarlos en in-
formación, hacerlos llegar en la cantidad y la forma precisas a las personas indicadas (y au-
torizadas), y almacenarlos de manera eficiente.
No es asunto menor entender los datos y la forma en que se comportan. Una ineficiente se-
lecció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 compu-
tadora debido a que los programas y datos deben residir en ella para que puedan ser toma-
dos de ahí por el procesador; nada puede ser procesado por una computadora si no está an-
tes 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 4
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 fun-
cionen; ¿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 eficien-
temente.
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 nom-
bre 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.
100 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
❑ 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 per-
sistencia 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
❑ 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.
❑ Eventos
❑ Interfaces
❑ Espacios de nombres
❑ Métodos y propiedades
Camel casing. El estilo Camel casing se caracteriza por colocar en mayúscula la pri-
mera 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.
NOTA
Evitar la notación húngara es la recomendación de Microsoft. En realidad, la notación húnga-
ra sigue siendo utilizada mucho por la comunidad de desarrollo, e incluso en el sitio de Mi-
crosoft 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 apli-
caciones.
Este apartado presenta recomendaciones que puede o no seguir. En cualquier caso, lo im-
portante no es el estilo que elija usar, sino que todos los miembros de un equipo de desa-
rrollo lo compartan y utilicen de manera consistente.
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 almace-
nará 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 domi-
nio 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 co-
noce 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 funciona-
lidad desde el código fuente en un determinado lenguaje. El nombre del type puede ser más 4
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 compor-
tamientos. En ese sentido, Integer es un type que representa un valor, mientras que Write-
Line es un type, en el sentido de que es un método de una clase de BCL que no debe ser
instanciada para funcionar.
104 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Tipo Estructura
de dato o Clase.NET
Framework a la que Consumo
se hace referencia en bytes Rango de valores (dominio de tipo)
Boolean System.Boolean 1 byte True o False
(estructura)
Byte System.Byte 1 byte De 0 a 255 (sin signo)
(estructura)
Char System.Char 2 bytes Caracteres UNICODE
(estructura)
Date System.DateTime 8 bytes De enero 1, 0001 a diciembre 31, 9999
(estructura)
Decimal System.Decimal 12 bytes a) +/-79,228,162,514,264,337,
(estructura) 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 8 bytes a) -1.79769313486231E+308 a
(estructura) -4.94065645841247E-324 para valores
negativos; b) 4.94065645841247E-324 a
1.79769313486231E+308 para valores
positivos
Integer System.Int32 4 bytes De -2,147,483,648 a 2,147,483,647
(estructura)
Long System.Int64 8 bytes De -9,223,372,036,854,775,808 a
(estructura) 9,223,372,036,854,775,807
Short System.Int16 2 bytes De -32,768 a 32,767
(estructura)
Single System.Single 4 bytes a) -3.402823E+38 a -1.401298E-45 para
(estructura) números negativos;
b) 1.401298E-45 a 3.402823E+38 para
valores positivos
String System.String Depende de De 0 a aproximadamente dos mil millones
(clase) la plataforma 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 ejem-
plo, 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. 4
❑ 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 manipu-
lado. 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 ex-
cederá 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 ha-
ber 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. Exis-
ten tres formas de conversión de datos en Visual Basic.
106 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Conversión explícita
La conversión explícita consiste en aplicar funciones específicas mediante código para rea-
lizar 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éri-
cas. 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.
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
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 representa-
ción String de la variable Edad; es decir, “30”.
Dependiendo del tipo de acceso a los datos, las capacidades de almacenamiento y econo-
mía difieren.
Con los tipos de valor (value type):
❑ Las variables almacenan un dato de un tipo determinado.
❑ 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).
108 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
❑ 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.
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 proce-
dimiento 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 ByVal y ByRef es respetado siempre y cuando la
naturaleza del dato no se imponga.
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 ma-
nera 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; ob-
viaba muchas cosas y les permitía no ser formales con la técnica, lo que a largo plazo siem-
pre causaba problemas.
Si no se declaraban las variables, si no se especificaban los tipos de datos o si no se pla-
neaban 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 con-
trol. 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 cual-
quier cosa en el código y que aseguran que la codificación siga una técnica formal, de ti-
po strong typing; es decir, donde todos los datos están asociados de manera explícita y no
ambigua a un tipo determinado.
4
Option Explicit [On/Off]
La instrucción Option Explicit, cuando está activada (On), obliga al programador a de-
clarar 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.
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 Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo 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 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7 Dim Texto As String = “Texto Original”
8 Console.WriteLine(Texto)
9 Valor(Texto)
10 Console.WriteLine(Texto)
11 Referencia(Texto)
12 Console.WriteLine(Texto)
13 Console.Write(“Pulse INTRO para continuar”)
14 Console.ReadLine()
15 End Sub
16
17 Sub Valor(ByVal Texto As String)
18 Texto = “Texto Valor”
19 Console.WriteLine(“<” & Texto & “>”)
20 End Sub
21
22 Sub Referencia(ByRef Texto As String)
23 Texto = “Texto Referencia”
24 Console.WriteLine(“<” & Texto & “>”)
25 End Sub
26
27 End Module
Capítulo 4. Variables, arreglos y tipos de datos 111
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 trata- 4
miento 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 co-
mo tipo valor, lo que provoca que el argumento genere su propia copia del dato, dejan-
do al dato original intacto.
8. Uso del dato como tipo referencia. En la línea 11 se proporciona la variable como argu-
mento 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.
Para utilizar una variable es necesario declararla; declarar una variable es el proceso me-
diante el cual se establece un identificador, que será reconocido en tiempo de ejecución, pa-
ra 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.
NOTA
La expresión “almacenar valores en las variables de memoria” es una expresión en sentido fi-
gurado: 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 memo-
ria. Cuando se dice que almacenamos valores en las variables, nos referimos a que almace-
namos 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
1 Dim Edad
2 Dim Edad As Integer
3 Dim Edad As System.Int32
4 Dim Edad As Integer = 50
5 Dim Nombre, Apellido As String
6 Dim Nombre, 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 co- 4
mas. La línea 6 demuestra que Dim acepta la declaración de dos o más variables de un mis-
mo 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 tiem-
po de vida. Para definirlos se utiliza la siguiente sintaxis.
Literales
Se tienen literales que permiten definir un valor, liberándolo de las ambigüedades de tipo
que pudiera tener.
Las literales son las siguientes:
Cada variable, en caso de que no se le asigne un valor, tendrá un valor por omisión. A con-
tinuación se muestra una relación de los valores por omisión para los tipos de datos.
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 Module Module1
2
3 Sub Main()
4 Const Titulo As String = “—- Rectángulo —-”
5 Dim Base As Integer
6 Dim Altura As Single = 0
7 Dim Resultado As Single, Entrada As String
8
9 Console.WriteLine(Titulo)
10 Console.Write(“Base: “)
11 Entrada = Console.ReadLine() 4
12 Base = CInt(Entrada)
13 Console.Write(“Altura: “)
14 Entrada = Console.ReadLine()
15 Altura = CType(Entrada, Single)
16
17 Resultado = (Base * Altura)
18 Console.WriteLine(“Resultado: “ & Resultado.ToString())
19 End Sub
20
21 End Module
4. Al agregar éste, se tendrán cuatro proyectos en la solución. En ocasiones, cuando las so-
luciones son muy grandes, reconstruir una completamente para saber si se tienen proble-
mas 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 seleccio-
nar el proyecto en Solution Explorer, desplegar el menú contextual y seleccionar la op-
ción Build. De esa forma se construirá sólo el proyecto seleccionado.
116 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
6. Seleccione en Solution Explorer el proyecto; para ello coloque el puntero sobre el nom-
bre del proyecto AreaRectangulo, haga clic con el botón derecho del ratón para desple-
gar el menú contextual y seleccione Build.
la altura del rectángulo, con la diferencia de que se utilizará para la conversión la fun-
ció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, da-
do 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
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 len-
guaje con vida propia.
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 eje-
cución. Generalmente se encuentran delimitados por una línea de inicio y una línea de con-
clusió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 conclu-
yen 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 resol-
ver 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 va-
riable 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
Shadowing
4
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 de-
be 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 decla-
rar una variable variableZ a nivel módulo, y una variable variableZ dentro de un proce-
dimiento, 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 Vi-
sual Basic siempre y cuando tengan alcances distintos; el programa utilizará para el proce-
samiento 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 tiem-
po de ejecución, a fin de utilizar el valor de menor alcance según se requiera en el programa.
120 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 varia-
ble de instancia (instance variable), y cada instancia mantiene la referencia de su pro-
pio valor. Este tipo de variables es especialmente útil para trasladar valores de un for-
mulario 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 ins-
tancia 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 conte-
nedor de la variable (objeto que contiene a otro objeto).
Se puede proporcionar permiso a nivel procedimiento, pero si no se tiene permiso para dis-
poner del capítulo, clase o estructura que contiene el procedimiento mencionado, no será po-
sible 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 Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria 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 Alcance.
3. Edite el programa de tal forma que aparezca como sigue:
122 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5 Dim Texto1 As String = “Alcance módulo”
6
7 Sub Main()
8 Console.WriteLine(Texto1)
9 Dim Texto2 As String = “Alcance procedimiento”
10 If Texto2 <> “” Then
11 Console.WriteLine(Texto2)
12 Dim Texto3 As String = “Alcance block”
13 Console.WriteLine(Texto3)
14 End If
15 Procedimiento1()
16 Procedimiento1()
17 Procedimiento1()
18 Procedimiento2()
19 Console.WriteLine(“ “)
20 Console.Write(“Pulse INTRO para continuar”)
21 Console.ReadLine()
22 End Sub
23
24 Sub Procedimiento1()
25 Static Texto4 As String
26 Texto4 = “Valor + “ & Texto4
27 Dim Texto5 As String = “Texto 5”
28 Console.WriteLine(“—Procedimiento 1 ——”)
29 Console.WriteLine(“Texto 1: “ & Texto1)
30 Console.WriteLine(“Texto 4: “ & Texto4)
31 Console.WriteLine(“———————————”)
32 End Sub
33
34 Sub Procedimiento2()
35 Console.WriteLine(“—Procedimiento 2 ——”)
36 If Texto1 <> “” Then
37 Dim Texto1 As String = “Shadow”
38 Console.WriteLine(“Texto 1: “ & Texto1)
39 End If
40 Console.WriteLine(“Texto 1: “ & Texto1)
41 Console.WriteLine(“———————————”)
42 End Sub
43
44 End Module
Capítulo 4. Variables, arreglos y tipos de datos 123
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
––––––––––––––––––––––
10. Modifique la línea 21, sustituyendo el estatuto de declaración Static por Dim. Ejecute
el programa nuevamente, y explique qué sucede:
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 tra-
vés de un subíndice, que es la posición secuencial de cada elemento dentro de la colec- 4
ción. Los subíndices, como en todos los lenguajes de .NET, son de base cero; es decir, ini-
cian en cero.
En Visual Basic, los arreglos tienen un tratamiento de colecciones, por lo cual los subíndi-
ces siempre se especifican entre paréntesis. Las colecciones son conjuntos de objetos lógi-
camente relacionados, diferenciados por un subíndice.
En su calidad de colecciones, pueden ser explorados con la instrucción For Each, cuya sin-
taxis es la siguiente:
Arreglos unidimensionales
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 ti-
po 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 nece-
sario 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 consi-
derando 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 Se-
rieValores es la serie de valores que asumirán los elementos; los valores deberán estar se-
parados por comas. Por ejemplo:
Dim Numeros() As Integer = {10,20,40,100}
Arreglos multidimensionales
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úme-
ro mayor de subíndice para la dimensión 2, y así hasta definir todas las dimensiones. Tipo-
Dato es el tipo de dato de los elementos del arreglo. Por ejemplo:
Dim VentaTrim(2,3) As Integer
4
En este caso se tiene un arreglo de 12 posiciones (de 0 a 2, 3 posiciones; de 0 a 3, 4 posi-
ciones; 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 especi-
ficar 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á au-
tomá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 valo-
res deberán estar separados por comas.
128 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Ejemplo.
Dim VentaTrim(,) As Integer = {{1000,20000,10000,5000}, _
{2000,30000,15000,2000}}
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 va-
lores 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 es-
tar 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 últi-
mos 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úme-
ros de categorías de empleados, un arreglo multidimensional ocuparía 1000 5 posicio- 4
nes 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 con-
sumo 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 Vi-
sual Basic y la forma en que podemos aprovechar su manejo para preservar valores en me-
moria con eficiencia.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo 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:
130 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7 Dim i As Integer
8
9 Console.WriteLine(“Arreglo unidimensional 1:”)
9 Dim Uni1() As Integer = {22, 49, 20, 40}
10 For Each i In Uni1
11 Console.WriteLine(i)
12 Next
13 Console.WriteLine(“Arreglo unidimensional 2:”)
14 Dim Uni2() As Integer = {55, 66, 77}
15
16 For Each i In Uni2
17 Console.WriteLine(i)
18 Next
19
20 Console.WriteLine(“Arreglo multidimensional:”)
21 Dim Multi(,) As Integer = {{92, 49}, {44, 20}, {10, 48}}
22 Console.WriteLine( _
23 String.Format(“Fila 0: {0},{1} “, Multi(0, 0),
Multi(0, 1)))
24 Console.WriteLine( _
25 String.Format(“Fila 1: {0},{1} “, Multi(1, 0),
Multi(1, 1)))
26 Console.WriteLine( _
27 String.Format(“Fila 2: {0},{1} “, Multi(2, 0),
Multi(2, 1)))
28
29 Console.WriteLine(“Arreglo escalonado:”)
30 Console.WriteLine(“Arreglo 1, posición 2”)
31 Dim Esca()() As Integer = {Uni1, Uni2}
32 Console.WriteLine(Esca(1)(2))
33
34 Console.Write(“Presione INTRO”)
35 Console.ReadLine()
36 End Sub
37
38 End Module
Capítulo 4. Variables, arreglos y tipos de datos 131
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 has-
ta 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 provo-
ca 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 se-
rá 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
termina el número de filas, mientras que el número de elementos de cada serie de valo-
res 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)
Los parámetros se incluyen con base 0, y deberá proporcionarse una serie de valores se-
parados 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 es-
calonado; es decir, permite seleccionar al arreglo a inspeccionar. En los siguientes pa-
ré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
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
Estructuras y enumeraciones
Estructuras
Structure NombreEstructura
Elementos
End Structure
134 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 per-
sona. Las variables que componen la estructura tienen acceso público, a fin de ser utiliza-
das 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
En este caso se declaró una enumeración que permite el uso de las referencias Estado.Ac-
tivo y Estado.Inactivo como valores válidos.
4
136 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
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 da-
to 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
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
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
7. Una de las nuevas capacidades de .NET es poder utilizar variables aun sin haberlas
declarado.
139
140 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Espacios de nombres (namespaces) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Nomenclatura para los espacios de nombres . . . . . . . . . . . . . . . . . . . . 143
Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Uso de espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Creación de namespaces propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Alias para los espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Independencia de los ensamblados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Creación y consumo de una librería (DLL) basada
en un espacio de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
➤ Creación de una librería DLL . . . . . . . . . . . . . . . . . . . . . 153
➤ Revisión de todos los elementos asociados a un
proyecto, usando Solution Explorer . . . . . . . . . . . . . . . . 154
➤ Establecimiento de una referencia a una librería
desde Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . 155
➤ Consumo de una librería programáticamente . . . . . . . . 156
Utilización del depurador (Debug) de Visual Studio
y la ejecución línea a línea basada en puntos de
interrupción (breakpoints) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
➤ Establecimiento de un punto de interrupción
(breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
➤ Ejecución línea por línea (Code Stepping) . . . . . . . . . . . 158
➤ Modificación de programas en tiempo de ejecución . . . 159
➤ Puntos de interrupción condicionales . . . . . . . . . . . . . . . 160
➤ Habilitación e inhabilitación de puntos de
interrupción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
➤ Eliminación de los puntos de interrupción
(breakpoint) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Utilización de Command Window . . . . . . . . . . . . . . . . . . . . . . . . 162
➤ Escritura de comandos de Visual Studio usando
Command Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Uso de herramientas avanzadas para la depuración . . . . . . . . . 165
➤ Apilado de herramientas en Visual Studio . . . . . . . . . . . 165
➤ Ventanas de variables (variable windows) . . . . . . . . . . . 166
➤ Ventanas de inspección de código . . . . . . . . . . . . . . . . . 168
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Capítulo 5. Espacios de nombres y desarrollo de librerías 141
Tener muchos archivos físicos de librerías constituye una ventaja, pues implica que el len-
guaje ya contiene muchas funciones que no será necesario programar; por otro lado, plan-
tea 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 ad-
ministrado que requiere la presencia del CLR.
Buscando la simplificación, Microsoft creó un sistema lógico que permite organizar y ca-
tegorizar las clases disponibles en las librerías que componen el .NET Framework, basán-
dose en un concepto: los espacios de nombres (namespaces).
Los espacios de nombres proporcionan una estructura que organiza y simplifica la referen-
cia 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 identi-
ficació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 cla-
ses; realmente se trata de un agrupamiento basado en funcionalidad.
Quienes desarrollan basándose en la tecnología COM están conscientes de que los espa-
cios 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 es-
quema lógico de organización de clases de .NET Framework.
Los espacios de nombres organizan colecciones de clases y eliminan la ambigüedad al mo-
mento 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
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 tecnolo-
gías Microsoft a los desarrollos. Además integra los elementos principales de los nuevos
lenguajes de Microsoft. 5
System
El espacio de nombre System y todas sus dependencias contienen las clases fundamenta-
les de la plataforma .NET. En esta jerarquía se encuentran las clases base para definir va-
lores, 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 herra-
mientas de propósito general, dado que se encuentran clases de graficación, acceso a da-
tos, telecomunicaciones, criptografía, matemáticas, etcétera.
No son todos los espacios de nombres; la mayoría tiene niveles jerárquicos de mayor pro-
fundidad que sería imposible tratar en este texto. Utilice la tabla como punto de partida pa-
ra buscar más información.
En la ayuda de Visual Studio puede buscar .NET Framework Class Library, y de ahí selec-
cionar un tema que le interese.
Es posible utilizar todas las clases disponibles de .NET Framework a través de sus nom-
bres calificados, pero eso no es del todo práctico pues en ocasiones éstos pueden ser bas-
tante largos (System.Runtime.Remoting.Channels.Http, por ejemplo).
Una forma de obviar la escritura del nombre calificado completo es importando los espa-
cios 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, refe-
rencias o métodos; en ese caso, la ambigüedad debe eliminarse a través de nombres califi-
cados, los cuales permiten definir el origen de los recursos referidos.
Capítulo 5. Espacios de nombres y desarrollo de librerías 149
Sub Main()
System.Console.Write(“Presione INTRO”)
system.Console.ReadLine()
System.Console.WriteLine(“Hola mundo.”)
End Sub
End Module
Module Module1
Sub Main()
Write(“Presione INTRO”)
ReadLine()
WriteLine(“Hola mundo.”)
End Sub
End Module
Donde EspacioNombre es el nombre a través del cual se referirán los elementos conteni-
dos en espacio de nombres que se genera.
Una cosa importante a tomar en cuenta es que para crear una jerarquía dentro de un espa-
cio de nombres es posible anidarlos, por lo cual una declaración Namespace puede estar
definida dentro de otra, creando el efecto EspacioNombre1.EspacioNombre2.Type.
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.
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 aplica-
ción. En el Solution Explorer pueden observarse claramente, ya que bajo el nodo de un pro-
yecto 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 uti-
lizar, dado que la plataforma .NET les da soporte. En la ficha Projects es posible seleccio-
nar 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 libre-
rí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
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 Vi-
sual 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 (ar-
chivo de extensión sln).
C:\APVBNETVS\Ejercicios\MisUtilerias\bin\Debug
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
1 Imports System.Console
2 Imports MisUtilerias.Funciones
3
4 Module Module1
5
6 Sub Main()
7 WriteLine(“Mensaje desde el programa”)
8 Continuar.EsperaINTRO()
9 End Sub
10
11 End Module
14. Vea cómo al editar las líneas de importación de espacios de nombres, ya teníamos dis-
ponible nuestro espacio de nombres en Intellisense.
Capítulo 5. Espacios de nombres y desarrollo de librerías 157
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 realiza-
do en la solución (oprima Ctrl-Mayús-S). Inicie la depuración para comprobar el com-
portamiento de su programa (oprima F5).
17. Si todo salió bien, el programa debe producir el siguiente resultado:
5
Mensaje desde el programa
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)
6. Al lanzar a ejecución una aplicación (oprimiendo la tecla F5), se entra en modo de-
bug, que es un estado de ejecución en donde Visual Studio provee todas las herramien-
tas 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 progra-
ma. Las líneas que se vayan ejecutando aparecerán resaltadas en amarillo.
Capítulo 5. Espacios de nombres y desarrollo de librerías 159
tiempo de depuración. A esta capacidad de Visual Studio se le denomina Edit and Con-
tinue, y sólo está disponible si el archivo está en vista de código fuente (source view).
12. En ocasiones queremos que un punto de interrupción detenga la depuración sólo en ca-
so de que sea necesario. La necesidad de interrupción debe estar expresada en térmi-
nos 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 pro-
yecto 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ú con-
textual y seleccione Condition....
17. Inicie la depuración de la solución (oprima F5). Cuando el programa le pregunte la ba-
se, proporcione el número 10. Proporcione una altura de 15 y vea cómo el programa
no detiene la depuración en ningún momento.
18. Inicie nuevamente la depuración de la solución (oprima F5). Cuando el programa
le pregunte la base, proporcione el número 0. Al cumplirse la condición, el programa se
detiene.
19. En ocasiones se desea iniciar la depuración de un programa sin tener que lidiar con los
puntos de interrupción. Una alternativa definitiva es eliminar los puntos de interrupción;
si no se desea que los puntos de interrupción se pierdan pero que tampoco detengan la
5
depuración en un momento dado, la opción más recomendable es inhabilitarlos.
20. Seleccione la opción Debug – Disable All Breakpoints. Inicie la depuración y proporcio-
ne como valor base el 0. En teoría debería detenerse la depuración, dado que la condición
del punto de interrupción se cumple; sin embargo, la depuración no se detiene.
21. Seleccione la opción Debug – Enable All Breakpoints. Inicie la depuración y proporcione
como valor base el 0. Vea cómo el punto de interrupción ha vuelto a su comportamiento
normal.
mación que debe responder afirmativamente en caso de que desee eliminar los puntos
de interrupción.
24. Elimine todos los puntos de interrupción que tiene su programa.
25. Guarde todos los cambios en la solución.
FIN DEL EJERCICIO*
Ejercicio 5.3
Utilización de Command Window
4. Casi todas las actividades que es posible realizar en Visual Studio a través de opciones de
menú o la barra de herramientas tienen un equivalente textual que es posible aplicar des-
de la línea de comandos de Visual Studio (Command Window). Los usuarios de FoxPro
estarán habituados a dicha ventana, dado que muchas operaciones pueden ser especifi-
cadas más rápidamente de forma textual, sobre todo cuando se es rápido escribiendo y cam-
biar del teclado al ratón implica más esfuerzo.
5. Para mostrar Command Window se puede utilizar la opción View – Other Widows –
Command Window (teclas Ctrl-Alt-A). En tiempo de depuración, Command Window
aparece automáticamente.
Capítulo 5. Espacios de nombres y desarrollo de librerías 163
8. La mayoría de los comandos puede inferirse fácilmente. Sólo piense cómo están loca-
lizables en los menús. Por ejemplo, para iniciar la depuración de una solución la op-
ción de menú es Debug – Start Debugging; el comando es Debug.Start, lo cual es
bastante obvio. Aproveche Intellisense en Command Window para descubrir los co-
mandos que le interesan.
9. En Command Window escriba los siguientes comandos:
>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, ini-
ciar la depuración, ejecutar tres líneas, línea por línea, y detener la depuración. En el ca-
so 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 ejecu-
ció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 pro-
yecto 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 Win-
dow. En realidad son muchas más herramientas, sólo que no están visibles por el momen-
to. Como podrá comprobar, en tiempo de depuración Command Window comparte su es-
pacio 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 algu-
na 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 selec-
ció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.
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 colum-
nas: 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 anterio-
res a la que se está ejecutando, dentro de un mismo alcance. Esta ventana cambia di-
ná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 ex-
perimenta 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 procedi-
miento 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 an-
teriores 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. Da-
da 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 de-
seamos saber cuánto valen en todo momento. Esta herramienta no carga variables au-
tomáticamente, por lo que hay que especificarle qué queremos que muestre.
5
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 ex-
presión en un momento dado. Por ejemplo, si queremos saber qué valor tiene la varia-
ble 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 alcan-
ce en donde nos encontramos, por lo cual se reporta como no declarada.
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.
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 pro-
blemas, 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 infor-
mació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 ac-
tivos o no, si les aplican condiciones y en qué casos detendrán la depuración. En nues-
tro 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
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
TERMINOLOGÍA
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 ne-
cesaria 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 173
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
5. Es el fenómeno que se presenta cuando en un programa se refieren dos métodos, pertenecientes a es-
pacios de nombres diferentes, pero que tienen el mismo nombre: 5
a) Colisión de nombre
b) Contaminación de espacios de nombres
c) Concurrencia de nombres
175
176 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Expresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Operadores de asignación incluyente . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Operadores comparativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Consideraciones relativas al código ASCII . . . . . . . . . . . . . . . . . . . . . . . 181
Option Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Operadores Is, IsNot y TypeOf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Operador Like . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Operadores lógicos de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Tabla de comportamiento de operadores lógicos . . . . . . . . . . . . . . . . . 188
Prioridad entre operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Uso de paréntesis para otorgar preferencia de ejecución . . . . . . . . . . 190
Utilización general de operadores de Visual Basic . . . . . . . . . . . 191
➤ Comentarios en bloques de código . . . . . . . . . . . . . . . . 192
➤ Uso de Clipboard Ring . . . . . . . . . . . . . . . . . . . . . . . . . . 193
➤ Selección basada en bloques de código
(Block Selection) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Uso de operadores de asignación incluyente y operadores
de circuito corto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Capítulo 6. Manejo de operadores 177
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éti-
cos 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:
NOTA
En el caso de los datos de tipo String, es posible utilizar el operador de suma, que se encar-
ga 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 ope-
ración aritmética.
Operadores de asignación
Los operadores de asignación son los que permiten asignar un valor a una variable o pro-
piedad. 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 expre-
sió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 varia-
ble que la contenga; es expresión derivada, cuando es el resultado de someter varios valo-
res existentes, sean éstos variables o literales, a la acción de operadores.
Vea los siguientes ejemplos de expresiones:
Son operadores de asignación incluyente aquellos que consideran el valor que posee la va-
riable 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 Es lo mismo que x += 1
x = x-1 Es lo mismo que x –= 1
x = x * 4 Es lo mismo que x *= 4
x = x ^ 2 Es lo mismo que x ^= 2
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), depen-
diendo 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:
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 uti-
lizado para la comparación.
Capítulo 6. Manejo de operadores 181
El juego de caracteres de siete bits denominado ASCII (American Standard Code In-
formation Interchange / Código Estándar Estadounidense para el Intercambio de
Información) es ampliamente utilizado para representar letras y símbolos de un te-
clado estándar de Estados Unidos. El juego de caracteres ASCII es igual que los pri-
meros 128 caracteres (0-127) del juego de caracteres ANSI, utilizado por las máqui-
nas antiguas. Es importante que conozca algunas referencias del código ASCII que
pueden serle de utilidad:
8 BackSpace (RETROCESO)
13 Enter (INTRO)
32 SpaceBar (BARRA ESPACIADORA)
64 “@”
92 “\”
48 al 57 “0” al “9”
6
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 ade-
cuadamente, 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-
182 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
mérico esté activado (teniendo el BLOQ NUM / NUM LOCK activado). Por
ejemplo:
Alt + 64 equivale a teclear “@”
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 represen-
tación simbólica. Las funciones que lo permiten son Chr( ) y Asc( ), respectiva-
mente. Estas funciones emplean la siguiente sintaxis:
Chr(CódigoASCII )
Asc(“Caracter”)
Por ejemplo:
Chr(64) → “@”
Asc(“@”) → 64
Option Compare
Option Compare 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á sen-
sible (Binary).
Capítulo 6. Manejo de operadores 183
Además de los operadores comparativos comunes, Visual Basic proporciona dos operado-
res comparativos especiales: Is y Like.
El operador Is es un operador que determina si una variable hace referencia a la misma po-
sició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).
Isdevolverá verdadero (True) si las variables comparadas refieren a la misma posición de
memoria, y falso (False) si refieren a posiciones distintas de memoria.
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 siguien-
te 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”)
Operador Like
El operador Like compara dos expresiones String, no en términos de igualdad, sino en tér-
minos de cumplimiento de un patrón determinado.
Este operador es especialmente útil cuando se verifica si una cadena de caracteres com-
puesta 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
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:
Expresión1 debe ser una expresión de tipo String; Expresión2 es un patrón String que se pre-
tende 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 es-
peciales que representan el contenido de caracteres a buscar; a continuación una tabla que
muestra dichos caracteres y su significado.
? Cualquier carácter
Recomendamos utilizar los patrones para determinar la validez de formatos mixtos de da-
tos; 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, producien-
do 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.
Ejemplos:
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 operacio-
nes se han de resolver. Por ejemplo:
“A” = “B” OR 1 > 0.5 AND 2 >= 2 AND “S” > “s”
FIGURA 6.1
Resolución de
una expresión
con múltiples
condiciones
❑ 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
De esta forma forzamos que en primera instancia se resuelva el paréntesis de mayor pro-
fundidad, que contiene la segunda, tercera y cuarta expresiones (True And True And Fal-
se, devuelve False), el resultado se resuelve con la primera condición, por ser el parénte-
sis 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 pa-
réntesis cuando tenga más de una condición por resolver.
Se denominan operadores lógicos de circuito corto (short- circuiting), aquellos que son ca-
paces de determinar la necesidad de continuar evaluando condiciones posteriores a las pri-
meras. 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.
No podemos resolver la expresión que implica el operador comparativo (>), si antes no re-
solvemos las expresiones que involucran el operador de suma (+). El procesador no resuel-
ve 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éti-
cos 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 expresio-
nes lógicas.
Los operadores de comparación tienen la misma prioridad; es decir, se evalúan de izquier-
da a derecha en el orden en que aparecen. Los operadores se evalúan en el siguiente orden
6
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 (+, –)
190 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Comparación
Igualdad (=)
Desigualdad (<>)
Menor que (<)
Mayor que (>)
Menor o igual que (<=)
Mayor o igual que (>=)
Lógicos
Not
And
Or
Xor
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 an-
tes que aquellas que se encuentren fuera. Sin embargo, dentro de los paréntesis, la priori-
dad 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 acos-
tumbran 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, pe-
ro 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 asig-
nada 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 (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado
Operadores.
1 Module Module1
2
3 Sub Main()
4 Dim Numero1 As Integer = 5
5 Dim Numero2 As Single = 2
6 Dim Texto1 As String = “Visual “
7 Dim Texto2 As String = “Basic.NET”
8 Console.WriteLine(Numero1)
9 Console.WriteLine(Numero2)
10 Console.WriteLine(Numero1 + Numero2)
11 Console.WriteLine(Numero1 – Numero2)
12
13
Console.WriteLine(Numero1 * Numero2)
Console.WriteLine(Numero1 / Numero2)
6
14 Console.WriteLine(Numero1 \ Numero2)
15 Console.WriteLine(Numero1 Mod Numero2)
16 Console.WriteLine(Texto1 Is Texto2)
17 Console.WriteLine(Texto1 IsNot Texto2)
18 Console.WriteLine(Texto1 + Texto2)
19 Console.WriteLine(Texto1.Trim() + Texto2.Trim())
20 Console.WriteLine(Texto1.Trim() + “ “ + Texto2.Trim())
21 Console.WriteLine(“Pulse INTRO para continuar”)
22 Console.ReadLine()
23 End Sub
24
25 End Module
192 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
5
2
7
3
10
2.5
2
1
False
True
Visual Basic.NET
VisualBasic.NET
Visual Basic.NET
Pulse INTRO para continuar
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 po-
sición determinada en una línea, se selecciona todo lo que resta de la línea hacia la de-
recha, 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
6
se conoce como line-based copy-paste.
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 generaliza-
da 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 an-
tes 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 co-
locado en él, y pueden ser extraídas utilizando Ctrl-Mayús-V. Al reunirse 20 conteni-
dos 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 sa-
lidas), 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 origina-
les 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)
...
...
19. Vaya a la que ahora es la línea 9 y oprima Ctrl-Mayús-V una vez. Visual Studio retorna-
rá 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 re-
tornará 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.
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 qui-
tar 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 nom-
bre 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 Se-
lection), 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 olvi-
de 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 elimi-
nan las referencias del código.
27. Vaya al inicio del programa, y antes de cualquier otra línea agregue la siguiente:
Imports System.Console
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 acumu-
larán los valores capturados, y mediante los operadores de circuito corto se hará más efi-
ciente un proceso, detectándose de entre los números capturados alguno que sea primo. Re-
cuerde 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 (ar-
chivo 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 197
1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5
6 Sub Main()
7
8 Dim N1 As Integer
9 Dim N2 As Integer
10 Dim N3 As Integer
11 Dim Total As Integer = 0
12
13 Console.WriteLine(“— Suma de 3 números ———————-”)
14 Console.WriteLine(“— Sólo capture enteros del 1 al 10”)
15 Console.Write(“Número 1 de 3:”)
16 N1 = CInt(Console.ReadLine())
17 Console.Write(“Número 2 de 3:”)
18 N2 = CInt(Console.ReadLine())
19 Console.Write(“Número 3 de 3:”)
20 N3 = CInt(Console.ReadLine())
21
22 Total += N1
23 Total += N2
24 Total += N3
25
26 If ((N1 = 1 OrElse N1 = 2 OrElse N1 = 3 OrElse N1 = 7) OrElse _
27 (N2 = 1 OrElse N2 = 2 OrElse N2 = 3 OrElse N2 = 7) OrElse _
28 (N3 = 1 OrElse N3 = 2 OrElse N3 = 3 OrElse N3 = 7)) Then
29 Console.WriteLine(“Al menos uno de los números es primo”)
30 Else
31 Console.WriteLine(“Ninguno de los números es primo”)
32 End If
33
34
35
Console.WriteLine(“Total:” & CType(Total, String))
Console.WriteLine(“Pulse INTRO para continuar”)
6
36 Console.ReadLine()
37
38 End Sub
39
40 End Module
198 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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
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
TERMINOLOGÍA
PREGUNTAS
6.1 ¿Cuáles son los operadores aritméticos, para qué sirven y cuál es su precedencia?
6.2 ¿Cuáles son los operadores de asignación, para qué sirven y cuál es su precedencia?
6.3 ¿Cuáles son los operadores comparativos, para qué sirven y cuál es su precedencia?
6.4 ¿Cuáles son los operadores lógicos, para qué sirven y cuál es su precedencia?
6.5 ¿Por qué son importantes las reglas de precedencia?
6.6 ¿Cuáles son las ventajas de los operadores de circuito corto con respecto a los opera-
dores lógicos?
6.7 ¿Cuáles son las ventajas de los operadores de asignación incluyente con respecto a los
operadores aritméticos? 6
202 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Notas:
Capítulo 6. Manejo de operadores 203
2. Si quiero comparar un valor en relación con otro valor, debo usar un operador:
a) Comparativo
b) Relacional
c) Aritmético
4. Son lo adecuado cuando la variable a recibir un valor también es considerada como primer factor de
cálculo:
a) Operadores aritméticos implícitos
b) Operadores de asignación incluyente
c) Operadores comparativos
5. Indican que un determinado tipo de expresiones han de resolverse antes que otras:
a) Prioridad entre operadores
b) Preferencia de ejecución explícita
c) Preferencia de ejecución automática
7. En una expresión lógica, al aplicar el operador Or, con una expresión que sea False,
todo es False.
10. Si una clave se compone de un número y una letra, el patrón a utilizar en una compa-
ración Like, para producir verdadero, sería “[0-9][A-Z]”.
CAPÍTULO 7
Estructuras de decisión
y control
Objetivos: Familiarizarse con las estructuras de decisión, para realizar procesos
condicionales, y con las estructuras de control para el manejo de procesos iterativos.
205
206 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Estructuras de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Estatuto If Then Else (condicional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Do Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Estructuras envolventes y anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Reglas para el anidado de estructuras . . . . . . . . . . . . . . . . . . . . . . . . . 215
Uso de estructuras de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Uso de For Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
➤ Adición de tareas a Task List . . . . . . . . . . . . . . . . . . . . . . 223
➤ Adición de comentarios de tarea a un programa . . . . . . 225
Identificación de errores en estructuras anidadas . . . . . . . . . . . . 226
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Capítulo 7. Estructuras de decisión y control 207
7
Estructuras de decisión
Las estructuras de decisión son estructuras del lenguaje que permiten decidir qué líneas de
código se han de ejecutar, dependiendo de una condición determinada.
208 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
El estatuto condicional (If) ejecutará instrucciones dependiendo del valor de una condi-
ción que deriva en una expresión lógica (dato de tipo Boolean).
Como If tiene muchas variantes, examinaremos varias de las sintaxis que emplea.
He aquí la más sencilla:
Sólo en caso de que ExpresiónLógica derive en un valor de True, Instrucción será ejecu-
tada; es decir, esta sintaxis de If produce la ejecución sólo en el caso afirmativo de la con-
dición.
Esta forma de If es muy útil para asignar valores a las variables en caso de que una con-
dición se cumpla.
Un bloque de código es un conjunto de líneas de código que tienen su propio alcance
de ejecución y que está siempre delimitado. Si la ejecución de un bloque de código depende
del cumplimiento de una condición, es necesario que se delimite la estructura de decisión;
el bloque de código será entonces todo lo que se encuentre entre el estatuto If y el estatu-
to End If.
If ExpresiónLógica Then
Instrucciones
End If
Sólo en caso de que ExpresiónLógica derive en un valor de True, Instrucciones será ejecu-
tada; esta sintaxis de If controla sólo la ejecución en el sentido afirmativo de la condición.
Por ejemplo:
If es un estatuto de bloque, por lo que si inicia un bloque tendrá que concluirse apropia-
damente. Un error muy común es abrir estructuras de decisión pero no cerrarlas; para evi-
tarlo, es muy útil organizar el código dando a las líneas de inicio y fin de la estructura de
decisión una alineación tabulada distinta a la del bloque de código controlado por dicha es-
tructura. Vea los ejemplos: If y End If nunca tienen el mismo margen izquierdo que el
bloque de código que controlan. No trate de ser original al respecto, pues con ello sólo lo-
grará que la gente se dé cuenta que es un programador novato y poco organizado.
Es posible hacer que If controle al mismo tiempo la ejecución en el sentido afirmativo y
en el sentido negativo, a través de la especificación Else. Vea la sintaxis:
If ExpresiónLógica Then
InstruccionesAfirmativo
Else
InstruccionesNegativo
End If
Select Case
Select Case es una estructura de decisión que permite ejecutar procesos mutuamente ex-
cluyentes en función de comparaciones realizadas sobre un mismo valor de referencia. Su
sintaxis es la siguiente:
Donde ExpresiónAEvaluar es una expresión de cualquier tipo que será tomada como refe-
rencia. Condición sirve para especificar una condición relacionada con ExpresiónAEvaluar
que, en caso de presentarse, disparará la ejecución de Instrucciones. Se va construyendo
un árbol de decisión basado en ExpresiónAEvaluar. Se pueden agregar tantas sentencias
Case como se deseen; incluso es posible anidar las estructuras Select Case.
¿Cómo se codificaría una estructura Select Case que atendiera esta necesidad? Veamos:
Es importante notar que todas las condiciones giran alrededor de la expresión a eva-
luar (en nuestro ejemplo, Categoria): si no hacen uso de dicha expresión, no son
consideradas. Usted podría agregar como instrucción una condición Case que se re-
suelva True, pero que no involucre a Categoria; en ese caso, el código dependiente
de dicho Case nunca se ejecutará.
Estructuras de control
Son estructuras de control, llamadas también bucles, aquellos elementos del lengua-
je que permiten la ejecución de una o más líneas de código de manera repetida.
Mediante las estructuras de control se puede repetir la ejecución de líneas de código:
❑ Un determinado número de veces
❑ Hasta que una condición sea verdadera (True)
For Next 7
For Next repite la ejecución de un bloque de código un número determinado y
conocido de veces. For Next se apoya en una variable que recibe el nombre de con-
tador, que se incrementa o reduce de valor, en intervalos también regulares y cono-
cidos. Su sintaxis es la siguiente:
212 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Donde Variable es una variable de memoria de tipo entero que permitirá controlar
las repeticiones del proceso. ValorInicial es el valor inicial a partir del cual el incre-
mento o decremento se llevará a cabo. ValorMáximo es el valor al cual el contador
podrá llegar. Incremento es la constante entera que marcará la cantidad de incremen-
to o decremento que sufrirá Variable en cada repetición del proceso. Vea los siguien-
tes ejemplos:
‘ Cuenta del 1 al 10
For i = 1 To 10
Console.WriteLine(i)
Next i
‘ Serie del 5
For i = 0 To 50 Step 5
Console.WriteLine(i)
Next i
‘ Decremento del 10 al 1
For i = 10 To 1 Step –1
Console.WriteLine(i)
Next i
While
While ejecuta un bloque de código un número infinito de veces mientras una con-
dición al inicio del bloque se cumpla (True). Su sintaxis es la siguiente:
While ExpresiónLógica
Instrucciones
End While
Capítulo 7. Estructuras de decisión y control 213
Por ejemplo:
Donde ExpresiónLógica es un valor de tipo Boolean (True/False), casi siempre una com-
paración que de ser verdadera al inicio del ciclo de ejecución provoca la ejecución de Ins-
trucciones.
Como recordará, el tipo de datos Byte puede almacenar valores desde 0 a 255, exclusiva-
mente; en nuestro ejemplo, While ejecutará un incremento de 1 para la variable Prueba
mientras sea menor a 255. Si dejáramos que el ciclo fuera más allá de 255, el programa ge-
neraría un error, pues es imposible que una variable de tipo Byte asuma un valor fuera de
su rango.
Al igual que For Next, While tiene una sentencia para interrumpir en cualquier momen-
to el proceso: Exit While.
Una de las formas más útiles de While es el ciclo infinito, en donde ninguna operación o
variable dentro del proceso influye en la condición que gobierna la estructura. Simple y lla-
namente, se proporciona el valor de True como ExpresiónLógica y no hay forma que deje
de ejecutarse el ciclo.
While True
Instrucciones
End While
Por ejemplo:
While True
Console.WriteLine(“Qué número estoy pensando”)
If Console.ReadLine() = 8 Then
Console.WriteLine(“Efectivamente: 8”)
Exit While
7
End If
End While
214 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
En este caso, es indispensable que especifique en su programa alguna condición para eje-
cutar Exit While ya que, de otra manera, nunca concluirá su ejecución. En el ejemplo que
pusimos, mientras no teclee 8, el programa seguirá pidiendo números.
NOTA
Puede ser que su programa tenga un detalle que impida ejecutar Exit While en un ciclo infi-
nito; recuerde que siempre puede detener la ejecución de un proceso presionando la combi-
nación de teclas Ctrl-Intro o Esc.
Do Loop
Do Loop ejecuta un bloque de código un número infinito de veces, hasta que una condi-
ción se cumpla (True). Esta instrucción brinda más flexibilidad que While, en el sentido de
que se puede controlar la evaluación de las condiciones al inicio o al final de la estructura.
Usando Do Loop se pueden crear estructuras que se ejecuten al menos una vez, de una for-
ma más sencilla que utilizando While.
Su sintaxis es la siguiente:
‘ Evaluación al inicio
Do {While/Until} ExpresiónLógica
Instrucciones
Loop
‘ Evaluación al final
Do
Instrucciones
Loop {While/Until} ExpresiónLógica
i = 0
Do While i <= LimiteMaximo
WriteLine(i)
i += 1
Loop
i = 0
Do Until i > LimiteMaximo
WriteLine(i)
i += 1
Loop
i = 0
Do
WriteLine(i)
i += 1
Loop While i <= LimiteMaximo
i = 0
Do
WriteLine(i)
i += 1
Loop Until i > LimiteMaximo
Do tiene una sentencia para interrumpir en cualquier momento el proceso: Exit Do.
❑ En el caso de estructuras, las variables de tipo entero se resuelven de manera más rápi-
da que cualquier otro tipo de dato.
Los problemas más comunes relacionados con las estructuras anidadas (y su solución) son:
❑ No terminar lo que se inicia.
Problema Solución
If Condición Then If Condición Then
Instrucciones Instrucciones
End If
Problema Solución
For Variable = 0 to 10
Instrucciones Instrucciones
Next Variable Next Variable
Problema Solución
For Variable = 0 to 10 For Variable = 0 to 10
For Variable = 0 to 5 For Variable_1 = 0 to 5
Instrucciones Instrucciones
Next Variable Next Variable_1
Next Variable Next Variable
Problema Solución
For Variable = 0 to 10 For Variable = 0 to 10
If Condición Then If Condición Then
Instrucciones Instrucciones
Next Variable End If
End If Next Variable
Capítulo 7. Estructuras de decisión y control 217
Ejercicio 7.1
Uso de estructuras de decisión
En este ejercicio se utilizará una aplicación de consola para comprobar las estructuras de deci-
sión. Se parte del supuesto que usted indicará al programa cuánto cuesta un producto que desea
comprar, así como el tipo de membresía que tiene en la tienda donde desea comprarlo. A cada
tipo de membresía se le aplica un determinado descuento que será informado por el programa.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Agregue a su solución un proyecto Windows – Console Application, llamado Descuento.
3. Edite el programa de tal forma que aparezca como sigue:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9
10 Dim Precio As Double
11 Dim FactorDesc As Decimal
12
13 Write (“Precio del producto:”)
14 Precio = CDbl(ReadLine())
15
16 If Precio = 0 Then
17 WriteLine(“Nada que calcular”)
18 Else
19 WriteLine(“Membresía:”)
20 WriteLine(“1.- Diamante”)
21 WriteLine(“2.- Premium”)
22 WriteLine(“3.- Clásica”)
23 Write(“¿Qué membresía tiene?:”)
24 FactorDesc = CDec(ReadLine())
25
26
Select Case FactorDesc
Case Is = 1
7
27 FactorDesc = 0.2D
28 Case Is = 2
29 FactorDesc = 0.16D
30 Case Is = 3
31 FactorDesc = 0.1D
218 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
32 Case Else
33 FactorDesc = 0
34 End Select
35 Write(“Precio para usted:”)
36 WriteLine(Precio - (Precio * FactorDesc))
37 End If
38
39 Write(“Presione INTRO para continuar”)
40 ReadLine()
41
42 End Sub
43
44 End Module
Ejercicio 7.2
Uso de For Next
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Dim LimiteMaximo As Integer = 4
11 Dim LimiteMinimo As Integer = 0
12 Dim i As Integer
13
14 WriteLine(“Mostrando con For Next incremental”)
15 For i = LimiteMinimo To LimiteMaximo
16 WriteLine(i)
17 Next i
18
19 WriteLine(“Muestra usando For Next invertido”)
20 For i = LimiteMaximo To LimiteMinimo Step –1
21 WriteLine(i)
22 Next i
23
24 WriteLine(“Mostrando con While”)
25 i = 0
26 While i <= LimiteMaximo
Capítulo 7. Estructuras de decisión y control 221
27 WriteLine(i)
28 i += 1
29 End While
30
31 WriteLine(“Muestra usando Do Loop inicial While”)
32 i = 0
33 Do While i <= LimiteMaximo
34 WriteLine(i)
35 i += 1
36 Loop
37
38 WriteLine(“Muestra usando Do Loop inicial Until”)
39 i = 0
40 Do Until i > LimiteMaximo
41 WriteLine(i)
42 i += 1
43 Loop
44
45 WriteLine(“Muestra usando Do Loop final While”)
46 i = 0
47 Do
48 WriteLine(i)
49 i += 1
50 Loop While i <= LimiteMaximo
51
52 WriteLine(“Muestra usando Do Loop final Until”)
53 i = 0
54 Do
55 WriteLine(i)
56 i += 1
57 Loop Until i > LimiteMaximo
58
59 Write(“Presione INTRO para continuar”)
60 ReadLine()
61 End Sub
62
63 End Module
4
Muestra usando Do Loop final Until
0
1
2
3
4
Presione INTRO para continuar
6. Modifique las asignaciones de las líneas 25, 32, 39, 46 y 53. En lugar de asignar 0, asig-
ne 10. Se proporciona ese valor porque no es válido para las condicionales While y Un-
til del programa. Compruebe cómo las estructuras con evaluación al final se ejecutan
al menos una vez. Si todo transcurrió bien, la pantalla mostrará lo siguiente:
7. Hay una herramienta en Visual Studio que permite crear y administrar tareas con el fin
de no olvidar pendientes relacionados con el desarrollo en el que participamos. Esta he-
rramienta tiene el nombre de Task List. 7
8. En Task List se pueden manejar dos categorías de registros: tareas de usuario y comen-
tarios de tarea. Las tareas de usuario son tareas que el usuario registra, estableciéndo-
les prioridad (alta, media, baja) y un indicador de estado, que marca si la tarea ya ha si-
do concluida (completed). Los comentarios de tarea son comentarios en el código que
224 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
tienen significado para Visual Studio, y que producen un registro en Task List. Estos
comentarios de tarea son: TODO, para señalar cosas por hacer; HACK, para anotar recor-
datorios de cosas relacionadas con el desarrollo; y UNDONE, para deshacer cosas que
temporalmente se colocaron pero que hay que eliminar antes de liberar el programa en
producción.
9. Para ver Task List es necesario seleccionar la opción View – Task List (oprima las te-
clas CTRL-\, CTRL-T). Con ello aparecerá la ventana Task List.
FIGURA 7.1
Task List
10. En Task List seleccione en el cuadro de lista Categories la categoría User Tasks.
Haga clic en el icono Create Task User. Se agregará una tarea de forma automática.
11. En descripción escriba Enviar por correo electrónico a un amigo. En la misma lí-
nea de la tarea, haga clic en la columna de prioridad, con lo que aparecerán las diferen-
tes prioridades que se pueden asignar a una tarea.
Capítulo 7. Estructuras de decisión y control 225
> Lo nuevo
En Visual Studio 2005 Task List permite desplegar varias líneas de texto en cada fila, el orde-
namiento basado en una o varias columnas, y cambiar la posición de las columnas de acuer-
do con los gustos del desarrollador.
12. En la línea anterior, en donde se inicia la comprobación de While (línea 24), agregue
el siguiente comentario:
13. Agregar un comentario reconocido por Visual Studio (TODO / HACK / UNDONE)
agrega un registro a Task List, en donde se especifica el archivo y la línea en la que
se realizó la anotación.
14. En Task List haga doble clic sobre el comentario que acaba de agregar y vea cómo el 7
control del programa se traslada a donde se encuentra el comentario.
15. Guarde todos los cambios en su solución.
226 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Ejercicio 5.1
Identificación de errores en estructuras anidadas
En este ejercicio analizará el código que se proporciona, y explicará cuáles son los erro-
res que se presentan (si los hay). Si no hay problemas, indíquelo en su respuesta.
1)
2)
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
7
228 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
PREGUNTAS
7.1 ¿Cuáles son las estructuras de decisión más importantes y cuál es la sintaxis de ca-
da 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 Loop que While?
Notas:
7
230 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
3. Es la estructura ideal para cuando se han de ejecutar procesos mutuamente excluyentes, dependien-
do de un valor determinado:
a) If
b) For
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
231
232 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Errores y Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Manejo estructurado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Try...Catch...Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Try . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Bloque Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Clase System.Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Uso de Try Catch Finally y de las propiedades de la clase
System. Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
➤ Despliegue de errores en tiempo de diseño usando
Error List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Calificadores de excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Objeto Err . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Tipos de filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Filtrado de excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Lanzamiento de excepciones propias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Lanzamiento de excepciones definidas por el usuario . . . . . . . . 246
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 desa-
rrolla.
8
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 to-
talmente 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 pro-
ducen 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 arit-
mética, por ejemplo—, es probable que codifique correctamente una fórmula que no es co-
rrecta; el programa no reportará errores en tiempo de compilación o ejecución, pero sin du-
da 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 len-
guaje, manejo inadecuado de dominios o problemas de hardware.
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 ex-
cepciones 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, argumen-
tos, o propiedades. Las demás son detectadas en el editor de código (excepto algunas excep-
ciones de hardware, que es posible detectar sólo hasta el momento de ejecución).
Try...Catch...Finally
8
Se puede implementar el manejo estructurado de excepciones a través del estatuto Try-
...Catch...Finally.
Bloque para
el manejo
Su sintaxis es la siguiente:
estructurado de
excepciones 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:
❑ 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
❑ Se puede utilizar uno o varios bloques Catch para manejar las excepciones.
Bloque Finally
El bloque Finally se ejecuta después del bloque Try, en caso de que no ocurran excepcio-
nes, o después del bloque Catch correspondiente, en caso de que sí haya sucedido una ex-
cepción.
Este bloque es opcional en su definición, pero no en su ejecución; si se define un bloque
Finally, éste se ejecutará siempre.
El uso más común de Finally es liberar objetos o cerrar archivos después de que una ex-
cepció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 permi-
te 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é ocu-
rre después, hayan ocurrido o no excepciones.
Si en el código protegido por Try no ocurren excepciones, el control del programa hace ca-
so 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:
En caso de que ocurra una excepción en el bloque de código protegido, el control del pro-
grama 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
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.
Ejercicio 8.1
Uso de Try Catch Finally y de las propiedades de la clase System.Exception
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Decimal
13 Write(“Dame el dividendo:”)
14 N1 = CDec(ReadLine())
15 Write(“Dame el divisor:”)
16 N2 = CDec(ReadLine())
17 Resultado = N1 / N2
18 WriteLine(“Resultado:” & Resultado.ToString)
19 Catch eProblema As Exception
20 WriteLine(“> Origen:”)
21 WriteLine(eProblema.Source)
22 WriteLine(“> Mensaje:”)
23 WriteLine(eProblema.Message)
24 WriteLine(“> Antecedente de ejecución:”)
25 WriteLine(eProblema.StackTrace)
26 WriteLine(“> Texto completo:”)
27 WriteLine(eProblema.ToString)
28 Finally
29 Write(“Pulse INTRO para continuar”)
30 ReadLine()
31 End Try
32
33 End Sub
34
35 End Module
5. 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).
8
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 ac-
tuará 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 pro-
grama 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.
Las líneas 21, 23, 25 y 27 muestran algunas propiedades importantes del objeto ePro-
blema 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:
13. En Error List se muestran los errores que contiene el programa, el archivo físico don-
de se encuentran los problemas y la línea de código en se encuentra (la línea, la colum- 8
na 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á ocasio-
nando 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 suce-
dan (lo que no es muy recomendable), o bien, revisando la ayuda de Visual Basic, en don-
de 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:
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 Inte-
lliSense 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 excep-
ciones (Structured Exception Handling) usando Try... Catch... Finally..., y el ma-
nejo 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.
Ejercicio 8.2
8
Filtrado de excepciones
1 Option Explicit On
2 Option Strict Off
3
4 Imports System.Console
5
6 Module Module1
7
8 Sub Main()
9 Dim Satisfactorio As Boolean = True
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Byte
13 Write(“Dame el dividendo:”)
14 N1 = ReadLine()
15 Write(“Dame el divisor:”)
16 N2 = ReadLine()
17 Resultado = N1 / N2
18 WriteLine(“Resultado:” & Resultado.ToString)
19 Catch eProblema As System.DivideByZeroException
20 WriteLine(“>>>>>>> Se trató de dividir entre cero”)
244 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
La línea 21 muestra el número de error del que se trata, utilizando para ello la propie-
dad Number del objeto Err, que también funciona en Visual Basic (en forma mejorada).
8
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 excep-
ciones trata a todas por igual, lo que resta precisión a la función de depuración de pro-
gramas. 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 (Satisfacto-
rio), que nos servirá para saber si el proceso fue satisfactorio (True) o si presentó ex-
cepciones (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 da-
mos 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:
Vea cómo el programa diferencia entre los tipos de excepciones que pueden ser causa-
das 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.
Ejercicio 8.3
Lanzamiento de excepciones definidas por el usuario
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Try
11 WriteLine(“Prueba de manejo de Excepciones”)
12 Dim N1, N2, Resultado As Decimal
13 Write(“Dame el dividendo:”)
14 N1 = CDec(ReadLine())
15 Write(“Dame el divisor:”)
16 N2 = CDec(ReadLine())
17 If N2 = 0 Then
18 Throw New Exception(“Divisor no puede ser cero”)
19 End If
20 Resultado = N1 / N2
21 WriteLine(“Resultado:” & Resultado.ToString)
22 Catch eProblema As Exception
23 WriteLine(“> Problema: “ & eProblema.Message)
24 Finally
25 Write(“Pulse INTRO para continuar”)
26 ReadLine()
27 End Try
28
29 End Sub
30
31 End Module
248 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
PREGUNTAS
8.1 ¿Para qué sirven los bloques Try Catch Finally?
Notas: 8
252 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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
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
7. La ejecución del código Finally se llevará a cabo sólo si se produce una excep-
ción.
255
256 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Términos básicos de POO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Clases y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Campos, propiedades, métodos y eventos . . . . . . . . . . . . . . . . . . . . . . 258
Encapsulamiento (encapsulation) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Herencia (inheritance) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Polimorfismo (polymorphism) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Overloading, Overriding y Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . 264
Elementos esenciales de los objetos que permiten su programación . . . . . . 265
Identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Comportamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Comprobación de la identidad, el estado y el
comportamiento de objetos . . . . . . . . . . . . . . . . . . . . . . . . 269
➤ Instanciación de objetos en Visual Studio . . . . . . . . . . . 269
➤ Modificación de la identidad de los objetos en
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
➤ Programación de comportamientos desde
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Capítulo 9. Fundamentos de la programación orientada a objetos 257
Todavía se habla de la POO con entusiasmo, sobre todo cuando quien lo hace no ha pro-
gramado con lenguajes como C++ o Java. Es necesario destacar que hace mucho tiem-
po el tema dejó de ser una novedad, y, sin embargo, por alguna extraña razón, se sigue 9
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 par-
te de un grupo más reducido y diferente, lo que confiere siempre un cierto grado de espe-
cialidad.
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 anterior-
mente tenía, ganando flexibilidad y potencia, y cubriendo aspectos que antes eran más sen-
cillos en otros lenguajes como C++.
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 paradig-
mas. Es importante, por no decir que indispensable, comprender el marco teórico del mo-
delo orientado a objetos para ser un buen programador en POO.
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 forma-
rá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 funcio-
nal de la clase. A la acción de generar un objeto a partir de una clase, se le denomina ins-
tanciación.
Al procedimiento o código que realiza la instanciación se le denomina constructor. Al pro-
cedimiento 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 libe-
rar los recursos que utilizan.
Los métodos son los comportamientos predefinidos que puede presentar un objeto. En cier-
ta 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.
9
FIGURA 9.1
Estructura de un
objeto
La interacción que tiene el usuario o programa con un objeto provoca internamente una in-
teracción de dicho objeto con otros, que puede ser bidireccional, ya sea que el objeto reci-
ba 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 en-
capsulamiento, herencia y polimorfismo. Estas tres cualidades son representativas de POO.
260 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
taria se dan servicio entre sí; en un momento dado, si a una persona se le ocurre modi-
ficar 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 modi-
ficar 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.
9
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 to-
dos los programadores que utilizaran el objeto pudieran conocer los pormenores del al-
goritmo 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, favore-
ce 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éto-
dos 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á defini-
dos 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 car-
ga); 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-
262 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 9.2
Herencia
Clase Base
Clases derivadas
Las ventajas que proporciona la herencia para los programadores de software son las si-
guientes:
Capítulo 9. Fundamentos de la programación orientada a objetos 263
La figura 9.2 muestra de manera conceptual cómo, a partir de una clase base, surgen clases
9
derivadas que pueden disponer de todas las propiedades, métodos y eventos de la clase ba-
se, y que además incluyen las características particulares de aquello que no es posible re-
presentar 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 defini-
do 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 poli-
morfismo 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 propie-
dades 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 utili-
za, 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 argu-
mento que reciba. Si la función recibe un argumento String, realizará la conversión y devol-
verá 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 ar-
gumento String, Char u Object. El polimorfismo se encarga de realizar la selección adecuada.
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 por-
menores de la venta. Suponga que hay un objeto llamado ActualizaLíneaCrédito que se en-
carga de actualizar la línea de crédito de los clientes que compran en el establecimiento; co-
mo 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 pro-
cedimientos 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á.
NOTA
La implementación en programación de la terminología descrita en este capítulo se demos-
trará 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 diferen-
te 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 pa-
ra la clase derivada. Esto permite sustituir elementos heredados de la clase base, con aque-
llos 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.
❑ 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 iden-
tidad.
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 he-
cho de que todos los controles que se utilizaban en las aplicaciones debían ser referidos por
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 ele-
mentos de un programa. Una vez realizada la codificación, cambiar la identidad a un con-
trol (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 Ena-
bled=False); puede tener un ancho de 10 o 20 píxeles (Width=10 o Width=20). Si cam-
biamos 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 propieda-
des establecidas; vea cómo la identidad del objeto también forma parte del estado del mis-
mo, 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 ejecu-
ció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 pre-
sentar, 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 co-
mo 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 decir-
le 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 proce-
dimiento y c) especificarle a dicho procedimiento que será ejecutado en caso de que le su-
ceda el evento a alguno de los objetos que maneje (handles).
9
En versiones anteriores de Visual Basic, un procedimiento de evento podía servir sólo pa-
ra 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 for-
mado 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 cua-
dros de texto no se dejaran vacíos); no obstante que el proceso a realizar era el mismo pa-
ra todos los cuadros de texto, a cada uno de ellos se le debía definir un procedimiento de
evento.
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 proce-
samiento o el valor que devuelven (en el caso de las funciones). Los argumentos implíci-
tos son aquellos que son declarados por Visual Basic de manera automática; en la declara-
ció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 tra-
bajar; cuando nosotros declaramos un objeto especificando que queremos que sea sensible
a eventos (WithEvents), también le estamos diciendo al programa que queremos que Vi-
sual 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 de-
termina 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 pu-
ra 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.
268 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
NOTA
Algunos desarrolladores, para no estar preocupándose respecto a qué objetos permitirán ma-
nejo de eventos y cuáles no, colocan la especificación WithEvents a todos los objetos. Aun-
que 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.
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
FIGURA 9.4
Form Designer
Moderadores
de tamaño
6. 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.
7. Seleccione la opción View – Toolbox (oprima las teclas Ctrl-Alt-X) para que aparez-
ca Toolbox. Si Toolbox está en ocultación automática, fíjela en Document Window.
8. En Toolbox expanda el grupo de controles Common Controls.
Capítulo 9. Fundamentos de la programación orientada a objetos 271
FIGURA 9.5
Interfaz con con-
troles derivados
9
de clases
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 Stu-
dio 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 ejem-
plo, se agrega automáticamente el siguiente código en el programa Form1.Designer.vb:
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 desarro-
llar en modo de diseño lo más que pueda. Sólo edite el código si sabe lo que está ha-
ciendo, 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 pro-
piedades 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
Height 150
21. Seleccione el objeto Button1, haciendo un solo clic en el botón que se ve en Form De-
signer.
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.
Cuando hacemos referencia a la forma programática de hacer las cosas, queremos de-
cir que a través de código hacemos cosas que es posible hacer en tiempo de diseño uti-
lizando 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 pro-
cure 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 va-
lor de la propiedad Name a Cambiar.
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
35. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado 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. 9
FIN DEL EJERCICIO *
TERMINOLOGÍA
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
Parte 1: Marque con una cruz el inciso que considere que responde a la pregunta.
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
279
280 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Definición de una clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Definición de propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Creación de bibliotecas de clases (librerías) . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Condiciones para la utilización de las bibliotecas de clases . . . . . . . . . . . . . . 284
Creación de una clase con propiedades y métodos . . . . . . . . . . . 284
➤ Uso de Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
➤ Creación de un diagrama de clases y modificación
del mismo con Class Designer . . . . . . . . . . . . . . . . . . . . . 289
➤ Uso del selector de documentos activos
(Active Documents) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
➤ Adición de métodos usando Class Designer . . . . . . . . . . 292
➤ Uso de Class View para examinar objetos . . . . . . . . . . . 296
Consumo una clase a través de instancias . . . . . . . . . . . . . . . . . . 298
Uso de Object Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Visualización de referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Uso de clases en soluciones diferentes . . . . . . . . . . . . . . . . . . . . 304
➤ Integración de proyectos existentes a una
nueva solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
➤ Distribución de copias locales de librerías DLL . . . . . . . . 305
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Capítulo 10. Clases, métodos y propiedades 281
Class NombreClase
CódigoClase
End Class
Donde NombreClase es el nombre a través del cual la clase puede ser invocada. La instan-
ciació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 (pro-
piedades) y comportamiento (métodos y funciones).
Por esa razón debemos definir dentro de la clase los procedimientos (Sub - End Sub), fun-
ciones (Function - End Function), y propiedades (Property - End Property) que de-
be 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, obje-
tos. 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:
Definición de propiedades
Para una clase se puede, además de definir su comportamiento a través de métodos y fun-
ciones, 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 defi-
nir 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 per-
mita 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
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.
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 mo-
dificadores 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:
284 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 consu-
mo desde otros programas.
Capítulo 10. Clases, métodos y propiedades 285
10
4. Cambie el nombre de la clase, sustituyendo Class1 por Areas.
7. Aparecerá una herramienta parecida a Intellisense, que permite seleccionar los patro-
nes de código preestablecidos de Visual Studio. Seleccione Common Code Patterns.
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 snip-
pets. 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 New-
Property 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 snip-
pet...., 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 In-
sert 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.
> Lo nuevo
En Visual Studio 2005 los code snippets formalizan lo que los desarrolladores hacían todo el
tiempo: copiar y pegar.
16. Desde la barra de herramientas de Solution Explorer, seleccione View Class Diagram
10
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 apar-
tado Properties y haga clic en <add property>. Automáticamente se agregará una
línea en donde podrá especificar los elementos básicos de la propiedad. En la colum-
na 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 do-
cumento, utilizando las flechas de dirección, o mantenga oprimida la tecla Ctrl mien-
tras 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 ocasio-
nes hasta que el programa en que codificamos la clase, Class1.vb (C:\APVBNETVS\
Ejercicios\Clase\Class1.vb) aparezca; cuando se haya seleccionado el archivo de-
seado, 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?
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 selec-
cionar 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 ti-
po 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 ti-
po 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 de-
berá 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:
1 ‘’’ <summary>
2 ‘’’ Muestra el área de un círculo
3 ‘’’ </summary>
4 ‘’’ <returns>Área del circulo (Decimal)</returns>
5 Public Function Círculo() As Decimal
6 Return (3.1416D * (Radio ^ 2))
7 End Function
17 ‘’’ <summary>
18 ‘’’ Variable de paso para altura
19 ‘’’ </summary>
20 Private pAltura As Decimal
21 ‘’’ <summary>
22 ‘’’ Valor de medida de la altura
23 ‘’’ </summary>
24 Public Property Altura() As Decimal
25 Get
26 Return pAltura
27 End Get
28 Set(ByVal value As Decimal)
29 pAltura = value
30 End Set
31 End Property
32 ‘’’ <summary>
33 ‘’’ Muestra el área de un rectángulo 10
34 ‘’’ </summary>
35 Function Rectangulo() As Decimal
36
37 Return (Base * Altura)
38 End Function
39 ‘’’ <summary>
40 ‘’’ Muestra el área de un triángulo rectángulo
41 ‘’’ </summary>
42 Function TrianguloRectangulo() As Decimal
43
44 Return ((Base * Altura) / 2)
45 End Function
46
47 ‘’’ <summary>
48 ‘’’ Valor de medida del radio
49 ‘’’ </summary>
50 Public Property Radio() As Decimal
51 Get
52
53 End Get
54 Set(ByVal value As Decimal)
55
56 End Set
57 End Property
58
59 ‘’’ <summary>
60 ‘’’ Muestra el área de un círculo
61 ‘’’ </summary>
62 ‘’’ <returns>Área del círculo (Decimal)</returns>
63 Public Function Círculo() As Decimal
64 Return (3.1416D * (Radio ^ 2))
65 End Function
66
67
68 End Class
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?
_____________________________
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 pala-
bra Base, empezando con la que más concuerde con el patrón a buscar (que es la pro-
piedad 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 co-
locarse en el miembro Areas. Observe cómo al seleccionar el nodo, todos sus miem-
bros 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
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 299
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
8. Dentro del módulo deberá generar una instancia de la clase Areas. Para ello deberá es-
cribir 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 codifi-
cado):
Dim X As Areas
X = New Areas()
11. Vea cómo Intellisense ya reconoce la existencia de nuestra clase y sus miembros. In-
cluso da la información que nosotros establecimos como comentario.
Capítulo 10. Clases, métodos y propiedades 301
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5 Imports Clase
6
7
8 Module Module1
9
10
11
Sub Main()
Dim X As New Areas
10
12
13 X.Altura = 10D
14 X.Base = 20D
15
16 WriteLine(“—- Áreas calculadas ———-”)
17 WriteLine(“Rectángulo: “ & CType(X.TrianguloRectangulo(), String))
18
19 Write(“Presione INTRO para continuar”)
20 ReadLine()
21 End Sub
22
23 End Module
➤ 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 Triangulo-
Rectangulo () 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 me-
nú 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
TrianguloRectangulo() y despliegue el menú contextual; seleccione Find All Refe-
rences. 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.
22. Por supuesto, al hacer doble clic en cualquiera de los elementos, Visual Studio nos tras-
ladará 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 de-
sarrolladores 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 utili-
zadas en todas las soluciones que construyen. Usos comunes son clases para gobernar la se-
guridad de las aplicaciones, clases para el acceso eficiente a los datos, clases para interfa-
ces 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 pro-
yectos, las utilizan. Veamos cómo se logra esto usando Visual Studio.
10
308 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
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
5. Es la especificación de destino (target) que aplica para las bibliotecas de clase, al momento de compi-
lar para generar un DLL:
a) Library
b) Class
c) Binary
6. Las clases que pertenecen a la biblioteca de clases de .NET Framework pueden utili-
zarse 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.
311
312 Aprenda Practicando Visual Basic 2005 usando Visual Studio
Contenido
Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
¿Cuándo se debe utilizar la herencia? . . . . . . . . . . . . . . . . . . . . . . . . . 313
Inherits (Heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Notlnheritable (No heredable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Mustlnherit (Debe heredar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Modificadores de acceso, necesarios para la herencia . . . . . . . . . . . . . 315
Programación de clases base y clases derivadas . . . . . . . . . . . . . 315
➤ Adición de clases a un módulo usando Class Designer . . 316
Estatutos auxiliares para el manejo de herencia y polimorfismo . . . . . . . . . . 323
NotOverridable (No reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overridable (Reemplazable) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
MustOverridable (Debe reemplazarse) . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overrides (Reemplaza) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Overloads (Sobrecarga/Sustituye) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
MyBase y MyClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Comprobación del polimorfismo basado en herencia
y el uso de MyBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
➤ Especificación de modificadores de herencia
usando Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Capítulo 11. Herencia y polimorfismo 313
Herencia
La herencia (inheritance) es un concepto fundamental de la programación orientada a ob-
jetos, y consiste en la capacidad de definir clases que sirven como base de otras clases, evi-
tando 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 es-
tá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 modifi- 11
quen (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.
Inherits (Heredar)
El estatuto Inherits se utiliza para especificar que una clase de nueva creación tiene co-
mo base una clase ya existente. La clase nueva es la clase derivada (derived class); la cla-
se ya existente es la clase base (base class).
La sintaxis es la siguiente:
Class NombreClaseDerivada
InheritsNombreClaseBase
...
End Class
En este caso, la clase derivada dispone de todos los elementos declarados en la clase base.
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 cla-
ses abstractas (abstract class).
Ejercicio 11.1
Programación de clases base y clases derivadas
7. Con ello se habrá agregado a nuestro programa de consola una clase. Como podrá sos-
pechar, las clases no sólo se pueden codificar como proyectos independientes, sino
también integrarse perfectamente en otros proyectos.
11
8. Aparecerá nuestra nueva clase en el diagrama de clase. Seleccione la nueva clase, des-
pliegue el menú contextual y seleccione Class Details.
318 Aprenda Practicando Visual Basic 2005 usando Visual Studio
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 comportamien-
to a los métodos de MiClaseBase.
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10
11 Write(“Presione INTRO para continuar”)
12 ReadLine()
13 End Sub
14
15 End Module
16
17 Public Class MiClaseBase
18
19 ‘’’ <summary>
20 ‘’’ Envía primer mensaje
21 ‘’’ </summary>
22 Public Sub Mensaje1()
23 WriteLine(“Clase Base - Mensaje 1”)
24 End Sub
Capítulo 11. Herencia y polimorfismo 319
25
26 ‘’’ <summary>
27 ‘’’ Envía segundo mensaje
28 ‘’’ </summary>
29 Public Sub Mensaje2()
30 WriteLine(“Clase Base - Mensaje 2”)
31 End Sub
32 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 de-
cir, Module1.vb.
11
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6
7 Module Module1
8
9 Sub Main()
10 Dim MiObjeto As New MiClaseDerivada
11 MiObjeto.Mensaje1()
12 MiObjeto.Mensaje2()
13 MiObjeto.Mensaje3()
14 Write(“Presione INTRO para continuar”)
15 ReadLine()
16 End Sub
17
18 End Module
19
20 Public Class MiClaseBase
21
22 ‘’’ <summary>
23 ‘’’ Envía primer mensaje
24 ‘’’ </summary>
25 Public Sub Mensaje1()
26 WriteLine(“Clase Base - Mensaje 1”)
27 End Sub
28
29 ‘’’ <summary>
30 ‘’’ Envía segundo mensaje
31 ‘’’ </summary>
32 Public Sub Mensaje2()
33 WriteLine(“Clase Base - Mensaje 2”)
34 End Sub
35 End Class
36
37 Public Class MiClaseDerivada
38 Inherits MiClaseBase
39
40 ‘’’ <summary>
41 ‘’’ Envía tercer mensaje
42 ‘’’ </summary>
43 Public Sub Mensaje3()
44 WriteLine(“Clase Base - Mensaje 2”)
45 End Sub
46 End Class
Capítulo 11. Herencia y polimorfismo 321
14. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado 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 MiClase-
Derivada, de la línea 37 a la 46.
16. En la línea 10 se tiene un constructor que genera una instancia de la clase MiClaseDe-
rivada 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 dis-
pone 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 Mi-
ClaseBase. Declarar los mismos métodos en ambas clases sería redundante.
Tome en cuenta las dimensiones que puede tomar su jerarquía de clases, ya que si he-
reda una clase que a su vez es derivada de otra clase, se hereda también la funcionali-
dad de la clase base de ésta.
Si todo ocurrió como se esperaba, la salida será la siguiente:
17. Si consultamos el diagrama de clase, nos daremos cuenta que reconoce ya la relación
de herencia existente entre nuestras dos clases.
FIGURA 11.1
Estatutos
auxiliares para
el manejo de
herencia
324 Aprenda Practicando Visual Basic 2005 usando Visual Studio
Overridable (Reemplazable)
El segundo escenario es que la clase base admita modificaciones o sustituciones a su funcio-
nalidad. 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.
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 cuan-
do 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éto-
do 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 lla-
mar 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 11
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 és-
ta es derivada.
Es importante saber que tanto MyBase como MyClass, aunque en su manejo parecen obje-
tos, realmente no lo son. No se instancian; existen porque el lenguaje los proporciona pa-
ra 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 funcio-
nalidad.
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 poli-
morfismo. 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
326 Aprenda Practicando Visual Basic 2005 usando Visual Studio
Ejercicio 11.2
Comprobación del polimorfismo basado en herencia y el uso de MyBase
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Const PagoXHoraVig As Decimal = 120D
8 Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11
12 End Sub
13
14 End Module
Capítulo 11. Herencia y polimorfismo 327
4. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina –
Nomina y haga clic en el icono View Class Diagram.
5. Agregue, usando Class Designer, una clase llamada Pago, que será pública y que se
agregará al programa de consola que estamos trabajando.
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 devol-
verá 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
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Public Const PagoXHoraVig As Decimal = 120D
8 Public Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11
12 End Sub
13
14 End Module
15
16 Public Class Pago
17
18 ‘’’ <summary>
19 ‘’’ Cálculo del pago neto
20 ‘’’ </summary>
21 Public Overridable Function CalculaPago() As Decimal
22
23 End Function
24 End Class
Capítulo 11. Herencia y polimorfismo 329
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 de-
be quedar de la siguiente manera:
10. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – 11
Nomina y haga clic en el icono View Class Diagram.
11. Agregue, usando Class Designer, una clase llamada PagoBonificado, que será públi-
ca 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, in-
voque Class Details y agregue un método de nombre CalculaPago(), que será públi-
co 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 he-
redando 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 selec-
cione el método CalculaPago() de PagoBonificado, e invoque Properties; deberá
modificarse la propiedad Inheritance modifier, asignando un valor Overrides. Da-
do 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 pro-
cedimientos 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 cla-
se 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:
330 Aprenda Practicando Visual Basic 2005 usando Visual Studio
15. Abra Class View (oprima las teclas Ctrl-Mayús-C), seleccione el nodo Nomina – No-
mina 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 agre-
gar, 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, inte-
grará 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éto-
do no necesariamente sean los mismos. La sustitución deberá especificarse vía códi-
go, 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 adicio-
nal 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.
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Console
5
6 Module Module1
7 Public Const PagoXHoraVig As Decimal = 120D
8 Public Const BonoPuntualidad As Decimal = 1.25D
9
10 Sub Main()
11 Dim PagoNoPuntuales As Pago = New Pago()
12 Dim PagoPuntuales As New PagoBonificado()
13 Dim PagoPuntualesPlus As New PagoBonificadoExtra()
14 Dim Horas As Decimal = 40
15
16 WriteLine(“Pago a los no puntuales: “ & _
17 PagoNoPuntuales.CalculaPago(Horas, PagoXHoraVig))
18 WriteLine(“Pago a los puntuales: “ & _
19 PagoPuntuales.CalculaPago(Horas, PagoXHoraVig))
20 WriteLine(“Pago a los puntuales, + extra: “ & _
21 PagoPuntualesPlus.CalculaPago(Horas, _
22 PagoXHoraVig, 1.2D))
332 Aprenda Practicando Visual Basic 2005 usando Visual Studio
23
24 Write(“Pulse INTRO para continuar”)
25 ReadLine()
26 End Sub
27
28 End Module
29
30 Public Class Pago
31
32
33 ‘’’ <summary>
34 ‘’’ Cálculo del pago neto
35 ‘’’ </summary>
36 Public Overridable Function CalculaPago( _
37 ByVal HorasTrabajadas As Decimal, _
38 ByVal PagoXHora As Decimal) As Decimal
39
40 Return (HorasTrabajadas * PagoXHora)
41
42 End Function
43 End Class
44
45 Public Class PagoBonificado
46 Inherits Pago
47
48 ‘’’ <summary>
49 ‘’’ Cálculo de pago con bonificación
50 ‘’’ </summary>
51 Public Overrides Function CalculaPago( _
51 ByVal HorasTrabajadas As Decimal, _
53 ByVal PagoXHora As Decimal) As Decimal
54
55 Dim PagoNeto As Decimal
56 PagoNeto = MyBase.CalculaPago(HorasTrabajadas, PagoXHora)
57 Return PagoNeto * BonoPuntualidad
58
59 End Function
60 End Class
61
62 Public Class PagoBonificadoExtra
63 Inherits PagoBonificado
64
65 ‘’’ <summary>
66 ‘’’ Cálculo de pago con bonificación y extra
67 ‘’’ </summary>
68 Public Overloads Function CalculaPago( _
69 ByVal HorasTrabajadas As Decimal, _
70 ByVal PagoXHora As Decimal, _
71 ByVal Extra As Decimal) As Decimal
72
73 Dim PagoBonificado As Decimal
74 PagoBonificado = MyBase.CalculaPago( _
75 HorasTrabajadas, PagoXHora)
76 Return PagoBonificado * Extra
77
78 End Function
79 End Class
Capítulo 11. Herencia y polimorfismo 333
22. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado 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 em-
pleados puntuales, que es un poco más alto; finalmente hay un monto aún más alto pa-
ra 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 ane-
xan estas constantes con el único fin de no solicitar información al usuario para la de-
mostració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 11
la funcionalidad de PagoBonificado. Las relaciones de herencia entre las clases
quedan como sigue: Pago es clase base de PagoBonificado; Pago bonificado es clase de-
rivada 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
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 vi-
gente. 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 codifica-
do 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 PagoPuntua-
les). 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 de-
clara una variable de trabajo (línea 55) a la cual le asigna el valor retornado el méto-
do 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 implemen-
tació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 re-
sultado 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
11
336 Aprenda Practicando Visual Basic 2005 usando Visual Studio
TERMINOLOGÍA
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
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
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
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
Parte 4
13 Desarrollo de aplicaciones
Web con ASP.NET Interfases
14 Servicios Web XML Windows/Web y
Servicios Web XML
Herramientas de Visual
Studio revisadas: En esta parte del libro aprenderemos a desarrollar
las interfases que proporcionarán a nuestros
1. Form Designer
2. Menu Designer procesos datos completos y correctos.
3. Dynamic Help
4. String collection editor Esta parte describe la manera de recopilar los datos
5. HTML Designer necesarios para el procesamiento y el
6. Regular Expression Editor almacenamiento.
Objetivos: Conocer los elementos básicos del trabajo con controles para la crea-
ción de aplicaciones con interfaz gráfica Windows.
341
342 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
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 consecuen-
cia. La interfaz puede ser gráfica (GUI, Interfaz gráfica de usuario, Graphic User Interfa-
ce), si está constituida por elementos gráficos (iconos, punteros, ventanas); o textual, cuan-
do 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 posi-
ble 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.
Una interfaz se constituye en un punto de contacto con el usuario: permite la entrada y sa-
lida 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 arqui-
tectura 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
NOTA 12
En computación hay un fenómeno que se conoce como GIGO (Garbage In, Garbage Out/ba-
sura entra, basura sale). Si una aplicación acepta datos erróneos, muy probablemente se ge-
nerará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 equivo-
cados. 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.
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 es-
tá 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é conte-
nido 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 elemen-
tos. La codificación ya está disponible como parte de BCL en forma de objetos que pue-
den 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 ob-
tener la apariencia y el comportamiento deseado. Los objetos que se necesitan en nuestra
interfaz derivan de las siguientes clases:
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 ob-
jetos 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 ope-
ración de buscarlos y encontrarlos.
FIGURA 12.3
Toolbox, o barra
de herramientas.
12
348 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 12.4 12
Jerarquía de
clases para
interfaces en
Windows.
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á en-
tendido 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 (ar-
chivo 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.De-
signer.vb.
6. La herramienta Dynamic Help es una ayuda dinámica que actualiza vínculos a los te-
mas de ayuda relativos a lo que estemos haciendo. Dependiendo de lo que estemos tra-
bajando, 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.
> Lo nuevo
En Visual Studio 2005, el contenido de la ayuda se distribuye de forma distinta, más organi-
zada 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).
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 corres-
pondiente al tema, e Index Results, que muestra los diferentes temas que se encuen-
tran para una búsqueda.
13. Index tiene dos fichas: Contents, que muestra los tópicos de forma organizada por te-
mas en un esquema de árbol de nodos, e Index, que permite especificar un tema a bus-
car, 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 fil-
trar 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 opri-
miendo la tecla Intro al finalizar.
15. Aparecerán en Index Results aquellos temas que concuerden con la búsqueda.
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 Ex-
pand 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 expandi-
dos, 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 len-
guajes .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 im-
plementaciones 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 decla-
ració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 apa-
rece 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 propieda-
des, 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 intere-
se 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 pro-
piedad 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 In-
clude 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 comu-
nidad 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 Vi-
sual Studio. Se tiene un nuevo menú, llamado Community, que permitirá el acceso a los re-
cursos disponibles para la comunidad de desarrolladores a nivel mundial.
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, co-
mo 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 elemen-
tos que componen la colección basta con invocar la propiedad Collection.Count de la co-
lección; para agregar elementos, podemos utilizar el método Collection.Add, mientras
12
que para eliminarlos podemos utilizar el método Collection.Remove.
Existen colecciones genéricas para agrupar objetos de tipo indeterminado. Este tipo de co-
lecciones 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 aplicacio-
nes, ya que es necesaria la realización de conversiones en tiempo de ejecución (boxing, un-
boxing).
Se habla de boxing cuando un tipo de dato primitivo es convertido en su equivalente a ob-
jeto (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 ori-
gen. 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.
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.
For Each
El ciclo For Each es una estructura de control que sirve para explorar colecciones. La sin-
taxis de For Each es la siguiente:
For Each Variable In Colección
«proceso en donde Variable se establece como
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 con-
tenidos 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 con-
trol 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 an-
terior.
Enfoque (Focus)
Se entiende por enfoque (focus) la capacidad de interactuar a través del teclado con un ob-
jeto. Por lógica, en tiempo de ejecución sólo un objeto puede poseer el enfoque en un mo-
mento 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 ob-
jeto 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, 12
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 tie-
ne 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.
TabIndex. 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 ca-
sos 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).
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.
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 pun-
tero del ratón a un objeto que no posee el enfoque, propicia una buena cantidad de even-
tos, 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 enfo-
que y lo pierde:
Definir un adecuado orden de tabulación es indispensable para construir una buena inter-
faz. 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 pro-
porcionados por .NET Framework.
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 instan-
cias que de dicha clase se generen.
frmEmpresa.Size.Height 350
5. Cuando encuentre este tipo de tablas en los ejercicios, lo que debe hacer es lo siguiente: 12
a) En la columna de propiedad se encuentra una referencia que se compone de
Objeto.Propiedad. En la herramienta Properties debe asegurarse que tiene selec-
cionado 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 (Propie-
dad1.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 propie-
dades la propiedad especificada (Propiedad), y debe establecer el valor de la mis-
ma 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 termi-
nar 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.
366 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
8. Visual Studio posee controles y herramientas llamados ToolStrip Designer, que per-
miten la modificación de propiedades textuales en modo de diseño. Uno de ellos es
MenuStrip.
9. 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
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 12
Menu Designer.
11. En Menu Designer cada opción constituye un elemento de menú (menu item). Se tie-
nen elementos de primer nivel, que son aquellas opciones que aparecen de forma per-
manente en la barra de menús, y que no dependen de ningún elemento de menú. Tam-
bié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.
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 co-
menzar a editar una etiqueta de elemento, automáticamente se proponen elementos la-
tentes, 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 ele-
mentos 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 forma-
ción de un nuevo nivel de elementos (salvo en el caso de los elementos de primer ni-
vel, 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 ele-
mento latente inferior escriba Limpiar campos; en el elemento latente inferior escri-
ba 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 eti-
queta 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.
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 alinea-
ció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 ob-
jetos 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 rela-
ción con otros objetos y elementos del entorno.
18. Mueva btnCancelar de tal forma que se ubique en la esquina inferior derecha. No de-
je 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.
12
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.
370 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
btnAceptar.Text &Aceptar
btnCancelar.Text &Cancelar
frmEmpresa.CancelButton btnCancelar
21. La propiedad Button.Text permite asignar el texto que aparecerá en la cara del bo-
tón. Si se antepone el carácter & a una de las letras en Button.Text, automáticamen-
te 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:
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
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 bt-
nAceptar 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
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 – Establece una misma distancia entre los objetos,
Make equal sobre el eje horizontal.
12
Format – Horizontal spacing – Incrementa de forma proporcional la distancia
Increase entre los objetos, sobre el eje horizontal.
Format – Horizontal spacing – Disminuye de forma proporcional la distancia
Decrease entre los objetos, sobre el eje horizontal.
Format – Horizontal spacing – Elimina la distancia entre los objetos, sobre el
Remove eje horizontal, dejándolos contiguos.
Format – Vertical spacing – Establece una misma distancia entre los objetos,
Make equal sobre el eje vertical.
Format – Vertical spacing – Incrementa de forma proporcional la distancia
Increase entre los objetos, sobre el eje vertical.
Format – Vertical spacing – Disminuye de forma proporcional la distancia
Decrease entre los objetos, sobre el eje vertical.
Format – Vertical spacing – Elimina la distancia entre los objetos, sobre
Remove el eje vertical, dejándolos contiguos.
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 ob-
jeto individual, son las siguientes:
37. Trace un rectángulo imaginario que toque los dos botones del formulario.
39. El objeto primario de referencia es btnCancelar, dado que tiene delimitadores de ta-
mañ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 ob-
jeto principal de referencia, es decir, btnAceptar.
41. Apoyándose en las líneas guía, vuelva a distribuir los botones de tal manera que ten-
gan una distribución estética. Nuestro formulario debe lucir como sigue:
Capítulo 12. Desarrollo de Aplicaciones Windows 375
42. En modo trazo agregue un objeto TabControl, que se encuentra en el grupo Contai-
ners 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 12
TabControl.
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 Tab-
Page; 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 compor-
tamiento 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 ob-
jeto de lugar, a través del cual podemos arrastrar un control hacia otro sitio en la inter-
faz. 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 gene-
ralmente 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 cuer-
po del TabPage estaremos trabajando con la página. Seleccione la ficha TabPage1 y ha-
ga clic en el cuerpo de la página; en Properties cambie la propiedad Name, de TabPa-
ge1 a tpGenerales. Modifique también el nombre de TabPage2 por tpContacto, y el
de TabPage3 por tpSitio.
50. Modifique las siguientes propiedades:
51. Seleccione tpGenerales y agregue 5 etiquetas (Label), 1 cuadro de texto con másca-
ra (MaskedTextBox), 3 cuadros de texto (Textbox) y un objeto para selección de fe-
cha (DateTimePicker). Todos los controles se encuentran en el grupo Common Con-
trols de Toolbox.
52. Distribuya los objetos de la siguiente forma:
Label1.Text ID Empresa:
MaskedTextBox1.Name mtbIDEmpresa
FIGURA 12.10
Input Mask.
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
txtDireccion.Multiline True
(aumentar el alto del objeto,
una vez modificada esta
propiedad)
Label4.Text NIP de acceso:
TextBox3.Name txtNIP
txtNIP.MaxLength 10
txtNIP.PasswordChar *
DateTimePicker1.Name dtpClienteDesde
Capítulo 12. Desarrollo de Aplicaciones Windows 379
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áxi-
mo 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á conver-
tido 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 12
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 conteni-
do, 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 incre-
mentar 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 tex-
to 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.
Ejercicio 12.3
Uso de grupos de controles, combos y selectores de número
Label6.Text Nombre:
TextBox1.Name txtNombreCon
txtNombreCon.MaxLength 50
Capítulo 12. Desarrollo de Aplicaciones Windows 381
txtNombreCon.CharacterCasing Upper
Label7.Text Teléfono:
MaskedTextBox1.Name mtbTelefono
mtbTelefono.Mask 99 (99) 9999-9999
Label8.Text Título:
ComboBox1.Name cboTitulo
FIGURA 12.11
String Collection
Editor.
12
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
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.
8. 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áxi-
mos 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.
FIN DEL EJERCICIO*
Ejercicio 12.4
Orden de tabulación y activación dinámica de controles
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
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 encabeza-
do 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.
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óque-
se en cualquier parte del formulario en tiempo de diseño, despliegue el menú contex-
tual y seleccione la opción View Code para ver el código del programa. Como no he-
mos 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).
1 Sub LimpiaCampos()
2 ‘ Campos del primer TabPage
3 mtbIDEmpresa.Text = “”
4 txtNombre.Text = “”
5 txtDireccion.Text = “”
Capítulo 12. Desarrollo de Aplicaciones Windows 385
6 txtNIP.Text = “”
7
8 ‘ Campos del segundo TabPage
9 txtNombreCon.Text = “”
10 mtbTelefono.Text = “”
11 rbtnMasculino.Checked = True
12 cboTitulo.SelectedIndex = 0
13
14 ‘ Campos del tercer TabPage
15 chkSitio.Checked = False
16 txtURL.Text = “”
17 txtURL.Enabled = False
18 btnVerSitio.Enabled = False
19 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á agre-
gado un procedimiento de evento que se lanzará cuando el usuario seleccione la op-
ción en tiempo de ejecución. El procedimiento se llama LimpiarCamposToolStripMe-
nuItem_Click. En dicho procedimiento mande llamar el procedimiento LimpiaCampos,
que acabamos de desarrollar.
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á complemen-
tar de la siguiente manera:
386 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 se-
leccione la opción de menú Limpiar Campos. Luego compruebe que al utilizar la op-
ción de menú Cerrar, el formulario se cierra. Con ello habrá aprendido cómo enviar
comandos a través del menú.
19. De esta manera, antes de que el formulario se muestre por primera vez, será ejecuta-
do el procedimiento que iniciará los valores del formulario.
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 po-
demos 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 propie-
dad 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:
12
FIGURA 12.12
TabOrder.
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 or-
den 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 bo-
tó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 con-
trol 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 or-
den 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 som-
breado 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 ta-
bulación cuando ya se está bastante seguro de que no modificará la interfaz.
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 co-
rrectos. Una forma de hacerlo es que el botón de comando que ejecute el procesamien-
to 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, txt-
NIP, txtNombreCon, mtbTelefono. El valor de todos ellos está representado por la pro-
piedad Text. 12
29. En Form Designer, despliegue el menú contextual y seleccione View Code. En Text
Editor codifique el siguiente procedimiento dentro de la clase:
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. Es-
tos argumentos se denominan argumentos implícitos, dado que CLR en tiempo de eje-
cución provee los datos a los argumentos sin que el usuario tenga que enviarlos me-
diante 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 desen-
cadena el evento; y e que es de tipo EventArgs (manejador de argumentos de even-
tos), que también es pasado en modo value type. En la misma declaración del proce-
dimiento 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, txt-
Direccion, txtNIP, txtNombreCon, mtbTelefono. En todo el código no verá un lla-
mado 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 va-
lor, 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 verifi-
cación está marcada. En Form Designer haga doble clic en chkSitio. Se precodifica-
rá el procedimiento por omisión aplicable al cuadro de verificación. Se trata del even-
to CheckBox.CheckedChanged, que se lanzará cuando se cambie el estado de marcado
de la casilla de verificación. Codifique lo siguiente:
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.
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 formula-
rios Windows.
1. Abra la solución Ejercicios, que debe encontrarse en C:\APVBNETVS\Ejercicios (ar-
chivo de extensión sln).
2. Continúe trabajando con el proyecto Empresa del ejercicio anterior.
3. 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:
TERMINOLOGÍA
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
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
397
398 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Motivos del auge de las aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Requerimientos para el desarrollo de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . 400
Entorno operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Herramientas de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Procesamiento de páginas Web en .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Características de ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Elementos de una página Web ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Estructura básica de una página ASP.NET . . . . . . . . . . . . . . . . . . . . . . . 410
Contenido HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Bloques proveedores de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Directivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Formulario del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Controles del servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Adición de código a una página: Código declarativo . . . . . . . . . . . . . . 417
Controles comunes en aplicaciones Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Grupo de controles estándar (Standard) . . . . . . . . . . . . . . . . . . . . . . . . 419
Grupo de controles de datos (Data) . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Grupo de controles de validación (Validation) . . . . . . . . . . . . . . . . . . . 422
Grupo de controles de navegación (Navigation) . . . . . . . . . . . . . . . . . 422
Grupo de controles de acceso (Login) . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Grupo de controles HTML (HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Creación de una página Web ASP.NET, prueba e identificación
de sus elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
➤ Configuraciones iniciales del diseñador de páginas
Web para las vistas y el posicionamiento de controles . . 425
➤ Adición de elementos a un sitio Web . . . . . . . . . . . . . . . 427
➤ Establecimiento de valores generales de formulario . . . 427
➤ Revisión del código generado por el servidor . . . . . . . . 437
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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.
Entorno operativo
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 necesa-
rio 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
Herramientas de desarrollo
13
❑ 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ñado-
res y asistentes interesantes, pero es más limitado respecto de la producción de software
y el trabajo en equipo.
402 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 vigen- 13
cia rápidamente, ya que ASP.NET es más potente, sencillo y organizado; en términos ge-
nerales, 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:
IIS debía interpretar el código, buscar errores de sintaxis, generar el código HTML corres-
pondiente y resolver la página.
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 ejecucio-
nes 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 aloja-
rá 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 formula-
rios (Form-state) era un suplicio. Si se querían trasladar datos de una página a otra de ma-
nera 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.
Código separado (Code Behind). En ASP Clásico, los programas eran una verdade-
ra 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), llama-
das 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).
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 estruc-
turados. Tranquilamente se puede encargar a un grupo de diseño que trabaje sobre la for-
ma de la página, mientras que los programadores podrán estar desarrollando procedimien-
tos 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 lengua-
je que decidamos utilizar), en donde se encontrará la programación de una clase que pro-
vee 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 ser-
vidor 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 prece-
dentes a las aplicaciones Web. Como sabe, la biblioteca de clases de .NET Framework po-
see un gran número de clases disponibles para su uso en los programas; aunque probable-
mente 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 “con-
troles”, 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 ele-
mento 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 even-
tos 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 publica-
ció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 per-
día la estética y algunos elementos ya no funcionaban. El problema era que la funcionali-
dad de nuestras aplicaciones dependía del navegador; en un mundo de aplicaciones globa-
les 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 fire-
walls y los servidores proxy; otro problema adicional: sólo funcionan para la misma plata-
forma 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 in-
teracción con plataformas operativas distintas a Windows.
Seguridad mejorada. De manera predeterminada, el ambiente Web proporciona acce-
so anónimo a los sitios; no obstante ello, es posible que se desee restringir el acceso de al-
guna manera.
En ASP Clásico sólo se tenía un tipo de seguridad: Autenticación Windows. Bajo este es-
13
quema, 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 formu-
larios, 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-
408 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 to-
talidad. A este tipo de implementación se le ha dado el nombre de Copy Deployment.
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) com-
puesta en HTML y controles Web del servidor; esta página contendrá, en lugar de directi-
vas @ 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 conte-
nido 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 conte-
nido que permiten especificar el ContentPlaceHolder en donde el contenido ha de inte-
grarse. En tiempo de ejecución, las páginas maestra y de contenido se enlazan para produ-
cir un resultado coherente y estandarizado.
Las páginas de apariencia (skins) son archivos con extensión .skin que definen las pro-
piedades de apariencia para las páginas ASP.NET; junto con las páginas de cascadas de es-
tilos (.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 13
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 par-
te del cliente (scripting) y sonido, que se pueden integrar a un sitio Web para darle mayor
calidad.
<html>
<head>
</head>
<body>
</body>
</html>
❑ 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, si-
guen 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 eti-
quetas, 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 simple-
mente no funcionaban como debían; en ASP.NET, no sólo no funcionarán, sino que mar-
cará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 equivalen-
te para .NET. En ese sentido, la inversión realizada en componentes y codificación se man-
tiene.
<%
Dim Hora As Integer
Hora = hour(Now)
if Hora > 12 and Hora < 20 then
else
Response.Write(“Buenas tardes”)
13
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 no-
ches”), 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.
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 compa-
tibilidad 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:
Una de las directivas de más útilidad es la directiva @Page. Algunos atributos importantes
de esta directiva son los siguientes.
Otra de las directivas útiles es la directiva @Import, que permite importar espacios de nom-
bres para nuestras páginas.
Veamos ejemplos del uso de @Page y @Import.
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 importar el espacio de nombres que se requiere para trabajar con datos:
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 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 úni-
co 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 com-
plejidad, 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 pro-
gramació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 etique-
ta que llame a un control Web del servidor es la siguiente: 13
<asp:NombreControl
id=”NombreObjeto”
[propiedades]
runat=”server” />
❑ Selección del control. Se deberá abrir la etiqueta normal. En el caso de los contro-
les Web y los controles de validación, deberá agregarse la especificación asp:; de esta
416 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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:
El siguiente ejemplo muestra cómo sería utilizar un control HTML para la creación de un
vínculo (Link/Anchor):
<a
id=”MiLiga”
href=”http://www.aprendapracticando.com”
runat=”server”>
Ir al sitio Aprenda Practicando
</a>
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 con-
trol 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 permitie-
ra omitir el valor del objeto al que llamamos Entrada:
Las páginas no siempre funcionan con código separado. En este caso, los bloques de códi-
go 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 etique-
ta 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:
<Script runat=”server”>
</Script>
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 argu-
mentos implícitos corresponden generalmente al objeto que produce el evento (sender As
Object), así como a un manejador de eventos (e As EventArgs). Obviamente, dependien-
do 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 ha-
cer clic (evento Click) en un botón:
<asp:Button
ID=”Aceptar”
OnClick=”Aceptar_Click”
Text=”Haz clic”
Runat=”server” />
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 419
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 C:\APVBNETVS\Ejercicios
(archivo de extensión sln).
2. El diseñador de páginas Web (HTML Designer, también llamado Web Forms Desig-
ner) 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 directa-
mente las etiquetas de controles de ASP.NET; la vista design, por su parte, permite tra-
bajar 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.
3. 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 vis-
tas y las etiquetas en las que nos encontremos trabajando.
4. 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
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 Ex-
plorer 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.
13
➤ Establecimiento de valores generales de formulario
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 ins-
tancias 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 per-
tinente; por ejemplo, BaseValidator.Display.
10. Modifique las siguientes propiedades desde Properties (oprima la tecla F4).
Capítulo 13. Desarrollo de aplicaciones Web con ASP.NET 429
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:
13
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
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 valida-
ció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 exis-
tir 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 va-
lor. Este validador es el primero que se comprueba, dado que los demás tienen senti-
do sólo cuando el control ya tiene un valor. En caso que RequiredFieldValidator re-
porte error, las demás validaciones no se realizan.
21. Un control que sí tiene sus propiedades particulares es RangeValidator, ya que utili-
za la propiedad RangeValidator.MinimumValue para especificar el umbral del rango,
y utiliza la propiedad RangeValidator.MaximumValue para especificar el valor más al-
to dentro del rango. Es muy importante especificar el tipo de dato sobre el que está ba-
sado 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.
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 Calen-
dar.SelectedDates. Por omisión la selección es de tipo Day.
28. 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. Na-
vigateURL.
29. 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.
30. 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.
31. 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 ve-
mos 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.
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 de-
seado. No es necesario que sepa VBScript o JavaScript: ASP.NET se encarga de codi-
ficar 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.
<a id=”HyperLink1” href=”http://www.aprendapracticando.com” style=
”z-index: 118; left: 8px; position: absolute; top: 377px”>Ir al si-
tio de Aprenda Practicando</a>
Sin embargo, sólo tuvimos que agregar un control a la interfaz y modificar propieda-
des en tiempo de diseño. ¿Qué forma de desarrollo preferiría? Aunque la programa-
ció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 439
13
440 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
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 443
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
5. Son implementaciones funcionales basadas en etiquetas, a través de las cuales se obtiene HTML di-
námico, sensible a eventos.
a) Código declarativo
b) Controles Web
c) HTML.NET
8. Con ASP.NET se puede indicar que las etiquetas HTML se resuelvan del lado del
servidor.
13
9. Las directivas permiten especificar valores a ser considerados al momento de la com-
pilación que realiza .NET Framework.
10. Los equipos desde los que se llama una página ASP.NET deben tener .NET Frame-
work instalado.
CAPÍTULO 14
Servicios Web XML
Objetivos: Aprender en qué consisten los servicios Web XML, y cómo crear-
los y consumirlos.
445
446 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Funcionalidad antes de los servicios Web XML . . . . . . . . . . . . . . . . . . . 447
Funcionalidad con servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . . . 448
Características de los servicios Web XML . . . . . . . . . . . . . . . . . . . . . . . 448
¿Cuándo utilizar servicios Web XML? . . . . . . . . . . . . . . . . . . . . . . . . . . 449
UDDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Web Service Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Infraestructura de operación de los Servicios Web . . . . . . . . . . . . . . . . . . . . 453
Elementos para la creación de un Servicio Web XML . . . . . . . . . . . . . . . . . . 454
Procedimiento de consumo desde el navegador . . . . . . . . . . . . . . . . . 454
Creación de un Servicio Web XML y demostración
de su uso desde el navegador . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
➤ Creación de un Servicio Web XML . . . . . . . . . . . . . . . . . 455
➤ Prueba del Servicio Web XML desde el navegador . . . . 457
Consumo programático de un Servicio Web XML desde
una aplicación Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 459
➤ Estableciemiento de la referencia a un Servicio
Web XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
➤ Consumo programático de un Servicio Web XML . . . . . 461
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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.
14
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 distan-
cias relativamente manejables. Ahora, las distancias son globales y podemos estar comu-
nicá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 prin-
cipio, lo que se transmitía por las redes eran datos, y la funcionalidad radicaba en un ser-
vidor o en clientes específicos funcionando en alguna plataforma determinada.
En el nuevo escenario global ya no se puede garantizar que equipos y servidores dispon-
gan 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 platafor-
mas que tengan los equipos.
Atendiendo a estas necesidades surgen los servicios Web XML.
❑ 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 Langua-
ge) y SOAP (Simple Object Access Protocol). Toda plataforma que maneje dichos pro-
tocolos podrá aprovechar la funcionalidad de los servicios Web XML.
❑ Comunicación aplicación a aplicación basada en Internet. Al utilizar un servi-
cio Web XML no se tiene una interfaz de usuario visible; realmente se trata de un com-
ponente 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 peti-
ciones 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
14
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 interac-
tuar con él.
❑ Independencia de lenguaje. Los servicios Web XML pueden ser consumidos des-
de 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 dis-
pongan 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 servi-
cios 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 pe-
tició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 aplica-
ció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.
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 si-
no 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 es-
quema de seguridad y perfiles que puede ser utilizado y contratado por cualquier aplica-
ció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 proporcio-
nar 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ós-
ticos del clima, ofertas de productos, etcétera.
Cuando cliente y servidor requieren compartir funcionalidad en Internet, pe-
ro 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 servi-
cios a los consumidores tienen la necesidad de darse a conocer, un servicio Web XML re-
quiere 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 ne-
gocios 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 si-
tio 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 desarrollado-
res 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.
14
disco URL_Servicio
WSDL
No sólo basta encontrar qué servicios Web XML están disponibles; es muy importante co-
nocer también cómo funcionan y cómo los podemos consumir.
Un WSDL (Web Service Description Language) es la especificación estándar de funciona-
miento y datos de un servicio Web XML. WSDL se maneja a través de un contrato, cono-
cido también como Service Description, que es un documento XML que contiene informa-
ció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 comportamien-
to y sus datos de retorno; actúa como un contrato de intercambio de paquetes de datos en-
tre 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:
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 ver-
14
sió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éc-
nicas 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. El equipo que consume el Servicio Web XML intenta localizar un Servicio Web XML
que le proporcione una funcionalidad específica.
2. Como no sabemos si alguien ya desarrolló un Servicio Web XML que brinde la funcio-
nalidad que requerimos, buscamos en un servidor UDDI; en caso de que ya exista el ser-
454 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
vicio buscado, el servidor enviará la dirección URL en donde se puede solicitar infor-
mación del Servicio Web XML pertinente, que está contenida en discovery document.
3. 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.
4. El consumidor utiliza la información de la ubicación de discovery document y lo re-
cupera. Este documento contiene las referencias a los recursos requeridos por el Ser-
vicio 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.
5. 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.
6. Ya con esta información se consume el servicio en los términos que especifica la des-
cripción del servicio.
7. Se recibe la respuesta del servicio.
1. La directiva @WebService.
2. Importar el espacio de nombres System.Web.Services
3. Crear una clase, ya sea dentro de la página o en modo Code Behind.
4. Declarar como <WebMethod()> las funciones del servicio Web XML.
1. Se debe hacer una solicitud del servicio Web XML utilizando HTTP.
Capítulo 14. Servicios Web XML 455
2. Aparecerá la página de descripción, que expone todos los métodos del servicio.
3. Se selecciona un método del servicio.
4. Se proporcionan los datos que el método requiere.
14
5. 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 in-
termediación de un proxy.
Ejercicio 14.1
Creación de un Servicio Web XML y demostración de su uso
desde el navegador
3. 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 tra-
ta 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.
4. Codifique lo siguiente:
1 Imports System.Web
2 Imports System.Web.Services
3 Imports System.Web.Services.Protocols
4
5 <WebService(Namespace:=”http://tempuri.org/”)> _
6 <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
7 <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
8 Public Class Service
9 Inherits System.Web.Services.WebService
10 txtInicio.Text = calInicio.SelectedDate
11 <WebMethod(Description:=”Suma de dos números”)> _
12 Public Function Suma(ByVal N1 As Integer, ByVal N2 As Integer) _
13 As Integer
14
15 Return (N1 + N2)
16
17 End Function
18
19 End Class
Capítulo 14. Servicios Web XML 457
9. Aparecerá una lista de los métodos expuestos por el servicio, de acuerdo con la des-
cripció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 pre-
gunta 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 In-
voke. Con ello se realizará el procesamiento correspondiente y la respuesta se devol-
verá utilizando un paquete de datos mediante XML.
Ejercicio 14.2
14
Consumo programático de un Servicio Web XML desde
una aplicación Windows
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 apare-
cerán los servicios Web disponibles en la solución.
Capítulo 14. Servicios Web XML 461
6. 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íncu-
lo hacia el servicio, la lista de métodos, así como el nombre de referencia del servidor
14
Web (localhost). Haga clic en el botón Add Reference para establecer la referencia
al recurso Web.
7. En modo de diseño, haga doble clic en el botón Invocar Servicio Web XML, a fin de co-
dificar el procedimiento de evento del botón. La codificación debe quedar como sigue:
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 463
TERMINOLOGÍA
Add Web Disco.exe, 451 UDDI, 450 Discovery, 451
Reference, 460 Discovery Universal <WebMethod()>,
.ASMX, 454 document, 454 Description 454
binding, 452 message, 452 Discovery and WSDL, 452
Clase proxy, 453 portType, 452 Integration wsdl.exe
definitions, 452 service, 452 (UDDI), 450 XML Web Service,
Descubrimiento de Servicios Web XML, Web Service 447
servicio Web, 451 447 Description
Disco, 451 types, 452 Language, 452
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 ám-
bito profesional.
Capítulo 14. Servicios Web XML 465
Notas: 14
466 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 es-
té 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
7. Los Servicios Web XML aprovechan el protocolo HTTP, SOAP y TCP/IP para dis-
tribuir la funcionalidad y paquetes de datos.
10. Los Servicios Web son ideales para compartir, vía Web, funcionalidad sin necesi-
dad de interfases.
Capítulos:
15 Manejo de bases de datos
con ADO.NET
Parte 5
16 Manejo de bases de datos
desde aplicaciones Windows Manejo de Bases de datos
17 Manejo de bases de datos con ADO.NET
desde aplicaciones Web
18 Colecciones genéricas En esta parte del libro aprenderemos a desarrollar
(generics) aplicaciones que manejen bases de datos de alto
rendimiento.
469
470 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Historia del acceso a los almacenes de datos . . . . . . . . . . . . . . . . . . . . . . . . . 472
Formas de trabajo con bases de datos en .NET . . . . . . . . . . . . . . . . . . . . . . . 477
Bases de datos conectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Bases de datos desconectadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Modos de trabajo con ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Proveedores de datos de .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Uso de consultas y procedimientos almacenados con
Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
➤ Adiciónde una conexión a Server Explorer . . . . . . . . . . . 482
➤ Visualización de los datos de una tabla desde
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
➤ Adición de una vista a la base de datos con
Query Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
➤ Adición y prueba de un stored procedure con
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Modelo de objetos de ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
DataSet Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Cómo realizar la conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Objeto Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Miembros más utilizados en Connection . . . . . . . . . . . . . . . . . . . . . . . 497
Propiedad ConnectionString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Cerrado de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Proceso de conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Establecimiento de una conexión a base de datos de
forma programática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Miembros más utilizados en Command . . . . . . . . . . . . . . . . . . . . . . . . 504
Tipos de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Tipos de ejecución de los comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Uso de comandos para ejecutar procedimientos
almacenados y uso de DataReader . . . . . . . . . . . . . . . . . . . . . . . 507
Altas, bajas, cambios y consultas en modo conectado . . . . . . . . 510
Consumo de cadenas de conexión de app.Config . . . . . . . . . . . . 514
➤ Compilación de un proyecto para liberación (Release) . 515
➤ Crackeado de un usuario y contraseña usando ILDASM . 516
➤ Adición de un archivo de configuración para la
aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
➤ Consumo de valores desde el archivo de configuración . 518
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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. 15
Antes de entender la forma en que ADO.NET trabaja es necesario comprender que una ba-
se 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 sis-
temas 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 inter-
faces gráficas intuitivas, llenas de asistentes y generadores de código. Ejemplos de este ti-
po 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.
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 pro-
gramá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 pa-
ra 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. Cierta-
mente no seremos los primeros en intentarlo, pero sí los que menos problemas enfrentare-
mos para hacerlo, ya que ADO.NET es una plataforma sorprendentemente potente y sen-
cilla; 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.
FIGURA 15.2
Cronología de
los manejadores
de base de datos.
Historia de
15
acceso a los
almacenes de
datos
pudiera tenerse acceso a cualquier motor de base de datos, siempre y cuando estuviera ba-
sada en el modelo relacional. Dichos motores, llamados motores de base de datos relacio-
nales (RDBMS/Relational Data Base Management System), tales como SQL Server, Ora-
cle, 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 de-
finiciones 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 compatibi-
lidad tan transparente.
Con ODBC nace el concepto de orígenes de datos, que vienen siendo el acceso a almace-
nes de datos por intermediación de un manejador de controladores, y el uso de un contro-
lador.
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 comunicar-
se 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 princi-
pal atractivo era la simplicidad. En la versión 3 de Visual Basic apareció DAO (Data Ac-
cess 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 acuer-
do con la filosofía de desarrollo de Visual Basic, y segundo, debido a que por ser un mo-
tor optimizado para Jet, era (y sigue siendo) la forma más rápida de tener acceso a las ba-
ses de datos en Access.
Aunque está optimizado para bases de datos basadas en Jet (Access), DAO también acep-
ta otras bases de datos a través de ODBC. De esa forma, se dispone de la simplicidad de
DAO y el poder de ODBC.
15
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 Con-
sumer.
En un esquema COM, OLE DB extendió el número de servicios disponibles para el mane-
jo de los datos a través de librerías de fácil utilización, permitiendo el manejo de transac-
ciones, persistencia de datos, manipulación de parte del cliente, conjuntos de registros je-
rá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 mu-
chos otros lugares y formatos como mensajes de correo electrónico, hojas electrónicas, ar-
chivos 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óni-
cas, por ejemplo. Todas las bases de datos son almacenes de datos, pero no todos los almace-
nes de datos son bases de datos.
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 ba-
sada en COM, su manejo implicaba la interacción con librerías y no con un modelo de ob-
jetos 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 velo-
cidad de OLE DB, sin la complejidad derivada de lidiar con librerías COM, ya que propor-
ciona un modelo de objetos tan sencillo como DAO.
La desventaja de ADO, no obstante su potencia, flexibilidad y sencillez sigue siendo la ve-
locidad; 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 biblio-
teca 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 da-
tos de .NET (.NET Data Providers). Estos controladores están diseñados para aligerar el pe-
so 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:
❑ MARS (Multiple Active Result Sets). Permite tener abiertos más de un conjunto de re-
gistros 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 Con-
nection 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
Las bases de datos conectadas se recomiendan para aquellas aplicaciones en donde los da-
tos 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.
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 clien-
te/servidor:
Las bases de datos desconectadas se recomiendan para aquellas aplicaciones donde la ac-
tualizació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
15
cómputo y almacenamiento. Por ejemplo, en el caso de una agenda en línea, correo elec-
trónico, control de gastos personales y en toda la gama de aplicaciones ideales para dispo-
sitivos móviles, como celulares o palm-tops.
FIGURA 15.4
Forma de trabajo
con bases de da-
tos desconectada.
La forma en que trabaja el esquema desconectado es muy distinta a la forma de trabajar ba-
jo el modelo cliente/servidor. Para empezar, no es necesario que exista un almacén de da-
tos, aunque lo común es que sí exista.
En este esquema:
4. Los datos extraídos se almacenan en una memoria temporal (caché) en el equipo que
hizo la petición (copia local de datos).
5. Sobre la copia local de datos, la aplicación realiza consultas y modificaciones.
6. Cuando así se considere oportuno, se reproducen en el almacén de datos las modifica-
ciones realizadas en la copia local.
❑ 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 reali-
cemos.
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 con-
cluido 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 pue-
den ser reproducidas de manera local.
❑ Modo totalmente desconectado. Es cuando trabajamos sólo con objetos que per-
tenecen a DataSet Objects y no establecemos conexión alguna con los almacenes de da-
tos. 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 Da-
taSet, pero como no hay enlace con ningún almacén de datos, no se pueden adquirir de-
finiciones y se hace necesario programar todas las especificaciones del modelo de da-
tos 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
Proveedor Uso en
.NET Framework Data Provider for SQL 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 reco-
mienda 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
Ejercicio 15.1
Uso de consultas y procedimientos almacenados con Server Explorer
2. Abra la herramienta Server Explorer, que permite establecer conexión a bases de da-
tos en tiempo de diseño. Seleccione la opción View - Server Explorer (oprima las te-
clas CTRL-ALT-S). Aparecerá la siguiente herramienta:
FIGURA 15.5
Server Explorer.
3. La herramienta tiene su propia barra de herramientas, que incluye botones para refres-
car el árbol de conexiones, detener el proceso de refrescado y establecer la conexión a
una base de datos.
4. 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.
5. É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
titles Contiene información de los títulos (libros) que pueden ser comer-
cializados.
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
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 da-
tos 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, espe-
cifique en Select or enter a database name el nombre de la base, Pubs. Proporciona-
dos estos datos, haga clic en el botón Test Connection, con lo que comprobará si la in-
formació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 485
9. La base de datos y todos los elementos manejables a través de Visual Studio son mos-
trados en el árbol de conexiones.
15
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.
486 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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’). Inicialmen-
te aparecerá la ventana Add Table, en donde se seleccionan todas las tablas involucra-
das; 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 to-
das, 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
FIGURA 15.6
Query Designer.
15
15. Los cambios que realice en la selección visual de columnas se reflejarán de manera au-
tomá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 condi-
ció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 colum-
na, después de la columna state, escriba sales.qty*titles.price en Column y Ven-
tasTotales en el atributo Alias.
488 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
20. Si todo está correcto, guarde la vista en la base de datos, oprimiendo las teclas Ctrl-S
y asignando el nombre de VentasCA.
23. Visual Studio es una excelente herramienta para la edición de procedimientos almace-
nados, conocidos también como Stored Procedures, que son instrucciones precompi-
ladas de SQL que se almacenan en la misma base de datos. Una de sus mayores ven-
tajas 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 delimi-
ta las instrucciones SQL mientras codifica.
Codificación de dbo.StoredProcedures.AprendaWS.Pubs.
28. El procedimiento espera que se proporcione como parámetro el estado del que se de-
sea 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 procedi-
miento 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á auto-
má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 ba-
ses de datos SQL Server.
29. Colóquese en cualquier parte del procedimiento almacenado que esté editando y des-
pliegue el menú contextual, seleccionando la opción Execute.
15
❑ 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 da-
tos, 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 desconecta-
das. En caso de optar por la respuesta afirmativa, identifique en qué funciones de la aplica-
ción serán utilizadas.
El manejo de bases de datos desconectadas es muy potente, pero también es complejo y exi-
ge un volumen considerable de recursos.
492 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 15.7
DataProvider
Objects.
En el momento en que DataReader o DataAdapter poseen datos, ya se tiene una copia lo-
cal de datos en el equipo cliente.
Los Data Provider Objects son llamados así porque, dependiendo del proveedor o contro-
lador de datos que se utiliza, se les antepone un prefijo que determina su origen.
En manuales y guías de estudio, suele referirse a los objetos como xxxCommand o xxx-
DataReader, de tal forma que, en caso de que aparezcan nuevos controladores y provee-
dores 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 obje-
tos varía.
494 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Además de estos objetos, .NET Framework también provee los siguientes objetos relacio-
nados con el proveedor de datos (dependiendo del manejador de bases de datos utilizados,
estarán disponibles o no).
Objeto Función
DataSet Objects
El hecho de que se tenga un flujo de datos con el almacén de datos no implica que poda-
mos 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.
DataSet 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, respetan-
do las reglas de las bases de datos originales y con la ventaja de que todo sucede de mane-
ra desconectada.
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
Objeto Función
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 considera-
mos 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
Propiedades
Propiedad Utilidad
Métodos
BeginTransaction BeginTransaction()
Close Close()
Abre una conexión de base de datos con los valores de propiedad que especifica
ConnectionString.
Eventos
Se requiere al menos una conexión por cada almacén de datos utilizado por nuestro pro-
grama, 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 estable-
cer el enlace utilizando para ello el método Open. Para no saturar los canales de comunica-
ció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 aque-
llas 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 pa-
ra la conexión, utilizando para ello parámetros textuales, en forma de igualaciones separa-
das por punto y coma («;»). Al valor asignado a ConnectionString se le ha llamado ca-
dena de conexión.
15
El formato sería el siguiente:
Connection.ConnectionString=”parámetro=valor;parámetro=valor…;”
Parámetro Función
Connection Pooling
ADO.NET administra las conexiones de manera eficiente, pues posee un concepto denomi-
nado Connection Pooling, que se encarga de revisar constantemente el uso que se le da a
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 nues-
tra 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, dejan-
do 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 re-
cursos, 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:
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 pro-
gramación. Suponga que tiene una instancia de SQL Server, de nombre APRENDAWS. Ima-
gine que desea establecer una conexión con la base de datos de prueba Pubs y que se en-
lazará utilizando la cuenta de administración sa, cuya contraseña es secreto.
15
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 Conecta.
3. Edite el programa de tal forma que aparezca de la siguiente manera:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As SqlConnection
10 conn = New SqlConnection()
11 conn.ConnectionString = “Data Source=aprendaws;” & _
12 “Initial Catalog=pubs;Persist Security Info=True;” & _
13 “User ID=sa;Password=secreto”
14 conn.Open()
15 Console.WriteLine(conn.State.ToString())
16 conn.Close()
17
18 Console.Write(“Pulse INTRO para continuar”)
19 Console.ReadLine()
20
21 End Sub
22
23 End Module
Open
Pulse INTRO para continuar
1 Option Explicit On
2
3
Option Strict On
15
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As New SqlConnection(“Data Source=aprendaws;” & _
10 “Initial Catalog=pubs;Persist Security Info=True;” & _
11 “User ID=sa;Password=secreto”
12 conn.Open()
13 Console.WriteLine(conn.State.ToString())
14 conn.Close()
15
16 Console.Write(“Pulse INTRO para continuar”)
17 Console.ReadLine()
18
19 End Sub
20
21 End Module
9. Para implementar la conexión en cualquier otro manejador basta con especificar el es-
pacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y co-
locar una cadena de conexión apropiada.
Command
Comando. El objeto Command permite ejecutar comandos sobre un almacén de datos so-
bre el cual mantenemos conexión; opcionalmente, un comando puede también retornar da-
tos extraídos del almacén de datos.
Un objeto Command siempre actúa sobre una conexión abierta (Connection), es de una natu-
raleza 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.
504 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Propiedades
Propiedad Utilidad
Métodos
Cancel Cancel()
Eventos
La siguiente sección describe algunas particularidades de los comandos para cada uno de 15
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:
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 lec-
tura 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 SqlData-
Reader, 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éto-
do 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 coman-
do, podemos leer los datos a través de un método llamado Read.
DataReader 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 propor-
cionando el nombre de los campos a recuperar.
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 po-
sible 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 15
En este ejercicio realizaremos una conexión a una base de datos SQL Server mediante pro-
gramació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. 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 Lee-
Datos.
3. Edite el programa de tal forma que aparezca de la siguiente manera:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9
10 Dim Estado As String
11 Console.Write(“Siglas del estado: “)
12 Estado = Console.ReadLine()
13
14 Dim conn As SqlConnection
15 conn = New SqlConnection()
16 conn.ConnectionString = “Data Source=aprendaws;” & _
17 “Initial Catalog=pubs;Persist Security Info=True;” & _
18 “User ID=sa;Password=secreto”
19 conn.Open()
20
21 Dim cmd As SqlCommand
22 cmd = New SqlCommand()
23 cmd.CommandText = _
24 String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, Estado)
508 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
25 cmd.Connection = conn
26
27 Dim Lector As SqlDataReader
28 Lector = cmd.ExecuteReader
29
30 Do While Lector.Read()
31 Console.WriteLine(Lector(“title”))
32 Loop
33
34 Lector.Close()
35 conn.Close()
36
37 Console.Write(“Pulse INTRO para continuar”)
38 Console.ReadLine()
39
40 End Sub
41
42 End Module
10. Aprovechando la flexibilidad de Visual Basic se puede hacer más compacto el código.
15
Vea las siguientes equivalencias posibles:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As New SqlConnection(“Data Source=aprendaws;” & _
10 “Initial Catalog=pubs;Persist Security Info=True;” & _
11 “User ID=sa;Password=secreto”
12 conn.Open()
13 Dim cmd As New SqlCommand( _
14 String.Format(“EXEC TitulosVendidosEstado ‘{0}’”, _
15 Estado),conn)
16 Dim Lector As SqlDataReader = cmd.ExecuteReader()
17
18 Do While Lector.Read()
510 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
19 Console.WriteLine(Lector(“title”))
20 Loop
21
22 Lector.Close()
23 conn.Close()
24
25 Console.Write(“Pulse INTRO para continuar”)
26 Console.ReadLine()
27
28 End Sub
29
30 End Module
11. Para implementar la conexión en cualquier otro manejador basta con especificar el es-
pacio de nombres que corresponda, utilizar los objetos Data Provider pertinentes y co-
locar 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 conec-
tado.
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Dim conn As SqlConnection
Capítulo 15. Manejo de bases de datos con ADO.NET 511
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 propor-
cionar 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 operacio-
nes 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 lugar de:
User ID=usuario;password=contraseña;
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:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6 Module Module1
7
8 Sub Main()
9 Dim conn As SqlConnection
10 conn = New SqlConnection()
11 conn.ConnectionString = “Data Source=aprendaws;” & _
12 “Initial Catalog=pubs;Persist Security Info=True;” & _
13 “User ID=sa;Password=secreto”
14 conn.Open()
15 Console.WriteLine(conn.State.ToString())
16 conn.Close()
17
18 Console.Write(“Pulse INTRO para continuar”)
19 Console.ReadLine()
20
21 End Sub
22
23 End Module
10. En Solution Explorer seleccione el nombre del proyecto Conecta. Despliegue el me-
nú 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 pro-
yecto. 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?
1 cd\
2 cd\APVBNETVS\Ejercicios\Conecta\Bin\Release
3 ildasm Conecta.exe
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 (ma-
naged).
15
16. Vea en la ilustración la línea IL_0007, en donde aparece la cadena de conexión, total-
mente legible para el ojo curioso, no siempre bien intencionado.
17. Cierre ILDASM.
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 apo-
yos de depuración y seguridad. En el caso de aplicaciones Windows (Consola y Win-
dows), 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 archi-
vo 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 configu-
ració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 Conec-
ta. Con ello se editará el archivo de configuración.
21. Dentro del elemento <configuration> agregue un elemento <connectionString> y
dentro de éste, una cadena de conexión. Las primeras líneas del archivo deben quedar
así:
22. El nombre conn asignado al valor de configuración podrá ser invocado programática-
mente.
15
522 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
TERMINOLOGÍA
Actualizaciones por Source, 499 Motor de base de Proveedor de datos
lotes, 477 DataAdapter, 493 datos Jet, 474 .NET Framework,
ADO, 476 Database, 497 Multiple Active 481
ADO.NET, 476 DataColumn, 495 Result Sets, Proveedores de
app.config, 515 DataReader, 493, 476 datos de .NET,
Base de datos 506 .NET Data 476
conectada, 477 DataRelation, 496 Provoders, 476 Provider, 499
desconectada, DataRow, 495 .NET Framework Query Designer, 487
478 DataSet Objects, Data Provider, RDO, 475
Batch updates, 477 491 481 Release, 515
BeginTransaction, DataSet, 495 OCI, 473 Remote Data
497 ODBC, 473 Objects, 475
Datasource, 497
Cancel, 504 OLE DB, 475 Server Explorer, 482
DataTable, 495
Client, 494 Consumer, 475 SqlCommand, 493
DataView, 495
Close, 498 OleDbCommand, SqlConnection, 493
DBLib, 473
Command, 492, 503 493 SqlDataAdapter,
Dispose, 498, 504
Builder, 494 OleDbConnection, 493
Disposed, 498, 505
CommandText, 504 493 SqlDataReader,
Error, 494
CommandType, 504 OleDbDataAdapter, 493
Exception, 494
Connection, 492, 493 State, 497
ExecuteNonQuery,
504 OleDbDataReader, StateChanged, 498
506
Pooling, 499 493 Stored Procedures,
ExecuteReader, 506
StringBuilder, Open, 498 488
ExecuteScalar, 506
494 OracleCommand, StoredProcedure,
ILDASM.EXE, 516
Timeout, 499 493 505
Integrated Security,
ConnectionString, OracleConnection, SuperVersion, 497
499
497 493 TableDirect, 505
Lector de datos, OracleData
ConnectionTimeout, Text, 505
506 Adapter, 493
497 Transaction, 494,
Constraint, 496 Liberación, 515 OracleDataReader, 504
CreateCommand, MARS, 476 493 UDA, 475
498 Modo Parameter, 494 Universal Data
CreateParameter, conectado, 480 Parameters, 504 Access, 475
504 parcialmente Password, 499 UpdateRowSource,
DAO, 474 conectado, 480 Permission, 494 504
Data totalmente Procedimientos User ID; 499
Provider Objects, desconectado, almacenados, Web.Config, 517
491 480 488
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 desco-
nectado de bases de datos.
15.3 Explique los objetos Data Provider Objects. 15
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?
524 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Notas:
Capítulo 15. Manejo de bases de datos con ADO.NET 525
2. Es el tipo de acceso en donde la aplicación mantiene una conexión permanente con el almacén de da-
tos:
15
a) Bases de datos de conexión persistente
b) Bases de datos conectadas
c) Bases de datos desconectadas
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
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 perma-
nentemente actualizados.
8. Los sistemas manejadores de bases de datos son componentes y librerías que nos per-
miten tener acceso a los almacenes de datos mediante programación.
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.
CAPÍTULO 16
Manejo de bases de datos
desde aplicaciones Windows
Objetivos: Aprender el manejo de bases de datos en modo parcialmente co-
nectado usando DataSet para el desarrollo de aplicaciones de base de datos.
527
528 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Modelo de objetos DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Funcionalidad de las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
For Each y la lectura de colecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Independencia de DataSet respecto del almacén de datos . . . . . . . . . 534
Alternativas para poblar de datos un DataSet . . . . . . . . . . . . . . . . . . . . . . . . 534
DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Miembros más utilizados en DataAdapter . . . . . . . . . . . . . . . . . . . . . . 536
DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Miembros más utilizados en DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Categorías de objetos de DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
DataSet y XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Cargado de datos en un DataSet de forma programática . . . . . 542
Uso de Data Sources, Typed Datasets y relaciones padre-hijo . . 545
➤ Creación de un origen de datos (Data Source) . . . . . . . . 545
➤ Creación de una aplicación de navegación de datos
desde Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
➤ Adición de registros en modo desconectado
y duplicación de modificaciones al almacén de datos . . 554
➤ Generación de interfaz con registros padre-hijo en
tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Actualizador de registros con Data Sources y enlazado
de datos a un cuadro combinado . . . . . . . . . . . . . . . . . . . . . . . . 556
➤ Personalización de cuadros combinados de tablas
relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 rela-
ciones 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 pro-
gramar, 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 ma-
nejar 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 lla- 16
ves, 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 ob-
jeto 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.
FIGURA 16.1
DataSet Objects.
530 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Exploraremos cada uno de los objetos que componen el modelo de objetos DataSet de ma-
nera detallada.
A nivel modelo de objetos es importante lo siguiente:
Un DataSet puede tener muchas tablas (objetos DataTable), que se organizan en una co-
lecció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 Da-
taRowCollection 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 da-
tos. Las restricciones se organizarán en una colección llamada ConstraintCollection.
También es posible establecer dependencia padre/hijo entre tablas (DataRelation) al es-
pecificar relaciones entre ellas; éstas se organizarán en una colección llamada DataRela-
tionCollection.
Si se desea tener una vista parcial de los datos de una tabla, se puede utilizar el objeto
DataView.
Colección Alias
DataTableCollection Tables
DataColumnCollection Columns
DataRowCollection Rows
DataRelationCollection Relations
Count Add
Item Clear
Contains
CopyTo
Remove
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
Tables de dsBasica:
Console.WriteLine(dsBasica.Tables.Count())
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)
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 po-
sible 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 bas-
tante 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 16
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érmi-
nos más sencillos. Esa posibilidad da paso a la estructura de control For Each.
Lo que hace For Each es que cada elemento de la colección se asigna a la variable de tra-
bajo; 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:
534 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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?
3. XML. Si los datos provienen de estructuras de datos XML válidas. Este tipo de alma-
cén de datos es muy utilizado en aplicaciones de cómputo móvil, ya que no es nece-
sario consumir recursos para almacenar y recuperar datos.
DataAdapter
Adaptador de datos. El objeto DataAdapter, es un conjunto de comandos y conexio-
nes que sirve de interfaz entre el almacén de datos y DataSet. 16
DataSet no interactúa de ninguna forma con el almacén de datos de manera directa; Data
Adapter actúa como puente entre DataSet y el almacén de datos para efectuar cualquier
operación de recuperación o escritura.
En caso de que los datos que han de poblar un DataSet provengan de un almacén de da-
tos, 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 lon-
gitud 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 res-
tricciones 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 comple-
ta 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 pro-
vienen de un almacén de datos; es posible, incluso, que DataSet pueda generarse de ma-
nera 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.
536 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Propiedades
Propiedad Utilidad
Métodos
Método Acción que realiza
Dispose Dispose()
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 16
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 car-
garán los datos.
Este método devuelve el número de filas actualizadas correcta-
mente 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 elemen-
tos 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 respec-
tivas 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.
538 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Finalize Finalize()
Eventos
DataSet
Conjunto de datos. El objeto DataSet es el elemento más poderoso de ADO.NET y re-
presenta 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 mo-
delo 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 ba-
ses de datos desconectadas, procure evitar el uso de DataSet.
Propiedades
16
Propiedad Utilidad
Métodos
Método Acción que realiza
Clear Clear()
Copy Copy()
GetXmlSchema GetXmlSchema()
WriteXml WriteXml()
WriteXmlSchema WriteXmlSchema()
Eventos
❑ Objetos de esquema. Son los que tienen por objeto definir la estructura que alma-
cenará los datos. Se responde a la pregunta, ¿dónde y cómo se guardarán los datos?
a) DataTable
b) DataColumn
c) Constraint
d) Relation
❑ Objetos de datos. Son los que tienen por objeto almacenar los datos. 16
e) DataRow
DataSet y XML
DataSet está muy vinculado a XML por ser éste el convencionalismo utilizado para co-
municar 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 imple-
mentación de los lenguajes .NET en plataformas distintas a los sistemas operativos de
Microsoft.
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 refe-
rencias 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:
Ejercicio 16.1
Cargado de datos en un DataSet de forma programática
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:
1 Option Explicit On
2 Option Strict On
3
4 Imports System.Data.SqlClient
5
6
16
7 Public Class Form1
8
9 Private Sub Form1_Load(ByVal sender As System.Object,
10 ByVal e As System.EventArgs) Handles MyBase.Load
11
12 Dim conn As SqlConnection
13 conn = New SqlConnection()
14 conn.ConnectionString = “Data Source=aprendaws;” & _
15 “Initial Catalog=pubs;Persist Security Info=True;” & _
16 “User ID=sa;Password=secreto”
17 conn.Open()
18
19 Dim Datos As New DataSet
20 Dim Adaptador As New SqlDataAdapter( _
21 “select * from jobs”, conn)
22 Adaptador.Fill(Datos, “Puestos”)
23
24 conn.Close()
25
26 dgvPuestos.DataSource = Datos.Tables(“Puestos”)
27 dgvPuestos.Refresh()
28
29 End Sub
30 End Class
Ejercicio 16.2
Uso de Data Sources, Typed Datasets y relaciones padre-hijo
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 te-
clas 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 re-
presentación formal del modelo de datos que queremos utilizar en nuestro progra-
ma, en formato XML. Por el momento, nuestro proyecto no posee ningún origen de
datos.
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 op-
ción Data – Add New Data Source, para agregar un origen de datos al proyecto. Apa-
recerá 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 cone-
xió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, co-
mo 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 547
6. 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 en-
tornos 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 cone-
xión expone información sensible (usuario y contraseña). Haga clic en el botón Next.
16
9. 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 aplica-
ció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 cons-
tante 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 tene-
mos 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 <configuration> existe otro elemento llamado <connectionStrings>,
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
13. Haga doble clic en Puestos – Form1.vb para regresar al formulario en modo de di-
seño.
14. Vea cómo al agregar un origen de datos al proyecto, Data Sources obtiene conte-
nido.
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 (Da-
taGridView), 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 si-
guientes:
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 visuali-
zació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 envia-
dos 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 opera-
16
ciones 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 elemen-
to 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 proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado 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 regis-
tros de un DataSet y se compone de la siguiente manera:
FIGURA 16.3
Binding
Navigator.
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.
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 desconec-
tada a través de un DataAdapter. El DataAdapter posee cuatro propiedades de co-
mando:
a) DataAdapter.SelectCommand
b) DataAdapter.UpdateCommand
c) DataAdapter.DeleteCommand
d) DataAdapter.InsertCommand
31. Haga clic en agregar (Add new) , en la barra de navegación. Vea cómo en la ba-
rra de navegación se reporta un nuevo registro. En Job desc, coloque Vendedor Se-
nior, 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 dispa-
rará 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.
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 co-
mo 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 comporta-
miento de su programa (F5).
40. Utilice la barra de navegación a discreción y vea la manera en que se enlazan dinámi-
camente los registros de ambas tablas. En caso de que existan empleados con un de-
terminado 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:
Ejercicio 16.3
Actualizador de registros con Data Sources y enlazado de datos a un
cuadro combinado
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á instan-
cia.pubs.dbo, donde instancia es el nombre de su servidor SQL Server.
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 – Windows Application, llamado Ven-
tas.
3. Modifique las siguientes propiedades:
4. Agregue el origen de datos que requiere el programa. Abra la herramienta Data Sour- 16
ces, 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.
5. En Data Sources haga clic en el vínculo Add New Data Source..., o seleccione la op-
ción Data – Add New Data Source, para agregar un origen de datos al proyecto. Apa-
recerá el asistente Data Source Configuration Wizard. Seleccione Database y haga
clic en Next>.
6. Seleccione la conexión instancia.pubs.dbo. Haga clic en el botón de radio Yes, inclu-
de sensitive data in the connection string. Haga clic en el botón Next.
7. 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.
8. 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.
9. En Data Sources deberán aparecer las tablas que se seleccionaron. Modifique el es-
tilo de Sales a Detail y modifique el estilo de sales.stor_id a ComboBox. Los es-
tilos deben quedar de la siguiente manera:
558 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
11. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha reali-
zado 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 almace-
na 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 ope-
raciones de enlazado de datos son las siguientes:
Propiedad Función
16
21. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyec-
to como proyecto de inicio (StartUp Project) y guarde todos los cambios que ha rea-
lizado 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 ha-
cemos clic en el combo, aparecerán todas las tiendas de las cuales podemos seleccio-
nar alguna.
Capítulo 16. Manejo de bases de datos desde Aplicaciones Windows 561
TERMINOLOGÍA
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
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
10. Sólo a través de DataSet podemos disponer de un modelo de datos relacional en me-
moria 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.
567
568 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Data Source Controls y Data Bound Controls. . . . . . . . . . . . . . . . . . . . . . . . . 569
Data Source Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Data Bound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Establecimiento de un enlazado de datos hacia un GridView . . 572
➤ Adición y configuración de un SqlDataSource . . . . . . . . 572
➤ Adición y configuración de un GridView . . . . . . . . . . . . 576
Actualizador de bases de datos desconectadas con ASP.NET . . . 579
➤ Adición y configuración de un objeto DetailsView . . . . 580
➤ Personalización de campos en DetailsView . . . . . . . . . . 581
➤ Análisis de las plantillas de los campos en DetailsView . 584
➤ Establecimiento de los comandos para la afectación
de datos vía SqlDataSource . . . . . . . . . . . . . . . . . . . . . . 587
➤ Especificación de la funcionalidad disponible en
DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 ver-
sió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 ca-
so 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).
Dependiendo del objeto de que se trate serán las propiedades que se deban establecer pa-
ra el manejo de datos desde la Web.
Ejercicio 17.1
Establecimiento de un enlazado de datos hacia un GridView
17
574 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
8. 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 com-
binado de nombres de tabla seleccione sales (ventas). Al hacer esto aparecerán las co-
lumnas de la tabla en el espacio Columns; marque la casilla de verificación que mues-
tra 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.
11. Agregue a la interfaz un objeto GridView. Organice los objetos en la página de tal ma-
nera que luzca de la siguiente manera:
12. Utilice la smart tag de GridView y modifique Choose Data Source, eligiendo SqlDa-
taSource1, que es el nombre de nuestro objeto de origen de datos.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 577
14. En la smart tag de GridView seleccione Auto Format. En la lista Select a scheme, se-
leccione 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 Ena-
ble sorting, para que sea posible paginar el contenido y ordenar los datos cuando ha-
gamos clic en el encabezado de la rejilla de datos.
do01.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 pa-
ra comprobar el comportamiento de su programa (tecla F5).
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 sa-
les se ha distribuido en varias páginas; seguramente la última página posee menos ele-
mentos 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), utili-
zando 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.
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 SqlDataSource. El
nombre del origen de datos será SqlDataSource1.
11. Automáticamente se habrán colocado los campos que contiene SqlDataSource en for-
ma 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 SqlData-
Source 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 re-
gistros 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 forma-
to Slate.
17
15. Utilizando la smart tag de DetailsView1, seleccione la opción Edit Fields.., para edi-
tar los campos involucrados en la interfaz. Aparecerá la ventana Fields. Esta herra-
582 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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. 17
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, cam-
bie las siguientes propiedades:
ButtonType Button
CancelText Cancelar
DeleteText Borrar registro
EditText Modificar datos
InsertText Insertar
NewText Nuevo registro
SelectText Consulta
UpdateText Actualizar
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:
25. Ya ha preparado su objeto DetailsView para el manejo de datos y el diálogo con el ob-
jeto SqlDataSource. Para que las operaciones que realicemos en DetailsView se tras-
laden 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, seguramen-
te las instrucciones SQL que proporcionemos requieren los valores que estamos mane-
jando 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 585
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 compor-
tarse. 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, InsertItem-
Template 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] – Des-
cripció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. Des-
pliegue 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:
32. Despliegue la smart tag de DetailsView1 y seleccione el vínculo End Template Editing.
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
588 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
FIGURA 17.1
Estructura de
Query Builder –
Panes.
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 589
38. Como puede darse cuenta, se está haciendo uso de un parámetro que no ha sido decla-
rado en ninguna parte (@job_id).
39. Haga clic en el botón Add Parameter de Command and Parameter Editor. Se agrega-
rá 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á Details-
View1. 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, ob-
viamente, eliminará el registro en que nos encontremos.
41. Modifique el valor de la propiedad InsertQuery, haciendo clic en el botón que invo-
ca el Command and Parameter Editor . Utilice Query Builder para la construc-
ció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 de-
berá especificar un parámetro con el mismo nombre, anteponiendo el símbolo de arro-
ba. 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
44. Modifique el valor de la propiedad UpdateQuery, haciendo clic en el botón que invo-
ca el Command and Parameter Editor . Utilice Query Builder para la construc-
ció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 se-
lección y asignación para evitar la sustitución de valores para todos los registros. Des-
pué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
49. Ya que hemos realizado las definiciones que hacen posible que DetailsView y SqlDa-
taSource 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 per-
mita 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 593
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 ori-
gen de datos. Lo que vemos está en memoria, en un objeto DataSet (estamos trabajan-
do 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 da-
to 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 co-
mando 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 re-
produce 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 Ni-
vel 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 17
los datos se han actualizado.
TERMINOLOGÍA
PREGUNTAS
17.1 ¿Para qué sirven los Data Source Controls? 17
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?
598 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Notas:
Capítulo 17. Manejo de bases de datos desde Aplicaciones Web 599
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 re-
gistros:
a) DetailsView
b) GridView
c) Repeater
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.
CAPÍTULO 18
Colecciones genéricas
(generics)
Objetivos: Aprender las generalidades de las clases para manejo de
colecciones genéricas.
601
602 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
Contenido
Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 603
Bloques de código usando generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 604
Programación de un método dinámico usando Generics . . . . .. 604
Colecciones genéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 607
List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 607
Implementación de List (Generics). . . . . . . . . . . . . . . . . . . . . . .. 608
Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 610
Implementación de Queue (Generics) . . . . . . . . . . . . . . . . . . . .. 610
Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 613
Implementación de Stack (Generics) . . . . . . . . . . . . . . . . . . . . .. 613
Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 616
Implementación de Dictionary (Generics) . . . . . . . . . . . . . . . . .. 616
Mapa mental del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 619
Terminología. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 620
Preguntas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 620
Examen rápido del capítulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 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 intercam-
biables, 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úsque-
da 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á ne-
cesario 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 propor-
18
cionado o, de plano, implementar objetos con polimorfismo.
Si además queremos que los programas sean type safe, el programa se complicará más da-
do 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 inter-
cambiable y se especifica al momento de la declaración en tiempo de ejecución. De esa for-
ma 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 mo-
mento de llamar a ejecución.
❒ Colecciones Son colecciones preconstruidas que permiten la especificación en tiem-
po de ejecución del tipo de dato a almacenar.
604 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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 instan-
ciació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 de-
sea utilizar; esto se lleva a cabo a través de la especificación Of, característica de generics.
Ejercicio 18.1
Programación de un método dinámico usando Generics
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 Uso-
Generics.
3. Edite el programa de tal forma que aparezca de la siguiente forma:
1 Option Strict On
2 Imports System.Console
3
4 Module Module1
5
6 Sub Main()
7 Dim X As Integer = 5
8 Dim Y As Integer = 7
9 WriteLine(“I = “ & X)
10 WriteLine(“J = “ & Y)
11 Intercambia(Of Integer)(X, Y)
12 WriteLine(“I = “ & X)
13 WriteLine(“J = “ & Y)
14
15
16 Dim W As String = “Juan”
17
18
Dim Z As String = “María”
WriteLine(“S = “ & W)
18
19 WriteLine(“R = “ & Z)
20 Intercambia(Of String)(W, Z)
21 WriteLine(“S = “ & W)
22 WriteLine(“R = “ & Z)
23
24 Write(“Presiona INTRO”)
25 ReadLine()
26
27 End Sub
28
29 Sub Intercambia(Of T)(ByRef a As T, ByRef b As T)
30 Dim Paso As T
31 Paso = a
32 a = b
33 b = Paso
34 End Sub
35
36 End Module
606 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
I = 5
J = 7
I = 7
J = 5
S = Juan
R = María
S = María
R = Juan
Presiona INTRO
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.
❑ Stack: Representa un conjunto de elementos de tipo LIFO (Last In – First Out) Úl-
timo en entrar, primero en salir.
❑ Dictionary: Representa un conjunto de elementos en donde una llave está relaciona-
da con un valor determinado.
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 susti-
tuir 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 senci-
lla, dado que no tiene comportamientos implícitos en su naturaleza. Sus miembros más im-
portantes son los siguientes:
Ejercicio 18.2
Implementación de List (Generics)
1 Imports System.Console
2
3 Module Module1
4 Dim lstNumeros As New List(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 lstNumeros.Add(CType(strNumero, Integer))
19 End If
20 Loop
21 End Sub
22
23 Sub Resultados()
24 For Each Entero As Integer In lstNumeros
25 WriteLine(Entero.ToString())
26 Next
27 End Sub
28
29 End Module
Capítulo 18. Colecciones genéricas (generics) 609
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:
Ejercicio 18.3
Implementación de Queue (Generics)
1 Imports System.Console
2
3 Module Module1
4 Dim queNumeros As New Queue(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 If queNumeros.Count = 3 Then
19 queNumeros.Dequeue()
20 End If
21 queNumeros.Enqueue(CType(strNumero, Integer))
22 End If
23 Loop
24 End Sub
25
26 Sub Resultados()
27 For Each Entero As Integer In queNumeros
28 WriteLine(Entero.ToString()) 18
29 Next
30 End Sub
31
32 End Module
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:
Ejercicio 18.4
Implementación de Stack (Generics)
1 Imports System.Console
2
3 Module Module1
4 Dim staNumeros As New Stack(Of Integer)
5
6 Sub Main()
7 Dim strNumero As String
8
9 Do While True
10 Write(“Capture un número (omitir para finalizar):”)
11 strNumero = ReadLine()
12 If strNumero = “” Then
13 Resultados()
14 Write(“Pulse INTRO”)
15 ReadLine()
16 Exit Do
17 Else
18 staNumeros.Push(CType(strNumero, Integer))
19 End If
20 Loop
21 End Sub
22
23 Sub Resultados()
24 For i As Integer = 0 To staNumeros.Count - 1
25 WriteLine(staNumeros.Pop.ToString())
26 Next
27 WriteLine(“—- Elementos que quedaron en Stack —-”)
28 For Each Entero As Integer In staNumeros
29 WriteLine(Entero.ToString())
30 Next
31 WriteLine(“—- Fin de elementos —-”)
32 End Sub
33
34 End Module
Dictionary
Es la colección generic que representa un conjunto de elementos donde una llave está re-
lacionada 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:
Este ejemplo declara un diccionario, carga tres elementos y despliega el valor correspon-
diente en una de las llaves.
Ejercicio 18.5
Implementación de Dictionary (Generics)
1 Imports System.Console
2
3 Module Module1
4 Dim dicPCard As New Dictionary(Of String, String)
5
6 Sub Main()
7 Dim strInicial As String
8
9 dicPCard.Add(“N”, “Norte”)
10 dicPCard.Add(“S”, “Sur”)
11 dicPCard.Add(“E”, “Este”)
12 dicPCard.Add(“O”, “Oeste”)
13
14 Write(“Dame la inicial de un punto cardinal:”)
15 strInicial = ReadLine()
16
17
18
WriteLine(“Inicial de {0}”, dicPCard(strInicial))
18
19 Write(“Presione INTRO”)
20 ReadLine()
21 End Sub
22
23 End Module
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.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 diferen-
cias.
Capítulo 18. Colecciones genéricas (generics) 621
Notas:
18
622 Aprenda Practicando Visual Basic 2005 usando Visual Studio 2005
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
8. Generics tiene la misma filosofía que tienen los templates en el lenguaje Java.
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.