PROGRAMA DE VISUAL BASIC 5.

0
CAPITULO I INTRODUCCION
I.1 El Paradigma de la Orientación a Objetos El tema de la orientación a objetos no es nuevo. Sin embargo, en los últimos años ha tenido un impacto tan grande en diferentes áreas de la computación que se hace obligatorio el manejo de los conceptos involucrados para cualquier persona relacionada con esta disciplina. De la misma forma ha surgido una proliferación de definiciones e interpretaciones que conducen, primero a confusión, y luego a malas interpretaciones y abusos de los términos. En este primer capítulo se presenta una breve reseña de algunos acontecimientos que han reforzado las bases de este paradigma a través del tiempo, así como una exposición de la mayor parte de los términos que giran alrededor de esta filosofía. I.2 Perspectiva histórica Cuando Fortran apareció en 1957 como una forma de automatizar la labor de aquellos que programaban en lenguaje máquina y en ensamblador, hubo mucho escepticismo. Había que probar que un proceso automático de traducción podía competir con la eficiencia y el ingenio que aplicaban aquellos programadores para poder ahorrar un microsegundo o una unidad de almacenamiento; y así fue. Este primer paso es sólo un ejemplo de la aplicación de un concepto clave en cualquier desarrollo computacional: abstracción. Ese concepto se sigue aplicando y es posible rastrearlo a lo largo de la historia de los lenguajes de programación. Los lenguajes de la primera generación como Fortran I y Algol 58 estaban orientados a facilitar la manipulación de expresiones matemáticas y liberar a los programadores de los incómodos detalles que involucra (y más en ese entonces) el lidiar con la máquina en forma directa. Aunque manejaban el concepto de subprograma, este era aplicado más que todo para reutilización. Además, los programas eran relativamente planos, en el sentido de que consistían de una serie de subprogramas que referenciaban datos globales. Es fácil deducir que en programas de no necesariamente gran complejidad, empezarán a darse problemas serios si un sólo subprograma no funciona correctamente. Para 1960, la popularización del transistor y la tecnología de circuitos integrados hicieron posible que los costos del computador disminuyeran y al mismo tiempo fuera posible aumentar su capacidad. Surgieron entonces lenguajes como Cobol y Algol 60, enmarcados dentro de la segunda generación. A diferencia de sus antecesores, éstos empezaron a dar mayor importancia al concepto de subprograma como un medio para realizar funciones abstractas. Es decir, al afrontar un problema se idealizaba un conjunto de acciones macro para solucionarlo, y estas a su vez serían atacadas como nuevos problemas, hasta llegar a completar la solución final. Lo anterior condujo al añidamiento de subprogramas, y al desarrollo de teorías referentes a estructuras de control, y a

alcance y visibilidad de variables. Es decir, se construyeron las bases de la programación estructurada, aplicando una abstracción de los procedimientos requeridos. Posteriormente, en la tercera generación se incluyó el concepto de módulo, como una forma de satisfacer la necesidad de manejar partes independientes de la solución que eran atacadas por diferentes personas, dado que los programas eran cada vez más complejos y más voluminosos. Sin embargo, aunque ya se había trabajado bastante en la abstracción al nivel de módulos y de procedimientos, no se había hecho mucho en lo que se refería a la abstracción al nivel de datos. Aunque lenguajes como Cobol daban mucha importancia a los datos dentro de las aplicaciones, existía una separación clara entre datos y procedimientos. La solución era trazada con base en funciones, no en los datos mismos. Incluso, al aplicar una metodología clásica de análisis y diseño estructurado, es posible tomar dos enfoques: 1) realizar primero el estudio y la especificación de las funciones requeridas y 2) luego formular el diagrama de datos, o al contrario, iniciar primero con el diseño del diagrama de los datos que se requerirán y las relaciones entre ellos, para luego deducir cuáles son los procesos necesarios que permitirán que los datos se mantengan actualizados y evolucionen para brindar la información última que se desee en el sistema. Según Shankar, el punto es que la construcción de procedimientos funciona bien en la conceptualización de funciones abstractas, pero no necesariamente en la conceptualización de datos abstractos, y dado que la complejidad de los datos contribuye substancialmente a la complejidad del problema, la abstracción de procedimientos podría traer serios inconvenientes. Afirmaciones como la anterior llevaron al desarrollo de métodos de diseño basados en los datos, y a teorías referentes al concepto de tipo, que eventualmente se reflejaron en lenguajes como Pascal. Estas ideas se vieron plasmadas por primera vez en el lenguaje Simula, un lenguaje para programar simulaciones en el computador en donde los objetos de una simulación eran modelados en forma directa como objetos de software. Simula es el antecesor de lenguajes como Smalltalk, Object Pascal, C++, Clos, y Ada, que se puede decir que son de desarrollo reciente. Estos lenguajes son llamados orientados a objetos. En ellos, un módulo es una colección de objetos, que son cápsulas que contemplan tanto un comportamiento (función) como un estado (datos), conformando una unidad donde los datos son el fundamento y estos pueden realizar "por sí mismos" un conjunto de acciones determinadas, tratando de simular el comportamiento de los objetos del mundo real (se entrará en detalles más adelante). Las metodologías de análisis y diseño orientadas a objetos tratan de establecer normas para definir esas cápsulas y las relaciones con las demás de forma que se maximicen una serie de criterios deseables previamente establecidos para lograr un producto de calidad.

I.3 Elementos de un modelo de objetos Según Booch, el modelo de objetos está basado en cuatro elementos principales:
• • • •

Abstracción Encapsulamiento Modularidad Jerarquía

Es importante entender esos elementos antes de entrar al estudio de términos más específicos, pues son ellos los que determinan las características comunes de cualquier aplicación que se denomine "orientada a objetos". I.1.1 Abstracción Existen muchas definiciones de este término que pueden ayudar a comprenderlo. Según Hoare: "una abstracción surge del reconocimiento de similitudes entre diferentes objetos, situaciones, o procesos en el mundo real, y de la decisión de concentrarse en esas similitudes e ignorar por un momento las diferencias". Shaw define el concepto como "una descripción simplificada de un sistema, que enfatiza algunos de los detalles o propiedades del mismo, pero que también omite otros. Una buena abstracción es una que enfatiza detalles que son significativos al lector y que suprime otros detalles que son, por el momento, irrelevantes". Berzins, Gray, y Naumann apuntan que " concepto califica como abstracción un sólo si puede ser descrito, comprendido, y analizado independientemente del mecanismo que será utilizado eventualmente para realizarlo". Booch concluye que "una abstracción denota las características esenciales de un objeto que lo distinguen de todas las otras clases de objetos, y entonces provee límites conceptuales claramente definidos, relativos a la perspectiva del observador". Cada una de las definiciones anteriores coincide en el hecho de que una abstracción es un medio que permite un mejor manejo de la complejidad del problema, al permitir suprimir o posponer detalles irrelevantes en cierto momento, y concentrarse más bien, en detalles verdaderamente esenciales. El reconocer similitudes entre diferentes objetos también permite simplificar el dominio en estudio pues hace posible enunciar comportamientos o características generales que los describen, sin importar detalles que podrían no ser importantes. Las abstracciones pueden ser de muchos tipos. Por ejemplo, pueden describir objetos que constituyen un modelo útil dentro del dominio del problema, u objetos que se conciben para agrupar acciones necesarias en la solución (objetos virtuales que son necesarios para controlar la interacción de los objetos entre sí). Una abstracción debe tener límites conceptuales bien definidos que permitan la independencia funcional entre unas y otras. Así mismo, esos límites deberán esclarecer la forma en que la abstracción será utilizada para resolver y modelar el problema en

cuestión. Es decir. estos serán utilizados por otros objetos para llevar a cabo alguna tarea. entonces aumenta la cantidad de información que se maneja lo que incrementa la complejidad.2 Encapsulamiento Encapsulamiento es una palabra que tiende a confundirse con mucha frecuencia debido a que se le asocian diferentes significados. está relacionado con protección. pero que sí serán importantes en algún otro momento. pero no especifica que una lista debe ser realizada como un arreglo o mediante el uso de punteros. y no cada parte a su vez. ni más ni menos. En particular. Esos son detalles que no vale la pena mencionar mientras se está introduciendo el concepto. Al decidir encapsular ciertas funciones o atributos. debe quedar claro cuál es su función y su relación con los demás objetos. Por otro lado. como apuntan Berzins y demás. . se estaría perdiendo el sentido de la abstracción. el cual está más relacionado con el control del acceso a las partes de una abstracción. si se esconden aspectos fundamentales. un objeto debe conocer de otro lo indispensable para que lo pueda utilizar. Una abstracción debe poderse manipular como una sola unidad independiente que cumple con ciertas funciones. Una abstracción es algo que no necesariamente existe en el dominio real de la aplicación pero que su existencia resultaría tan útil para el analista que termina siendo representada e incorporada en la solución computacional al problema. Además. "ninguna parte de un sistema complejo debería depender de los detalles internos de otras partes". al abstraer un objeto. así como ciertas variables que mantienen el estado de la misma. La abstracción es un concepto externo al objeto que determina la forma en que es visto por los demás. Cada abstracción debe ser claramente distinguible de las demás. Según Ingalls. Encapsular significa agrupar y manejar el grupo resultante como tal. encapsulamiento se refiere al fortalecimiento de las barreras de abstracción mencionadas anteriormente. la implementación de un objeto debe ser escondida dentro de la abstracción y no debe ser conocida por los objetos que lo utilicen (clientes). un concepto que muchas veces se señala como equivalente es el de ocultamiento de la información.1. debe ser independiente de la forma en que finalmente se lleve a cabo. son conceptos complementarios. además de que hace más vulnerable el objeto que se utiliza. Es decir. I. Es decir. El ocultamiento de la información es un concepto interno que determina qué cosas deben ser vistas por los demás. Sin embargo. Formalmente. Si se conoce más. así como la forma en que interactuarán entre ellas. Por ejemplo. y es más difícil garantizar su integridad y su correcto funcionamiento. la abstracción de una lista considera tanto las acciones que se permitirán realizar sobre ella. Sin embargo.

En ese sentido se dice que los módulos deben ser altamente cohesivos y poco acoplados entre sí. Con esto se busca lograr una mayor productividad al desarrollar software en gran escala. Si se pudiera tomar un programa grande y dividirlo en subprogramas según ciertos criterios. "El acto de particionar un programa en componentes individuales puede reducir la complejidad en algún grado. Se espera que cada módulo pueda ser desarrollado con cierta independencia de los demás. una razón más poderosa para particionar un programa es que crea un número de límites bien definidos y documentados dentro del programa. existe un número a partir del cual las ventajas se tornan en lo contrario pues es tal la cantidad de módulos que puede volverse inmanejable.. I.4 Jerarquía Los módulos y el encapsulamiento ayudan a manejar el conjunto de las abstracciones identificadas. y su acoplamiento con los demás debería ser el mínimo posible. la complejidad resultante sería mucho menor. Según Myers.. que constituyen las unidades físicas de particionamiento de los programas. no vale la pena particionar programas pequeños.1. y que incluso sea compilado en forma separada. Estos límites. . su complejidad será mucho mayor que la suma de la complejidad de varios programas más pequeños que cumplan el mismo objetivo. Cada estructura de un módulo debería ser lo suficientemente simple como para que sea comprendida por completo. Las abstracciones. Intuitivamente.". resulta muy útil y al mismo tiempo natural. Según Britton y Parnas: "El objetivo general de la descomposición en módulos es la reducción del costo del software al permitir que los módulos sean diseñados y revisados independientemente.1.".I.. o interfases. en donde los módulos son asignados a las personas que componen el equipo de trabajo y los desarrollan en forma independiente y paralela. se puede decir que se deben agrupar las abstracciones de acuerdo a su grado de relación lógica según el criterio del diseñador. y en programas grandes. Cada módulo debe estar bien definido. como se mencionó anteriormente. y un módulo debe exponer sólo aquellas partes indispensables que los demás necesitan conocer. sin embargo. Lograr la modularización adecuada para un sistema no es un trabajo sencillo.. Esas abstracciones son agrupadas a su vez para formar módulos. Sin embargo. más mantenible será la aplicación final.Aunque particionar un programa es útil por esa razón. debería ser posible cambiar la implementación de un módulo sin tener conocimiento de la implementación de otros módulos y sin afectar el comportamiento de los mismos. Entre menos dependencias existan entre ellos. son invaluables en la comprensión del programa. son encapsuladas y protegidas para manejarse como una única unidad lógica que se espera funciona correctamente. Analizando un poco más las propiedades de una función exponencial es fácil deducir que si se tiene un programa grande.3 Modularidad Se ha dicho que la complejidad de un programa crece en forma exponencial con respecto a su tamaño...

basa el concepto de objeto en la relación existente entre clientes y proveedores de servicios. Un cliente puede ser una persona o un programa. la herencia define una relación entre las clases. como las aves.4. al ser solicitados por un cliente. Snyder señala que: “la abstracción representada por un objeto se caracteriza por un conjunto de servicios que los clientes pueden solicitar”. Sin embargo.4 Conceptos básicos I. y además puede agregar o redefinir elementos a la estructura o al comportamiento previo. la clase de animales de sangre caliente contempla tanto los mamíferos como las aves. Aunque un objeto puede involucrar datos. Básicamente. desarrollada a partir de la nada. y caballos son todos mamíferos de sangre caliente. creando clasificaciones de especies. I. vacas. etc. El ejemplo más claro de jerarquía en el modelo de objetos es el concepto de herencia. La herencia define entonces una jerarquía de abstracciones. Por ejemplo. donde una clase comparte la estructura y el comportamiento definida en una o más clases consideradas como superiores o superclases.1 Objeto El concepto de objeto puede ilustrarse a partir de muchos enfoques diferentes. Por ejemplo. . La herencia hace posible definir software nuevo de la misma manera en que se introduce un concepto a un persona que lo desconoce. pero lo importante es idealizar los servicios que se necesitan para realizar una labor y construir una solución basada en la interacción entre objetos que proveen servicios unos a los otros. Todos ellos parten de que un objeto representa una abstracción. en donde una subclase hereda de una superclase. tigres. El ser humano siempre tiende a clasificar los objetos que lo rodean.” Las clases podrían no tener relación la una con la otra aún cuando fueran muy similares. la abstracción puede incluir un conjunto de actividades o servicios que se necesitan. pero pertenecen a clases diferentes de animales. La naturaleza de un cliente o de un proveedor depende del sistema que se esté analizando. Como señala Cox: “sin herencia cada clase sería una unidad independiente por sí misma. comparándolo con algo que ya existe y con lo que ya está familiarizado. hay clases de animales. un objeto no es solo eso. como se mencionó anteriormente. de materiales. y un servicio puede ser una actividad que se realiza a partir de una solicitud del cliente. o sea. Esas clasificaciones forman jerarquías que permiten concentrarse en subconjuntos de elementos lo que facilita el estudio de los elementos como un todo. pero la forma en que esta se caracteriza puede variar de un enfoque a otro.clasificar u organizar las abstracciones de acuerdo a su naturaleza. de elementos químicos. que son de sangre caliente pero no son mamíferos. O sea. Es decir. Sin embargo. los elefantes. Existe una clase de animales denominados mamíferos que comparten un conjunto determinado de características. Define un objeto como cualquier entidad que juega un rol visible al proveer servicios a clientes. Todos los mamíferos y todas las aves heredan las características de los animales de sangre caliente. El propósito de los datos es representar información asociada con la abstracción que se realizó. Estos servicios.

el estado de un objeto está determinado por el contenido de cada una de las variables que se asociarán al objeto. El cliente debe conocer únicamente lo necesario del objeto que utilice. Además. Se dice que un mensaje es la invocación de un método de un objeto. Cada uno de los servicios también se conoce como método u operación. * Los clientes deben conocer los servicios que proveen otros objetos. "La identidad es aquella propiedad de un objeto que lo distingue de todos los otros objetos" El mensaje es el mecanismo a través del cual los objetos pueden cooperar entre sí. No debe ser necesario describir el objeto. Objeto B . no más. Un parámetro o un valor retornado puede ser a su vez un objeto. Cada objeto debe poderse referenciar a través de un valor que permita identificarlo en forma directa y confiable.modifican los datos asociados a la abstracción para cumplir con una necesidad o un cambio que se de en el sistema. En este punto surge la inquietud de cómo identificar cada uno de los objetos que se manipulan. Esta operación denota el servicio que se ofrece. y no menos. Una solicitud de un cliente identifica una operación. Cuando un objeto A necesita de otro objeto B para cumplir con una operación propia. y probablemente retornará algún resultado. Esas operaciones secundarias también deberían ocultarse de alguna forma para que el cliente no pueda utilizarlas y ni siquiera tenga que conocer acerca de su existencia. En lo que respecta al cliente. que funciona correctamente en el sentido de que hace lo que debe hacer. sino solo especificar el valor que lo identifica. es decir. Los datos o variables que constituyen un objeto se conocen como atributos o componentes (los cuales podría ser a su vez objetos). él solo sabe que envió una solicitud y que está llevándose a cabo. pero no tienen porqué inmiscuirse con los detalles de cómo se llevará a cabo su solicitud. y que además provee una serie de servicios que son utilizados por otros objetos para cumplir algún objetivo (ver figura 1). y el conjunto de los métodos a los que puede responder el objeto se conoce como protocolo del objeto. y puede tener parámetros asociados y resultados que retornar. le envía un mensaje que resultará en la ejecución de las operaciones asociadas al método. supone que el servicio opera tal y como está estipulado. Objeto A Esquema del concepto de objetos. Además. Un objeto se ve entonces como una cápsula que contiene datos.

el comportamiento de un objeto se define completamente por sus acciones. La clasificación hace que los objetos que se manejan estén mejor organizados y sean más fáciles de entender y utilizar.2 Clases y Herencia Los objetos pueden ser clasificados según la naturaleza de los servicios que brindan.4. Finalmente. una clase es una implementación de un TDA (Tipo de Dato Abstracto). . en vez de codificar manualmente a partir de bosquejos". I. como la misma palabra lo indica. Es decir. y al desarrollar un nuevo sistema cada vez se cuenta con una mayor cantidad de ellas. Todos los objetos de una clase presentan la misma estructura y el mismo comportamiento. o una referencia a él. I.En general las asociaciones entre los objetos se manejan a través de atributos. Según Korson: "Herencia es una relación entre clases que permite la definición e implementación de una clase con base en la definiciones e implementaciones de otras clases existentes. También puede utilizarse el mismo operador para sumar un número a un vector. Los datos son accesados a través de métodos (funciones de acceso). La idea es tomar ese conjunto de clases ya depuradas y construir a partir de ellas nuevas soluciones. cabe destacar que la estructura de clases se espera que sea fácilmente reutilizable cuando sea necesario. significa múltiples formas. una función polimórfica es aquella que puede ser aplicada uniformemente a cierta variedad de objetos. números reales. pero en general una referencia polimórfica en un lenguaje orientado a objetos es una que atañe a instancias de más de una clase a través del tiempo. polinomios representados como listas.4. Además.. Así. matrices de números enteros. uno de los atributos de A podría ser el objeto B. y también existen otras funciones para modificar la información (procedimientos de transformación). Otro concepto es el de comportamiento: "el comportamiento es cómo un objeto actúa y reacciona. Idealmente. Una clase es una descripción de un conjunto de objetos con características similares.3 Polimorfismo Polimorfismo. se dice que un objeto es una instancia de una clase. etc. Existen muchos tipos de polimorfismo. secuencias de caracteres. en términos de sus cambios de estado y envíos de mensajes" . modificando la jerarquía de clases según se requiera. En otras palabras. A través de la clasificación se asocian características comunes a todos los miembros de una clase. Por ejemplo. Las clases pueden ser agrupadas para formar bibliotecas. Herencia es el concepto más promisorio en la consecución del objetivo de construir sistemas de software a partir de partes reutilizables. la misma función de suma puede utilizarse para representar la aplicación de esa operación a números enteros. Esto significa que los detalles de implementación de la clase deben ser privados.. de ella.

es importante mencionar otros.En lenguajes orientados a objetos es posible definir la misma operación para diferentes clases. Pero cada sensor es independiente y no existe un control directo sobre ellos. y se tienen varias instancias de ella. y los objetos modelados en la aplicación. Ese objeto. cada una con un sensor. y combinaciones de ellos. Sin embargo. El problema surge al hacer un diseño orientado objetos. lo contrario al polimorfismo es el monomorfismo. y unidas a través de una red. o si se tiene una arquitectura de hardware con un único procesador. que se encuentra en lenguajes fuertemente tipificados y de binding estático. su existencia se justifica.5. pero como no es posible modelar los objetos en forma independiente. o tal vez el nuevo objeto sea el que lo haga. no es posible hacer una asociación directa. podría desarrollarse una arquitectura con varios procesadores donde en cada uno de ellos existe un sensor. cada uno de ellos sería un hilo (thread) de ejecución que aunque no sería simultáneo.1 Concurrencia Muchos de los objetos en el mundo real son independientes. serán necesarios cambios fuertes. Incluso. . Recuérdese que mediante herencia es posible redefinir funciones. Finalmente. entre los objetos del mundo real.5 Conceptos adicionales Además de los temas analizados hasta el momento. Esta característica se conoce en algunos lenguajes como sobrecarga de operadores. podrían mantenerse varias máquinas. puede compartir el tiempo de CPU con los demás bajo algún esquema de multiprogramación. O bien. que aunque no son un requisito para denominar a un producto "orientado a objetos" son puntos que están constantemente en discusión. en realidad no existe en el mundo real. en el sentido de que cada uno puede realizar acciones sin necesidad de que exista un objeto superior que lo coordine. Si se tiene una aplicación meteorológica en donde existen varios sensores de temperatura. Si se tiene un lenguaje o un sistema operativo que no provee ningún mecanismo de multiprogramación. I. Se identifica la clase sensor. como se quisiera. I. como Ada. En el otro extremo. El operador "+" se define para cada una de ellas y eso permite realizar esa operación sobre elementos de diferentes clases. cada uno de ellos podría hacer lecturas en forma permanente y activar algún mecanismo de alarma si fuera necesario. Probablemente sería necesario introducir un objeto que estuviera activando permanentemente cada uno de los sensores para que realicen sus lecturas y hagan el reporte de alarma. que se podría denominar un despachador (dispatcher) de eventos. dependiendo de la plataforma de desarrollo que se posea.

El ofrecer persistencia es algo más que guardar el estado de un objeto. Sin embargo. visto como una abstracción del mundo real. Sin embargo. Orientado a objetos o no. pueden surgir una serie de soluciones truculentas ideadas por los programadores. ¿qué sucede si se necesita que algunos objetos sobrevivan a la aplicación que los crea?. todos estos detalles pueden relegarse a los niveles de abstracción bajos. sincronización de procesos. relacional. Es decir. Según Booch: "Persistencia es la propiedad de un objeto a través de la cual su existencia trasciende el tiempo (i. o de redes. lo cual no es fácil considerando que un objeto puede cambiar de clase. starvation. esta información no presenta una estructura simple. o necesiten revelar detalles de implementación propios del compilador. polimorfismo y otras características de OO. exclusión mutua. siempre es necesario lidiar con los problemas de compartir recursos (deadlocks. y de la forma en que conserva la información de los objetos. I. pero presentan una interfaz al programador que le permite visualizar los objetos como tales. regiones críticas. Las consultas se realizan a través de operaciones sobre objetos que trascienden la existencia de un programa individual.Lim y Jhonson señalan que diseñar los aspectos de concurrencia en lenguajes orientados a objetos no es muy diferente de hacer lo mismo con otros lenguajes (según ellos. la concurrencia es ortogonal a la POO en los niveles de abstracción más bajos). puede representarse como un thread de control (abstracción de proceso). las variables locales a un procedimiento existen mientras aquel se encuentre activo. El objeto. paso de mensajes. existen los mismos problemas. Las variables globales existen durante toda la ejecución de la aplicación y conservan su estado mientras esta esté activa. cuando vuelva a ser ejecutado.2 Persistencia Los objetos toman cierta cantidad de espacio.5.e. y utilizar otras abstracciones que escondan esos detalles para hacerlos transparentes a los programadores. La introducción del concepto de persistencia conduce a las bases de datos orientadas a objetos.e. y otros). la clase del objeto también deberá trascender. por aspectos que implica soportar herencia. El problema anterior sería visto como un problema . Los objetos así representados son llamados objetos activos [Booch91]. Por ejemplo. Muchas de ellas siguen operando mediante los conceptos tradicionales de acceso a través de índices. Por lo tanto. Si en el lenguaje no se proveen mecanismos adecuados para manejar este problema. Es necesario almacenar la información que garantice que el estado del objeto será interpretado de la misma forma por el programa. En lenguajes orientados a objetos. modelo jerárquico. Se crean en el momento de la invocación y al terminar el procedimiento son destruidas. pero también de tiempo durante su existencia en la aplicación. la localización del objeto deja el espacio de direcciones en el que fue creado)" [Booch91]. que tal vez no sean confiables. el objeto continúa existiendo después de que su creador cesa de existir) y/o el espacio (i.

En tiempo de compilación se realizan todas las verificaciones de correctitud de tipos. pero los fuertemente tipificados brindan seguridad. Para efectos prácticos. de forma que los objetos de diferentes tipos no sean usados intercambiablemente. se generaría un error alusivo en tiempo de ejecución. La mayoría de los compiladores pueden generar código más eficiente si se declaran los tipos. Para cada variable se debe especificar claramente su tipo. y campos de clases. SmallTalk es un lenguaje no tipificado. o no tipificado. un tipo es una caracterización precisa de las propiedades estructurales y de comportamiento que comparten un conjunto de entidades. el ciclo edición-compilación-depuración es tan tedioso que una detección temprana de errores es indispensable. un programa puede convulsionar misteriosamente en tiempo de ejecución. así como para parámetros formales. En muchos sistemas. Booch agrega: "Tipo es el refuerzo de la clase de un objeto.que atenta contra la integridad de la base de datos. Las declaraciones de tipos documentan los programas.5. sean usados intercambiablemente bajo formas muy restringidos". los lenguajes no tipificados ofrecen mayor flexibilidad. tipo y clase son conceptos equivalentes. y en este texto. Si se envía un mensaje no reconocido por un objeto. I. débilmente tipificado. . Un lenguaje de programación específico puede ser fuertemente tipificado. aunque en algunos contextos no lo sea. o a lo sumo. En general. conforme esta crece y se torna más compleja. Las variables se declaran sin tipo.3 Tipo Según Deutsch. Tesler señala un conjunto de ventajas de los lenguajes fuertemente tipificados [Tesler81]: • • • • Sin chequeo de tipos. Lenguajes como Object Pascal son fuertemente tipificados. y el significado de las operaciones no se determina sino hasta durante el tiempo de ejecución. En algunos casos puede ser necesario convertir o coersionar una variable de un tipo a una de otro para que la expresión sea válida para el compilador.

las que nos permite guardar datos en memoria.1 Que son las variables En cualquier programa necesitamos hacer cálculos. Permiten asignar nombres cortos y fácil de recordar. En la mayoría de los casos. La memoria es el lugar donde el ordenador almacena de forma temporal los programas y parte de la información que necesita o utiliza. modificarlos y volverlos a guardar para usar mas tarde. Son para manejar cualquier tipo de información. usar información. DECLARACIONES Y ALCANCES DE LAS VARIABLES 2. Es aquí donde entran en juego las variables. de esta forma no sería accesible desde los demás procedimientos o formularios. procesarla y mostrarla. 2. Ej: Public suma . Ej: Dim suma Public: Las variables declaradas serán publicas y podrán estar accesibles desde todos los formularios de la aplicación. En VB los nombres de las variables deben limitarse a 255 caracteres.CAPITULO II FUNDAMENTOS DE PROGRAMACION 2 TIPOS. empezar con un carácter alfabético y no pueden obtener un punto Utilización temporal de almacenamiento de datos dentro de un programa. Esas posiciones o lugares de la memoria donde los programas pueden almacenar información son las variables. Para conseguirlo tendremos que declararlas en un módulo de código. no en la sección declarations de cualquier formulario de los que conste la aplicación. siendo capaz de contener cierto tipo de datos que pueden modificarse durante la ejecución del programa. Es una ubicación de almacenamiento temporal con nombre que se encuentra en memoria. incluso toda.1 Tipos de Variables Dim: Al declarar una variable con esta palabra estamos diciendo que la variable sea local al ámbito en que se declara. necesitamos un lugar temporal en el cual guardar parte de esa información. podamos tomarlos. para que cuando los necesitemos. Puede ser dentro de un procedimiento o dentro de un formulario.

483. De esta forma a entrar en algún procedimiento las variables recuerdan el valor que tenían cuando se salió de él.648 y LONG 2.483. EJ : Dim nombre Declaración Implícita: Declarar variables sin uso del Dim.147.147. permite operar con ellas 2. esto reserva espacio en memoria para la variable cuando se ejecute el programa y permitirá a VB que tipo de datos deberá guardar en dicha variable. No obliga a organizar y listar las variables de antemano.Static: Con esta forma de declarar variables conseguiremos que las variables locales no se creen y se destruyan al entrar y salir de los procedimientos donde fueron declaradas sino que se mantenga su valor durante todo el periodo de ejecución de la aplicación. . Si se va a herramientas.647 admite valores decimales con SINGLE precisión simple admite valores decimales de doble DOUBLE precisión CURRENCY válido para valores de tipo moneda STRING cadenas de caracteres Variant Admite cualquier tipo de datos DATE fechas. Ej: Static suma TIPOS DE VARIABLES TIPO BOOLEAN BYTE INTEGER COMENTARIO Sólo admite 2 valores TRUE o FALSE admite valores entre 0 y 255 admite valores entre -32768 y 32767 admite valores entre -2. Con esto VB genera un mensaje de error siempre que encuentre una variable mal escrita o declarada.2 Declaracion de las variables DIM: Es la abreviatura de Dimensión. opciones y en editor se elige “Requerir Declaración de Variables”.

En VB. Las variables locales de un procedimiento son reinicializada cada vez que llama el procedimiento. Esta forma de identificar a una variable nos permite ahorrar tiempo a la hora de escribir código. Los módulos de códigos se utilizan para conservar los subprocedimientos y funciones generales que no están relacionados con eventos. Nivel de Formulario: Si se declara una variable a nivel de forma esta disponible en cada procedimiento en esta forma. existen dos tipos de procedimientos: los procedimientos SUB y los FUCNTION. ya sea implícitas o con el enunciado DIM . Las variables declaradas en los procedimientos son locales para ese procedimiento. las variables locales tienen la visibilidad mas baja y el alcance mas estrecho. así . podemos escribir el siguiente código: Private Sub Command1_Click() Sum% = 3 + 4 Num# = 32 / Sum% Label1 = Num# End Sub En este ejemplo. String y Currency. Long.0). Hay cuatro niveles diferentes de alcances: Nivel de Procedimiento: Para declarar variables. Single. además de tratar de hacer compatible las primeras formas de asignar variables en Visual Basic (desde Visual Basic 1. Siendo accesibles solamente por los procedimientos en los cuales están declaradas. puede utilizarse. También se pueden declarar variables Estáticas: es decir que las variables locales sean permanentes: EJ static nombre.3 Establecimiento del alcance de la variable El alcance de las variables se refiere al área del programa en las cuales es visible la variable. Estas formas son extensibles para las variables tipo Integer. Integer Long Single Double String Currency % & ! # $ @ De esta forma.Pero hay otra forma que sólo es utilizable para 6 tipos. Nivel de Modulo: Se crean mediante la selección de la opción Agregar Modulo del menú Proyecto de VB. 2. es en el nivel de procedimiento. Double. pero es preciso tener un ligero conocimiento de este tipo de variables para no confundir una variable de tipo Long por otra de tipo Integer por ejemplo.

. Esto se hace colocando la instrucción option base 1 en la sección declarations de nuestro formulario. se declara con la palabra Public. Variables Publicas: identificar una variable global.6 Por que son Indispensables las Variables El poder y la flexibilidad añadidos a sus programas de computadoras por un uso juicioso y bien informado de variables están más allá de cualquier discusión y no pude sobre estimarse. Ej: Public nompreapellido As String 2. Las matrices multidimensionales se declaran de la siguiente forma: Dim medidas(1 to 10. cualesquiera programas. usando la palabra clave Type y End Type. ID As Long Nombre As String *15 Salario As Currency End Type 2. abarcando todo el expectro de tipos disponibles. donde ayuda a considerar varios elementos diferentes de datos como una sola entidad. Ej: Type tipoempleado ‘ Crear tipo definido por el usuario.4 Matrices para Para declarar matrices debemos colocar entre paréntesis el número de elementos de los que constará a continuación del nombre de la variable: Dim medidas(9) as integer De esta forma tenemos una matriz de 10 elementos identificados del 0 al 9 Podemos obligar a que el primer elemento de una matriz tenga el índice con valor 1. 1 to 10) as integer 2. Los tipos de datos personalizados son útiles en los programas de Bases de Datos. tal como un registro de un empleado por ejemplo. De hecho.5 Tipos de Datos Definidos por el Usuario El usuario puede definir los datos en VB en la sección General de Declaraciones de un modulo de código.como sus variables locales(publicas) y sus constantes. o una factura de un cliente. También podemos indicar los límites inferior y superior de la matriz: Dim medidas(5 to 14) as integer Es una matriz de 10 elementos cuyos índices van del 5 al 14. a excepción d los más triviales harán un uso cuidadoso de una amplia diversidad de variables.

asegúrese de incluir un retorno del carro chr(13) y un avance de línea. Si se omite aparecerá en el centro. ArchAyuda.7 Declaración de Constantes Como su palabra lo dice es Información que no varía hace más fácil la comprensión del código y permite modificar un valor en un solo lugar no ocupa espacio extra. q Mensaje: consiste de más de una línea. Context) q Mensaje: Es una expresión de cadena que se despliega como el mensaje en un cuadro de dialogo. Posx. 2. Ejemplo: Const Mínimo = 1. ArchAyuda. Context: Se usan para proporcionar ayuda sensible al contexto. Puede usar la constante pre definida Vbcrlf para lograr el mismo efecto. Posx. titulo. Posy. Sintaxis: ValRe = InputBox(Mensaje. Posy: Expresiones numéricas que especifican el tamaño de la caja. tipo. Posx. ArchAyuda. Context) ‘ Devuelve Variant RetVal$ = InputBox$(Mensaje. titulo. Posy. . chr(10) entre cada línea. ArchAyuda. Context) ‘ Devuelve una Cadena. q q q MsgBox() y MsgBox Despliega un mensaje en un cuadro de dialogo y espera que el usuario seleccione un botón. Titulo: Es una cadena que se despliega en la barra de titulo el cuadro de dialogo. espera que el usuario introduzca el texto o seleccione un botón y luego devuelve el contenido del cuadro de texto. titulo. Máximo = 10 3 ENTRADAS Y SALIDAS SENCILLAS CON MSGBOX() E INPUTBOX() 3. Msgbox() InputBox() Despliega un Mensaje en un cuadro de dialogo.Por lo general el establecimiento de variables del tipo y alcance adecuado asegurara el uso más eficiente de la memoria en sus programas.1 Que son Inputbox(). Sintaxis: ValRe% = MsgBox(Mensaje. Si se omite no aparecerá nada.

Tipo.2 Por qué usar InputBox() y MsgBox() Proporcionan una manera de manejar tareas sencillas de Entrada y Salida. el otro Mostrar Nombre y el ultimo Salir. Digitar el Siguiente Código en las declaraciones generales de la forma: Private Nombre As String Private Const TituloInput = “Demostración de InputBox” Private Const TituloNombre = “ Valor Actual del Nombre” En el Botón Captura de Nombre Digitar el siguiente Código: Dim Petición As String Petición = “Teclee su Nombre: “ Nombre = InputBox$(Peticion. así como los cuadros de Acerca De que se presentan en los Sistemas. Tipo: Expresión numérica que es la suma de valores que especifican la cantidad y el tipo de botones por desplegar. Crear un formulario con tres botones. Tituloinput) If Nombre = “ “ Then MsgBox “ No escribio Nada”. Reiterar e Ignorar Si. TituloNombre) If ValRe = VbYes Then . Son muy útiles para manejar tareas tales como el despliegue de mensajes de error y de ayuda. Valor 0 1 2 3 4 5 16 32 48 64 Botón Ok(Aceptar) Ok(Cancelar) Abortar. No y Cancelar Si o No Reiterar y Cancelar Icono Parada Critica Signo de Interrogación Signo de Exclamación Icono de Información Constante VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation 3.q q Titulo: Expresión de cadena que aparece en la barra de titulo del cuadro. un botón dirá Captura de Nombre. vbCritical. “Error” End If En el Botón Mostrar Nombre Digitar el siguiente Código: Dim men As String Dim Tipo As integer. valRe As Integer Tipo = vbYesNoCancel + vbQuestion ValRe = MsgBox(“Digito” & Nombre.

Loop y While.. se usan para repetir un cierto bloque limitado de instrucciones hasta que las condiciones especificadas son True (cierta) o False(Falsa).. La estructura general es la siguiente: If condición then bloque de sentencias Else bloque de sentencias End If Se pueden colocar todas las sentencias de código que queramos en cada uno de los bloques de sentencias. Si los bloques de sentencias están formados por una sola instrucción podemos utilizar la versión reducida que ocupa una sola línea: If condición then sentencia else sentencia Ejemplo: If isnumeric(numero) then la variable numero es numérica else no es numerica. Los dispositivos como If. Las construcciones en ciclos como Do. 4.1 Que son las estructuras de Decisiones? Estas estructura caen en dos amplias categorías: Ramificaciones y Ciclos .2 Sentencia If Then Else La primera es la sentencia If Then Else que no debe tener secretos puesto que es muy similar en todos los lenguajes..Then y Select Case hacen que el programa continúe en una dirección cuando se encuentra una condición particular. También podemos anidar varias sentencias If then Else cuando una de las 2 opciones iniciales contiene a su vez 2 bifurcaciones dependiendo del estado de otra condición: . vbInformation. siempre que cada sentencia vaya en una línea distinta. “Procedimiento MsgBox” 4 ESTRUCTURAS DE DECISIONES: RAMIFICACIONES Y CICLOS 4.Men = “ Ha presionado Si” ElseIf valRe = vbNo Then Men = “Ha presionado No” ElseIf valre = vbCancel Then Men = “ Ha Precionado Cancelar” End If MsgBox Men. sin mirar nunca atrás.Wend.

La segunda sentencia If se ejecutará si la condición de la primera sentencia If no se cumple.. sino que el código queda más claro y resulta más fácil de modificar utilizando la sentencia Select Algunas veces se puede condensar la construcción If. Ej: Color = IIF(elcolor < 15. Esto se logra con la función IIF(Si inmediato). Podemos introducir tantas líneas ElseIF como queramos siempre antes del último Else. si dato>=10. Para múltiples decisiones en los que dependiendo del valor de una variable queremos que se realice una acción distinta. si es que lo necesitamos. Una vez que se ha llegado a este punto sabemos que la variable dato contiene 2 o más dígitos. no conviene utilizar la estructura IF Then.Else. dos o más dígitos. 1) . Para calcularlo no es suficiente con una sola sentencia If Then Else.. Este último ejemplo podría haberse escrito de otra forma utilizando la cláusula ElseIf: If dato<10 then la variable dato contiene un dígito ElseIf dato<100 then la variable dato contiene dos digitos Else la variable dato contiene más de 2 digitos End If Esta segunda opción es perfectamente válida cuando queremos evaluar varias condiciones.if dato<10 then la variable dato contiene un solo dígito Else If dato<100 then la variable dato contiene 2 dígitos Else la variable dato contiene más de 2 dígitos end If End If En el ejemplo anterior se quiere saber si la variable dato contiene uno. mediante una nueva sentencia If sabremos exactamente el número de dígitos de la variable dato.. sin dejarnos introducir sentencias entre medias que algunas veces podríamos necesitar. es decir. por tanto se recurre a anidar 2 sentencias de este tipo. aunque tiene más limitaciones que la estructura anterior ya que enlaza directamente el Else con el If siguiente.Endif dentro de una línea de código. elcolor.Then. parecido a los menús de los programas de MS DOS.

Los valores que podemos colocar en lugar de valor1. se ejecutan si no se cumple ninguno de los valores anteriores End Select En esta construcción. <=. valor2.99 Notable Case Else Sobresaliente End Select Como se puede observar si utilizamos los operadores lógicos como >. =. Si lo que hacemos es comparar con un intervalo de valores colocaremos el operador to entre los limites del intervalo. dependiendo del valor de la variable dato se ejecutará un bloque de sentencias diferente.99 Aprobado Case 7 to 8. <.3 Sentencia Select CASE Esta sentencia permite realizar operaciones diferentes dependiendo del valor de una variable: Estructura General: Select Case dato Case valor1 bloque de sentencias case valor2 bloque de sentencias Case valor3 bloque de sentencias case else bloque de sentencias. valor3 no sólo se limitan a valores constantes como números y cadenas de texto. >= debemos anteponer el operador Is. También podemos realizar comparaciones con un conjunto de valores separados por comas: .4. sino que podemos comparar con un número como podemos ver en el siguiente ejemplo: Select Case NotaFinal Case Is < 5 Suspendido Case 5 to 6.

Case 1.4 Sentencia de Control While Wend Ejecuta repetidamente una o mas instrucciones mientras una condición dada es cierta. Sintaxis: Do Unitil cliente. Eso lo veremos en el capítulo siguiente. 5. no hemos entrado todavía en como introducir este codigo en el entorno de desarrollo de VB para crear una aplicación. aunque de esta forma no hay que repetir tantas veces la condición a evaluar. Esta repite un bloque de codigo mientras una condicion es True o a partir de que la condicion sea True.EOF Print cliente(“nombre”) Cliente.movenext Loop condición [ instrucciones] . donde hablaremos de controles que son los elementos necesarios para construir el interfaz de usuario y poder asociar el código necesario para realizar nuestras aplicaciones 4. Sabemos que la estructura de una ecuación de este tipo es la siguiente: ax2+ bx + c = 0 La fórmula que resuelve el valor de x es: Esta fórmula tiene 2 soluciones. El código anterior es sólo una muestra de como llegar a la solución de un problema utilizando sentencias de Visual Basic. 3. una o ninguna dependiendo del contenido de la raíz. Sintaxis: While Wend 4. El numero es impar. Para terminar con el tema de las sentencias de selección vamos a ver un ejemplo completo en el que probaremos el uso de este tipo de instrucciones.5 Sentencia de Control Do Until proporciona una forma mas estructurada y flexible para ejecutar ciclos. de modo que esa es la comparación que realizaremos: Trabajaremos con variables de tipo double que permiten decimales con la mayor precisión: También podría haberse utilizado la estructura If then Else. Se trata del típico ejemplo de resolución de una ecuación de 2º grado.

un numero especificado de veces.Exit Do transfiere el control a la instrucción que sigue inmediatamente al ciclo.7 Por que Tomar Decisione? Los lenguajes de computación al igual que la vida real deben ser capaces de realizar diferentes juegos de acciones. este empleado obtiene un aumento. Si el empleado entra en la edad de la jubilación. la cantidad que cambiar el contador cada vez que se ejecuta el ciclo. algunas veces repetidas.Then y transfiere el control a la instrucción que se encuentra a continuación de Next.6 Sentencia de Control For Next Esta sentencia repite un grupo de instrucciones. Por ejemplo. hay que jubilarlo. en un sistema de administración de personal.. 4. Si no se especifica. si un empleado ha estado en la compañía por espacio de una año. Ej: For porcentaje = 0 To 100 Step 5 Print porcentaje & “%” Next porcentaje Exit For se usa frecuentemente con la evaluación de algunas condicionantes If. 4. Sintaxis: For contador = 1 To 10 Print cliente(“nombre”) Cliente. indicadas por circunstancias internas o externas. .Movenext Next contador Se puede especificar también el intervalo Step. el incremento toma un valor por omisión de 1.

5 MODULOS Y PROCEDIMIENTOS 5.1 Que son los Modulos de Codigos? Son los que contiene códigos públicos, declaraciones, procedimientos Sub y Functions, que pueden compartirse entre todos los módulos de un proyecto. 5.2 Que es un Procedimiento General? Le dice a su aplicación como realizar una tarea especifica. Una ves que usted ha definido el procedimiento, este debe ser explicitamente llamado por su aplicación. 5.3 Que es un Procedimiento de Evento? Permanece inactivo hasta que se llama para responder a los eventos causados por el usuario. 5.4 Que es un Procedimiento Sub? Cualquier procedimiento es una secuencia nombrada de instrucciones que ejecutan como una unidad. El procedimiento Sub es una unidad de código que realiza una tarea especifica dentro de un programa, pero que no devuelve un valor explícito. Un procedimiento sub comienza con una instrucción Sub y termina con una instrucción End Sub. Esto no significa que el procedimiento Sub sea el único, existen una serie de procedimientos que VB trae incluido ej: Sub DiskCleanup() Kill “*.Dat” Kill “*.txt” Beep Msgbox “ La unidad esta Limpia”, vbinformation, “Procedimiento completo” End Sub Para mandarlo a llamar solamente se escribe el nombre del procedimiento sin necesidad de usar los paréntesis DiskCleanup. También existen procedimientos a los que se le pasan argumentos: Sub multiplicar(primero As integer, segundo As integer) Resultado = primero * segundo End Sub

Para mandarlo a llamar seria de la siguiente forma: Dim i As Integer, y As Integer I=3 Y=4 Multiplicar i, y 5.5 Que es un Procedimiento de Funcion? Es un procedimiento que realiza una tarea especifica dentro de un programa y devuelve un valor. Una función se define en un modulo que inicia con la instrucción Function y termina con la instrucción End Function.

Funciones Utiles en VB
Función Len() Chr() Asc() Ucase() Lcase() Descripción Devuelve la longitud de una cadena Devuelve el carácter del código Devuelve el código del carácter Convierte a mayúscula Convierte a minúscula Ejemplo Ilen = Len(“Hola”) Schar = chr(65) Icod = Asc(“A”) Sup = Ucase(“hola”) Slow = Lcase(“HOLA”) Valor Ilen = 4 Schar = “A” Lcod = 65 Sup = “HOLA” Slow =(“hola”)

Para convertir un titulo de una manera mas presentable tal como muestra el ejemplo anterior: “el mundo es una ostra” en “El Mundo Es Una Ostra” se escribe el siguiente codigo: Function titulo(introcadena As String) As String Dim fueracadena As String Dim espacio As Integer Introcadena = Trim(Lcase(introcadena)) + “ “ Espacio = instr(introcadena, “ “) While espacio > 0 Fueracadena = fueracadena + Ucase(Mid(introcadena, 1, 1)) + Mid(introcadena, 2, espacio –1) Introcadena = Ltrim(Mid(introcadena, espacio +1)) Espacio = instr(introcadena, “ “) Wend Titulo = fueracadena End function 5.6 Por que Trabajar con Funciones y Procedimientos? Permiten crear rutinas personalizadas por los programadores para satisfacer las necesidades de su aplicación particular y evitar la inconveniente e innecesaria repetición

del código. Se puede aumentar el poder y la versatilidad de los procedimientos incluyendo cualquiera de las instrucciones y funciones integrados de VB, así como las rutinas previamente definidas por usted. El uso de las funciones y procedimientos puede ayudar a dividir una aplicación compleja en unidades de código mas manejables. Si escribe sus propios procedimientos y funciones a nivel formulario, puede compartir código entre los controles de un formulario. Si añade sus propios procedimientos a un modulo estándar, puede compartir su código entre todos los formularios de su aplicación. 6 INTRODUCCION FORMULARIOS A LOS CONTROLES, METODOS, PROPIEDADES Y

Una vez que ya hemos visto algunas de las sentencias básicas: declaración de variables, sentencias de selección, que son muy parecidos a las sentencias utilizadas en MSDOS. Vamos a empezar a programar en windows y veremos en que se diferencia de la programación clásica en MS DOS, para vamos a introducir el uso de los controles. Pero ¿Qué son los controles? Realmente son objetos que disponen de sus propias propiedades y métodos, y cuya utilidad es la de facilitarnos el desarrollo de nuestras aplicaciones. En cualquier aplicación con la que trabajamos estamos rodeados de controles. Quien no ha visto en multitud de programas los botones ACEPTAR y CANCELAR, un cuadro para introducir texto, una lista con datos, por mencionar algunos. Pues todos ellos son controles y no tendremos que preocuparnos por crearlos para nuestras aplicaciones sino que ya vienen con el paquete de VB, lo único que tendremos que hacer es modificar sus propiedades: tamaño, color, entre otros. Para incorporarlos en nuestras aplicaciones y asociarles el código necesario para que se comporten como esperamos al ejecutar la aplicación. Antes de empezar a conocer los controles básicos veamos cuales son sus características generales: Propiedades: Todos los controles disponen de una serie de propiedades las cuales podemos cambiar al incluirlos en nuestras aplicaciones. Ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto, entre otros. La sintaxis para asignar una propiedad de un objeto es: Objeto.Propiedad = Valor Metodos: Son procedimientos asociados a los controles, es decir, rutinas ya establecidas que podemos invocar desde nuestras aplicaciones para que se realice alguna operación sobre el control. Por ejemplo el control ListView (la lista de archivos que aparece en el explorador de windows) dispone del método order que te ordena los datos aparecidos en la lista. Son procedimientos conectados o

son bastantes y cada control cuenta con los suyos propios. No hace falta que indiquemos las coordenadas de la situación del formulario en pantalla. CUADRO DE TEXTOS Y ETIQUETAS 7.Metodo Arg1.0 `ej: Eventos: Son acciones que pueden ser motivadas por el propio usuario o por el mismo sistema operativo. proporcionando herramientas que se adaptan mas de cerca de la manera en que las personas piensan acerca del mundo.1 Por que Trabajar con Propiedades y Metodos? Las técnicas objeto-propiedad-metodo hacen que el desarrollo de las aplicaciones sea más fácil. Obtendremos una ventana como esta en la pantalla Realmente existen muchos más controles.. Arg2.1 TextBox Mediante este control podremos realizar tanto la entrada como la salida de datos en nuestras aplicaciones. Windows lo detecta automáticamente. Moviendo el ratón por encima de cualquier control aparecerá una pista indicándonos el control de que se trata. Su sintaxis es la siguiente: Objeto. Los metodos pueden requerir informacion adicional en forma de argumento. Para mostrar la ventana donde aparecen los controles que Visual Basic carga por defecto nada más arrancar la aplicación tendremos que marcar en Ver del menú principal y activar la opción Cuadro de Herramientas. Para tener acceso a los demás controles tanto de Visual Basic como los controles que incorporan otras aplicaciones marcaremos en proyecto y luego la opción componentes del menú principal.Move 0. aunque son muy parecidos. lo cual es una de las diferencias más importantes respecto a la programación lineal de MS DOS. Los eventos ya están definidos.. 7 BOTONES DE COMANDOS. aunque estos son los más utilizados y por eso aparecen por defecto. Ejemplos pueden ser el movimiento del ratón o hacer click sobre su botón. un bloque de código que puede llamarse para impartir alguna acción a un objeto particular.integrados. simplemente tendremos que marcar sobre . En Visual Basic digamos que se utiliza la programación orientada a eventos. Lo único que tendremos que hacer es asociar el código necesario al evento que necesitemos tratar. Argn pictierra. No necesitamos detectar cuando se ha producido un evento determinado. 6.

Tag: Almacena información adicional(cualquier expresión de cadena). Para que funcione la propiedad MultiLine debe estar con el valor true. BorderStyle: Determina el tipo de borde. Podemos asignarle cualquier texto en tiempo de diseño o ejecución. nuevotexto As String Nuevotexto = “Texto Nuevo” Viejotexto = introtexto. centro o derecha. Forecolor: color de letra. En un mismo formulario no puede haber 2 controles con el mismo nombre. ej: almacenar la contraseña de su sistema. Conviene poner un nombre que represente la función que tiene el control en la aplicación para que el código quede más claro. Otras propiedades que son comunes a la mayoría de los controles: Backcolor: color de fondo. si en el textbox vamos a introducir la dirección de una persona podemos asignarle a esta propiedad el valor Dirección. Se puede almacenar el contenido actual de este control en una variable. el nombre que viene por defecto en este caso Text1 y es el nombre con el que se conocerá el control cuando lo utilicemos en el código. . Font: tipo y tamaño de letra. Ejemplo.text Lee el texto Actual introtexto. Nos puede servir para utilizar el control como salida de datos sin que el usuario pueda modificarlos por error. PasswordChar: Oculta un texto con un carácter simple. Alignment: Alineación que tendrá el texto dentro del control: izquierda. es decir.text = nuevotexto Pone el nuevo texto PROPIEDADES Text: Aquí indicamos el texto que aparecerá en el control. Locked: Si esta con valor true bloquea el control. MultiLine: Permite que introduzcamos varias líneas de texto en el control en lugar de sólo una. ej: Dim viejotext. También podemos tomar el texto que haya introducido el usuario para tratarlo durante la ejecución. Name: Esta propiedad la tienen todos los controles.el control de la caja de herramientas y dibujarlo con el tamaño que queramos en nuestro formulario. el usuario no puede introducir ni modificar el texto que contenga.

es decir. EVENTOS Los eventos son acciones que se pueden realizar en cualquier control: click. se activa cuando el control pierde el enfoque. es decir. movimiento del ratón. Entonces lo que habrá que hacer abrir la ventana de código. Both o None. Vertical. Getfocus: Lostfocus: EJEMPLO Vamos a probar el uso del control TextBox mediante un pequeño ejemplo en el que teniendo un único control de este tipo en un formulario. Para que no aparezca ese texto al ejecutar la aplicación. Es el contrario del anterior evento. Lo que queremos hacer es que cada vez que movamos el ratón por el control aparezca su contenido en el formulario. lo programaremos de forma que al pasar el ratón sobre el control (evento mousemove) aparecerá en el formulario el texto que contenga. seleccionando el control. A estos eventos se les puede asociar código para que se ejecute al producir el evento. cuando se activa el control en tiempo de ejecución para introducir datos en él o realizar alguna operación. Cuando la propiedad MultiLine esta en True se puede usar la propiedad Alignment para ajustar el texto. . Observamos que al situar el control en el formulario aparece por defecto el texto Text1. este evento se activa cuando el control recibe el enfoque. al pulsar cualquier boton del raton al cambiar el contenido del control al hacer click con el botón izquierdo del ratón sobre el control al hacer doble click con el con el botón izquierdo del ratón sobre el control. doble click.Para personalizar las combinaciones de la barra de desplazamiento en un cuadro de texto. se pasa a otro control para seguir introduciendo datos. debemos cambiar la propiedad Text. se puede establecer la propiedad ScrollBars en Horizontal. Este proceso nos llevará al cuadro de la imagen siguiente. MouseMove: Mousedown: Change: Click: Doubleclick: al mover el raton por encima del control.

puede establecer las propiedades Autosize y WordWrap en True. 7. hubiera quedado mejor con un mensaje aclaratorio contenido en un control label Si se desea que se despliegue adecuadamente varias líneas de diversas longitudes. en nuestro caso mousemove y a continuación teclear el código correspondiente: La instrucción print visualiza un texto en el formulario y si le ponemos text1. Si queremos que aparezca un borde alrededor del control activaremos esta propiedad. no necesita que esté activada ninguna otra propiedad. Podemos modificar el programa para que responda a cualquier otro evento sin más que seleccionarlo en la sección Proc e introduciendo el código que sea necesario.2 Label Este control es también uno de los más utilizados.text le decimos que nos muestre la propiedad Text del control Text1 que ese será el nombre que tendrá el control por defecto si no lo hemos cambiado en la propiedad name. Al ejecutar esta pequeña aplicación pulsando F5 observaremos como aparece en el formulario lo que hayamos tecleado en el control cada vez que movemos el raton sobre el Textbox . no permitiendo la introducción de datos por parte del usuario. aunque su utilidad queda restringida a la visualización de datos en el mismo. En el ejemplo anterior donde aparecía un textbox en el formulario. Alineación del texto contenido en el control. Este control sirve para mostrar mensajes en nuestro formulario que orienten al usuario sobre la utilidad de los demás controles que tengamos en la aplicación o para indicarnos acciones que podemos realizar. sino utilizando la propiedad caption. La forma de utilizarlo es similar a la del control anterior. PROPIEDADES Caption: Alignment: Es el texto que contendrá el control.Lo que tendremos que hacer es seleccionar el evento que necesitemos de la sección Proc. BorderStyle: . dibujar el control en el formulario con el tamaño que queramos y asignarle un texto en tiempo de diseño o de ejecución esta vez sin utilizar la propiedad text puesto que no la incorpora.

Podemos utilizar esta propiedad para activar o desactivar un botón dependiendo del estado de otros controles. False . cuando su valor es false el botón se encuentra desactivado. ya que ese botón nos calculará el IVA de la cantidad. cancelar. Por ejemplo. 7. Cancel: Permite la selección con Esc True. Pero sólo con introducir un control de este tipo con el texto salir que se introduce a través de la propiedad caption no basta.3 CommandButton Se usa un control de botón de comando para iniciar. Habrá que asociarle un código que nos permita salir de la aplicación en el evento adecuado. De todas formas los eventos son casi los mismos del control textbox excepto que no dispone de los eventos GetFocus y LostFocus ya que a este control no se le puede dar el enfoque. PROPIEDADES Caption: Aquí pondremos el letrero que queremos que aparezca en el botón: aceptar.Para este control no se suelen utilizar los eventos ya que su contenido suele cambiar poco a lo largo de la ejecución de la aplicación. Enabled: Appearance: Selecciona 3-D o apariencia plana. Y el evento por excelencia de este control es click. Esta es una nueva propiedad. no activarlo hasta que se haya introducido una cantidad en un control textbox. salir. no responde a los eventos producidos sobre él y el texto aparece en un gris claro advirtiéndonos de su estado. normalmente Aceptar o Cancelar. entre otros. cuando su valor es true el botón funciona normalmente. Así pues accederemos al código del control y la sentencia nos permitirá salir de la aplicación es End. interrumpir o terminar un proceso en particular. Este control es el típico botón que aparece en todas las aplicaciones y que al hacer click sobre él nos permite realizar alguna operación concreta. Aunque según el código que le asociemos podremos realizar las operaciones que queramos. en un botón Aceptar. simplemente tecleamos esa palabra en el evento click y comprobar que realmente finalizaremos nuestra aplicación al pulsar sobre dicho botón. En el ejemplo anterior podemos añadir un control de este tipo para salir de la aplicación sin tener que pulsar sobre la equis de la esquina superior derecha.

Si activamos cualquier otra opción. según el caso. Para agrupar los controles OptionButton en un marco o cuadro de dibujo. El marco que está alrededor de los 4 controles optionbutton se trata del control Frame. Si traza los controles fuera del marco y los arrastra adentro. False.1 Que son los botones de Opción? Es el que despliega una opción que puede encenderse a pagarse. no producirá los resultados deseados. es opcional. 8. se desactivará automáticamente la última que teníamos activada . 7. Es probable que el mismo formulario tenga algunos botones para navegar a través de los registros de base de datos. Como sabemos detecta el movimiento del ratón sobre el control. en este caso los 4 colores. 8 BOTONES DE OPCIONES. CASILLAS DE VERIFICACION Y MARCOS 8. Facilita la introducción de datos por parte del usuario: De todas las opciones que se nos ofrece. Esto se hace para asegurarse que sean mutuamente excluyentes y crear una jerarquía de contenedores validas.4 Porque usar los cuadros de textos. aunque es conveniente colocarlo siempre que . trace el marco o cuadro de dibujo primero y luego trace los controles OptionButton adentro. Puede servir para que aparezca un mensaje en un control Label que nos aporte información sobre la utilidad del control ampliando el texto que hayamos colocado como caption del commandbutton. los copia dentro del marco o traza el marco alrededor de los controles existentes.Default: Permite la selección con enter True. EVENTOS Click: MouseMove: Es el evento tipico de este control y el que más se utiliza.2 OptionButton Este control nos permite elegir una opción entre varias de las que se nos plantean. esto son usualmente almacenados(o relacionados) en varios controles TextBox. los que a su vez se identifican por etiquetas. Cada opción será un control optionbutton diferente. con la propiedad Value del botón puesta en True o False. sólo podremos activar una. Botones de comandos y etiquetas? Cuando los datos de campos se ven a través de un formulario.

Los eventos del control son los mismos que en anteriores controles.. al mover el marco se moverán los controles incluidos en él facilitándonos las modificaciones.hagamos uso de las opciones.Right Justify: el control aparece a la derecha del texto. una operación que seleccionemos y mostrar el resultado. que es el texto que aparecerá en el encabezado. Limpiar y Salir. Para comprobar que opción ha activado el usuario comprobaremos el estado de esta propiedad. sino únicamente conocer el valor que tienen: true o false. El formulario donde estarán todos los controles es el siguiente: La propiedad Caption de cada uno de los controles es la que se muestra en el formulario. . A los controles Label y al Frame no have falta cambiarles el nombre. Los controles Optionbutton tienen cada uno de ellos el mismo nombre que su caption Los controles CommandButton tienen los nombres: Calcular. aunque no se suele asociar código a los eventos de este tipo de controles. Es el valor que tendrá el control: True si se encuentra activado y False si no lo está. También. en el ejemplo anterior: colores. Alignment: Alineación del texto respecto al control: Left Justify: el control aparece a la izquierda del texto. No sólo por motivos de presentación sino porque de esta manera podremos establecer grupos de controles optionbutton independientes en los que en cada grupo sólo pueda haber una opción activada a la vez. verde. Num2 y Resul. Es el ejemplo anterior. Del control Frame la única propiedad que nos interesará es caption.. APLICACION DE EJEMPLO Para practicar con los controles que hemos visto vamos a realizar una pequeña aplicación que consistirá en realizar con 2 números que introduzcamos. PROPIEDADES DE OPTIONBUTTON Caption: Value: El texto que aparecerá al lado del control: Rojo. He modificado la propiedad Name de cada control para que al utilizarlos desde el código sepamos cual es el control con el que trabajamos: • • • • Los controles TextBox tienen los nombres: Num1.

4 Que son los Marcos? Proporciona una forma atractiva de agrupar controles relacionados. Si/No y Activado/Desactivado. Ej: Select Case chksound Case 0 Msg = “No Seleccionado” Case 1 Msg = “Seleccionado” Case 2 Msg = “No Disponible” End Select MsgBox Msg 8.3 Que son las casillas de verificación? Un CheckBox muestra una marca cuando esta seleccionado. Este control se usa para dar al usuario las opciones True/False .Lo que habrá que hacer ahora es asociar código a cada uno de los botones que es de donde se van a realizar las operaciones: • Para el botón Calcular que es el que nos mostrará el resultado según la operación seleccionada. Use la propiedad Value para determinar el estado del control: 1 = Marcado 0 = Sin marcar 2 = No disponible(desactivado. estableciendo la propiedad Caption. El código que tendremos que introducir es muy simple: El botón Salir únicamente contendrá la sentencia End 8. se puede utilizar la instrucción If Then Else que se vio anteriormente. puede usar un marco para subdividir un formulario en otros. El botón Limpiar Datos nos va a servir para borrar de una forma rápida los datos introducidos por el usuario y el resultado preparando los controles para introducir nuevos datos. Se . y la marca desaparece cuando se borra el cuadro. aparece atenuado). Se puede desplegar texto junto a las casillas de verificacion. Primero se traza el control Frame y luego los controles dentro del Frame.

algunas de las cuales pueden estar desplegadas como un grupo mutuamente excluyente. Descripción y Ajuste de MultiSelect Ajustar 0 1 Descripción No se permite la selección múltiple(ajuste por omisión) Selección múltiple sencilla. Si el numero de elementos excede el numero que puede desplegarse a la vista. Para seleccionar mas de un elemento de una lista.5 Por que los botones de opción y los cuadros de texto? Frecuentemente es necesario diseñar cuadros de dialogos que presentan al usuario una diversidad de opciones. La propiedad MultiSelect devuelve(en tiempo de ejecución) o establece(en tiempo de diseño) un valor que indica si un usuario puede o no hacer una selección múltiple. Los eventos Clic o Ddclic del cuadro de lista se utilizan habitualmente para procesar la selección. Selección múltiple extendida. una barra de desplazamiento se anexa automáticamente al control ListBox. botones de opciones y casillas de verificación.1 Que son los cuadros de lista? Los cuadros ListBox despliegan una lista de elementos en la que el usuario puede seleccionar uno o más de estos. Una propiedad Listcount de una lista devuelve el numero de elementos de la lista. mientras que la propiedad ListIndex se una para seguir la pista del elemento actualmente seleccionado. extendiendo la selección del elemento 2 . así como de sus propiedades y eventos asociados. un clic del ratón u opresión de la barra espaciadora seleccionada o quita la selección de un elemento de lista. 9 CUADROS DE LISTA Y CUADROS COMBINADOS 9. Oprimiendo mayúsculas y haciendo clic con el ratón u oprimiendo mayúsculas y una de las teclas de flechas.8. la propiedad MultiSelect del control ListBox puede ponerse en 1 o 2. aumentará en gran medida su habilidad para diseñar formularios y cuadros de diálogos de Windows visual y funcionalmente concisos. y como usted hacerse tal selección. Una comprensión completa de la relación entre los marcos. mientras que otras estan clasificadas en una forma que permiten tener efecto a la vez a una o mas opciones.

Este permite solamente la selección de la lista desplegable. Incluye un cuadro de texto y una lista fija. 9.listCount -1 Milista. Incluye una lista desplegable y un cuadro de texto.List(5) If milista. El tamaño de un simple Combobox incluye las partes de edición y las parte de la lista. .seleccionado anteriormente al elemento actual. puede teclear información en la parte del cuadro de texto del control. cuando la parte del TextBox no esta disponible al usuario. si el elemento esta Ejemplo de Uso Item = milista. Los valores de la propiedad Style del comboBox resumen a continuación: Descripción y Ajuste de MultiSelect Ajustar 0 1 Descripción DropDown Combo. 2 9.3 Propiedades y Métodos Comunes de lista Estas se resumen en le siguiente cuadro Propiedad ListCount ListIndex List Selected Descripción Numero de elementos de una lista Indice numérico del elemento actual Con el índice devuelve el elemento de lista True. determinados por sus valores en la propiedad Style .Listindex = 3 Quintoelemento =milista. Simple combo. DropDown List.Selected(3). Este estilo no es realmente un comboBox del todo.2 Que son los cuadros combinados? La diferencia entre cuadros combinados (ComboBoxes) y cuadros de lista(ListBox) es que un control ComboBox combina las características de un control Textbox y un control Listbox. Si el usuario no desea seleccionar alguna de las opciones ofrecidas. Un cuadro combinado tiene tres estilos diferentes. Esta propiedad devuelve o establece un valor indicando el tipo de control ComboBox y el comportamiento en el cuadro de lista.

del cual le usuario debe hacer una elección. mientras que Removeitem requiere un índice numérico. . o algunas veces.sorted = True en True Descripción Añade la cadena de elemento Elimina todos los elementos de la lista Elimina un solo elemento de la lista Ejemplo Milista. Ambos requieren un solo argumento. pero Additem espera una expresión de cadena. Los controles Listbox y Combobox ofrecen una amplia variedad de propiedades de lista y métodos que pueden usarse para simplificar en gran medida el proceso de añadir funcionalidad a sus programas. debe permitirle teclear su propia nueva información textual.clear Método Addeitem Clear RemoveItem “Hola Milista. Casi siempre existe la necesidad de desplegar información en un formato de lista.Serted seleccionado Then Lista autoordenada si esta Milista.Additem = Mundo” Milista.4 Por que usar cuadros de lista y cuadros combinados? Como programador de Windows descubrirá una diversidad de usos para los cuadros de lista y para los cuadros combinados. 9.RemoveItem 5 Es importante en la manera en que trabajan los métodos Additem y Removeitem.

Hacer Click en la pestaña de Objeto inicial y seleccionar el Formulario de arranque que desea. commandbutton. eventos y métodos. label. En este capítulo vamos a ver las propiedades y eventos más importantes de los formularios. Puede hacer que todos los Formularios de un programa sean visibles de forma .1 ¿Qué es un Formulario de Arranque? Es el primer formulario que se despliega en la Aplicación por lo general es el primer formulario que se crea en el Ambiente de desarrollo. 3. Componentes en la pestaña Objetos Insertables. como trabajar con múltiples formularios y como se establece la comunicación entre ellos. 3.vbx u . como una hoja de trabajo en Excell o un Documento de Word.ocx que cuando se añade a un Proyecto extiende la caja de herramientas de Visual Basic. esto lo puede accesar dentro de la opción Proyecto. CONTROLES Y MENU Los formularios son tratados como controles con sus propiedades.CAPITULO III FORMULARIOS. pueden añadirse dentro de la opción de Menú Proyecto en la opción Componentes . 3. Pasos para especificar un Formulario de Arranque: 1. Aunque digamos que se trata de un control especial que utilizamos para contener los controles más usuales con los que construiremos nuestras aplicaciones: textbox. Del Menú de Proyecto escoger la opción propiedades del Proyecto. etc. 3.2 ¿Qué es un Control Personalizado y Objetos Insertables? Un Control personalizado es un archivo con una extensión . Un Objeto Insertable es un tipo de control Personalizado que es un Objeto y una Aplicación servidora OLE. No necesariamente una Aplicación tiene que arrancar con el primer formulario del Proyecto ya que esto se puede modificar.5 ¿Cómo se utilizan los Formularios? En Visual Basic el uso de Formularios es una Actividad realmente flexible. 2.3 ¿Por Qué usar los Procedimientos de Arranque y los Controles Personalizados? La ventaja de usar los Controles Personalizados es obvia puesto que no es necesario Programar algo que ya esta hecho.

Tiene tres posibles valores: 0 . MinButton y MaxButton: Son dos propiedades que admiten únicamente los valores True o False. únicamente lo hará el botón con la "x" de cerrar. 2 . Cancelar o sea eliminado por otros medios). Las propiedades más comunes de los formularios y que son similares al resto de los controles son las siguientes: Name: código. nos . pero si desactivamos las dos propiedades. no aparecerá ninguno de los 2 botones. Caption: Nombre del formulario.simultanea o podrá cargar y descargar formularios a medida que el Programa los valla necesitando. Otras propiedades que son propias de los formularios y que es importante conocerlas para realizar una buena presentación en nuestras aplicaciones son las siguientes: WindowState: Nos permite indicar el modo en el que aparecerá el formulario cuando sea llamado. En una aplicación con múltiples formularios. el botón correspondiente aparecerá desactivado. necesario para llamar al formulario desde el Texto que aparece en el título del formulario Backcolor: Color de fondo del formulario. 3.Normal 1 . ShowInTaskbar: Mediante esta propiedad podremos controlar que determinado formulario aparezca o no en la barra de tareas de Windows. si para cada uno de los que aparezca en pantalla.Maximizado. Un formulario que el usuario puede seleccionar o ignorar en pantalla recibe el nombre de Formulario No Modal. Nos sirven para controlar que el usuario no pueda cambiar el tamaño en que presentemos un formulario en pantalla. La mayoría de aplicaciones desarrolladas por Microsoft utilizan formularios no Modales para mostrar Información. ya que proporcionan más flexibilidad de empleo del usuario. Un formulario que tenga que ser utilizado cuando se muestre por pantalla se denomina formulario modal (el Formulario acaparara la atención del Programa hasta que el usuario pulse Aceptar. Si sólo desactivamos una de las propiedades.Minimizado. Forecolor: color del texto del formulario. Permiten que queden habilitados los botones minimizar y maximizar. respectivamente de un formulario.6 Propiedades de los Formularios.

Unicamente aparece la barra de titulo con el caption Si además de colocar ControlBox a False. Esta propiedad por defecto está activada. maximizar y cerrar. es decir sin nada en el título. únicamente un rectángulo gris que sí podremos cambiar de tamaño apuntando sobre el borde. ControlBox: Controla la aparición del menú de control. aunque si la ponemos a False. colocamos MinButton y MaxButton a False y dejamos vacía la propiedad Caption. no sólo hacemos desaparecer el icono que simboliza al menú de control. En la siguiente tabla aparece una explicación de cada una de sus opciones y de que valor adoptan otras propiedades del formulario . que es donde aparece el menú de control. Icon: Nos permite modificar el icono que aparece a la izquierda de la barra del título de cualquier formulario. nos aparecerá un formulario sin barra de titulo. al final la barra estará llena de aplicaciones.aparece también en la barra de tareas. El cambiar el valor de esta propiedad afecta también a las propiedades MinButton. Podemos hacer que determinados formularios no aparezcan en ella colocando esta propiedad a False. sino que desaparecen también los botones de minimizar. es decir. MaxButton y ShowInTaskbar que cambian automáticamente según la opción que hayamos seleccionado. para personalizarlo en nuestra aplicación El icono que aparece por defecto en todos los formularios se puede cambiar por otro más simpático. BorderStyle: Esta propiedad es la que más opciones tiene y la que más posibilidades ofrece para cambiar el aspecto de nuestros formularios.

para llamarlo desde otro formulario se escribe: Form2. 3. 3 . algo Single que sí se puede hacer desactivando los botones MinButton y MaxButton en un formulario normal Formulario por defecto de VB.Show Si no se pone ningún argumento se asume que el formulario aparece en modo no modal.Fixed doble click sobre la barra del título.Sizable modificar su tamaño actuando sobre el ToolWindow borde. es el que utiliza VB para 4 . Sirve para pantallas de presentación al principio de nuestra aplicación No se puede cambiar su tamaño. lo que significa que . 3. Para llamar a un formulario desde el código se utiliza el método Show.Fixed No se puede cambiar su tamaño y no Dialog aparece en la barra de tareas Aparece con la barra de titulo más pequeña.Fixed ToolWindow mostrar la caja de herramientas. Contiene 2 . No aparece el icono del menú de control ni aparece en la barra de tareas. Si el formulario 2 tiene en la propiedad Name form2. La otra modalidad que existe es modal. se permitirá que se active cualquier otro formulario sin cerrar el formulario 2.7.1 Método Show.Sizable todos los botones de la barra del título. se (aparece por puede cambiar su tamaño actuando sobre defecto) el borde y aparece en la barra de tareas. Igual que el anterior pero sí permite 5 .7 Utilización de Múltiples Formularios False False False False False True True True True False False False False False False False False False Para utilizar varios formularios en nuestra aplicación tendremos que añadir cada uno de ellos mediante la opción de menú Insert / Form o pulsando sobre el botón.None ninguna forma.Opciones de BorderStyle Utilidad MinButton MaxButton ShowIn Taskbar No aparecen bordes ni barra de titulo. es decir. Ni siquiera se puede maximizar haciendo 1 . No podemos modificar su tamaño de 0.

Permite descargar un formulario de la memoria. Si el formulario ya estaba cargado en memoria. si no estaba cargado antes. ya que la propiedad Visible se coloca a False.Show vbModal 3. Por tanto el formulario aparecerá con los mismos datos que tenía cuando se ocultó.7. y coloca la propiedad Visible del formulario a True.no se permite el enfoque hacia ningún otro formulario hasta que no se cierre el actual. 3. Los argumentos del método Show son: 0 1 VbModeless VbModal No modal Modal Ejemplo: Form2. Este último modo puede servir para cuadros de diálogo que soliciten ciertos parámetros para que la aplicación siga funcionando: una contraseña. mediante una sentencia Load o porque se haya ocultado con el método Hide. Durante este proceso se provoca la activación de los eventos Load y Activate del formulario en ese orden. Ejemplo Load Form2 Realmente el método Show realiza la carga del formulario en memoria. y no se volverá a efectuar el proceso de carga del formulario a memoria. Se introduce junto al nombre del formulario que se va a descargar: Unload Form2 Si se esta dentro del mismo formulario para descargarlo no hace falta colocar el nombre sino únicamente: Unload me . La sentencia Load seguida del nombre de un formulario provoca que se cargue el formulario en memoria pero sin visualizarse. al llamarlo con el método Show.7. únicamente se realizará la modificación de la propiedad Visible a True. En dichos eventos se puede colocar el código necesario que haga que el formulario se inicie siempre con los valores deseados. Ahora el único evento que se activará es el Activate que se activa cada vez que un formulario recibe el enfoque o pasa a ser el formulario activo.3 Sentencia Unload.2 Sentencia Load.

Los valores que puede tener son los siguientes: 0 . el menú de control o con ALT + F4) aparezca un mensaje que pregunta si realmente se desea salir: Query_Unload: Unload. este se activa cada vez que un formulario pierde el enfoque. 1 . también proporciona el parámetro UnloadMode que según el valor que tenga se podrá saber desde donde se produce la posible descarga del formulario.vbAppWindows: Se cierra el formulario porque se apaga el sistema desde Inicio / Apagar Sistema.vbFormMDIForm: Se produce cuando se cierra un formulario hijo porque se está cerrando el formulario MDI que lo contiene. 3 . La sentencia unload provoca la activación de los eventos: Deactivate: Al contrario que el evento Activate.vbFormControlMenu: Significa que el cierre del formulario se ha producido: Pulsando sobre la "x" Mediante la opción cerrar del Menú de Control. de esta forma se libera espacio en memoria para que los otros formularios puedan aprovecharla mejor. Este evento se produce realmente antes que el evento En este evento además de recoger el parámetro Cancel. Cerrando el formulario desde la Barra de Tareas. (no sólo mediante la sentencia Unload sino también haciendo click sobre la "x".En una aplicación con varios formularios se debe usar esta sentencia para los métodos que se terminan de utilizar.vbFormCode: Indica que se ha cerrado el formulario utilizando la sentencia Unload. Unload: Este evento recibe el parámetro Cancel. Mediante 2 líneas de código se puede hacer una pregunta al usuario cada vez que se cierra un formulario para que confirme la operación: Este código provocará que cada vez que se cierre el formulario de cualquier forma. También se activa este evento al utilizar el método Hide. Pulsando ALT + F4. 2 .vbAppTaskManager: Desde el administrador de tareas de windows (CTRL + ALT + DEL) se cierra la aplicación que contiene el formulario 4 . y al modificar su valor se puede hacer que se suspenda (cancele) el proceso de descarga de un formulario. .

Caption = "Número de Clientes" Al acceder a las propiedades de otro formulario automáticamente se carga éste en memoria. y ejecutar la aplicación desde fuera del entorno de trabajo de VB. se tendrán que declararlas como Públicas desde un módulo de código Para insertar un módulo en un proyecto de Visual Basic se tendrá que marcar en Proyecto y dentro de la opción proyecto Agregar Modulo o pulsar sobre el botón de la barra de herramientas. En lugar de realizar el paso de parámetros cuando se llama a otro formulario que queremos que aparezca con unos determinados valores iniciales.Propiedad = valor Se debe colocar una admiración "!" entre el formulario y el control y un punto entre el control y la propiedad Ejemplo: Form2!Label1..Mediante unas líneas de código se va a probar las posibilidades de este evento.. si no lo estaba ya antes. El código asociado al evento Query_Unload es el siguiente: Desde un formulario se puede tener acceso a los controles y propiedades de otro formulario. Esto es así para que se pueda cerrar la aplicación apagando el sistema y desde el administrador de tareas. Una vez que se hayan modificado sus propiedades los visualizaremos con el método Show. de modo que si se quiere trabajar con variables generales. Nota: Para el correcto funcionamiento de este ejemplo se debe compilar la aplicación mediante File / Make EXE File. Aparecerá una ventana en la que únicamente se podrán colocar las variables y procedimientos o funciones que se deseen públicas para toda la aplicación. En el siguiente ejemplo se declara la variable Gen_var de tipo Integer que será accesible desde cualquier formulario de la aplicación: . Para acceder a los controles de otro formulario se sigue la siguiente sintaxis: Formulario!Control. las cuales sean accesibles desde cualquier formulario de la aplicación. No se puede acceder a las variables declaradas en otro formulario. lo que se hace es acceder a los controles del otro formulario y después mostrarlo mediante el método Show. Según desde donde se cierre el formulario del que consta la aplicación aparecerá un mensaje distinto que pide confirmación en el proceso de descarga.

Para especificar un botón de comando en tiempo de diseño establezca la propiedad Default del botón a True . Checked: Es una casilla de verificación que se selecciona si desea que aparezca una marca de verificación a la izquierda. Si el botón de comando es el botón cancelar predeterminado para el formulario. Enable: Es una casilla de verificación que se selecciona si desea que el elemento del menú aparezca en el menú. al presionar ENTER se elige el botón aunque cambie el enfoque a un control diferente de un botón de comando. Name: Se usa para teclear el nombre del Control para el elemento del Menú.2 Hacer Clic con los botones para realizar acciones Hay muchas formas de elegir un botón de comando en tiempo de ejecución: § § § § § § Usar un Mouse para hacer clic en el botón Mover el enfoque al botón presionando la tecla TAB y luego presionar ENTER Presionar una tecla de acceso a un botón de comando(ALT + la tecla subrayada) Establecer la propiedad Value del botón de comando en True en el código: Command2. Index: Se usa para asignar un valor numérico que determina la posición del elemento del menu dentro de un arreglo de control. al presionar ESC se elige el botón aunque cambie el enfoque a otro control. El Editor de Menú es una Aplicación de diseño de menús que se incluye en Visual Basic. CREACION DE MENUS. HelpContextId: Se usa para asignar un valor numérico para el Id de contexto.4. 4. También puede crear una barra separadora tecleando un guión (-). Este valor se usa para encontrar el tema de ayuda apropiado en al archivo de ayuda identificado por la propiedad HelpFile. Shortcut: Presenta una lista desde la que puede seleccionar una tecla de atajo para el elemento del menú. Para permitir el acceso por teclado al elemento de Menú se inserta un Ampersand (&) antes de una letra. El Editor Menú consiste en un cuadro de texto que consta de: Caption: Se teclea el nombre del Menú o del comando que aparecerá en la Barra de Menú. Es un identificador que se usa solamente para accesar el elemento del menú en código y no aparecerá en un Menú. Para § .Value = True Invocar al evento Clic del botón de comando en el código: Cmcerrar_Clic Si el botón de comando es el botón de comando predeterminado para el formulario.

especificar un botón Cancelar por defecto en tiempo de diseño ponga la propiedad Cancel en True . .3 Controles para Introducir y Mostrar Textos Los controles son Label y Text. El AutoSize determina si se debe cambiar el tamaño de un control para ajustarlo a su contenido. Para cambiar el tamaño de una etiqueta y ajustarla al tamaño de su contenido se hace lo siguiente: § Los títulos de etiquetas de una sola línea se pueden especificar en tiempo de diseño en la ventana propiedades. Pero para hacerlo en tiempo de ejecución es necesario utilizar dos propiedades: AutoSize y WordWrap. etiqueta crece horizontalmente. Si esta establecida en True . La WordWrap hace que la etiqueta crezca verticalmente para ajustarse al contenido. 4.

Es un control muy potente.mdb con el que podremos hacer pruebas. El sistema de programación de acceso a bases de datos de VB tiene dos tipos de herramientas diseñados para este fin: 1 . Nos permite abrir una base de datos y manipular su contenido: situarnos en un registro concreto de una tabla. añadir o modificar registros. el más importante para bases de datos. Además el propio Visual Basic viene con un fichero de base de datos Biblio. Dao permite el acceso a las bases de datos desde programacion exclusivamente. se deberá implementar la intefaz del usuario. Esto quiere decir que si se desea dotar a una aplicación de la potencia de un Dynaset.1 CONTROLES DE BASES DE DATOS Sin una sola línea de código se puede visualizar cualquier tabla de una base de datos con todos sus registros. es decir. incluyendo los botones y controles oportunos para realizar los diferentes procesos. 5. 2 – DataControl: poseen de por si una interfaz con una apariencia fisica concreta. no porque sean las mejores. no implementan ninguna interfaz para el ususario. Inicialmente se hará el ejemplo de 2 formas distintas: • Empleando los controles que facilitan la labor con bases de datos • Mediante código. Para iniciar se enseñará como realizar una pequeña aplicación que muestre en un formulario una tabla de una base de datos. A partir de este ejemplo que se irá comentando efusivamente se conocerá la base para realizar las aplicaciones y se irá ampliando para conocer todas las posibilidades que existen en el manejo de bases de datos. Data: este control viene en la caja de herramientas ( oolbox) nada más cargar t Visual Basic. Dynaset y QueryDef. etc. Table. sobre la cual el usuario puede pulsar con el raton y desencadenar acciones directamente sin que dichas acciones hayan sido implementadas por el . Datacontrol: es un tipo de control propio de VB pensando especialmente para el acceso a bases de datos.DAO(Data Acces Objets) son objetos no visibles para acceder a bases de datos. es decir "a pelo" utilizando un ListBox para mostrar el resultado. sino porque son las bases de datos más extendidas. Entre ellos podemos destacar Database. eliminar.CAPITULO 5 BASE DE DATOS Durante el curso vamos a trabajar con bases de datos de Access. que no lo son.

RecordSource: aparecerán las tablas de las que consta la base de datos para que elijamos con cual queremos trabajar. de esta forma visualizará la tabla que hayamos indicado en la propiedad Recordsource del Data. Cada archivo de datos representa una tabla que puede tener varios indices para acelerar el acceso a los registros que contiene. ejemplo : Data1. Conect: contiene un alfanumérico que especifica el tipo de formato de la base de datos a la que nos queremos conectar. Recordemos que el concepto relacional de base de datos es diferente a lo que se entiende como base de datos. El DataControl posee una lista de alfanumericos correctos para compararlos con el que le especificamos. Es el único dato que necesita este control. Esta propiedad tiene esencialmente dos funciones como se menciono anteriormente: 1. en este caso Biblio. Es lo que en el manual de VB se denomina DataBoundControl. Dentro de una base de datos se puede tener una o varias tablas.mdb que estará en el mismo directorio de Visual basic. el formulario tendrá un aspecto como este: Como se puede observar junto con los datos aparece la cabecera que nos indica a que campo corresponde cada columna.Para especificar una sentencia SELECT que obtenga datos concretos de una o varias tablas.RecorSource = “Clientes” Este ejemplo establece que la fuente de datos para nuestro DataControl llamado Data1 va a ser la tabla clientes. Más adelante veremos que podemos indicar mediante una sentencia SELECT campos de distintas tablas que cumplan ciertas condiciones. 2. DataBaseName: le indicamos donde está situado el archivo que contiene la base de datos. La finalidad basica del DataControl es acelerar las fases de desarrollo de mantenimiento de archivos. DataSource: indicamos el control Data con el que estará conectado este control que si se ha cambiado el nombre debe ser Data1. Los DataControl presentan los datos mediante controles vinculados a ellos. lo cual quiere decir que una tabla de datos no es lo mismo que un archivo de datos o una tabla.porgramador.Para especificar la tabla de la cual queremos recuperar los datos. . Se puede hacer que un DataControl muestre automaticamente sus datos en una serie de cajas de edicion de texto. Al ejecutar la aplicación.

MoveNext If Data1. hay muchas más tablas en el archivo de base de datos Biblio. tendremos que buscarlo en la opción: Proyecto .1 Funciones de Movimientos los DataControl al igual que el resto de los objetos RecordSet muestran solo un registro a la vez.Recordset. cabeceras incluidas. Este control permite visualizar un conjunto de registros. que haya sido indicado en un control Data.Recordset. las cuales nos permiten desplazarnos al primer registro.MoveLast End if . registro posterior y último registro respectivamente.2 PROGRAMACION DE DATACONTROLS 5. modificar.MoveLast Ejemplo de lo anterior es son las siguientes intrucciones: Sub Button1_Click () Data1.mdb).Recordset. aparecerá como 1ª opción de las muchas que existen Apex Data Bound Control. permitiendo posicionarse en diferentes registros.MoveFirst Data1. eliminar. aunque para no haber introducido una sola línea de código ya es bastante.Componentes (si estás utilizando la versión inglesa).MoveNext Data1.También nos podemos desplazar por todos los registros de los que consta la tabla de 2 formas: utilizando la barra de desplazamiento del control DBgrid o con las flechas del control Data.Recordset.MovePrevious Data1.Recordset.2. o que al hacer click sobre un autor nos aparezcan los libros que ha escrito en otro control DBgrid o en otro formulario.Recordset. Por ahora las únicas operaciones que podremos hacer con este formulario son las de desplazarnos a través de la tabla que indiquemos (no tiene por que ser necesariamente la tabla Autores o Authors. registro anterior.EOF Then Data1. buscar. Habrá que situar los 2 controles en el formulario y modificar las siguientes propiedades: Control Data: Más adelante veremos las modificaciones que habrá que hacer para poder realizar otras operaciones más útiles sobre los datos: añadir.Recordset. por ejemplo. 5. DBgrid: Si el control no se encuentra inicialmente disponible en la toolbox. actívala y acepta. Para tal fin se dispone de tres funciones básicas de movimiento que equivalen a los cuatro botones del DataControl: Data1.

BOF Then Data1.Recordset.fields(2).Recordset.Fields(2).MoveFirst End if End Sub En objetivo de utilizar este tipo de funciones es para que el usuario no vea el DataControl y para implementar una serie de mecanismos de seguridad que permitan al usuario avanzar o retroceder en función de variables de programas.Recordset. entonces para tratar tal posibilidad y evitar un error en tal caso se debe realizar lo siguiente: If Isnuli(Data1.value Pero puede surgir la posibilidad de asignar a una variable alfanumérica el valor Null.Visible = False. a través de Recordset(campo) o a través del símbolo “!” el cual actúa como separador sintáctico entre registro y campo.End Sub Sub Button1_Click () Data1.2. de manera que solo el programa podrá manejarlo y el usuario deberá interacturar con el DataControl exclusivamente a través de los botones y controles que se hayan dispuestos a tal efecto.Recordset!“Apellido” Data1.Recordset.value End if .2 Obtener el valor de un campo Esto se hace a través de la colección Fields. Son expresiones validas las siguientes: Data1.fields(2). De este modo si especificamos dentro del Evento Load del Form la instrucción Data1.MovePrevious If Data1. se ocultara el DataControl.value) Then A$ = “ “ Else A$ = Data1.Recordset.Recordset.Recordset(“Apellido”) Data1. 5.

openrecordset("authors". los apellidos y el departamento de todos los profesores que pertenezcan al departamento 3 ordenados alfabéticamente por el nombre. Para indicar los campos y registros que queramos se utiliza la sentencia SELECT del lenguaje SQL encerrada entre comillas en lugar de introducir únicamente el nombre de una tabla: "SELECT nombre. dbOpenDynaset: Permite que se incluyan varios campos de varias tablas.5. no permitiendo operaciones de modificación ni escritura. apellidos. Es el método más rápido para realizar modificaciones en una única tabla. Por tanto este modo es más rápido que el anterior y lo utilizaremos cuando sólo nos interese realizar una vista o consulta de un conjunto de tablas. El método dbOpenDynaset permite que se realicen operaciones de lectura. Para asignar un conjunto de registros a un recordset utilizábamos la siguiente sentencia: set autores = mibase. Para asignar el conjunto de registros al recordset utilizaremos también una sentencia SELECT. modificación y escritura sobre los registros. con la diferencia de que la única operación permitida sobre sus registros es la de lectura. dbOpenSnapShot: Este modo de abrir recordsets es parecido a dbOpenDynaset. Las demás constantes que podemos introducir son dbOpenDynaset y dbOpenSnapShot y las características de todas ellas son las siguientes: dbOpenTable: Sólo permite que se asigne a un recordset el contenido completo de una tabla con todos sus campos y registros. Podemos realizar operaciones de lectura. dbOpenTable) En este caso hemos utilizado la constante dbOpenTable.3 Tipos de Recordset Recordemos que un recordset es un conjunto de registros que asignamos a una variable para poder tratarlos y hacer operaciones con los registros que la componen. departamento FROM profesores. también permite que se asignen los registros que cumplan ciertas condiciones y no necesariamente todos los que componen las tablas como ocurría con el método anterior. con lo que le estamos diciendo que asigne al recordset autores todos los campos de la tabla authors. . departamentos WHERE codprof=coddep AND coddep=3 ORDER BY nombre" Esta sentencia SELECT obtiene el nombre. modificación y escritura aunque es más lento que el modo dbOpenTable. que deberá ser una tabla incluida en la base de datos mibase.

Recordset de tipo Dynamic: un conjunto de resultado de una consulta de una o más tablas base en las que puede agregar. Sólo puede avanzar en los registros. Comentarios Utilice los objetos Recordset para manipular datos en una base de datos al nivel de registro. Este tipo corresponde a un cursor de tipo dynamic ODBC (sólo espacios de trabajo ODBCDirect). Además. Recordset de tipo Forward-only: idéntico a un tipo Snapshot excepto que no se proporciona ningún cursor.* Un objeto Recordset representa los registros de una tabla base o los registros que se generan al ejecutar una consulta. Este tipo corresponde a un cursor de tipo static ODBC. cambiar o eliminar registros desde una tabla o tablas subyacentes de una base de datos. Recordset de tipo Snapshot: una copia estática de un conjunto de registros que puede utilizar para encontrar datos o generar informes. DAO intenta un Snapshot. Recordset de tipo Dynaset: el resultado de una consulta cuyos registros pueden actualizarse. interactúa con los datos prácticamente utilizando objetos Recordset. cambiar o eliminar registros desde una única tabla de base de datos (sólo espacios de trabajo Microsoft Jet). . Todos los objetos Recordset se construyen utilizando registros (filas) y campos (columnas). Este tipo corresponde a un cursor de tipo forward-only ODBC. comenzando con Forward-only. Si no está disponible este tipo. también aparecen en el objeto Recordset los registros que agregan. DAO intenta crear el tipo de objeto Recordset con la respuesta de consulta más rápida. DAO intenta un Dynaset. Cuando utiliza objetos de acceso de datos. En un espacio de trabajo Microsoft Jet. Un objeto Recordset de tipo Dynaset es un conjunto dinámico de registros que puede utilizarse para añadir. Un objeto Recordset de tipo Dynaset puede contener campos de una o más tablas de una base de datos. Esto mejora el rendimiento en situaciones donde sólo necesita hacer una pasada sencilla en el conjunto de resultado. DAO intenta crear el tipo de objeto Recordset con la mayor funcionalidad disponible. después un Dynaset y por último un objeto Recordset de tipo Dynamic. Existen tres tipos de objetos Recordset: § § Recordset de tipo Table : una representación en código de una tabla base que puede utilizarse para añadir. Si no está disponible este tipo. si no especifica un tipo. cambiar o eliminar registros de una consulta que devuelve filas. si no especifica un tipo. eliminan o modifican otros usuarios en la tablas base. después un Snapshot y por último un objeto Recordset de tipo Forward-only. Este tipo corresponde a un cursor de tipo keyset ODBC. comenzando con tabla. § § § Puede elegir el tipo de objeto Recordset que quiere crear usando el argumento tipo del método OpenRecordset. En un espacio de trabajo ODBCDirect. Un objeto Recordset de tipo Snapshot puede contener campos de una o más tablas de una base de datos pero no se puede actualizar.

debe asegurarse de que la variable que represente la base de datos que contiene el conjunto de registros también sea global o se encuentra en un procedimiento Sub o Function con la palabra clave Static. Nota Si utiliza variables para representar un objeto Recordset y el objeto Database que contiene el conjunto de registros. Si este espacio está agotado. el valor de la propiedad RecordCount será 0 y los valores de la propiedad BOF y EOF serán True. El código puede simplificarse utilizando estos valores predeterminados. se crean objetos Recordset de tipo Table . Cuando abre el objeto se agrega automáticamente un nuevo objeto Recordset a la colección Recordsets y se elimina automáticamente cuando lo cierra. puede buscar registros utilizando el método Seek. Por ejemplo. . Si no se encuentra el registro. también puede utilizar los métodos Find. IMPORTANTE!!! Su aplicación puede crear tantas variables objeto Recordset como se necesiten. si establece una variable global que representa un objeto Recordset. como los nombres y los tipos de datos de cada objeto Field y cualquier objeto Index. Cuando se utilizan los métodos Move para moverse entre los registros (o "andar" a través del objeto Recordset). IMPORTANTE!!! Puede utilizar los métodos MoveNext. Si no hay suficiente espacio en la memoria local para almacenar los datos. Si no hay registros. la propiedad NoMatch se establece a True. La propiedad Type indica el tipo de objeto Recordset creado y la propiedad Updatable indica si puede cambiar los registros del objeto. Cuando se crea un objeto Recordset. el motor de base de datos Microsoft Jet guarda los datos adicionales en el disco TEMP. se almacena en un objeto TableDef. compruebe que las variables tengan el mismo alcance o duración. Para objetos Recordset de tipo Table. La información acerca de la estructura de la tabla base. Los Recordset de tipo Dynaset y Snapshot se almacenan en la memoria local. el registro activo se coloca como primer registro si existen varios registros. puede utilizar las propiedades BOF y EOF para comprobar el inicio o el fin del objeto Recordset. MoveFirst y MoveLast para volver a establecer el registro activo. Los objetos Recordset de tipo Forward-only sólo admiten el método MoveNext. Con los objetos Recordset de tipo Dynaset y Snapshot en un espacio de trabajo Microsoft Jet. se producirá un error.Cuando se crea un objeto Recordset utilizando un objeto TableDef no adjunto. MovePrevious. Sólo pueden crearse Recordset de tipo Dynaset o Snapshot con tablas adjuntas o tablas de bases de datos externas ODBC. como FindFirst. para localizar un registro específico basado en un criterio. IMPORTANTE!!! La colección predeterminada de un objeto Recordset es la colección Fields y la propiedad predeterminada de un objeto Field es la propiedad Value. Un objeto Recordset puede hacer referencia a una o más tablas o consultas y los campos sin conflictos.

Sub RecordsetX() Dim dbsNeptuno As Database Dim rstTable As Recordset Dim rstDynaset As Recordset Dim rstSnapshot As Recordset Dim rstForwardOnly As Recordset Dim rstBucle As Recordset Dim prpBucle As Property Set dbsNeptuno = OpenDatabase("Neptuno. Debe asignar objetos Recordset a variables de objeto y hacer referencia a ellos por el nombre de variable.OpenRecordset _ ("Empleados". enumerando la colección Recordsets de la Database actual y enumerando la colección Properties de cada Recordset. _ dbOpenTable) Set rstDynaset = .OpenRecordset("Categorías".OpenRecordset("Empleados".Para hacer referencia a un objeto Recordset en una colección por su número de orden o por el valor de la propiedad Name. _ dbOpenDynaset) Set rstSnapshot = . For Each rstBucle In . _ dbOpenSnapshot) Set rstForwardOnly = .Print "Recordsets en la colección " & _ " Recordsets de dbsNeptuno" ' Enumera la colección Recordsets. EJEMPLO DE USO DEL RECORDSET Este ejemplo demuestra los objetos Recordset y la colección Recordsets abriendo cuatro tipos diferentes de Recordsets.mdb") With dbsNeptuno ' Abre cada tipo de objeto Recordset.Recordsets With rstBucle .OpenRecordset("Compañías de envíos". utilice cualquiera de los formatos de sintaxis siguientes: Recordsets(0) Recordsets("nombre") Recordsets![nombre] Nota Puede abrir un objeto Recordset del mismo origen de datos o base de datos más de una vez creando nombres duplicados en la colección Recordsets. Set rstTable = . dbOpenForwardOnly) Debug.

Debug.Print _ " " & prpBucle. o en un registro.Name & _ " = " & prpBucle On Error GoTo 0 Next prpBucle End With Next rstBucle rstTable. métodos y propiedades: Leyenda: § Fields (predeterminada) Una colección Fields contiene todos los objetos Field almacenados de un objeto Index. Recordset.Close . QueryDef. Relation y TableDef contienen las especificaciones de los campos a los que representan estos objetos.Close rstSnapshot. For Each prpBucle In . Relation o TableDef. Bloquea cualquier ' propiedad cuyo valor no es válido ' en este contexto.Close rstForwardOnly. .Name ' Enumera la colección Properties de cada ' objeto Recordset.Print " " & . QueryDef.Close End With End Sub Recordset (Objeto) Recordset (Objeto) El objeto Recordset contiene los siguientes colecciones. Los objetos Field de un objeto Recordset se utilizan para leer y establecer valores para los campos del registro activo del objeto Recordset.Properties On Error Resume Next If prpBucle <> "" Then Debug. La colección Fields de un objeto Recordset representa los objetos Field en una fila de datos.Close rstDynaset. Comentarios Las colecciones Fields de objetos Index.

es necesario definir previamente sus características con el método CreateProperty y a continuación añadirla a la colección con el método Append. utilice los formatos de sintaxis siguientes: Fields(0) Fields("nombre") Fields![nombre] Con los mismos formatos de sintaxis.Para hacer referencia a un objeto Field en una colección por su número de orden o por su valor de propiedad Name. Nota Una propiedad definida por el usuario (objeto Property) sólo está asociada a la instancia específica del objeto. Comentarios Todos los objetos de acceso de datos contienen una colección Properties. pero no puede eliminar las propiedades incorporadas. Se puede utilizar la colección Properties de un objeto para enumerar las propiedades incorporadas y definidas por el usuario del objeto. No es necesario que conozca de antemano exactamente qué propiedades existen o cuáles son sus características (propiedades Name y Type) para manipularlas. Para añadir una propiedad definida por el usuario a una instancia existente de un objeto. Además de las propiedades incorporadas. Estos objetos Property (que a veces se denominan propiedades) caracterizan de forma exclusiva a esa instancia del objeto. como agregar un objeto Property definido por el usuario a una colección Properties que contiene un objeto Property con el mismo nombre. también puede hacer referencia a la propiedad Value de un objeto Field que crea y agrega a una colección Fields. Hacer referencia a un objeto Property definido por el usuario que no se ha agregado a la colección Properties producirá un error. se produce un error. que tiene algunos objetos Property. como el valor de la propiedad Value de un objeto Field en la colección Fields de un objeto TableDef. Puede utilizar el método Delete para eliminar propiedades definidas por el usuario de la colección Properties. algunos objetos permiten crear y añadir propiedades definidas por el usuario. Sin embargo. utilice cualquiera de los formatos de sintaxis siguientes: . si intenta leer una propiedad de sólo escritura. El contexto de la referencia de campo determinará si hace referencia a un objeto Field o a la propiedad Value del objeto Field. Para hacer referencia a un objeto Property incorporado en una colección por su número de orden o por el valor de la propiedad Name. La propiedad no se define para todas las instancias de objetos del tipo seleccionado. § Properties Una colección Properties contiene todos los objetos Property de una instancia determinada de un objeto. como la propiedad Password de un objeto Workspace) o intenta leer o escribir una propiedad en un contexto adecuado.

Properties(0) objeto. Con los mismos formatos de sintaxis. El contexto de la referencia determinará si hace referencia al objeto Property por si mismo o a la propiedad Value del objeto Property. Nota Cuando utilice AddNew en un espacio de trabajo Microsoft Jet y el motor de base de datos tenga que crear una nueva página para almacenar el registro activo. el nuevo registro y los cambios realizados se descartarán sin previo aviso. el bloqueo de páginas será pesimista.AddNew El marcador de posición del recordset es una variable de objeto que representa un objeto Recordset que se puede actualizar al que puede agregar un registro nuevo. también puede hacer referencia a la propiedad Value de un objeto Property.Properties("nombre") objeto. Este método establece los campos a los valores predeterminados y si no se especifican valores predeterminados.Properties![nombre] Para una propiedad incorporada. si cierra el Recordset o finaliza el procedimiento que declara el Recordset o su objeto Database. Si no se ha desplazado hasta el último registro de su Recordset. establece los campos a Null (los valores predeterminados especificados pare el Recordset tipo Table). RECORDSET (MÉTODOS) Crea un nuevo registro para un objeto Recordset de tipo Table o Dynaset. Además. los registros agregados a las tablas subyacentes pueden incluirse. los cambios se perderán sin previo aviso. Si el nuevo registro cabe en una página existente.Properties("nombre") completa. también puede utilizar esta sintaxis: objeto. Sintaxis recordset.objeto. No se producirán cambios en la base de datos hasta que no se utilice el método Update. Comentarios Utilice el método AddNew para crear y agregar un nuevo registro en el objeto Recordset llamado por el recordset. Después de modificar el nuevo registro. debe utilizar la sintaxis objeto .nombre Nota Para una propiedad definido por el usuario. utilice el método Update para guardar los cambios y agregar el registro al Recordset. Precaución Si ejecuta un AddNew y a continuación realiza una operación que desplace otro registro sin usar Update. si se colocan más allá del registro . el bloqueo de páginas será optimista.

El registro que estaba activo antes de utilizar AddNew permanece activo. Si no se ha establecido la propiedad Index. Nota Para agregar. Delete o Edit que se llama en un espacio de trabajo Microsoft Jet o se producirá un error "Argumento no válido " en el método Update que se llama en un espacio de trabajo ODBCDirect. strNombre = Trim(InputBox( _ "Introduzca el nombre:")) strApellidos = Trim(InputBox( _ "Introduzca los apellidos:")) ' Sólo se ejecuta si el usuario escribe algo ' en los dos campos. si agrega un registro a un Recordset. los registros se insertan al final del conjunto del Recordset. debe haber sólo un índice único en el registro en el origen de datos base. los registros se insertan en el lugar adecuado dentro del orden definido. Sin embargo. Ejemplo de ADDNEW Este ejemplo utiliza el método AddNew para crear un registro nuevo con el nombre especificado. La posición del nuevo registro depende del tipo de Recordset: · En un objeto Recordset tipo Dynaset. · En un objeto Recordset tipo Table en el que su propiedad Index se haya establecido. el registro será visible en el Recordset y se incluirá en la tabla subyacente donde estará visible para todos los nuevos objetos Recordset. los nuevos registros se insertarán al final del Recordset. independientemente de las reglas de clasificación u orden que estuvieran en vigor cuando se abrió el Recordset. se producirá un error "Permiso denegado " en el método AddNew. If strNombre <> "" and strApellidos <> "" Then . puede establecer la propiedad Bookmark con marcador identificado por el valor de la propiedad LastModified. Sub AddNewX() Dim dbsNeptuno As Database Dim rstEmpleados As Recordset Dim strNombre As String Dim strApellidos As String Set dbsNeptuno = OpenDatabase("Neptuno.mdb") Set rstEmpleados = _ dbsNeptuno.activo. Si no.OpenRecordset("Empleados". dbOpenDynaset) ' Obtiene datos del usuario. Se necesita la función AgregarNombre para ejecutar este procedimiento. Si desea convertir el nuevo registro en el registro activo. modificar o eliminar un registro.

With rstTemp .AddNew !Nombre = strNomrbe !Apellidos = strApellidos . · Colecciones: elimina un objeto persistente almacenado de una colección.Bookmark = . .Delete End With Else Debug. AgregarNombre rstEmpleados.Delete nombreobjeto La sintaxis del método Delete utiliza los siguientes argumentos. por tanto. _ strNomrbe As String.' Llama a la función que agrega el registro. With rstEmpleados Debug. Sintaxis recordset.Delete colección. .Close End Sub Function AgregarNombre(rstTemp As Recordset.Update . el tipo de controlador determina si los objetos Recordset se pueden actualizar y. strApellidos As String) ' Agrega un registro nuevo al Recordset utilizando ' datos transferidos del procedimiento que llama. ' El registro nuevo pasa a ser el registro actual.Print "Registro nuevo: " & !Nombre & _ " " & !Apellidos ' Elimina el registro nuevo porque esto es un ejemplo. admiten el método Delete.Close dbsNeptuno. strApellidos ' Muestra los datos agregados más recientemente.Print _ "¡Debe escribir una cadena para el nombre y los apellidos!" End If rstEmpleados. strNombre.LastModified End With End Function Delete · Objetos Recordset: elimina el registro activo de un objeto Recordset de tipo Dynaset o Table. Para espacios de trabajo ODBCDirect.

EJEMPLO DE DELETE ste ejemplo utiliza el método Delete para quitar un registro especificado de un objeto Recordset . Delete elimina el registro activo y lo hace inaccesible. como una tabla almacenada de una base de datos. se producirá un error "Permiso denegado" en la llamada al método AddNew. Delete o Edit en un espacio de trabajo Microsoft Jet. un campo almacenado de una tabla y un índice de una tabla. se eliminará la definición de la tabla y los datos de la misma. debe tener un índice único en el registro en el origen de datos de base. Las referencias subsiguientes a un registro eliminado en un Recordset no son válidas y producen un error. en caso contrario se produce un error en tiempo de ejecución. o se producirá un error "Argumento no válido" el la llamada al método Update en un espacio de trabajo ODBCDirect. Si no es así. Colecciones Puede utilizar el método Delete para eliminar un objeto persistente. La eliminación de objetos almacenados ocurre inmediatamente. Comentarios Puede utilizar el método Delete para eliminar un registro activo de un objeto Recordset o un miembro de una colección. Si la tabla base es la tabla principal en una relación de eliminación de cascada. Aunque no pueda modificarlo o utilizarlo. Puede recuperar un registro utilizando transacciones y el método Rollback. los objetos abiertos o activos se eliminarán cerrando ese objeto mediante el método Close. que contiene el registro que desea eliminar.Argumentos Descripción recordset Una variable de objeto que identifica un objeto Recordset de tipo Dynaset o Table abierto. Recordsets o Workspaces (cada una de las cuales se almacena sólo en memoria). Sin embargo. Cuando elimine un objeto TableDef de una colección TableDefs. pero debe utilizar el método Refresh en cualquier otra colección que se pueda ver afectada por cambios en la estructura de la base de datos. una vez que se desplace a otro registro no podrá volver a convertir en activo el registro eliminado. Sin embargo. nombreobjeto Un tipo de datos String que es el valor de la propiedad Name de un objeto existente en una colección. modificar o eliminar un registro. En objetos Recordset. Recordsets Un objeto Recordset debe contener un registro activo antes de que utilice el método Delete. si la colección es una colección Databases. el registro eliminado permanecerá activo. colección Una variable de objeto que representa una colección de la que se elimina nombreobjeto. al eliminar el registro activo también se eliminarán uno o más registros de una tabla externa. Nota Para agregar.

lngID rstEmpleados. lngSeek If .LastModified lngID = !IdEmpleado End With ' Elimina el registro de empleado con el Número de ' Id especificado. With rstEmpleados .mdb") Set rstEmpleados = _ dbsNeptuno.Bookmark = . _ lngSeek As Long) With rstTemp .. EliminarRegistro rstEmpleados.AddNew !Nombre = "Daniel" !Apellidos = "López Duque" .NoMatch Then MsgBox "¡No existe el empleado #" & lngSeek & "en el archivo!" Else .Delete MsgBox "¡Registro del empleado #" & lngSeek & _ "eliminado!" End If End With End Sub Update .OpenRecordset("Empleados") ' Agrega un registro temporal que se va a eliminar.Close End Sub Sub EliminarRegistro(rstTemp As Recordset. Se necesita el procedimiento EliminarRegistro para ejecutar este procedimiento Sub DeleteX() Dim dbsNeptuno As Database Dim rstEmpleados As Recordset Dim lngID As Long Set dbsNeptuno = OpenDatabase("Neptuno.Seek "=".Close dbsNeptuno.Update .Index = "ClavePrincipal" .

Precaución Los cambios realizados en el registro activo se perderán si: · Utiliza el método Edit o AddNew y a continuación. Si es False (predeterminado). · Establece la propiedad Bookmark para otro registro. a continuación. dbUpdateBatch Todos se graban en disco los cambios pendientes en la memoria caché de actualización. Constante Descripción dbUpdateRegular Predeterminado. Si es True.Update (tipo. . tipo Opcional. Comentarios Utilice Update para guardar el registro activo y los cambios que haya efectuado en él. respectivamente (sólo espacios de trabajo ODBCDirect). dbUpdateCurrentRecord Sólo se graban en disco los cambios pendientes del registro activo. Puede utilizar los valores no predeterminados sólo cuando está activada la actualización por lotes. vuelve a usar Edit o AddNew sin utilizar previamente Update. Los cambios pendientes no pasan a la memoria caché y se graban en el disco inmediatamente. como se especifica en Valores (sólo espacios de trabajo ODBCDirect). · Utiliza Edit o AddNew y. los cambios hechos por otros usuarios mientras la actualización está pendiente provocarán que falle la actualización para aquellos cambios conflictivos. Una constante que indica el tipo de actualización. obligar ) La sintaxis del método Update tiene las siguientes partes. obligar Opcional. Sintaxis recordset. pero las propiedades BatchCollisionCount y BatchCollisions indicarán el número de conflictos y las filas afectadas por los mismos. Valores Puede utilizar los siguientes valores en el argumento tipo.Guarda el contenido del búfer de copia en un objeto Recordset de tipo Dynaset o Table especificado. Parte Descripción recordset Una variable de objeto que representa un objeto Recordset abierto que se puede actualizar. Delete o Edit. pasa a otro registro sin actualizarlo previamente mediante Update. sin tener en cuenta si los datos base se han cambiado por otro usuario desde la llamada al método AddNew. los cambios se fuerzan y los cambios hechos por otros usuarios se sobrescriben. No se produce ningún error. Un valor de tipo Boolean que indica si se pueden o no obligar los cambios en la base de datos.

el registro permanecerá bloqueado desde el momento en que se utiliza Edit hasta que se ejecuta el método Update o se cancele la edición.· Cierra el conjunto de registros a los que hace referencia recordset sin utilizar primero Update. puede realizar actualizaciones por lotes. cuando el objeto Recordset de la propiedad LockEdits establecida como True (bloqueo pesimista) en un entorno multiusuario. Delete o Edit en un espacio de trabajo Microsoft Jet. tal como lo cambió el otro usuario. Si la configuración de la propiedad LockEdits es False (bloqueo optimista). Si ha cambiado el registro desde que utilizó el método Edit. actualice el registro activo usando los métodos Move 0. proporcionadas por la biblioteca de cursores compatible con actualizaciones por lotes y si el objeto Recordset se abrió con la opción de bloqueo optimista. Para que la operación Update continúe con los cambios. strAntiguoNombre = !Nombre . Nota Para agregar. Se obtiene no lo hay. el registro se bloquea y se compara con el registro previamente modificado justo antes de se actualizado en la base de datos. EJEMPLO DEL METODO EDIT Y EL UPDATE Este ejemplo demuestra el método Update en unión con el método Edit.mdb") Set rstEmpleados = _ dbsNeptuno. El bloqueo optimista se utiliza siempre en Microsoft Jet conectado a ODBC y ISAM instalable. utilice el método Edit para copiar el contenido del registro activo al búfer de copia. Para volver al registro. En un espacio de trabajo ODBCDirect. modificar o eliminar un registro. Si no utiliza Edit en primer lugar.Edit ' Almacena los datos originales. · Cancela la operación Edit utilizando el método CancelUpdate. se producirá un error "Permiso denegado" en la llamada al método AddNew.OpenRecordset("Empleados") With rstEmpleados . Sub UpdateX() Dim dbsNeptuno As Database Dim rstEmpleados As Recordset Dim strAntiguoNombre As String Dim strAntiguosApellidos As String Dim strMensaje As String Set dbsNeptuno = OpenDatabase("Neptuno. se producirá un error "Argumento no válido" en la llamada al método Update en un espacio de trabajo ODBCDirect. se producirá un error cuando utilice Update o intente cambiar el valor de un campo. Para modificar un registro. En un espacio de trabajo Microsoft Jet. utilice de nuevo el método Update. debe haber un índice único en el registro del origen de datos base. la operación Update falla.

Update Else .strAntiguosApellidos = !Apellidos ' Cambia los datos en el búfer de modificación. vamos a ver ahora como trabajar con bases de datos sin la ayuda de controles especializados. vbYesNo) = vbYes Then . If Not (strAntiguoNombre = !Nombre And _ strAntiguosApellidos = !Apellidos) Then .Update End If .4 VISUALIZAR DATOS DE UNA TABLA MEDIANTE CODIGO Como contrapartida a obtener datos sin una sola línea de código. .Close End With dbsNeptuno. 5.Close End Sub Este ejemplo demuestra el método Update en unión con el método AddNew. strMensaje = "Modificación en progreso:" & vbCr & _ " Datos originales = " & strAntiguoNombre & " " & _ strAntiguosApellidos & vbCr & " Datos en el búfer = " & _ !Nombre & " " & !Apellidos & vbCr & vbCr & _ "¿Utilizar Update para reemplazar los datos originales con " & _ "los datos del búfer en el Recordset?" If MsgBox(strMensaje. !Nombre = "María" !Apellidos = "Álvarez" ' Muestra el contenido del búfer y obtiene una entrada del usuario. es decir.CancelUpdate End If ' Muestra los datos resultantes.Edit !Nombre = strAntiguoNombre !Apellidos = strAntiguosApellidos . mediante código únicamente. MsgBox "Datos en el Recordset = " & !Nombre & " " & _ !Apellidos ' Restaura los datos originales porque esto es un ejemplo.

cuando almacene la aplicación debe hacerlo en el directorio que ofrece Visual Basic por defecto ya que es el mismo del archivo Biblio. Vamos a visualizar el contenido también de la tabla autores de la base Biblio. ¿Para qué voy a hacer las cosas sin ayudarme de ellos? Pues se puede decir que mediante el código podemos manejar la información con una mayor flexibilidad.(En este Caso. dbOpenTable) Este tipo de variables se inicializan con Set puesto que realmente se trata de objetos que disponen de sus propiedades y sus métodos. Los pasos a seguir son los siguientes: Creamos un formulario. Si tengo unos controles que me lo hacen todo. dbOpenTable es una constante que indica que los registros son de una única tabla .path le estamos diciendo que la busque en el mismo directorio donde se encuentra la aplicación.openrecordset("authors".Opendatabase(App. situándonos en la sección Form y el evento Load ya que vamos a hacer que aparezcan los resultados nada más cargar la aplicación.mdb y al poner App. Al objeto mibase se le asigna la base de datos Biblio. que es un nombre de tabla que debe estar en la base de datos mibase. Definimos las variables: Dim mibase as Database Dim autores as Recordset La primera línea declara una variable que contendrá la base de datos completa y la variable autores contendrá la tabla que vayamos a mostrar. aunque el tipo de datos recordset puede contener también campos de diversas tablas y no sólo de una como ya veremos.mdb") set autores=mibase. Respecto al objeto autores le estamos asignando los registros de la tabla Authors. en otros usted puede definir la ruta) Al colocar Workspaces(0) le decimos que trabajamos en el área de trabajo por defecto y con el método Opendatabase abrimos una base de datos existente. podemos superar los límites que siempre tienen los controles y personalizar mejor nuestras aplicaciones.Y qué sentido puede tener el complicarnos la vida de esta manera.path & "\biblio. Aunque siempre es recomendable llegar a un compromiso entre el uso del código y de los controles de bases de datos. también podíamos haber utilizado otros métodos como CreateDataBase con lo que habríamos creado una base de datos con un determinado nombre. Asignamos valores a las variables: set mibase=Workspaces(0).mdb mediante código aunque ayudándonos del control ListBox para visualizar los registros.mdb.

text=autores(" year born") Lo que necesitamos para presentar todos los registros de autores es un bucle que nos recorra el recordset y por cada iteración añadiremos al control ListBox los campos que nos interese. como sabemos los registros que tiene el recordset?.movefirst nos sitúa en el primer registro del recordset. El listado de la rutina que va añadiendo los registros a un listbox es la siguiente (acuérdese de incluir en el formulario un control ListBox que no lo he dicho antes): Se ha declarado la variable cadena para contener los 3 campos que aparecerán en el listbox utilizando el método AddItem. La sentencia autores. eliminando todos los posibles errores que puedan aparecer. una tabulación .determinada. es decir. Si queremos asignar a un textbox el contenido de un campo del recordset haremos lo siguiente: text1.movenext cuando ya no hay más registros causaremos un error en tiempo de ejecución. ¿Y cómo sabemos las veces que debemos recorrer el bucle. Cuando llegamos al final de la tabla autores. ya que si nos colocamos en el primer registro con movefirst sin que haya ningún registro provocaremos un error en tiempo de ejecución. aunque ya los veremos en profundidad posteriormente. cada campo aparece a la misma distancia por que hemos separado cada campo mediante chr(9). las otras opciones son dbOpenDynaset y dbOpenSnapShot que nos permiten abrir campos de varias tablas para modificarlos o sólo para lectura repectivamente.text=autores!author Si el nombre del campo es compuesto utilizaremos text1. Debemos tratar de realizar nuestros programas de una forma robusta. Si comprobamos esta propiedad y hacemos autores. Lo que haremos por ahora es comprobar si hemos llegado al final del recordset mediante la propiedad EOF (End Of File). En el bucle While nos vamos situando cada vez en el registro posterior y añadiéndolo a la lista.EOF saldremos del bucle. También se ha utilizado la propiedad no vista hasta ahora Recordcount que nos sirve para comprobar que el recordset autores tiene al menos un registro. su funcionamiento es similar al de los ficheros de texto. Este sería el resultado final.

Delete Data1.setfocus ‘ Posicionarse en el primer campo dentro de un text End sub Sub Grabar_click () Data1. En otras bases de datos anteriores al concepto relacional.Update ‘ Grabar el dato End sub 5.Recordset.MoveNext If Data1.8 BOOKMARKS En bases relacionales no existe el concepto de numero de registros.Movefirst End if End sub 5.addnew ‘ Crear un espacio en blanco Text1. existían variables como RECNO que permitían volver a posicionarse en un registro dado. Para emular ese comportamiento desde VB se dispone de Bookmarks.Recordset.Recordset. Sub Borrar_Click () On Error Resume Next Data1.Recordset.5. Los Bookmarks son útiles en casos tales como el que se describe a continuación: .6 BORRAR UN REGISTRO O FILA Esta forma utiliza el metodo Delete con la seguridad de que no se llegara al final del archivo.5 MODIFICAR UN REGISTRO O FILA DE LA TABLA sub Actualizar_click () Data1.EOF Then Data1.recordset.recordset.7 AÑADIR UN NUEVO REGISTRO Para añadir un nuevo registro se debe coordinar dos acciones: ADDNEW y UPDATE. El método AddNew realiza los mismo que en Fox pro hace APPEND BLANK Sub Nuevo_click () Data1.Recordset.Update End sub 5.

Bookmark Fuente = Inputbox(“Apellido de Busqueda?”. Esto se consigue guardando dentro de un Bookmark la posición del registro antes de lanzar el FindFirst: Sub Buscar_Click () Dim comillas as String Dim fuente as string Dim criterio as String Dim marca as String Comillas = Chr$(34) Marca = Data1. Que sucede si el usuario intenta colocar un contenido alfanumérico en el campo numérico.Bookmark = marca End if End sub 5. C.Nomatch Then MsgBox(“No se encontro el registro”) Data1.Se necesita realizar una búsqueda mediante FindFirst y no encontramos el registro que cumpla con el criterio de búsqueda. Seria bueno que al finalizar la búsqueda se posicionara en el registro del cual se partió antes de lanzar la búsqueda. Tomemos con ejemplo la base de datos Biblio.Findfirst criterio If Data1.J En esta ”Forma”(Imaginemos que es una forma) Existen dos tipos de campos. REPOSITION Y ERROR Los eventos Validate y Reposition propios del DataControl sirven para manejar los problemas más típicos de interacción con el usuario para la entrada de datos y para su modificación. uno de tipo numérico y otro alfanumérico.recordset.9 EVENTOS VALIDATE.recordset.recordset. Bueno pasaría lo siguiente: . “Busqueda:”) If fuente = “ “ Then exit sub Criterio = “Apellido = “ & comillas & fuente & & comillas Data1.Recordset.Mdb Numero de Autor 9 Nombre Data.

save as Integer) If IsNumeric(Text1.Text) = 0 Then K% = MsgBox(“El del Campo debe ser Numerico”.text) if v > 1000 or v .”Error”) save = False end if end sub Mediante el parametro Save indicaremos si el registro debe grabarse o no.Type Mismatch Lo que ha sucedido es que antes de grabar VB ha verificado el tipo de los campos de debe grabar para ver si corresponde con la información introducida por el usuario. Supongamos que se va a introducir un nuevo registro: Sub command1_click () Data1.Addnew End sub Para evitar el tipo de mensaje anterior utilizaremos el evento Validate del DataControl: Sub Data1_Validate (Action As integer.Recordset.Text) = 0 Then K% = MsgBox(“El del Campo debe ser Numerico”. _ 16. 1 Then mensaje$ =”El numero debe estar entre 1 y 1000” k% = MsgBox(mensaje$. save as Integer) If IsNumeric(Text1.”Error”) save = False exit sub end if v = val(text1. Por tal razón es necesario controlar este tipo de mensajes.”Error:”) save = False end if end sub . Ademas se le puede restringir los numero en un rango determinado(1 a 1000 en este caso): Sub Data1_Validate (Action As integer. Se explicara esto con un ejemplo. 16. _ 16.

_ 16. ante cualquier acción evasiva por parte del usuario.El valor de la variable Action es el que identifica cual ha sido la Accion del usuario que ha causado el disparo del evento Validate.”Error:”) save = False end if ----------------------------------------------------------------------------------------Especificacion CUA ----------------------------------------------------------------------------------------If save = True Then ‘ No vamos a sacar el mensaje al añadir registro if acction <> 5 then ‘ No es Addnew mensaje$ =”Los datos han sido modificados” + chr(13) .Text) = 0 Then K% = MsgBox(“El del Campo debe ser Numerico”. save as Integer) If IsNumeric(Text1.”Error”) save = False exit sub end if v = val(text1. 1 Then mensaje$ =”El numero debe estar entre 1 y 1000” k% = MsgBox(mensaje$.text) if v > 1000 or v . 16. Para tal razón se modificara la rutina anterior para agregarle lo que se acaba de discutir: Sub Data1_Validate (Action As integer. Según el valor de Validate podemos tener los siguientes motivos de disparó: Valor 0 1 2 3 4 5 6 7 8 9 10 Accion tomada por el usuario Puesta a cero para cancelar la accion Posicionarse al inicio de la tabla Posicionarse en el registro anterior Posicionarse en el registro siguiente Posicionarse en el ultimo registro Añadir un nuevo registro Modificar un registro Existente(Actualizar) Borrar un registro Existente Buscar un Registro Bookmark Cerrar la tabla Otra posibilidad del evento Validate es la verificación de que los datos modificados han sido grabados. deberá preguntar si los datos modificados debe guardarse o descartarse. El conjunto de normas CUA(Commont User Acces) alas cuales se adhiere Windows(y las aplicaciones para Windows que se precien) especifican que las aplicaciones deben evitar la perdida accidental de datos. y una vez detectada la modificación de los datos.

En evento Error atrapa los errores de este estilo que puede producirse con el Datacontrol. en muchos lenguajes de programación se utilizan algoritmos de búsqueda previa para evitar el choque de dos claves principales idénticas. 4. Por ejemplo el tema de las claves duplicadas puede generar errores si el usuario intenta dar de alta una clave que ya existe. no ocurre si lo que realizamos es un Data1Updaterecord 5.16. El siguiente ejemplo se emplea para las claves duplicadas: Sub Data1_Error(DataErr as integer.updatecontrols End if End if End if end sub El evento Validate se produce si desde el programa realizamos un Data1.Update. response as integer) Const NOACTUALIZA =3164 Const CLAVEDUPLI =3022 Const QUITARMENSAJEVB = 0 Select Case DataErr Case NOACTUALIZA Mensaje$ = “No se puede actualizar el registro” Case CLAVEDUPLI Mensaje$ = “La clave ya existe” Case Else Mensaje$ = “Se ha producido un error” End select K% = Msgbox(mensaje$.Updatecontrols End sub DataErr: Proporciona el numero del error que se ha producido.mensaje$ = mensaje$ + “Desea Grabarlos?” k% = MsgBox(mensaje. . “Error:”) Response = QUITARMENSAJEVB Data1.9. En VB podemos utilizar un manejador de errores a posterioris. Tradicionalmente.”Atencion:” if k% = 7 Then ‘Si es que no save = false Data1.1 El evento Error Aunque controlemos muy bien el tipo de datos que vamos a grabar en la base de datos es muy posible que topemos con problemas debido a las normas de diseño de la base de datos.Recordset. en cambio.

Junto a el se coloca otro boton para borrar registros.Puede informar de cuando se produce un cambio de registro. en el preciso momento en que seleccionamos un registro diferente.MoveNext If Data1.9.EOF Then Data1.visible = True Botonborrar. Si le suministramos 1. Al realizar una operación de lectura.Response: Sirve para especificar que tipo de reacción queremos en nuestro programa.3 El evento Reposition En este evento se produce justo en la accion y el momento contrario. Supongamos que los autores cuyo numero es inferior a 10 no tienen libros a la venta por lo que no vale la pena ponerlo en pantalla: Sub Data1_Reposition () If Data1. bastara con coloar el siguiente codigo dentro del evento de Reposition de neusto DataControl: Sub Data1_Reposition () Botonborrar. Si le suministramos un cero no se mostrara el mensaje de error. con lo que se puede inicializar de nuevo nuestro control y menus de aplicación. 5. aunque se atrape el error. Este evento se genera cada vez que se reposiciona el puntero de lectura de la tabla en un registro diferente.Recordset.Recordset.Enable = True End sub Existe otra situacion mas en la que los eventos Reposition y Error pueden resultarnos utilies. Al dar de alta un registro deberemos volver a activar el estado del boton para permitir que el usuario tome la decision de borrar el nuevo registro que tiene ante si. los datos del registro se leen del disco y antes de que pase a los controles se dispara el evento Reposition. 2.Recordset.Fields(“ID_AUTOR”) .Recordset.MoveFirst End if End if End sub Otro caso en que son utiles estos eventos esta detallado en el siguiente ejemplo: Imaginemos que tenemos un boton de dar de alta registros en nuestra aplicación. Este evento puede servir para dos cosas: 1.Puede ayudar para ocultar datos antes de que aparezcan en los controles.value < 10 Then Data1. el mensaje de error se mostrara tras la rutina de mensaje de error. Cuando un DataControl esta vinculado a un TextBox y la tabla ete . Para volver a validar el boton de borrar.mdb y en ella la tabla autores. Veamos esto tomando como ejemplo la base de datos Biblio.

ponga la propiedad Enable de la caja de edicion de texto en False al principio del programa. Al cambiar de registro. . Por ejemplo. El momento ideal para ejecutar el Addnew es antes de permitir al usuario que haga cic sobre el Datacontrol o que entre texto en un TextBox vinculado con dicho Datacontrol. Tras ello.vacia al hacer clic sobre cualquier de las flechas de movimiento del DataControl obtenemos el siguiente error: No Current Record Este error puede darse tambien cunado se introduce texto en un Textbox y se ejecuta Addnew o edit con la tabla vacia. El error radica en que el Recordset subyacente no contiene ningun registro. detectando dicho cambio con el evento Reposition. la actualizacion automatica. ya puede volver a vaildar los controles y los botones necesarios par el normal funcionamiento de la aplicación.tal como la realiza el Datacontrol. Por otro lado.resulta de gran interes. Cuando la tabla no esta vacia. el error resulta imposible de atrapar con la sentencia ON ERROR al producirse repetitivamente el mismo error. El programa no sabe que la tabla esta vaica hasta que se produce la actualizacion automatica. Este comportamiento viene determinado por el diseño del propio Datacontrol. pero cuando esta vacia cuasa un erro de No Current Record. oblique a que el usuario pulse un boton del Form que ejecute el metodo Addnew antes de validar el DataControl y sus cajas de edicion de texto correspondiente. Debe ejecutarse Addnew para crear un registro en curso antes de cualquier otra accion que pueda provocar una actualizacion automatica. Dicha actualizacion automatica se produce cuando se hace clic en la flecha cdle control o cuando se introduce texto y se fuerza un Addnew o un edit.

Sign up to vote on this title
UsefulNot useful