Visual Basic - Guía del Estudiante Cap.

1
INTRODUCCION Antecedentes históricos. El lenguaje de programación BASIC (Beginner's All purpose Symbolic Instruction Code ) nació en el año 1964 como una herramienta destinado a principiantes, buscando una forma sencilla de realizar programas, empleando un lenguaje casi igual al usado en la vida ordinaria ( en inglés), y con instrucciones muy sencillas y escasas. Teniendo en cuenta el año de su nacimiento, este lenguaje cubría casi todas las necesidades para la ejecución de programas. Téngase en cuenta que las máquinas existentes en aquella época estaban estrenando los transistores como elementos de conmutación, los ciclos de trabajo llegaban a la impensable cifra de 10.000 por segundo y la memoria no pasaba de unos pocos k´s en toroides de ferrita. Los autores fueron los científicos John G. Kemeny (Budapest, 1926 – USA 1992) y Thomas E. Kurtz (Illinois 1928) Su trabajo original se llamó True BASIC. La evolución del BASIC por los años 70 fue escasa, dado el auge que tomaron en aquella época lenguajes de alto nivel como el FORTRAN y el COBOL. En 1978 se definió una norma para unificar los Basics existentes creándose la normativa BASIC STANDARD Con la aparición de los primeros ordenadores personales, dedicados comercialmente al usuario particular, allá por la primera mitad de los ochenta, el BASIC resurgió como lenguaje de programación pensado para principiantes, y muchos de estos pequeños ordenadores domésticos lo usaban como único sistema operativo (Sinclair, Spectrum, Amstrad) Con la popularización del PC, salieron varias versiones del BASIC que funcionaban en este tipo de ordenadores (Versiones BASICA, GW-BASIC), pero todas estas versiones del BASIC no hicieron otra cosa que terminar de rematar este lenguaje. Los programadores profesionales no llegaron a utilizarlo, habida cuenta de las desventajas de este lenguaje respecto a otras herramientas (PASCAL, C, CLIPPER). El BASIC con estas versiones para PC llegó incluso a perder crédito entre los profesionales de la informática. Las razones para ello eran obvias: - No era un lenguaje estructurado. - No existían herramientas de compilación fiables. - No disponía de herramientas de intercambio de información. - No tenía librerías. - No se podía acceder al interior de la máquina. - Un largo etcétera de desventajas respecto a otros lenguajes de programación. Tal fue ese abandono por parte de los usuarios, que la aparición del Quick-BASIC de Microsoft, una versión ya potente del BASIC, que corregía casi todos los defectos de las versiones pasó prácticamente inadvertida, a no ser porque las últimas versiones del sistema operativo MSDOS incluían una versión de Quick-BASIC algo recortada (Q-Basic) como un producto mas dentro de la amplia gama de ficheros ejecutables que acompañan al sistema operativo, y aprovecha de él el editor de textos (Cada vez que se llama al EDIT estamos corriendo el editor del Q-Basic). Esta versión del popular BASIC ya es un lenguaje estructurado, lo que permite crear programas modularmente, mediante subrutinas y módulos, capaz de crear programas ya competitivos con otros lenguajes de alto nivel. Sin embargo llegaba tarde, pues los entornos MS-DOS estaban ya superados por el entorno gráfico Windows. Sin embargo algo había en el BASIC que tentaba a superarse: su gran sencillez de manejo. Si a esto se le añade el entorno gráfico Windows, el aprovechamiento al máximo de las
LSB Visual Basic - Guía del Estudiante Capítulo 1 Página 1

posibilidades de Windows en cuanto a intercambio de información, de sus librerías, de sus drivers y controladores, manejo de bases de datos, etc. el producto resultante puede ser algo que satisfaga todas las necesidades de programación en el entorno Windows. La suma de todas estas cosas es VISUAL - BASIC. Esta herramienta conserva del BASIC de los años 80 únicamente su nombre y su sencillez, y tras su lanzamiento al mercado, la aceptación a nivel profesional hizo borrar por fin el "mal nombre" asociado a la palabra BASIC. Actualmente (2001) se está comercializando la versión 6.0 de este producto. Desde su salida al mercado, cada versión supera y mejora la anterior. Dados los buenos resultados a nivel profesional de este producto, y el apoyo prestado por el fabricante para la formación de programadores, Visual-Basic se ha convertido en la primera herramienta de desarrollo de aplicaciones en entorno Windows. Es obligado decir sin embargo, que sigue siendo BASIC. No se pueden comparar sus prestaciones con otros lenguajes cuando deseamos llegar al fondo de la máquina y controlar uno a uno sus registros. No es ese el fin perseguido con VB y si es necesario llegar a esas precisiones será necesario utilizar otro lenguaje que permita bajar el nivel de programación. (Visual-C). o realizar librerías (DLLs) que lo hagan. En la mayor parte de las aplicaciones, las herramientas aportadas por VB son mas que suficiente para lograr un programa fácil de realizar y de altas prestaciones. Características Generales de Visual-Basic Visual-Basic es una herramienta de diseño de aplicaciones para Windows, en la que estas se desarrollan en una gran parte a partir del diseño de una interface gráfica. En una aplicación Visual Basic, el programa está formado por una parte de código puro, y otras partes asociadas a los objetos que forman la interface gráfica. Es por tanto un termino medio entre la programación tradicional, formada por una sucesión lineal de código estructurado, y la programación orientada a objetos. Combina ambas tendencias. Ya que no podemos decir que VB pertenezca por completo a uno de esos dos tipos de programación, debemos inventar una palabra que la defina : PROGRAMACION VISUAL. La creación de un programa bajo Visual Basic lleva los siguientes pasos: Análisis . Es el studio de las necesidades que han dado origen a la creación de ese programa. Es lo que se se llama Análisis de la aplicación. Es la primera fase que debe tener siempre un programa y es tambien la más olvidada entre los programadores noveles. Una aplicación no se inicia con el teclado, sino sobre un papel. - Creación de un interface de usuario. Este interface será la principal vía de comunicación hombre máquina, tanto para salida de datos como para entrada. Será necesario partir de una o varias ventanas - Formularios - a las que le iremos añadiendo los controles necesarios. - Definición de las propiedades de los controles – Se dará la forma, posición, y todas las características necesarias a los controles que hayamos colocado en ese formulario. Estas propiedades determinarán la forma estática de los controles, es decir, como son los controles y para qué sirven. - Generación del código asociado a los eventos que ocurran a estos controles. A la respuesta a estos eventos (click, doble click, una tecla pulsada, etc.) le llamamos Procedimiento, y deberá generarse de acuerdo a las necesidades del programa. - Generación del código del programa. Un programa puede hacerse solamente con la programación de los distintos procedimientos que acompañan a cada objeto. Sin
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 2

embargo, VB ofrece la posibilidad de establecer un código de programa separado de estos eventos. Este código puede introducirse en unos bloques llamados Módulos, en otros bloques llamados Funciones, y otros llamados Procedimientos. Estos Procedimientos no responden a un evento acaecido a un control o formulario, sino que responden a un evento producido durante la ejecución del programa. No es necesario entender de momento lo anterior. Visual Basic introduce un concepto nuevo de programación, y es necesario cambiar hasta el argot del programador. Posiblemente se le habrán acumulado demasiados términos de una sola vez. Es normal. A poco que siga leyendo verá las cosas mas claras cuando se explique una por una.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 3

VARIABLES. DEFINICION Y ENTORNO Basic, desde siempre, al contrario de otros sistemas de programación, no exigió la definición previa de una variable. Una variable, como Vd. seguro que conoce, es un nombre que en el programa le asignamos a un dato. Ese dato podrá cambiar. Piense por ejemplo, en un programa consistente en la toma de datos de los alumnos de un centro escolar. Existirán varias variables para poder introducir los datos de los alumnos. Estas variables pueden tener nombre tales como: Nombre Apellido1 Apellido2 Dirección Teléfono Salario La variable Nombre tomará valores distintos según vayamos introduciendo los datos de los distintos alumnos. Es posible, que a lo largo de la ejecución del programa, esta variable Nombre valga: José Pedro María Luis Espero que su intuición o conocimiento anterior le lleve a conocer el concepto de variable. Mas adelante lo verá mas claro. Decíamos que Basic no exige la definición previa de las variables. Otras herramientas exigen que se haga así. Por lo tanto es normal encontrar, en otros sistemas de programación, que un programa comienza de la siguiente forma: Declare Nombre As String Declare Apellido1 As String Declare Apellido2 As String Declare Dirección As String Declare Teléfono As String Declare Salario As Número Le dice que Nombre es una sucesión de letras

Le dice que Teléfono es una sucesión de letras Le dice que Salario es un número

Mediante estas declaraciones, el programa sabe de que tipo de dato se trata y por tanto cómo debe trabajar con él. En otros sistemas de programación distintos de Basic, es necesario realizar esta declaración antes de introducir una variable. Basic permite que no se declaren. Cuando a lo largo del programa le introducimos una variable nueva, asume que es una variable y que el tipo es el adecuado para el valor que le estamos introduciendo en ese momento. Por ejemplo, si Basic encuentra estas instrucciones Salario=50000000 Nombre ="Pedro" Teléfono = "1234567" entiende que Salario, Nombre y Teléfono son variables, que Salario es un número (No hemos metido su valor entre comillas), y que Nombre y Teléfono son sucesiones de caracteres alfanuméricos (su valor está entre comillas)

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 4

Esta particularidad de no necesitar declarar las variables hace que sea sencillo introducir una variable nueva. Sin embargo entraña un gran peligro. Imagínese que en un paso posterior del programa, le mandamos escribir esos tres datos anteriores con la instrucción PRINT Print Salario Print Nombre Print Telwfono Habrá observado en tercer lugar la palabra Telwfono, que por error ha introducido el programador. Basic interpreta que Telwfono es una variable e irá a leer en memoria el valor que tiene. No tendrá ningún valor. Por lo tanto no escribirá nada y encima no dará ningún aviso de que se ha cometido un error. Nada es gratis en esta vida, y la facilidad para introducir variables se paga con la posibilidad de un error. El peligro de no declarar las variables no termina en esa posibilidad de error. Cuando no declaramos el tipo de variables, Visual Basic supone que la variable es de un tipo que soporta cualquier tipo de datos : una variable tipo Variant. En ese tipo podrá meter cualquier tipo de variable, pero a costa de ocupar mucho mas espacio en la memoria que si la hubiese declarado con el tipo correcto para el dato que va a meter en ella. Basic ha pensado en ese problema, y se puede solucionar con esta que será la primera instrucción BASIC que vamos a estudiar: OPTION EXPLICIT Obliga a declarar previamente las variables que se vayan a usar. De no haberla declarado antes de usarla, el programa dará una comunicación de error. Esta declaración debe ponerla al comienzo de la sección de declaraciones de cada formulario y módulo que contenga su aplicación. Pero no se preocupe de ello puesto que VB lo ha hecho por Vd. Basta que lo programe en las opciones del VB. Haga click en Herramientas | Opciones de la barra de menú del VB y le aparecerá este cuadro, donde debe marcar las casilla Requerir declaración de variables. A partir de ahora, será VB quien ponga la sentencia Option Explicit en el lugar correcto. (Fig. 1.1)

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 5

TIPOS DE VARIABLES Las variables pueden ser de los siguientes tipos: (El número indicado en segundo lugar indica el número de Bytes que ocupa en memoria.) Booleana Byte Integer Long Single Doble Currency String Date Objet Variant (2) (1) (2) (4) (4) (8) (8) (*) (8) (4) (**) Admite los valores 0 y 1, o True (verdadero) y False (falso) Números enteros, en el rango de 0 a 255 Números enteros en el rango de -32768 a 32767 Números enteros en el rango de -2147483648 a 2147483647 Punto flotante, simple precisión Punto flotante, doble precisión. Entero, con punto decimal fijo (Típico de monedas) Cadenas alfanuméricas de longitud variable o fija Fechas Referencia a objetos Otros tipos de datos

(*) Una variable tipo String ocupa el mismo número de bytes que caracteres tenga la cadena. (**) Una variable tipo Variant ocupa 16 bytes si se trata de un número y 22 bytes + longitud de la cadena si se trata de un dato tipo cadena de caracteres. Existen también variables definidas por el usuario (Ya verá la sentencia Type). En este tipo de variables se pueden introducir muchos datos de distinto tipo. Los bytes necesarios para almacenar esa variable dependerá de los datos que se hayan definido. Dentro de las variables Objet (variables que se refieren a objetos) existe una gran variedad que a estas alturas del curso no debemos complicarnos con ellas. Pero para adelantar algo, veremos que una variable puede ser del tipo Form - Formulario - , tipo Recordset, etc. etc. Cada tipo de variable ocupa unos determinados bytes. Si no se define una variable, VB toma como tipo por defecto para la variable el tipo Variant, tal como citábamos anteriormente. Este tipo ocupa mas bytes que, por ejemplo, un integer. Si el tipo de dato que vamos a introducir en una variable es un integer, y no la hemos declarado como tal, VB asumirá para esa variable que es del tipo Variant, lo que le llevará a gastar mas bytes de memoria (16) que los que necesitaría (2) si la hubiésemos declarado previamente. Si esa variable va a estar en el rango de 0 a 255, y no declaramos previamente que la variable va a ser del tipo Byte, o la declaramos como integer, p. e., estamos desperdiciando memoria RAM y posiblemente, retardando la ejecución del programa. Lo mismo podemos decir del resto de las variables, y lo importante que es declararlas y declararlas bien. NOTA. Observe en la lista anterior que un dato Booleano ocupa 2 Bytes, mientras que un dato tipo Byte ocupa un byte. En muchas ocasiones declaramos variables tipo Boolean con la intención de que ocupen menos espacio. Paradoja del VB. Si la declaramos como Byte ocupamos menos espacio en memoria. Declarar una variable como Boolean tiene también sus ventajas (escribirá menos código por lo general cuando necesite leer o escribir una variable tipo Boolean), pero tenga presente esta observación respecto al tamaño de los datos Boolean. Puede declarar el tipo de la variable mediante un carácter después del nombre de la variable. Esta técnica, obligatoria en Quick-Basic, está en desuso en VB. No es recomendable definir el tipo de esta forma, pues existe un serio peligro de error. De cualquier forma, eso es potestativo del programador y de sus costumbres. Los caracteres que definen cada tipo de variable son: % #
LSB

Integer Double

& @
Capítulo 1

Long Currency

! $

Single String
Página 6

Visual Basic – Guía del Estudiante

Ejemplos Prácticos de declaración de variables En Visual Basic, cuando declaramos una variable como String (Cadena de caracteres), no es necesario declarar su longitud. VB aceptará cualquier número de caracteres. Si desea evitar que se puedan introducir más de un determinado número de caracteres, debe declarar su número. Por ejemplo : Dim Var1 as String Dim Var2 as String * 15 Var1 puede tener cualquier número de caracteres Var2 puede tener un máximo de 15 caracteres.

En este segundo caso, si se introduce como Var2 una cadena de caracteres con mas de 15 caracteres, Var2 tomará solamente los 15 primeros. Visual basic no presenta ningún aviso de que esa variable ha omitido los caracteres que han sobrepasado la cifra de 15. Si desea que el usuario conozca esa circunstancia, debe introducir el código oportuno para producir el aviso. La declaración de variables tipo String con número de caracteres predefinido presenta también inconvenientes a la hora de tratar esa cadena de caracteres con sentencias tales como Mid, Left y Right, o a la hora de añadir una cadena a otra. La experiencia nos indica que NO merece la pena declarar variables tipo String con el número de caracteres prefijado, excepto que sea necesario justamente para definir la longitud de la cadena. En una gran parte de los casos una variable que se compone de números debe declararse como una variable de cadena de caracteres (String), y no como numérica. Cuando pensamos por ejemplo en un número de DNI, compuesto por 7 u 8 cifras, un código postal, el número de una calle, el piso de un edificio, parecen invitar a que la variable que los contenga sea una variable de tipo numérico (Byte, Integer, Long, ...). Estas variables, aunque su contenido sean números, siempre se deben declarar como String, ya que se tratan en realidad de cadenas de caracteres, aunque estos no sean letras sino números. Para aclarar mas estas ideas, piense en el número del DNI con la letra del NIF incluido, o que el lugar del DNI se deba rellenar con el número del permiso de residencia, (lleva letras). Piense en el código postal de una provincia que comienza por 0 ( 08XXX = Barcelona ) . Si la variable que va a contener ese código postal se declara como numérica, el cero de la izquierda lo desprecia, por lo que ese código postal quedaría reducido al 8XXX, número de 4 cifras que el cartero nunca reconocería como un código postal, que necesariamente ha de tener 5 cifras. Para terminar, piense la forma de introducir en una variable numérica el número 32Bis de una calle o el piso S2 de un edificio. O piense en una variable que va a contener un código de un producto. Ese código siempre va a ser un número, por ejemplo de 9 cifras. ¿Ha pensado como trataría el ordenador una variable numérica que contiene el código 000100123 ?. El resultado sería que convertiría ese código en la cifra 100123, y Vd. deberá buscarse la vida para añadir los ceros iniciales a la hora de sacarlo a una impresora, por ejemplo. En todos los casos anteriores, el número no representa una cantidad numérica, sino un nombre. Lo que ocurre es que ese nombre contiene solamente números. ¿Qué variables debemos declarar entonces como numéricas ? La respuesta es bien sencilla : Aquellas que van a contener datos con lo que vamos a realizar operaciones matemáticas. Las variables booleanas (True/False) pueden en muchos casos sustituirse por una variable del tipo Byte. Si ese datos True / False se va a introducir en una base de datos o en fichero en el disco, puede ser mas prudente poner 0 en vez de False y 1 en vez de True. Una variable byte ocupa muy poco, simplemente 1 byte como su nombre indica. Pero no puede contener números mayores de 255 ni números negativos. Cada vez que declare una variable numérica piense en los valores que puede tener, sobre todo cuando esa variable va a ser el resultado de una operación matemática. Recuerde el escaso
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 7

margen de una variable tipo Integer ( de -32768 a 32767) Si la aplicación va a tratar moneda, piense en la forma de expresar los números decimales y el número de ellos permitidos, así como el redondeo. La variable correcta para este caso es Currency, pero Currency le añade automáticamente el tipo de moneda de cada país (Pts. Para España) lo que con frecuencia es un engorro. Los datos del tipo de moneda los toma del sistema operativo del ordenador, por lo que no se extrañe si le expresa el número de pesetas en dólares. Cambie el país en su S. O. Otro tipo de variable es Date. Este tipo de variable representa una fecha o una hora. Pero debe ser objeto de un estudio un poco mas extenso para tener claro que es una fecha para Visual Basic, como las trata y como se pueden comparar. Lo verá mas adelante al estudiar las funciones Format y DateDiff. Ambito de las variables. Denominamos ámbito de una variable a las partes del programa donde esa variable está declarada. Para entenderlo mejor, veamos someramente la forma de un programa desarrollado en VB. Un programa VB tiene uno o varios formularios. Cada formulario tiene varios controles. Tanto el formulario como cada uno de sus controles tienen una parte del programa, justamente la parte relacionada con cada uno de los eventos que pueden suceder bien al formulario o a los controles. A estas partes las habíamos llamado Procedimientos. Podemos tener procedimientos que no estén relacionados con ningún evento ocurrido al formulario o a sus controles. (Los Procedimientos que iremos insertando a lo largo de la aplicación) Aparte de formularios y controles, un programa puede tener Módulos, y en cada uno de los módulos podemos insertar cuantos Procedimientos y Funciones queramos. La estructura de un programa VB puede ser de la siguiente forma: Formulario1 Declaraciones Proc. A1 Proc. A2 Proc. A3 Proc. A4 Proc. A5 Proc. AA1 Proc. AA2 Proc. AA3 Formulario2 Declaraciones Proc.B1 Proc.B2 Proc.B3 Proc.B4 Proc.BB1 Proc.BB2 Proc.B33 Formulario3 Declaraciones Proc.C1 Proc.C2 Proc.C3 Proc.C4 Proc.CC1 Proc.CC2 Proc.CC3 Proc.CC4 Módulo1 Declaraciones Proc.D1 Proc.D2 Proc.D3 Proc.D4 Modulo2 Declaraciones Proc.E1 Proc.E2 FunciónE1 FunciónE2 FunciónE3 FunciónE4 FunciónE5 FunciónE6

Si se declara una variable dentro de un procedimiento o Función, esa variable "NO SALE" del Procedimiento o Función donde se declaró. El procedimiento puede estar en un Formulario (Cualquier procedimiento de un control o un procedimiento creado por nosotros) o en un Módulo (En este caso, el procedimiento solo puede ser creado por nosotros) En un Formulario, una variable puede declararse de dos formas : Privada o Pública. Para declarar una variable a nivel de formulario debe hacerse en la sección de declaraciones, que está la ventana de código Objeto = General, Proc. = Declaraciones. Si se declara Privada, esa variable se puede ver en todo el formulario, (es decir, en todos los procedimientos de todos los controles del formulario y en los Procedimientos que pudiésemos insertar en ese formulario), pero no sale de dicho formulario. Si se declara como Pública, esa variable puede verse por todo el formulario, de la misma forma que lo haría declarada como Privada, y además puede ser usada desde otro Formulario o Módulo, citándola con el nombre del Formulario, seguido del nombre de la variable (Formulario.Variable) En un Módulo una variable puede declararse como Privada, con lo que no saldrá de ese
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 8

Módulo, o Pública, pudiendo en este caso usarse en todo el programa. Cuando se declara una variable como pública en un Módulo, basta referirse a ella por su nombre, sin citar el nombre del Módulo donde se declaró. En VB es posible declarar varias veces las variables, es decir, pueden declararse a nivel de formulario, en su apartado de declaraciones, y esa variable conservará su valor en todas las partes de ese formulario. Sin embargo, si se declara una variable con el mismo nombre a un nivel inferior, por ejemplo al principio de un procedimiento, esa variable será una variable distinta a la anterior, aunque tenga el mismo nombre, al declararla en un Procedimiento, solamente será válida en ese Procedimiento. Una vez que hayamos salido de ese procedimiento, la variable con ese nombre volverá a ser la declarada en el Formulario. En realidad, lo que tenemos son dos variables distintas, pero con el mismo nombre, una declarada para todo el formulario excepto para el procedimiento donde se volvió a declarar, y otra para ese procedimiento concreto. NOTA.- No es recomendable declarar una variable a dos niveles. Es mucho mejor utilizar otro nombre para esa variable dentro del procedimiento donde se le declararía por segunda vez. A esta nota cabe exceptuar cuando declaramos variables para una operación tipo contador For I = 1 To N Esa variable I es práctico declararla con el mismo nombre en cada Procedimiento donde se use. Tipos de declaración de variables. Sentencia DIM Es la forma mas común de declarar una variable como Privada. Puede emplearse en un Procedimiento, Función, Formulario o Módulo. La sintaxis es de la siguiente forma: nombrevariable As Integer (o el tipo que sea)

Dim

Declarando una variable con la sentencia DIM, en un formulario, Función, procedimiento o módulo, el ámbito de la variable será el explicado anteriormente para una variable declarada como Privada. Es decir, esa variable no sale del formulario, procedimiento ó módulo donde se declaró. Cada vez que entremos al formulario, procedimiento o módulo, esa variable tomará el valor cero (si es numérica) o nulo (si es string). Sentencia PRIVATE Es la forma de declarar una variable como Privada. Puede emplearse solamente en la sección de declaraciones de un Formulario o Módulo. La sintaxis es de la siguiente forma: nombrevariable As Tipovariable

Private

Declarando una variable mediante la sentencia PRIVATE en un Formulario o Módulo, esa variable puede usarse en todo ese Formulario o Módulo (En todos sus Procedimientos y Funciones), pero NO fuera del Formulario o Módulo donde se declaró. La sentencia Private no puede usarse en un procedimiento o función. Sentencia PUBLIC Es la forma de declarar una variable como Pública. Puede emplearse solamente en la sección de declaraciones de un Formulario o Módulo. La sintaxis es de la siguiente forma: Public
LSB

nombrevariable
Capítulo 1

As

Tipovariable
Página 9

Visual Basic – Guía del Estudiante

Declarando una variable de esta forma en la sección de declaraciones de un Módulo, esa variable puede usarse en cualquier parte del programa citándola simplemente por su nombre. Si se declara de esta forma en la sección de declaraciones de un Formulario, esa variable puede usarse en toda el programa. Para nombrarla, si estamos en el Formulario donde se declaró basta con citarla por su nombre. Si no estamos en ese Formulario, habrá que citarla por el nombre del Formulario, seguido del nombre de la variable, separados por un punto : NombreFormulario.Nombrevariable En un Módulo puede usarse también la sentencia Global en vez de Public : Sentencia GLOBAL Global Declara una variable que es válida en todo el programa. La sintaxis es: nombrevariable As tipovariable

La sentencia Global sólo puede usarse en el apartado de declaraciones de un Módulo. Esta sentencia se mantiene por compatibilidad con versiones anteriores de VB. No la use. Sentencia STATIC Como se dijo anteriormente, una variable declarada en un procedimiento pierde su valor al salir de él. Lo peor es que una vez que el programa vuelva a entrar en ese procedimiento, la variable estará puesta a cero. Afortunadamente, esto último tiene solución. Si declarásemos una variable en un procedimiento o función, como estática, esa variable, aunque no la podremos utilizar fuera de ese procedimiento o función, cuando volvamos a él conservará el valor que tenía cuando lo abandonamos. Esta declaración como estática se realiza mediante la instrucción Static Static nombrevariable As tipovariable

El nombre de una variable puede ser tan largo como queramos. hasta un máximo de 40 caracteres. En la versión VB para España se pueden usar incluso la Ñ y vocales acentuadas. Es indiferente usar mayúscula ó minúsculas. No se sorprenda, si por ejemplo, la ha declarado con mayúsculas y luego la cita con minúsculas al escribir el código, que automáticamente se cambie a mayúsculas. El nombre de una variable siempre debe comenzar por una letra. No hay problema por utilizar variables largas. Al compilar el programa no se lleva el nombre, es decir, no le va a ocupar mas espacio. Utilice siempre nombres que le definan la variable con algún sentido. Es muy útil a la hora de acordarse como se llaman, y sobre todo, a la hora de rehacer un programa que realizó hace seis meses. Pese a que Visual Basic no obliga a declarar variables, es muy útil hacerlo. De esta forma se tiene control sobre el programa. La experiencia se lo irá demostrando. Resumimos la forma de declarar una variable: En un Procedimiento (La variable no puede usarse fuera de esta Procedimiento) Dim Variable As Tipovariable En un Procedimiento, como permanente (La variable no puede usarse fuera de este procedimiento, y dentro de él conserva el valor aunque se salga y se vuelva a entrar) Static Variable As Tipovariable
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 10

En un Formulario (En su sección de declaraciones) Como Privada (Solamente se puede usar en ese Formulario) Dim Variable As Tipovariable Private Variable As Tipovariable Como Pública (Puede usarse en toda la aplicación) Public Variable As Tipovariable En un Módulo Como Privada (Solamente puede usarse en ese Módulo) Dim Variable As Tipovariable Private Variable As Tipovariable Como Pública (Puede usarse en toda la aplicación) Public Variable As Tipovariable Global Variable As Tipovariable Error típico de un programador novel de Visual Basic Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de declarar varias variables juntas en una misma línea : Dim Variable1, Variable2, Variable3, Variable4 As String Esta declaración está MAL hecha. Visual Basic interpretará que Variable1, Variable2 y Variable3 son del tipo Variant, y solamente Variable4 la supone como tipo String La forma correcta de hacerlo, si queremos declarar esas variables un una sola línea, es la siguiente : Dim Variable1 As String, Variable2 As String, Variable3 As String, Variable4 As String. ó ó ó

Forma de conocer el tipo de una variable. Función TypeName
Podemos conocer el tipo con el que se ha declarado una variable. Esto se hace mediante la Función TypeName, que devuelve una cadena con el tipo de una variable. MiTipo = TypeName(NombreVariable) NombreVariable puede ser cualquier variable con excepción de las de tipos definidos por el usuario. La cadena de caracteres devuelta por TypeName puede ser una de las siguientes: Cadena devuelta Byte Entero
LSB

La variable contiene Un byte Un entero.
Capítulo 1 Página 11

Visual Basic – Guía del Estudiante

2 y 3 aparecerá el tipo de cada variable: String. Una cadena. En la parte superior izquierda tiene una línea con la palabra Form y una flecha hacia abajo que parece que va a desplegar algo. Por ejemplo. Haga doble click sobre el formulario. Una variable de objeto que no se refiere a un objeto. Puede que ya le aparezca la linea con Option Explicit. un botón de comando (CommandButton) y tres etiquetas (Label). tecléela. Si no le aparece. Arranque VB y coloque en el formulario que aparece nada mas arrancarlo. Un número de punto flotante de precisión simple. Esta idea es especialmente útil cuando el trabajo a realizar sea retomar el trabajo comenzado por otro programador. Esta función tiene mucha utilidad para determinar errores durante el diseño.Largo Simple Doble Moneda Fecha Cadena Boolean Error Empty Null Objeto Desconocido Nada Un entero largo. Una fecha. Si NombreVariable es una matriz. Un valor de error. No inicializado. El botón de comando le aparecerá con el nombre de Command1 y los labels con Label1. Option Explicit Dim MiString As String Dim MiEntero As Integer Dim MiObjeto As Control ‘Hemos declarado que MiString es una variable tipo String ‘Hemos declarado que MiObjeto es una variable tipo Objeto Haga doble click sobre el botón de comando. Teclee el siguiente código : Private Sub Command1_Click() Set MiObjeto = Command1 ‘Y aquí decimos que MiObjeto es precisamente el Command1 Label1 = TypeName(MiString) label2 = TypeName(MiEntero) Label3 = TypeName(MiObjeto) End Sub En los labels 1. Le aparecerá una ventana. Un objeto que no respalda Automatización OLE. la cadena devuelta puede ser cualquiera de las cadenas posibles con un paréntesis vacío adherido. Haga click sobre esa flecha y luego sobre la palabra General que le aparecerá. Un valor Boolean. Cuando aparece el error “No coinciden los tipos” puede interrogarse al programa para ver qué tipo de variable es el que hemos declarado. Integer y CommandButton. si NombreVariable es una matriz de enteros. Le aparecerá la ventana anterior. Teclee aquí las declaraciones de varias variables (observe que en la ventana similar de la derecha aparece Declaraciones). No hay datos válidos. TypeName devolverá "Integer()". LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 12 . Un valor de moneda. Label2 y Label3. Un número de punto flotante de precisión doble. Un objeto de Automatización OLE cuyo tipo es desconocido. Vamos a hacer nuestro primer programa en Visual Basic. pero referida ahora al Command1.

e. Puede ocurrir que. 2 y 3.Lenguaje Basic del Visual Basic. un determinado juego de instrucciones: Select Case variable LSB ' variable es una variable que puede tomar los valores (p. Llamamos sentencias condicionales a aquellas que se realizan si se cumple una determinada condición. No ha sido un juego de palabras. y ejecuta otras instrucciones distintas. caso de no cumplirse la condicion primera. se abra un abanico de dos o tres posibilidades. y este no va ser menos. y lo descrito anteriormente toma la forma: If condición Then Instrucciones Else Otras instrucciones End If En este ejemplo. La sentencia condicional más usada es: Si se cumple una condición Entonces Realiza estas instrucciones Si no se cumple Realiza estas otras instrucciones Fin de la sentencia.) de Capítulo 1 Página 13 Visual Basic – Guía del Estudiante . End If Como decíamos anteriormente. comunes a QB y VB. Sentencias condicionales. Son las sentencias por las que empieza cualquier texto de Basic. Así de fácil es programar en Basic. Existe otra sentencia condicional muy usada: Select Case Su nombre casi nos define lo que es: Selecciona. Lo que ocurre es que esta herramienta habla inglés. Sin embargo ha añadido otras nuevas instrucciones. inherentes con la programación visual. o se cumple una condición y ejecuta unas determinadas instrucciones. Vamos a estudiar aquí las instrucciones y definiciones mas sencillas. este es el tipo de sentencia condicional mas usada. La sentencia condicional tendría entonces la forma: If condición 1 Then Instrucciones ElseIf Condición 2 Otras instrucciones ElseIf Condición 3 Otro juego de instrucciones Else Instrucciones que debe realizar caso de no cumplir las condiciones 1. dependiendo del caso. o no se cumple. VB emplea unas instrucciones casi iguales a las que emplea Quick Basic.

En realidad Switch es una función (las funciones las veremos muy pronto) A = Switch (B=1. Puede agrupar varios valores en una misma línea. 24. 25. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 14 . 11) Esta instrucción obtiene un valor para A que dependerá del valor que tome B entre los valores posibles (1. Le garantizo que puede llegar a ser un gran programador sin necesidad de utilizarlas. Use preferentemente If End If y Select Case. Por ejemplo. 5. 23. B=3. Esto puede producir algún error si no se contempla esa posibilidad. y el tratamiento es igual para varios de ellos. 22. 26 Instrucciones Case Is > 26 Instrucciones End Select Cuando lo que queremos es elegir un valor. 7. Switch y Choose. si tiene 100 valores posibles. 5. La misma intrucción anterior puede realizarse con Choose de la siguiente forma: A = Choose ( B. 2 ó 3) La sentencia Choose es casi igual. no ejecutar instrucciones como hacíamos anteriormente. cambia solamente la forma. Las sentencias Switch y Choose no se usan mucho en programación. puede agruparlos así: Select Case Valor Case Is < 20 Instrucciones Case Is = 20 Instrucciones Case Is = 21. cuando el margen de elección es mayor que 2. Switch toma una serie de parámetros. Parece que los programadores o no las conocen o se lían (y es comprensible) al utilizarlas.1a4 Case 1 Instrucciones a ejecutar en caso de que variable = 1 Case 2 Instrucciones a ejecutar en caso de que variable = 2 Case 3 Instrucciones a ejecutar en caso de que variable = 3 Case 4 Instrucciones a ejecutar en caso de que variable = 4 Case Else Instrucciones a ejecutar en caso de que variable sea distinta a los valores anteriores End Select Este procedimiento resulta mucho mas sencillo y rápido que las sentencias If Then Else vistas anteriormente. la sentencia devuelve el valor Nulo ( Null ). B=2. todos por parejas. si el valor de B no coincide con ninguno de los valores que se le habían establecido (1. 11 ) En estas sentencias. El primer término de cada pareja es la expresión a evaluar. El segundo es el valor que tiene que devolver. disponemos de otras dos funciones: Choose y Switch. 7. 2 ó 3 en nuestro caso).

obtener resultados de operaciones. ya que va a contener un dato tipo cadena de caracteres. Como ejemplo. El TextBox tendrá por nombre Text1. Otra. que se estarán realizando mientras se cumpla una condición o mientras no se cumpla otra condición. Si ese valor numérico es menor que 100. SiEsCierto SiEsFalso Observaciones IIf siempre evalúa SiEsCierto y SiEsFalso.Otra sentencia condicional: IIF Devuelve uno de entre dos valores. deberá vigilar que no se produzcan efectos no deseados. en el formulario de nuestro primer programa introduzca un nuevo botón de comando. aunque sólo vaya a devolver una de ellas. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 15 . . Es el llamado bucle por condición. SiEsFalso) Expresión es la expresión a evaluar. cambiar las propiedades de un objeto. Sintaxis Iif (Expresión. Fíjese que hemos declarado MiVariable como String. Por esta razón. realiza el bucle hasta que se cumpla (o deje de cumplirse) una condición.. Con estas sentencias condicionales es posible realizar bifurcaciones del programa. Vea que poco a poco vamos metiendo cosas aunque no las conocemos todavía. si al evaluar SiEsFalso se produce un error de división entre cero. Si introduce una cantidad mayor. Es tan sencillo como esto: Mientras condición Instrucciones Fin del bucle Existen dos formas de bucle: Una. Por ejemplo. Valor o expresión devuelta si Expresión es True..Text) > 100. Valor o expresión devuelta si Expresión es False. Sentencias de bucle. Es el denominado bucle por contador. por lo que MiVariable tomará el valor “Es mayor”. El valor que toma la variable puede verlo en Label1. MiVariable tomará el valor “Es menor” (No se cumple la condición expresada en el primer parámetro Text1. debe introducir un valor numérico en Text1. Haga doble click sobre el botón de comando e introduzca el siguiente código : Private Sub Command2_Click() Dim MiVariable As String MiVariable = IIf(Clng(Text1. Un bucle es una sucesión repetitiva de instrucciones. "Es menor") Label1 = MiVariable End Sub Al ejecutar el programa.Text > 1000). Mas tarde las conocerá.. dependiendo de la evaluación de una expresión. Introduzca también un TextBox. SiEsCierto. "Es mayor". se cumple esa condición. se generará un error aunque Expresión dé como resultado True. que realiza un número determinado de recorridos por el bucle. Es muy común utilizar bucles a lo largo de un programa.

donde se parará. y Until para indicar Mientras no se cumpla que .caption = Chr ( N ) Next N Este "programa" nos presentará en una caja (Label) los caracteres cuyo número ASCII vaya desde el 65 (A) al 90 (Z) Comenzará presentando el correspondiente al número 65. donde visualizábamos los caracteres A a la Z. y solamente veríamos la Z. en la etiqueta Label1. y así nos dará tiempo a verla. Si lo que queremos es que el programa se ejecute mientras no se cumpla una determinada condición. y también de exponer las sentencias condicionales y los bucles.caption = Chr ( N ) Label1. y si es cierto. dado que cambiaría con mucha velocidad. hasta llegar al 90.RefreshN X=0 Do While X < 1000 X=X+1 Loop Next N (Mientras se ' Refresca la etiqueta Este es nuestro primer programa en BASIC. etc.. en este bucle nos va a presentar las 26 letras mayúsculas del alfabeto inglés For N=65 To 90 Label1. Así hasta que X ya no sea menor que 1000. En VISUAL BASIC es idéntico...Bucle por contador Realiza el bucle tantas veces como le indiquemos. Analiza si el valor de X es menor que 1000. Con el primer bucle. Como final de lección. que es donde se detuvo el programa. posiblemente no nos diese tiempo de ver cada una de las letras que iban apareciendo en la pantalla. sale del bucle. Con los dos bucles vistos anteriormente ya podemos hacerlo. e irá presentando sucesivamente el 66. Podemos poner un temporizador cada vez que presente una letra. Por ejemplo. Bucles por condición Ejecuta las instrucciones del bucle mientras se cumple una condición X=0 Do While X < 1000 X=X+1 Loop El programa toma una variable ( X ) que previamente tuvimos la curiosidad de ponerla a cero. While para indicar Mientras se cumpla que ... inicio de cualquier curso de Basic. Para terminar bien el programa anterior utilizaremos la condición de While cumpla la condición) For N=65 To 90 Label1.. se propone un problema. pero nos falta la LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 16 . el 67. vuelve a realizar el bucle. Acabamos de realizar un temporizador. e incrementa su valor una unidad. Al dejar de cumplirse que X sea menor que 1000. la sentencia será: X=0 Do Until X > 1000 X=X+1 Loop Observe que la diferencia entre una y otra es la condición.

introducir una etiqueta. su ordenador estaría detenido realizando una función bastante triste. que es la forma limpia y elegante de hacer una temporización Formas de salir de un bucle Para salir de un bucle. (*) Las temporizaciones no se hacen realmente así. Para realizarla basta con abrir el VB y sobre el formulario que aparece al abrirlo.interface gráfica. atender a ese puerto serie) Contador = 0 Do While Contador < 1000 Contador = Contador + 1 DoEvents If MSComm1. (Cuando se conecte. Para ello. Private Sub Command1_Click() For N=65 To 90 Label1. Este ejemplo es muy sencillo. Pero puede ocurrir que interese salir del bucle sin haber terminado la ejecución total del mismo. a la espera que otro equipo se conecte a través del puerto serie. El ejemplo anterior no deja de ser una forma sencilla de detener el programa. basta con ejecutar la sentencia Exit Do (Cuando hemos comenzado el bucle con Do Until o Do While. bien porque se ha cumplido la condición (Bucles por condición) o a que se haya llegado al final de la cuenta (Bucles por contador). por ejemplo. Y lo que es peor. en un ordenador a 300 MHz. podemos esperar a que se complete. Aparecerá el procedimiento Click. para que en los comienzos de su carrera como programador pueda ver el contenido de una etiqueta. deseamos transmitir por el puerto serie una serie de números.. To Ejemplos En el siguiente ejemplo pretendemos parar el programa cierto tiempo. Tardaría menos tiempo que en uno a 66. contar hasta 1000 para luego continuar el programa. del 1 al LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 17 .caption = Chr ( N ) Label1. Haga doble click sobre el botón. y sería una pérdida de tiempo seguir ejecutando el bucle cuando ya hemos obtenido lo que buscamos. por ejemplo. el control MSComm1 detectará la señal DSR que le envía el otro equipo y deberemos salir inmediatamente del bucle para. Este procedimiento es el que se realiza cuando hacemos click sobre ese botón.. (Label) que llevará el nombre por defecto de Label1. Si lo hiciera de esta forma. Escriba en ese procedimiento este código.RefreshN X=0 Do While X < 1000 X=X+1 Loop Next N End Sub ' Esta línea sale automáticamente ' Refresca la etiqueta ' Bucle de temporización (*) ' Termina el bucle de temporización ' Esta línea sale automáticamente Hemos puesto nuestra primera piedra en Visual Basic. Solo nos queda pensar donde introducimos el código anterior. porque ya hemos encontrado lo que estabamos buscando. Podemos introducir un botón de comando (Command Button) que saldrá con el nombre por defecto de Command1.DSRHolding = True Then Exit Do Sleep (1000) Loop ‘Aquí comenzamos a atender al puerto serie En el siguiente ejemplo. Esta misma función puede hacerla con Sleep que la verá mas adelante. Visual Basic es tan sencillo como este ejemplo. o con Exit For cuando lo hemos comenzado con For .

En el ejemplo Capítulo 1 Página 18 Visual Basic – Guía del Estudiante . deberá parar la ejecución mediante las teclas Ctrl – Pausa. pero siempre y cuando que el equipo que está al otro lado de la línea serie esté a la escucha (Condición MSComm1. En un programa compilado posiblemente tenga que reiniciar el equipo mediante Alt – Ctrl – Sup. Para salir de un LSB procedimiento basta con ejecutar la sentencia Exit Sub. que si nuestro programa entra en un bucle infinito se pueda salir de una forma no tan agresiva. Función DoEvents Si hablameos de bucles. Y es así por la misma razón que cada vez que ponemos un bucle. deberíamos poner dentro de ese bucle la palabra mágica DoEvents. por ejemplo) la ejecuta y posteriormente vuelve a ejecutar el bucle. Cuando VB encuentra esta función el control del microprocesador al sistema operativo.DSRHolding = False Then Exit Do MSComm1.DSRHolding = True) Si se desconecta ese equipo. hay que introducir dentro del bucle la instrucción DoEvents. Para que no suceda. llevándose por delante el resto de los programas que se estén ejecutando en ese momento en su PC. Lo entenderá perfectamente unos capítulos mas adelante. De esta forma. Imagínese que Visual Basic está ejecutando este código: Do While Valor < 100 Valor = valor + 1 If Valor = 90 then Valor =1 Loop Observará que la variable Valor nunca podrá llegar a tener el valor 100.1000. pero además no podrá atender a otros eventos que se produzcan en el ordenador (por ejemplo la pulsación de una tecla) ya que el microprocesador está atendiendo solamente a ese bucle. Esto es lo que se llama un bucle infinito. podemos salvar al menos los datos de las otras aplicaciones que se están ejecutando al mismo tiempo. veamos como salir de un procedimiento usando también esa “vía rápida”. No podrá pararlo mediante el botón Terminar de la barra de herramientas de VB. y si hay alguna operación en espera (la pulsación de una tecla.Output = Str(I) Next I No se preocupe que no entienda esto del MSComm. Si lo está ejecutando desde el propio entorno de Visual Basic. y la condición pasa de True a False. No es difícil cometer este error involuntariamente. o al menos. necesariamente debemos hablar de la función DoEvents. El programa no va a salir nunca del bucle. El bucle tomaría esta forma: Do While Valor < 100 Valor = valor + 1 If Valor = 90 then Valor =1 DoEvents Loop Salir de un procedimiento antes de terminar su ejecución Y ya que explicamos como se sale de un bucle por la vía rápida. deseamos salir del bucle: For I = 1 To 1000 If MSComm1. puesto que cada vez que llega a 90 le ponemos de nuevo el valor 0. Lo importante es que entienda la idea de salir de un bucle por la vía rápida.

No pretenda ver una forma mejor de realizar la misma función.Text = "" Exit Sub ‘Con esta instrucción saldríamos de este procedimiento Else 'Aqui vendrían las lineas de instrucciones donde trataríamos 'el contenido de Text1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 19 . Pero ese campo puede tener como máximo. debemos salir del procedimiento donde se introduce ese dato sin ejecutarlo de forma íntegra: Private Sub BotonLeerNonbre_Click() Mivariable = Text1. 20 caracteres.siguiente. Los ejemplos anteriores sirven solamente de ilustración para explicar el código que estamos estudiando. Si el usuario ha introducido mas de 20 caracteres. usamos el botón BotonLeerNombre para introducir el dato Nombre en una base de datos. si tuviese menos de 20 caracteres End If End Sub NOTA.Text If Len(Mivariable) > 20 Then MsgBox "El Campo Nombre debe tener como máximo 20 caracteres" Text1. que seguro que existe.

Estas consideraciones nos llevan a las dos primeras funciones con cadenas: Str Val Ejemplos Variablenumerica = Val (TextBox1. pero también tiene una presentación escrita. Obtiene el valor (el número) correspondiente a esa cadena. el ordenador debe convertirlo previamente a una cadena. Cuando introducimos un valor numérico por teclado o pantalla. Una cadena es también una sucesión de números. . y asocia este número a la variable Variablenumerica. por ejemplo). debe transformarlo a un número. Un número tiene un valor. Pero esa información no es un número legible por el usuario. Esa representación del número en un determinado sistema de numeración es una cadena. Variablenumerica tomaría el valor 0.Text) Este ejemplo convierte la cadena de caracteres (numéricos) que hubiese en la caja de texto TextBox1 en un número. El valor es algo que estará en el ordenador como una sucesión de bits. o incluso en binario) de ese número. Una cadena puede tener uno o varios caracteres alfanuméricos. tendrá mas o menos bits. Así. Si el contenido de la caja de textos no fuesen caracteres numérico (abcd. nos lo podrá presentar como: 9 9 11 1001 En numeración decimal En numeración hexadecimal En numeración octal En numeración binaria Esas formas de presentarnos el número son CADENAS de caracteres. o hexadecimal. Dependiendo de como lo hayamos declarado.Caption = Str (Variablenumerica) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 20 (número) (cadena numérica) Convierte un número a una cadena en numeración decimal. Para presentar un número en la pantalla. Lo que sí es legible por el usuario es la representación en numeración decimal (u octal. el ordenador para hacer operaciones con él.BASIC DE VISUAL BASIC (y2) Funciones de cadena Se denomina CADENA a una sucesión de caracteres. El valor del número dentro del ordenador es un NUMERO. que en la memoria del ordenador será una sucesión de bits. Label1. Ejemplo de cadenas: Curso de Visual Basic abcdefghijklmnopqrstuvwxyz1234567890 123456789 Hagamos una distinción entre una cadena que contenga números y un número. el número nueve.

sino que convierte cualquier tipo de variable a una variable tipo String (cadena). Cuando tenga mas experiencia en VB verá que esta observación estará un poco de más.Caption = Verdadero si booleana es true Label1. cuando queramos operar con ese número. y además un texto en el mismo Label. por lo que le dará un error. Existe una función mas amplia que Str. n) (Para todos los ejemplos) ----> Resultado = Curso de V Extrae lo n últimos caracteres de la cadena ----> Resultado = sual Basic Resultado = Right (cadena. cuando tiene que presentar un número. Le recomiendo que convierta los números a variables de cadena siempre que los quiera presentar en un Label o TextBox. cuando tiene que presentar un único número. 3. una variable tipo Booleana en una variable de cadena. (Vea Instrucción Mid mas abajo) Resultado = Mid (cadena. Sin embargo. como hace Str. n) Extrae n caracteres de la cadena.Caption = CStr(booleana) Label2 = CStr(Check1. devolviendo la cadena “Verdadero” si el valor de la variable booleana es True. Se trata de Cstr. siendo el primer carácter extraído el que ocupa el lugar m. pues VB hace automáticamente esa conversión.Caption = 0 si Check1 está activado si Check1 está desactivado Label3. Vea mas adelante la colección de funciones Cxx Mas funciones de cadena: Left (cadena. comenzando por la izquierda. 10) Mid (cadena.Caption = 1 Label2. Pero de momento. no le pedirá que se lo convierta a cadena. Puede también transformar a una cadena de caracteres el valor de un CheckBox o de un OptionButton. por ejemplo.Caption = Falso si booleana es False Label2. Esta función no solamente transforma un número a una cadena. m. convierta cada dato según lo vaya a necesitar.Value) Label3 = CStr(Option1. y “Falso” si es False. Siempre habrá que convertir a número la cadena de caracteres numéricos que hayamos introducido por teclado o por pantalla. VB no realizará automáticamente ese cambio. n) Extrae los n primeros caracteres de una cadena.Value) Label1. Si cadena = Curso de Visual Basic Resultado = Left (cadena.Caption = Falso si Check1 está desactivado Si se aplica Cstr a una variable tipo Fecha/Hora devuelve la fecha / Hora en formato corto.Este ejemplo pondría en la etiqueta Label1 los caracteres correspondientes al valor que tuviese la variable Variablenumerica . Esta función transforma.Caption = Verdadero si Check1 está activado Label3. 10) LSB Visual Basic – Guía del Estudiante Capítulo 1 ----> Resultado = rso de Vis Página 21 . En estos casos devuelve 0 y 1 para el CheckBox (Desactivado / Activado) y Verdadero ó Falso para el OptionButton (Activado / Desactivado) label1. Nota para recordar: Siempre habrá que convertir un número a una cadena cuando queramos presentarlo en la pantalla. 10) Right (cadena. Un Label.

pero con todos los caracteres en minúsculas.LCase (cadena) Resultado = Lcase (cadena) UCase (cadena) Resultado = UCase (cadena) Len (cadena) Devuelve otra cadena igual. La función Trim hay que usarla cada vez que convertimos un número a cadena de caracteres. (UCase = Upper Case) ----> Resultado = CURSO DE VISUAL BASIC Devuelve la longitud de la cadena ----> Resultado = 21 Resultado = Len (cadena) LenB (Cadena) String (n. la función Str introduce un espacio al comienzo de la cadena que. tanto por su izquierda como por su derecha. etc. (Vea Ejercicio Cap11 del disco) No se pone ningún ejemplo de estas funciones. es el doble que Len (Cadena) Devuelve una cadena de n caracteres como el indicado ----> ----> ----> Resultado = aaaaaaaa Resultado = AAAAAAAA Resultado = AAAAAAAA Resultado = String (8. 65) Space (n) Devuelve una cadena formada por n espacios. en la mayor parte de los casos. Cuando usamos Str(Número). (No elimina los espacios centrales de la cadena) Estas tres funciones se emplean para quitar los posibles espacios que pueden resultar de una entrada de datos. Elimina los posibles espacios que tenga una cadena por Su derecha. "a") Resultado = String (8. donde fueron introducidos por otro programa. Sorpréndase. InStr (cadena. pues sería difícil verlo impreso. ----> Resultado = A B Resultado = "A" + Space (6)+ "B" LTrim Rtrim Trim Elimina los posibles espacios que tenga una cadena por Su izquierda. a introducir en una base de datos. pero con todos los caracteres en mayúsculas. produce un error cuando lo vamos a comparar. carácter) Devuelve el número de Bytes empleados para almacenar la cadena. Tienen especial importancia cuando se toman los datos de un archivo o base de datos. Chr(65)) Resultado = String (8. (LCase = Lower Case) ----> Resultado = curso de visual basic Devuelve otra cadena igual. Elimina los espacios que tenga una cadena. cadena1) LSB Visual Basic – Guía del Estudiante Capítulo 1 Busca la cadena1 dentro de cadena y Página 22 .

hallar el carácter correspondiente. Sintaxis MiVariable = Asc (Cadena) Cadena es cualquier expresión de cadena válida. según las instrucciones que le sigan. 7. sabiendo el número ASCII. ocurrirá un error en tiempo de ejecución. ----> Resultado = CURSO DE VISUAL BASIC ----> Resultado = curso de visual basic ----> Resultado = Curso De Visual Basic Resultado = StrConv (cadena.2)=”AB” Si la cadena que vamos a introducir tuviera más caracteres. AscB devuelve el primer byte. Función Chr LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 23 . Puede sustituir a UCase o LCase si la instrucción es UpperCase o LowerCase respectivamente. Función Asc Devuelve el código de carácter correspondiente a la primera letra de una cadena de caracteres.2)=”ABCDE” ---. longitud]) = cadena2 ---. ProperCase) Instrucción Mid Mid puede usarse también para cambiar el contenido de una cadena. La Instrucción Mid reemplaza un número especificado de caracteres en una variable de cadena con caracteres de otra cadena.> Resultado = Curso AB Visual Basic Mid (cadena. si la instrucción es ProperCase. Sintaxis Mid(cadena1. tomará solamente los primeros Mid (cadena. inicio[. Ejemplo : Label1 = Asc (“ABCD”) Label1 presentará 65 Nota Hay otra función (AscB) que puede usarse con bytes contenidos en una cadena. Si la cadena no contiene caracteres. UpperCase) Resultado = StrConv (cadena. "sua") StrConv ----> Resultado = 12 Convierte una cadena de caracteres en otra. En lugar de devolver el código del carácter para el primer carácter. Observe la sutileza entre Mid como Función de cadena y Mid como Instrucción.> Resultado = Curso AB Visual Basic Funciones Asc y Chr Estas funciones se utilizan para obtener el número ASCII de un carácter. 7. y para. LowerCase) Resultado = StrConv (cadena. o poner la primera letra de todas las palabras de la cadena en mayúsculas.devuelve el número de orden dentro de cadena donde se encuentra la primera letra de cadena1 Resultado = InStr (cadena.

Otros caracteres importantes son. FUNCIONES CON NUMEROS _________________________ Visual Basic puede operar con números tal como lo haría cualquier persona. Los operadores que realizan comparaciones se denominan Operadores relacionales. El resultado de las operaciones realizadas con estos operadores solamente admiten dos resultados: True (Cierto) o False (Falso) Estos operadores son: = <> < LSB Igual que No igual que Menor que Capítulo 1 Página 24 Visual Basic – Guía del Estudiante . Sintaxis Chr (CódigoCarácter) El argumento CódigoCarácter es un número en el intervalo de 0 a 255. Los operadores que utiliza para las operaciones básicas son: + * / \ Mod ^ Suma Resta Multiplicación División División sin decimales Resto de una división Eleva a un exponente Ejemplos Resultado = Resultado = Resultado = Resultado = Resultado = Resultado = Resultado = 12 + 15 15 . inclusive. La tecla ENTER produce ambos caracteres cada vez que se pulsa. Existen otras operaciones que se pueden realizar con números: comparaciones. y el espacio (carácter 32) Nota Se proporciona otra función (ChrB) para su uso con datos de byte incluidos en una cadena. y puede utilizar paréntesis de la misma forma que los escribimos sobre el papel. ChrB siempre devuelve un solo byte. Conoce las 4 reglas. que identifica a un carácter. el Backspace (carácter 8). En lugar de devolver un carácter.25 Resultado = 1 resultado = 3 Resultado = 144 Resultado = 36 resultado = ( ( 4 * 3 ) / 2 ) ^ 2 Estos operadores se denominan Operadores aritméticos.12 15 * 12 15 / 12 15 \ 12 15 Mod 12 12 ^ 2 ----> ----> ----> ----> ----> ----> ----> ----> Resultado = 27 Resultado = 3 Resultado = 180 Resultado = 1.Devuelve el carácter asociado con el código de carácter especificado. Ejemplo Label1 = Chr (65) Label1 contendrá el carácter A Como ejemplos de números de caracteres algo especiales se debe señalar el carácter 10 (avance de línea) y el carácter 13 (Retroceso de carro). que puede ser de uno o de dos bytes.

Int devuelve el primer entero negativo menor o igual a número.<= > >= Menor o igual que Mayor que Igual o mayor que Estos operadores se suelen utilizar en estructuras de programa donde se tome una decisión. El operador = puede usarse también para comparar cadenas o fechas. Por ejemplo. los parámetros deben introducirse en decimal. En el ejercicio Cap11 puede ver un ejemplo muy explicativo Operador And Or Xor Eqv Imp Devuelve True si A=True y B=True A=True o B=True A=True y B=False A=False y B=True A=True y B=True A=False y B=False A=True y B=True A=False y B=True A=False y B=False A=False A=True Devuelve False si Cualquier otro caso A=False y B=False A=True y B=True A=False y B=False A=True y B=False A=False y B=True A=True y B=False Not Like A=True A=False Otras Funciones con números Int . Abs Sgn Sqr Exp Log LSB Visual Basic – Guía del Estudiante Devuelve el valor absoluto de un número Devuelve el signo de un número Devuelve la raíz cuadrada de un número Devuelve el número elevado al exponente indicado Devuelve el logaritmo natural de ese número Capítulo 1 Página 25 . si quiere realizar la función And entre el carácter 15 (00001111) y el 131 (10000011) . Pero en este caso. FixDevuelven la parte entera de un número con decimales Int y Fix eliminan la fracción de un número y devuelven el valor entero resultante.4 en -8. le devolverá el valor 3.4 en -9. Por ejemplo. La diferencia entre Int y Fix es que si el número es negativo. Int convierte -8. El resultado de esta operación será el byte 00000011. aquellas que solamente pueden tomar los valores cero y uno. Operadores Lógicos Estos operadores podemos usarlos con variables Booleanas. mientras que Fix devuelve el primer entero negativo mayor o igual a número. y con caracteres (un carácter = 1 Byte = 8 bits) realizando la operación correspondiente bit a bit con los 8 bits de cada carácter. pero como Ud. y Fix convierte -8. ya se habrá dado cuenta. debe ponerlo de la forma Resultado = 15 And 132. es decir.

se redondea al número entero más cercano antes de ser evaluado. anteponiendo &O a números en el intervalo apropiado. Puede realizarse la conversión hasta el valor de 11 caracteres octales. Función Oct Sintaxis Devuelve la cadena (String) que representa el valor octal de un número. &O10 representa a 8 en base diez en la notación octal. un string. Se pueden representar números octales directamente.Trigonométricas Sin Cos Tan Atn Devuelve el valor del seno de un ángulo (Expresado en radianes) Devuelve el coseno de un ángulo (En radianes) Devuelve la tangente de un ángulo Devuelve un arco cuya tangente sea el número (Angulo en radianes) Funciones para el Cambio de Base de Numeración Función Hex Sintaxis Devuelve una cadena. VariableBooleana = Cbool (expresión) El argumento expresión es cualquier expresión numérica o expresión de cadena válida. se redondea al número entero más cercano antes de ser evaluado. Por ejemplo. Mediante esta función se puede convertir un número de hasta ocho caracteres hexadecimales. anteponiendo &H. es decir. Recuerde que estas dos funciones devuelven una Cadena de caracteres. El resultado deberá tratarlo como una cadena de caracteres. que representa el valor hexadecimal de un número. VariabledeCadena = Oct (número) Si número no es entero. Son un tipo de funciones que convierten un dato o expresión a un tipo de datos determinado Función Cbool Sintaxis Convierte una expresión al tipo de datos Boolean. &H10 representa al decimal 16 en la notación hexadecimal. Por ejemplo. Funciones Cxxx para conversión del tipo de datos. no un número. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 26 . VariabledeCadena = Hex (número) Si número no es un número entero. Se pueden representar números hexadecimales directamente.

0.5 se redondea a 0 y 1. Debe usar la función CStr en lugar de Str para proporcionar conversiones que reconozcan las variantes internacionales. a partir de varios números tipo Byte. Dependiendo del tipo de dato que se va a convertir. la parte fraccionaria de un número.5.5 a 2. Por ejemplo. (Moneda) Convierte un dato a un tipo Long. la parte fraccionaria de un número. Convierte una expresión a un tipo de datos Single. Si la expresión a convertir queda fuera del intervalo aceptable para el tipo de datos a obtener. Función CByte Función CCur Función CLng Convierte una expresión al tipo de datos Byte. queremos obtener una suma que debe ser un Long. Por ejemplo. CStr devuelve: Boolean Date Null Empty Error Numérico String conteniendo True o False. CInt en lugar de Val para proporcionar conversiones que reconozcan las variantes internacionales. Un error de tiempo de ejecución. dependiendo de la configuración de la información local de su PC. (Fecha / Hora) Función Cvar Función Cdate Nota curiosa y a tener muy en cuenta En algunas ocasiones (no siempre. ocurrirá un error. Función CStr Convierte una expresión a un tipo de datos String. CLng se diferencia de las funciones Fix e Int en que trunca. misterios del VB) cuando hacemos una operación entre números. Cuando la parte fraccionaria es exactamente 0. Cuando la parte fraccionaria es exactamente 0. en vez de redondear. Por ejemplo. CCur. los diferentes separadores decimales se reconocen adecuadamente.5 a 2. cuando se convierte de cualquier otro tipo de datos a String. se devuelve True Si la expresión no se puede interpretar como un valor numérico. String conteniendo una fecha en el formato de fecha corta de su sistema. dependiendo de la configuración de la información local de su sistema. 0. Debe usar las función CByte. en vez de redondear. Por ejemplo. cuyas variables que los contienen se han declarado de distinto tipo. los diferentes separadores decimales se reconocen adecuadamente. Declaramos las variables de la siguiente forma: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 27 . String conteniendo la palabra Error seguida del número de error. CInt se diferencia de las funciones Fix y Int en que trunca. Por ejemplo. la función CInt siempre la redondea al número par más cercano.5. String conteniendo el número.Si expresión es cero. CLng. puede ocurrir que dé un error. Convierte una expresión a un tipo de datos Variant. ocurrirá un error de tiempo de ejecución. Convierte una expresión al tipo de datos Date. de lo contrario. Convierte una expresión al tipo de datos Currency. cuando se convierte de cualquier otro tipo de datos. la función CLng siempre la redondea al número par más cercano.5 se redondea a 0 y 1. Función CInt Convierte un dato a un tipo Integer. Función CDbl Función CSng Convierte una expresión al tipo de datos Double. se devuelve False. String de longitud cero ("").

Un ejemplo. y si este se repite. I1 As Byte. I3 As Byte.click Randomize Timer A = Rnd * 100 A = CInt(A) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 28 . dependen del numero que se meta como parámetro. I3 As Byte. I2 As Byte. Cuando hagamos click sobre el botón de comando deberá generar un número comprendido entre el 1 y el 49. dependiendo del número que se le introduzca como parámetro. No es necesario ejecutar la instrucción Randomize Timer cada vez que se quiera obtener un dato de la variable Rnd. Dará seguramente el error 6. Generador de números para la Lotería Primitiva Supongamos que tenemos un formulario con una etiqueta de nombre Label1.. (Y me parece que era un fallo de los muchos que tenía VB5) Otras Funciones Una función curiosa Timer Tiempo acumulado Devuelve el tiempo (en segundos) que ha pasado desde las 12 de la noche. eso sí. Y siempre con la precaución de que medie mas de un segundo entre dos instrucciones Randomize.Los números aleatorios generados de esta forma son siempre iguales. Generación de números aleatorios Randomize (Numero) Inicia el generador aleatorio tomando como dato de partida el Numero. y de esta forma. Devuelve el resultado en una variable llamada Rnd. un botón de comando de nombre Command1. haremos el truco de convertir el primero de los números que forman parte en la operación matemática a un Long. (Afortunadamente lo han corregido en la versión 6) La forma de obtener números realmente aleatorios es introducir como parámetro un número que sea variable con el tiempo. se puede obtener una sucesión de números aleatorios. La función toma entonces la forma: Randomize Timer La función Randomize devuelve una variable Rnd con un número comprendido entre 0 y 1 (Nunca será 0 ni 1) Leyendo el valor de la variable sucesivas veces. Ese número no puede ser otro que el número timer visto antes. Esta generación de números no produce números aleatorios pues como se dijo. se repite la sucesión de números que nos crea el generador aleatorio.Dim Suma as Long. VB ya se da cuenta que el resultado de esa operación es un Long: Suma = CLng(I1) + I2 + I3 + I4 + I5 Tenga en cuenta esa observación inicial que NO ocurre en todas las ocasiones. pues no entiende que sumando varios Byte (números comprendidos entre 0 y 255) puedan dar un número de otro tipo. Overflow. En el procedimiento click de Command1 pondremos el siguiente código: Private Sub Command1. I5 As Byte Suma = I1 + I2 + I3 + I4 + i5 El resultado de esta operación es que da un error. NOTA MUY IMPORTANTE para versiones de VB anteriores a la 6. Para que esto no suceda.

Añade un intervalo de tiempo a una fecha Obtiene el intervalo de tiempo entre dos fechas Devuelve una parte de una fecha (semana. 1=Domingo. Una variable declarada como date puede contener una fecha. Por ejemplo. a partir de una fecha Obtiene el mes a partir de una fecha.. etc. Obtiene el segundo a partir de una hora. Devuelve la hora actual. Obtiene el año a partir de una fecha. Esta fecha la toma del reloj del ordenador.. una fecha y una hora o una hora solamente. Funciones con fechas.Do While A > 49 A = A . trimestre. Visual Basic sabe obtener y tratar la información relativa a la fecha y la hora. Date Time Now WeekDay Day Month Year Hour Minute Second DateAdd DateDiff DatePart DateSerial TimeSerial DateValue Devuelve la fecha de hoy.caption = A End Sub Realice este pequeño programa. Obtiene la hora a partir de una hora Obtiene el minuto a partir de una hora. Devuelve el día de la semana (En número. Las fechas son cadenas especiales. para obtener el día de hoy solamente: Día = Day (Now) Día será un número El día de la semana lo obtendríamos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 29 .) Compone una fecha a partir de parámetros relativos Compone una hora a partir de parámetros relativos. 2=Lunes. con la instrucción Randomize Timer y sin ella.49 Loop Do While A < 1 A = A + 49 Loop Label1. Devuelve la fecha y hora actual.. Devuelve una fecha a partir de un dato que se le parezca y VB pueda obtener de él una fecha válida Mediante estas instrucciones podemos obtener el dato necesario de una fecha u hora. Dispone para ello de una declaración de variable: Date.) Obtiene el día.

trimestre.Diasemana = WeekDay (Now) Diasemana será un número DateValue. (Now = 22/09/1998). etc. primerasemanaaño]]) Valor para Intervalo q m y d w ww h n s Obtendremos el Trimestre Mes Día del año Día Día de la semana Semana Hora Minuto Segundo El parámetro Primerdíasemana puede ser un número o una constante (veremos a lo largo de todo el curso. y tomando como referencia para todos los ejemplos el día 22 de Septiembre de 1998. fecha[. una instrucción que le sacará mucho provecho Fecha = DateValue (12-07-96) Fecha = DateValue (12 07 96) Fecha =12/07/96 La función DatePart merece estudio aparte. tenemos : Variable = DatePart (“m”. Now) LSB Visual Basic – Guía del Estudiante Variable = 10 Variable = 3 Variable = 22 Capítulo 1 Página 30 . fecha en la que se ha escrito este texto. Por ejemplo. Now) variable = DatePart ("q". La sintaxis de esta función es : VariableNumérica = DatePart (Intervalo. primerdíasemana[. semana. (Standard ISO 8086) Empieza con la primera semana contenida el año nuevo. que VB usa constantes que son palabras reservadas por VB que generalmente comienzan por vb) que indica que día es para nosotros el primero de la semana Constante vbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday Número 1 2 3 4 5 6 7 Primer día de la semana Domingo (predeterminado) Lunes Martes Miércoles Jueves Viernes Sábado Para el parámetro primerasemanaaño podemos emplear uno de los siguientes números o constantes: Constante vbFirstJan1 vbFirstFourDays cuatro vbFirstFullWeek completamente en Valor 1 2 3 Descripción Empieza con la semana en la que se encuentra el 1 de enero (predeterminado). Now) variable = DatePart ("d". Empieza con la primera semana que tenga al menos días en el año nuevo. día del año. Con esta función podemos averiguar el mes.

al igual que cuando lo hacíamos con Now. No debemos confundir esta fracción del día (0. Emplea por lo tanto 8 bytes para representar una fecha. y el resultado sigue siendo 39. vbMonday. vbFirstFourDays) Con las comillas dobles puede incluso no poner el año. Puede expresar la fecha metiéndola entre dos signos #. Una hora también es una variable tipo Date. Ese es el número de días transcurridos desde el origen de tiempos tomado por VB (Y por muchas otras aplicaciones de Microsoft y de otras marcas) hasta ese fatídico día. Now) Variable = 265 Variable = 3 (Martes. vbMonday) Variable = 2 (Primer día semana = lunes) variable = DatePart ("ww". vbFirstFourDays) Variable = 39. No lo sé. vbFirstFourDays) Estas tres formas de expresar la fecha funcionan perfectamente. En este caso le pone por defecto. el año en curso. Porque las anteriores a ese día las trata como números negativos. al día 12 de Julio de 1999. Por ejemplo.5 Es decir. Por ejemplo. interpreta como tipo de datos Date determinados datos que no lo son. 12 Julio 1999 es tal y como puede verse. el día 12 de Octubre de 1492. Ejemplo : variable = DatePart("ww". Now. ¿Que como trata los minutos dentro de una variable Date? Pues como decimales de ese número Double.Predeterminado) variable = DatePart ("w". una sucesión de caracteres. ¿ Cual es ese origen del tiempo? El 30 diciembre 1899. que indica el número de la semana dentro del año. vbMonday. Now) variable = DatePart ("w". pero solamente vale para el día de hoy. Y precisamente como un número Double. la hora 12:00:00 del día 12 de julio de 1999 es para VB 36. Pero es fácil intuir que motivos prácticos para que cualquier fecha del siglo XX tuviese un número positivo. Por ejemplo. variable = DatePart("ww". Puede verlo en el ejercicio Cap12 del disco. VB lo trata como el día número . Una posibilidad es la usada en los ejemplos. la parte decimal representa la fracción de día transcurrido desde el comienzo del día (medianoche) hasta la hora en cuestión. "22/9/98". Cuidado con como se escriben las fechas. Por ejemplo. #9/22/98#. VB que es un lenguaje inteligente. vbMonday. y usar el formato especificado para el país : variable = DatePart("ww". (Fecha en la que el autor de este libro alcanzó la respetable edad de #9 años) le corresponde el valor de 36563. Ese numero puede conocerlo utilizando la función CDbl sobre una variable tipo Date.148. "22/9". Cuando se tratan variables tipo Date. Nota para recordar de las variables tipo Date (No se extrañe que esta explicación la encuentre solamente en esta Guía del Estudiante) Visual Basic trata las fechas como números.variable = DatePart ("y". vbFirstFourDays) Pero lo mas fácil para el formato de fecha usado en España es meter la fecha entre comillas dobles. Si ejecutamos el código: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 31 . vbMonday.732.5 para las 12:00:00) con el valor de la función Timer para ese instante (45. pues el primer día de la semana era el domingo . Now. Y una composición Día / Hora también.000)) que representa el número de segundos transcurridos desde la 12 de la noche de ese día. ¿Que porqué ese día?.563. pero en ese caso debe estar expresada en el formato mm/dd/yy (mes/día/año).

firstdayofweek[.563 ‘ Para ver ese valor basta con hacer Label1. No lo usará con frecuencia. Para poner los números separados por millares : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 32 . dado que la fecha la guarda como un número. No le aclara mucho lo que se puede hacer con Format. primerasemanadelaño]]]) Lo mejor que puede hacer con esta definición de la sintaxis de Format es olvidarla. Si recurre a la ayuda de VB acerca de esta función se va a enterar muy poco de lo que puede dar de sí. "Standard") Variable = 123. y luego. lo tratará como un número Double. Por ejemplo la cifra 123456 se transformará en las siguientes expresiones. Centrémonos mas en el parámetro Formato. Con la expresión : FechadeHoy = Format (Now.Caption = CDbl (Pepe) Al estar Pepe declarada como variable tipo Date. debe reconocer el formato. es decir. firstweekofyear]]]) No se complique la vida con el tema del primer día de la semana ni la primera semana del año.456 Pts Variable = 123. el dato.00 Veamos ahora con un poco mas de conocimiento la sintaxis de Format Variable = Format (expresión[. VB busca todas las posibilidades de extraer una fecha (o una hora) del dato que le estamos metiendo. Si hubiésemos puesto la expresión FechadeHoy = Format (Now. que se refiere al día 21 de mayo de 1998. Veamos los principales. En cualquiera de estos casos. "Currency") Variable = Format(123456. “dd/mm/yy”) . la variable FechadeHoy contendría el valor 21/05/98 referido al día citado.456. Otra cosa ocurriría si la declarásemos como String o Variant. no importa en que formato le introduzcamos una fecha. formato[. “12 Julio 1999” De lo anterior se desprende una cosa. La sintaxis que presenta es : Format(expresión[. La función Format se usa para poner una fecha en un determinado formato.Dim Pepe as Date Pepe = “12 Julio 1999” ‘ A partir de ahora. Si ponemos que Fecha1 = “12/7/99” es idéntico a poner fecha1 = 12/07/1999 ó Fecha1 = 1999-07-12.”Formato”) para todos los ejemplos de números. Pepe contendría el literal introducido. Permite establecer el Formato de esa cadena. Access trata las fechas de idéntica forma. según como empleemos la función Format Variable = Format(123456. Primero para números Observe que usamos la expresión Variable = Format (1234567. Función FORMAT Esta función permite presentar cadenas numéricas o fechas de una determinada forma. Lo volveremos a ver cuando estudiemos las bases de datos. Puede tomar muchos valores. “yyyy-mm-dd”) la variable FechadeHoy tendrá el valor 1998-05-21. Pepe contendrá el valor 36. formato[. Eso sí. Las posibilidades de Format llegan también al campo de las cadenas numéricas. según el formato recomendado por la norma ISO-8601 para la presentación de fechas. primerdíadesemana[.

microsoft. La Administración Española está obligada a exigir su cumplimiento en todas aquellas aplicaciones que realicen intercambios de fecha y hora.567 (Cada carácter # indica que ahí va un número.00%) Usa notación científica (1. pondremos : FechaISO8601 = Format (Now. y queremos convertir esa fecha al formato ISO 8601. siempre entre comillas dobles : General Number Currency Fixed Standard Percent Scientific . en la WEB de Microsoft (www. "##. esta fecha puede ser un literal (un string).Variable = Format(1234567. o una variable tipo fecha Si en Text1 tenemos la expresión 12 Julio 1999.234.Text LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 33 .567. “yyyy-mm-dd”) Tenga presente esta recomendación.com) puede encontrar mas formatos posibles. Esta recomendación dice que el formato de fecha debe ponerse de la forma yyyy-mm-dd (p. 1998-10-05 para referirse al 5 de Octubre de 1998). Format dispone de mas opciones.00) Con separador de millares y dos decimales (1. Muestra el número tal como lo tecleó En formato de la moneda de su sistema operativo Sin separador de millar y dos decimales (1234567.###") Variable = 1.234. Pero vamos a volver con el tema de las variables tipo Date. Sería muy largo explicarlas aquí.e. eso si.###. “Formato”) siendo Now la fecha y hora actual (21/07/98 a las 22:16:00 ) General Date Long Date Medium Date Short Date yyyy-mm-dd yy-mm-dd Long Time Medium Time Short Time hh :mm :ss hh :mm 21/07/98 22:16:00 martes 21 de julio de 1998 21-jul-98 21/07/98 1998-05-21 98-07-21 22:19:53 10:20 PM 22:20 22 :21 :29 22 :21 RECOMENDACIÓN ISO 8601 Va como cultura general. Para este formato. Para mas información.00) Multiplica el número por cien y lo presenta cono porcentaje(123456700. El separador debe ser una coma.23E+06) Para fechas (Observe que usamos el ejemplo Format(Now. podemos hacerlo de cualquiera de estas dos formas: Private Sub LFormat1_Click() Dim Pepe As Date Pepe = Text1. Cuando realizamos el Format sobre una fecha. aunque esto depende del idioma que esté usando) Puede poner una de estas expresiones. no un punto.

LFormat1 = Format(Pepe. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 34 . "yyyy-mm-dd") End Sub Ó Private Sub LFormato2_Click() LFormato2 = Format(Text1. Si le metemos una fecha no hay problema (caso de meterle Pepe.Text) intenta obtener de esa cadena una fecha válida.Text. Pero si le metemos una cadena de caracteres (caso de Text1. Si lo consigue lo presenta. dará un error. Si no lo consigue. "yyyy-mm-dd") End Sub La función Format es suficientemente inteligente para darse cuenta que con el formato yyyymm-dd le estamos pidiendo una fecha. variable declarada como Date).

2) Podemos definir matrices de dimensión superior a dos. que el primero tiene el índice 1 y el último tiene el índice 25. primer apellido y segundo apellido del alumno. el primer apellido del alumno que ocupa el puesto número 15 de la clase. Q y R elementos en cada una de las dimensiones respectivamente. Podemos llegar a un máximo de 60 dimensiones. 1 To 3) As String De esta forma. 1 To M. El nombre asociado a cada uno de los elementos de la matriz puede ser: Alumno (n) Donde n es el número por orden de lista de ese alumno. Para hacer que una matriz comience a numerar por el 1 se debe definir mediante la instrucción: Option Base 1 que debe colocarse al comienzo del módulo o formulario donde declaremos la matriz. y que hay 25 elementos en esa matriz. especificando entre paréntesis el número de elementos que componen la matriz: Dim Alumno (25) as String Hemos declarado que la variable alumno es una cadena. 1 To Q. podemos declararla de la siguiente forma: Dim Alumno (1 To 25. el nombre de los alumnos de una clase) podemos utilizar una matriz. estamos ReDimensionando una matriz ya declarada. será el elemento: Alumno (15. Las matrices normalmente comienzan a numerar por el número 0. Pero imaginemos que queremos meter en la misma matriz el nombre. Para declarar la matriz se hace como con todas las variables. Como todos los elementos serán cadenas de caracteres. 1 To P. M. Necesitaremos declarar una matriz de 25 por 3. Este comienzo puede no ser el mas apropiado para la variable que estamos planteando. 1 To R) entendiendo que hay N. Una matriz también se puede declarar de la siguiente forma : Dim Alumno(1 To 25) as String Donde le decimos que la variable Alumno tiene 25 elementos. No se puede LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 35 . Esta matriz está formada por tantos elementos como alumnos tenga la clase.MATRICES __________ Cuando utilizamos varias variables que tienen un significado similar para nosotros. P. pues ningún alumno tiene el número de orden 0. Una matriz de 5 dimensiones se declararía: Dim Variable ( 1 To N. pero que son distintas (Por ejemplo. Una variable ya declarada como una matriz puede redimensionarse a lo largo del programa mediante la instrucción ReDim ReDim Alumno (1To 25) Mediante esta instrucción.

.. solamente podemos cambiar los elementos de la última dimensión : ReDim Preserve (1 To 5. Nos daría un error... Para evitar perder la información presente en la matriz. Si hubiésemos empleado ReDim Preserve. pero esa redimensión no puede afectar al número de dimensiones de la matriz. Si hubiésemos utilizado ReDim Preserve solamente podríamos haber usado la primera de las dos líneas anteriores : ReDim Preserve MiMatriz (1 To 5.. Por ejemplo. Si se redimensiona simplemente con el número de elementos : ReDim (25) le estamos diciendo que tiene 25 elementos. 1 To 30) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 36 ... Como podrá ver en la Ayuda de VB. NO es cierto del todo. independientemente de lo que hayamos puesto en OPTION BASE.. 1 To 9) a partir de ahora.redimensionar una matriz inexistente. 1 To 15..... 1 To 20) ReDim MiMatriz (1 To 25... si ha declarado la matriz con unas dimensiones determinadas.. Si usa la palabra clave Preserve en matrices de dimensión superior a 1. Una matriz puede redimensionarse cuantas veces se quiera a lo largo de la aplicación.. pero que el primero sea el 0 ó el 1 depende de haber puesto OPTION BASE 0 u OPTION BASE 1.. Le saldrá un error que dice que las dimensiones de la matriz ya han sido declaradas. 1 To 6) Observe que no solamente la hemos cambiado dos veces de dimensiones (la primera a 2 y la segunda a 3)... 1 To 9) pero ya no podríamos volver a cambiar el número de dimensiones con la segunda línea... Con ReDim podemos cambiar el número de elementos de cada dimensión cuantas veces queramos. Respecto a cambiar el número de dimensiones. usando ReDim Preserve sólo puede cambiar el tamaño de la última dimensión de matriz y no puede modificar en ningún momento el número de dimensiones. sino que también hemos cambiado el número de elementos en cada dimensión.. va a encontrarse con comportamientos no esperados. Si redimensionamos la matriz perderá la información existente... debe utilizar la sentencia ReDim Preserve. podemos redimensionar MiMatriz de las siguiente forma : ReDim MiMatriz (1 To 5.. ya no podrá cambiar las dimensiones ni con ReDim ni con ReDim Preserve. 1 To 30) . Mediante la declaración 1 To 25 le estamos diciendo que el primer elemento de la matriz es el 1. SÍ lo podrá hacer una sola vez. 1 To 9) ReDim MiMatriz (1 To 8. podríamos cambiar los elementos de todas las dimensiones de la matriz una vez : ReDim Preserve (1 To 5.. 1 To 20) ReDim Preserve (1 To 5. 1 To 9) ReDim MiMatriz (1 To 15. Pero si ha declarado la matriz sin dimensiones : Dim MiMatriz() puede cambiar las dimensiones y volver a cambiarlas ReDim MiMatriz (1 To 5.

es decir, no podremos hacer esto : ReDim Preserve (1 To 10, 1 To 30) donde se señala en negrita el error.

Esto no causa ningún error en una matriz de una dimensión, ya que si la matriz tiene sólo una dimensión, puede cambiar el tamaño de esa dimensión porque es la única y la última. Cuando a lo largo de la aplicación se va redimensionando una matriz, podemos llegar la circunstancia de que, en un momento determinado, no sepamos las dimensiones de esa matriz. Para conocer el índice máximo y mínimo de una matriz se usan las funciones UBound y LBound. UBound devuelve el mayor subíndice disponible para la dimensión indicada de una matriz. Sintaxis UBound(nombredelamatriz[, dimensión])

LBound devuelve el mayor subíndice disponible para la dimensión indicada de una matriz. Sintaxis LBound(nombredelamatriz[, dimensión])

Ejemplo Tengamos una matriz llamada Mimatriz, de tres dimensiones. En un momento de la aplicación se ejecutó la siguiente instrucción válida : ReDim Mimatriz (1 To 100, 0 To 3, 5 To 20) En otro momento queremos tener el control de los índices de esa matriz, y queremos averiguar el índice menor y mayor de cada una de sus dimensiones : (IID1= Indice Inferior Dimensión 1, ISD 1 = Indice Superior Dimensión 1, etc. ) IID 1= LBound (Mimatriz, 1) ISD1 = UBound (Mimatriz, 1) IID 2= LBound (Mimatriz, 2) ISD2 = UBound (Mimatriz, 2) IID 1= LBound (Mimatriz, 3) ISD1 = UBound (Mimatriz, 3) IID1 = 1 ISD1 = 100 IID1 = 0 ISD1 = 3 IID1 = 5 ISD1 = 20

Función Split
Una vez visto lo que es una matriz, vamos a ver una función interesante para el tratamiento de cadenas de caracteres. La función Split Descripción Esta función toma una cadena de caracteres compuesta varias subcadenas, separadas entre ellas mediante un separador, y devuelve una matriz de una dimensión, que contiene esas subcadenas. Sintaxis Donde: Expresion es la variable que contiene la cadena de caracteres de entrada Delimitador. Contiene el carácter o caracteres que se usan de delimitador entre subcadenas
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 37

Split (expresión[, delimitador[, contar[, comparar]]])

Contar es un número donde indicamos el número de subcadenas que queremos extraer. Si no se pone nada, extrae todas las cadenas. Si se pone un valor, extrae el número de cadenas que le indiquemos. En este caso, en la última cadena, mete el resto de subcadenas que quedaban sin meter. Comparar es un valor numérico que nos da cuatro opciones de comparación para comparar las subcadenas. Este parámetro es solamente para alumnos avanzados

Ejemplo.
En el siguiente ejemplo veremos como separar distintos datos que están dentro de un TextBox (Text1) separados entre ellos por una coma. Private Sub Command1_Click() Dim MiVariable() As String Dim I As Integer MiVariable = Split(Text1.Text, ",") For I = 0 To UBound(MiVariable) List1.AddItem MiVariable(I) Next I End Sub ‘Declaramos una matriz (MiVariable) del tipo String ‘Declaramos una variable auxiliar como numérica ‘Ejecutamos la función Split ‘Ejecutamos un bucle para introducir las subcadenas ‘en un ListBox

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 38

VISUAL BASIC
Tras esta pequeña introducción al lenguaje Basic ya estamos en disposición de encender el ordenador y comenzar a trabajar con Visual - Basic. Se supone que su PC tiene instalado el programa Visual Basic 6.0 Entre en el programa VB. Le aparecerá en pantalla algo similar a esto : (Para VB Vers. 6)

Fig. 1.2 Aspecto del entorno de desarrollo de aplicaciones VB Este es el comienzo del VB . Observe que en esta pantalla existen varias cosas. En la parte superior , la barra de título del programa Visual Basic, con el texto : Proyect1 - Microsoft Visual Basic (Diseño) Por debajo de esta barra de Título del VB, encontramos la barra de menú de VB, con las leyendas : Archivo Edición Ver Proyecto Formato Depuración Ejecutar Consulta Diagrama Herramientas Complementos Ventana Ayuda Por debajo de esta barra de menú tenemos la barra de herramientas, donde podrá ver varios iconos, que cada uno representa un determinada operación que Vd. puede realizar. Estas operaciones está todas en la línea de menú, y puede acceder a ellas abriendo los menús desplegables que existen en cada una de las palabras Archivo Edición Ver ...... de esta línea de menú. El hecho de colocar las operaciones mas usuales en un icono en la barra de herramientas se hace para mayor comodidad del usuario. A la izquierda o derecha de la pantalla tiene una caja rectangular con varias columnas de iconos. Esa caja es la Caja de Herramientas (No la confunda con la barra de herramientas de la parte superior)
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 39

Esta caja de herramientas es, salvando las distancias, lo mismo que una caja de herramientas real que pueda tener un mecánico para realizar su trabajo. En ella están los iconos que representan a los controles con los que Vd. va a desarrollar su aplicación VB. No están todos los que pueden estar, al igual que en una caja de herramientas de un mecánico no están todas las herramientas que puede usar. Están solamente las mas usuales. Si necesita alguna mas, puede cogerla de otra parte (barra de Menú, Proyecto | Componentes) y agregarlos a esa caja de herramientas, al igual que lo haría un mecánico con una herramienta especial, que la metería en su caja sólo cuando va a realizar un trabajo determinado para el que la necesite. Posiblemente esta caja de herramientas no le aparezca tal y como la ve en esta figura. Eso depende de la versión y la personalización. Para añadir un nuevo control haga click en Proyecto | Componentes y le aparecerá una caja con todos los controles existentes. Puede seleccionar nuevos controles para añadir a la caja de herramientas, marcando la casilla que está a la izquierda del nombre del control que quiere introducir. Una vez seleccionados todos los nuevos controles, haga click en APLICAR . Salga haciendo Click en ACEPTAR, y podrá observar que esos nuevos controles ya se le han añadido a la caja de herramientas. Esos controles le aparecerán cada vez que cargue el proyecto actual. No es prudente meter muchos controles en la caja. Ponga solamente los que necesite normalmente en sus aplicaciones. Ocupará menos memoria y tardará menos tiempo en cargar el programa VB. Además, cuando realice una aplicación y la distribuya una vez compilada, Visual Basic entregará en los disquetes de distribución las DLL’s u OCX’s correspondientes a todos los controles personalizados que Vd. tenga en la caja de herramientas, los necesite el programa o no los necesite. Esto le va a suponer que está cargando subprogramas inútiles en el ordenador destino de su aplicación. A la hora de compilar el programa (Crear archivo .EXE) quite todos los controles personalizados que no necesite su aplicación. (Sólo los controles personalizados. Los controles comunes - CommandButton, Label, TextBox, etc.-, no se pueden eliminar de la caja de herramientas) Para quitar controles de su caja de herramientas, debe proceder de forma análoga, a lo que hizo para meterlos en la caja de herramientas, pero al revés. No se preocupe a la hora de quitarlos. Si está utilizando un determinado control, VB no le dejará quitarlo. En el centro, y ocupando casi toda la pantalla, tenemos el Formulario. Este Formulario es la interface gráfica de su aplicación, sobre el que podrá añadir los controles que necesite. Lo veremos mas adelante con todo detalle. Puede tener dos ventanas más adosadas a la caja de herramientas, una denominada Ventana de Propiedades, donde puede ver las propiedades del formulario o de cualquier control que tenga dentro del proyecto, y otra, denominada Ventana de Proyecto, donde puede ver todos los formularios existentes. Existen otras ventanas, por ejemplo la Ventana de Depuración. Por cada formulario y cada control que introduzca en el proyecto, le aparecerá otra ventana, denominada Ventana de código. No se extrañe de que esta presentación gráfica del Visual Basic coincida con otros sistemas de desarrollo (Delphi, p.e.). La lógica de desarrollo de una aplicación en Windows ha llevado a varios fabricantes de software a utilizar un entorno gráfico similar (diríamos idéntico). A Visual basic le queda el orgullo de ser el primero en utilizarlo. (¡Y el mejor!) Con lo descrito anteriormente ya tenemos, al menos, fijado el argot con el que expresarnos para comenzar a estudiar el VISUAL BASIC. Veamos con un poco mas detalle la Ventana de Código.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 40

Fig. 1.3 Ventana de código Esta figura le muestra un Formulario con su ventana de código. Cada objeto gráfico de VB tiene su propia ventana de código. Así, si en este formulario hubiésemos introducido un Label y dos CommandButton, todos ellos tendrían su propia ventana de código. La ventana de código la podemos ver haciendo doble click sobre cualquier objeto de nuestro proyecto. En este caso hemos hecho doble click sobre el único objeto que teníamos : el formulario. Observe las dos cajas de la parte superior, uno con la inscripción Objeto : que en el momento que le sacamos la foto tenía Form, y el otro con la inscripción Proc : (procedimiento), que en el momento de la foto tenía Load. A estas cajas les denominamos Lista de Objetos y Lista de Procedimientos respectivamente. Haciendo click sobre la flecha de cada lista, se despliega un menú, en la lista de objetos se desplegará una lista con los nombres de cada objeto existente en ese momento dentro del formulario. Haciendo click sobre uno de los nombres, nos presentará la ventana de código de ese objeto. Todos los objetos gráficos (controles) existentes dentro de un formulario y el propio formulario aparecerán en la misma lista de objetos. Haciendo click sobre la flecha de la lista de procedimientos, se despliega la lista con todos los procedimientos posibles para ese objeto. Siempre saldrá uno. Si tenemos escrito código en uno de los procedimientos, saldrá por defecto ese procedimiento para el cual hemos escrito el código. Si no hay código en ninguno de los procedimientos, saldrá el que tenga por defecto cada objeto. Solamente nos queda por decir, para cerrar este capítulo, que es un procedimiento. Para ello vamos a explicar lo que es un evento. Un Evento es algo que le puede ocurrir a un objeto. En una interface gráfica, lo que le puede ocurrir a un objeto es que se le haga click, doble click, que se pase el cursor del ratón por encima, etc. Este es el Evento. El Procedimiento es la respuesta por parte de ese objeto, al evento que le está sucediendo. Esa respuesta, esa forma de Proceder del objeto al evento que le está sucediendo, debemos programarla según nuestras necesidades, es decir, debemos escribir el código que necesite nuestra aplicación como respuesta al evento que acaba de ocurrir. Posiblemente, no queramos ninguna respuesta a muchos de los eventos que pueden acaecer a un objeto. Cada objeto tiene muchos eventos y solamente queremos aprovechar los que nos interesan. Para que un evento no produzca ningún efecto, basta con dejar sin código el procedimiento correspondiente
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 41

a ese evento. En los eventos que queramos que realice alguna operación, le escribiremos en su procedimiento el código necesario para que esa operación se realice. Sin darnos cuenta, hemos comenzado a escribir el código de la aplicación. Observará que el primer elemento del menú desplegable de la lista de objetos se denomina General. Este no es en realidad ningún objeto, sino un apartado existente en cada formulario, que, al desplegar su lista de procedimientos tiene la sección de declaraciones, donde debemos declarar las variables que queremos que afecten a todo el formulario y sus controles, y tendrá además, los nombres de todos los procedimientos que introduzcamos (véase un poco mas adelante). En este menú desplegable de la lista de procedimientos del General verá con frecuencia cosas que Vd. no puso allí. Cosas tales como Command1_click, y en la ventana un determinado código. Esto ocurre cuando se borra algún control que tenía escrito código en alguno de sus procedimientos. Visual Basic sabe lo mucho que cuesta escribir el código asociado a un control. Si borramos un control de nuestro formulario accidentalmente, después de haber introducido todo el código asociado a él, Visual Basic nos sorprende con que ese código no lo tira inmediatamente, sino que lo reserva como un procedimiento en ese apartado General del formulario. Si en realidad queríamos borrar el control y todo su código, debemos quitarlo de ese apartado General de nuestro formulario, pues en realidad, si no lo queremos, no hará otra cosa que estorbar. Para quitarlo basta con borrar todo el código que aparece en la ventana de código cuando hacemos click sobre el nombre del control eliminado. Deberemos borrar todo el código, incluida la cabecera donde figura el nombre del control eliminado, y la parte final, que siempre termina con End Sub. El primer estorbo lo observará si crea otro control con el mismo nombre, cosa fácil ya que VB da un nombre por defecto a cada control (Command1, Command2....). El código asociado al control eliminado pasará automáticamente al nuevo control con el mismo nombre. Una aplicación puede tener todo su código escrito en los sucesivos procedimientos del formulario y de los controles que tenga ese formulario. Puede ocurrir que un determinado evento no esté entre los posibles eventos de los controles de nuestra aplicación. Piense por ejemplo, el evento de que la variable A sea igual a la variable B. No existe en ninguno de los controles ese procedimiento. No se preocupe, puede crear un procedimiento que se ejecute cuando su programa lo decida. Podemos añadir cuantos procedimientos queramos. Estos procedimientos se añaden al formulario, y deberán definirse por un nombre que Vd. debe elegir. Para que se ejecuten las instrucciones (código) incluido en ese procedimiento, basta simplemente con nombrarlo por ese nombre. Para insertar un procedimiento debe ir a la barra de menú, hacer click sobre Herramientas, y en el menú que le desplegará, volver a hacer click sobre Agregar Procedimiento. VB le presentará un cuadro donde le pedirá el nombre, si quiere que sea un procedimiento, una función o una propiedad. A lo largo del curso irá viendo que es cada cosa. Escribiendo el código en los sucesivos procedimientos, bien en los propios de cada objeto, bien en los procedimientos que vayamos creando, es posible completar la aplicación. Pero en una aplicación larga esta forma de escribir el código no sería la mas adecuada. Es mas, posiblemente sería demasiado engorroso escribirla de esta forma, y muy probablemente deberíamos escribir el mismo código para varios procedimientos, lo que alargaría inútilmente el programa y el tiempo de desarrollo. Para disponer de un sitio donde escribir parte (o la mayor parte) de su programa, puede introducir uno o varios módulos. Expliquemos lo que es un módulo. Un Módulo es una parte del programa donde solamente puede escribir código. Es igual que un formulario, sin interface gráfica. Un profesor de Visual Basic lo expresaba diciendo que un Módulo es un Formulario sin cara. En un módulo pueden existir procedimientos al igual que en los formularios, pero como un módulo no tiene interface gráfica, esos procedimientos debe introducirlos el programador tal y como explicamos un poco mas atrás. El módulo tiene su propia ventana de código, al igual que un formulario, con un objeto único, el apartado General. Aquí también tenemos la sección de declaraciones, al igual que los formularios. En esta
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 42

sección de declaraciones se comporta de manera similar a la de los formularios, pero permite algo que no nos permite la sección de declaraciones de un formulario : Declarar variables que se pueden utilizar en todo el programa. Esto ya lo ha visto mas atrás, con la sentencia de declaración Public. Los módulos se emplean para la declaración de variables globales, y para escribir el código de la aplicación que sea común a varios formularios. Esto nos evita tener que repetir código inútilmente. Ese código común se escribirá en un procedimiento que previamente habremos insertado en este módulo, y lo citaremos por su nombre desde cualquier parte del programa. Los procedimientos se pueden introducir en los módulos o en los formularios. Y les pasa lo mismo que a las variables en cuanto a su ámbito. Para agregar un procedimiento debe abrir una ventana de código (cualquiera) perteneciente al módulo o formulario donde quiera insertar ese módulo, y a continuación hacer click sobre Herramientas | Agregar Procedimiento de la Barra de Menú.

Fig. 1.4

Agregando un procedimiento

Nos aparecerá un cuadro donde le debemos poner el nombre de ese procedimiento y elegir el ámbito (Alcance en la figura) que le queremos dar, público o privado.

Fig. 1.5 Cuadro para agregar un procedimiento o función Si un procedimiento es público, se podrá acceder a él desde cualquier parte de la aplicación. Si es privado, solamente desde el módulo o formulario donde se ha introducido. ¿Cual es el nombre por el que podemos llamar a ese procedimiento? Sigue las mismas normas que para las variables. Si se ha declarado como público en un módulo, se le citará por su nombre cualquiera que sea la parte del programa desde donde le citemos.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 43

p.e.

CalculaGastos

Si se ha declarado como publico en un formulario, deberemos llamarle con el nombre del formulario, seguido del nombre del procedimiento separado por un punto p.e. Formulario1.CalculaGastos

Si se ha declarado como privado, se le llamará por el nombre, pero solamente desde el código del módulo o formulario donde se insertó, puesto que desde otro módulo o formulario no se verá. Fíjese en el punto usado como separador entre el nombre del formulario y el nombre del procedimiento. VB usa como separador un punto. Usa el separador para separar el nombre de un control y una de sus propiedades (Label1.Caption), para separar el nombre del formulario del nombre de uno de sus controles (Formulario1.label1.caption) Se irá familiarizando con la terminología VB según vayamos avanzando en el curso.

Call
En Visual Basic, para ejecutar un procedimiento no hace falta usar la sentencia Call, muy propia de otros lenguajes de programación. Hay programadores que la usan no sé si porque creen que es necesario, o porque piensan que queda más bonito. No hace falta pero VB lo soporta. Queda a gusto del programador usarla o no usarla.

Funciones Al igual que introducimos Procedimientos, podemos introducir Funciones en nuestra aplicación. Una Función es un Procedimiento al que le pasamos uno o varios parámetros. (O Ninguno) y nos devuelve un valor. Verá los Procedimientos y funciones mas adelante (Cap. 15). Al igual que los Procedimientos, pueden ser públicas (se verán en toda la aplicación) o privadas (se verán solamente en el formulario o módulo donde estén. Se introducen igual que los procedimientos, Main Merece la pena pararse un poco para estudiar el Procedimiento Main. Para verlo con mas detalle, comentaremos como comienza a trabajar una aplicación realizada en Visual Basic. Imaginemos una aplicación que tiene 3 Formularios. En cada uno de ellos tiene código. Lógicamente la aplicación tendrá que presentar uno de ellos en primer lugar. Deberemos decirle a Visual Basic cual es el formulario inicial, y será ese por el que empiece. En ese formulario dispondremos el código necesario para que la aplicación se ejecute en el orden deseado. Si hacemos click en la Barra de Menú de Visual Basic, en Proyecto | Propiedades obtendremos el siguiente cuadro de diálogo :

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 44

Fig. 1.6 Cuadro de propiedades del Proyecto Verá que tiene 5 pestañas, y actualmente tiene abierta la pestaña correspondiente a General, y tiene desplegada una lista donde nos pide el Formulario Inicial. En esa lista figura también la expresión Sub Main. Si ponemos como formulario inicial uno de los formularios, la aplicación comenzará por ese formulario. Si en uno de los Módulos existentes en el proyecto, ponemos un procedimiento llamado Main, podemos comenzar la ejecución de la aplicación justamente por ese procedimiento. En ese procedimiento pondremos el código necesario para que, posteriormente, se muestre uno de los formularios. Esto es muy practico cuando queremos hacer una función previa a mostrar cualquier formulario (abrir una base de datos, por ejemplo). Para comenzar la aplicación por Main se elige esa opción en la lista Formulario Inicial. ¡ Recuerde que Main debe estar en un Módulo ! El cuadro de diálogo anterior sirve además para otras cosas. Entre ellas poner el nombre del proyecto (nombre que no aparecerá por ninguna parte, solo en los datos internos de la aplicación) y su descripción. Existe otro cuadro parecido en Herramientas | Opciones donde puede terminar de completar las condiciones de trabajo. Observe el cuadro “Cuando Inicie sus programas”. Aquí le permite grabar el programa antes de ejecutar, cosa que le recomiendo para evitar que, al ejecutarlo, por un código mal puesto se le cuelgue el PC y tenga que volver a empezar. En este cuadro puede elegir también el formato de la ventana de trabajo formato del editor, etc.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 45

Fig. 1.7 Opciones del entorno de diseño En la pestaña Avanzado puede cambiar el entorno de trabajo. Le recomiendo el SDI. Si tenemos la activada la casilla Declaración de variables requerida nos pondrá automáticamente Option Explicit en el encabezamiento de todas las secciones de declaraciones de la aplicación. Está en la pestaña Editor (Esto es algo que le recomiendo de una forma especialmente rigurosa) Podemos elegir también las ventanas que queremos que estén siempre visibles, y que verifique automáticamente la sintaxis de una instrucción en el momento de escribirla. La pestaña de Editor nos permite fundamentalmente 2 cosas : Ver solamente el código correspondiente al procedimiento que estamos escribiendo ó Ver el código del Módulo (o Formulario) completo. En este último caso es un poco mas difícil de manejar la ventana de código, sobre todo si el programador no está muy habituado a ello. Le presenta procedimiento tras procedimiento, separados por una línea. Para seleccionar una u otra opción hay que seleccionar o deseleccionar la casilla Ver módulo completo. Cambiar el color de la letra y del fondo del código, según el tipo que sea (código, comentario, error devuelto, etc.). Los alumnos mas aventajados y con ganas de marear al profesor, conocen la forma de poner como invisible una parte del texto del código. Si observa comportamientos raros en el texto donde escribe el código, revise el cuadro de Colores de Código.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 46

Ejercicios del Capítulo 1
Nota acerca de los ejercicios de cada capítulo. Estos ejercicios se proponen a efectos académicos solamente, para facilitar al alumno la comprensión de lo explicado y estimular el autoaprendizaje. No son perfectos y seguramente existirá una forma mejor de realizarlos. No se ha pretendido crear programas perfectos, sino que muestren al alumno parte de lo explicado en el capítulo correspondiente. Se reúnen en el ejercicio Cap11 tres pequeños programas. Es importante que el alumno comprenda perfectamente como se ha programado cada una de las líneas. Son tan sencillos estos ejemplos que dan ganas de saltárselos. Evite esa tentación y vaya paso a paso camino de la perfección en la programación VB (Antesala de la gloria) entendiendo y sacando consecuencias de estos pequeños ejercicios. Habrá platos mas fuertes en pocos días. En la parte de conversión de números a cadenas de caracteres puede ver el comportamiento de la función Str para convertir números a cadenas de caracteres. Puede observar la longitud de la cadena resultante contiene un carácter mas de los que cabría esperar. En la etiqueta de desglose de caracteres, puede observar que el primer carácter es el 32 (espacio), carácter que se elimina al hacerle la función Trim En la sección de operadores lógicos puede jugar a aplicar uno de los operadores disponibles a una pareja de número o a un par de datos booleanos. Observe que para invertir los bits de un byte basta con hacer el Xor con 255 La tercera parte se parece mas a un programa real. Veamos un ejemplo de como se puede utilizar la función Xor. Explicaremos lo que es el Cifrado Xor (Se usó profusamente con los mensajes télex, con un sistema llamado cinta aleatoria. No entra en este curso explicar lo que era un teletipo. Era, al correo electrónico, lo que la máquina de vapor al AVE ) Este sistema de cifrado puede utilizarlo en sus aplicaciones para, por ejemplo, cifrar el Password de entrada y poder guardarlo cifrado en el disco duro de su PC. De cualquier forma, debo indicarle que este sistema de cifrado al tiempo que simple, es tremendamente vulnerable, pero si lo acompaña de otras características, lo convierte en un cifrador intrínsecamente seguro (Vigenere). La explicación mas detallada de algoritmos cifradores se sale por completo de la intención de este curso. Supongamos que queremos cifrar la palabra Secreto que es el Password de entrada para una aplicación. Deberemos usar otra palabra que cifrará a la anterior, que llamaremos Clave. La clave debe tener, al menos, tantos caracteres como la palabra a cifrar. Imaginemos que clave es ABCDEFGHIJK Para cifrar usamos la función Xor de cada una de las letras de Secreto con las correspondientes letras de la clave. (La primera letra de Secreto con la primera letra de la clave, la segunda con la segunda, etc.) Pero debemos efectuar la función Xor sobre un número, no sobre una letra. Por lo tanto convertiremos la letra en un número usando la función Asc Asc (A) = 65, ya que 65 es el número Ascii que corresponde a la A Para realizar el Xor del carácter introducido en la variable a, con el carácter introducido en la variable b haremos: Chr(Asc(a) Xor Asc(b)) De esta forma, si a = “S” y b = “A” estaremos haciendo Resultado = 83 Xor 65
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 47

Resultado = 18. que no tiene representación como una letra. El ejercicio Cap12 es un entrenamiento con fechas y formatos. Si A Xor B = C  A = B Xor C B = A Xor C No vamos a explicar profundamente el ejercicio. También tiene una parte dedicada a la conversión de números. etc. utilice DateDiff. Son ampliables por parte del alumno. Se sugiere al alumno que introduzca nuevos formatos.En este caso. Vamos a ver por qué Si representamos en binario el número 83 83 = 0 1 0 1 0 0 1 1 El número 65 es 65 = 0 1 0 0 0 0 0 1 Haciendo Xor bit a bit Resultado = 0 0 0 1 0 0 1 0 = 18 Luego el resultado de realizar el Xor entre S y A es el carácter 18. El alumno debe intentar comprender códigos sencillos como este. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 48 . El desentrañar el código de estos ejercicios puede ser una buena práctica para ello. Si ahora hacemos el Xor entre el resultado y la clave (18 con 65) 65 = 0 1 0 0 0 0 0 1 18 = 0 0 0 1 0 0 1 0 Resultado 2= 0 1 0 1 0 0 1 1 = 83 es decir la letra S Vemos que descifra usando la misma función que para cifrar . Verá en su trabajo profesional que es difícil meterse en la forma de programar de otra persona.

Tiempo de ejecución. los objetos de acceso a datos que veremos profusamente más adelante. Eventos. Y muchos de ellos tienen también Métodos Propiedades. es una aplicación de las típicas de Windows. es un evento el hecho de hacer click sobre ese control. bien por su forma o color. No podemos verlos porque pese a que son objetos VB. podemos cambiar el color de un control durante el diseño de la aplicación. el hecho de pasar el ratón por encima de él. el nombre de ese objeto es una de sus propiedades). En este caso hay que hacerlo con código escrito en el propio programa. Es decir. por su contenido. por ejemplo) y otros exclusivos de un determinado control (El evento Timer solamente lo tiene el control Timer) Puede ver los eventos de un control haciendo doble click sobre ese control en tiempo de diseño. Puede que una propiedad. por la forma en la que va a trabajar… Las propiedades pueden modificarse cuando estamos diseñando la interface gráfica. Son por ejemplo. se cambiará el color del control de nombre MiControl. Es cuando esa operación se realiza durante la ejecución del programa. PROCEDIMIENTOS Y METODOS Vamos a ver en este capítulo como podemos realizar una aplicación en Visual Basic. Le aparecerá la ventana de código. (se puede cambiar y se puede leer el valor de la propiedad). Es cuando realizamos una operación durante el diseño. Los objetos que tienen parte gráfica tienen además Eventos. Las propiedades pueden ser de lectura y escritura. Y esa interface gráfica está formada por un formulario y dentro de él. que es de lectura y escritura en tiempo de diseño. Comencemos por abajo. Tanto al formulario como a los controles les denominamos genéricamente Objetos. Hemos cambiado la propiedad BackColor de ese control en tiempo de ejecución. controles. Veamos ya dos definiciones que se repetirán profusamente a lo largo del curso Tiempo de diseño. generalmente. 2 OBJETOS VISUAL BASIC PROPIEDADES. Una aplicación VB es una aplicación que. sea sólo de lectura en tiempo de ejecución (esto es lo que le pasa por ejemplo. tiene una interface gráfica. Procedimientos y Métodos Típica pregunta de examen de VB elemental.Nombre) Un evento es todo aquello que le puede ocurrir a un objeto con parte gráfica (Control o Formulario) Por ejemplo. a la propiedad Name . accediendo a su propiedad BackColor en la caja de propiedades. unos de ellos comunes a casi todos los controles (Evento click. (Por ejemplo. mediante lo que llamamos caja de propiedades. Si tenemos una línea de código como esta MiControl.Visual Basic . Todos los objetos de Visual Basic tienen Propiedades. Los controles tienen muchos eventos. Las propiedades son aquellas características de un objeto que lo define "físicamente".0) al ejecutarse esa línea. Veamos que es cada una de estas cosas. sólo de lectura (solamente se puede leer el valor de la propiedad) ó solo de escritura (hay muy pocas de este tipo).Guía del Estudiante Cap. o durante la ejecución del programa. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 49 . Por ejemplo. el hecho de que un control cambie de tamaño…. no tienen ninguna representación en la ventana. Hay objetos VB que no los podemos ver en la interface gráfica.0.BackColor =RGB(255.

aparecerá la ventana de código dedicada a ese evento. uno que permite visualizar el código correspondiente a un solo evento. 1 si está pulsada. Cada programador tiene su costumbre para ver uno o todos. Nota.Fig. que se ejecuta cuando levantamos el botón del ratón (también existe el evento MouseDown). La práctica le dirá lo que es más práctico para Vd. Podría hacerse una aplicación que no tuviese mas código que el introducido en los procedimientos. 3=Central). El código introducido en la ventana de código del evento click será el procedimiento click. no pasa nada por ello. 2. (el de más a la izquierda) y otro que permiten ver en la misma ventana el código de todos los eventos. En el lenguaje coloquial es muy habitual ese error y como decíamos. No pretendo hacer escuela con definiciones. 0 si no está pulsada) y los valores X e Y de la posición del cursor del ratón. Se dice que pasa parámetros cuando el sistema aporta datos automáticamente al procedimiento. el que se introduzca en el evento MouseUp será el procedimiento MouseUp. Hay dos botones. Un Procedimiento es el código que introducimos dentro de un evento. una a la izquierda (sin desplegar) donde se ve el nombre del control del cual estamos visualizando el código (en este caso Command1) y otra a la derecha. Podemos ver los parámetros que pasa en la propia definición del procedimiento. puesto que el concepto de evento y procedimiento se confunde con mucha frecuencia. donde se despliegan todos los eventos que tiene ese control. si está pulsada la tecla mayúsculas (Shift. y muchas veces esa es la realidad. 2=Dcho. No se sorprenda si a lo largo de este libro nos referimos a evento o a procedimiento de forma equivocada. el procedimiento MouseUp. (1=Izdo. Puede ver que existen en ella dos listas desplegables. Haciendo click en la línea de uno de esos eventos. Fíjese en la parte inferior izquierda de la ventana de código. pasa los siguientes parámetros: Número del botón que se ha pulsado.1 Ventana de código La ventana de código es el lugar donde deberá escribir el código de su aplicación. Estos procedimientos forman parte del programa. y no pasa nada por ello. Por ejemplo. Un procedimiento puede pasar parámetros. que nos da Visual Basic LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 50 .

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 51 . Cuando en vez de introducir datos. en este cuadro gráfico que llamamos formulario. Si queremos escribir texto. y que queda definido el tipo de variable que es cada uno de ellos. cajas donde podemos elegir una u otra opción. podemos introducir textos escritos. X As Single. Posiblemente a lo largo de estos apuntes nos referiremos al formulario con el nombre de ventana. una ventana donde se reproducen exactamente los controles de operación de una máquina. Tendrá tiempo suficiente a lo largo del curso para verlas. (En el caso de una línea. Shift As Integer. El nombre de formulario le viene muy bien cuando ese formulario es una ventana donde vamos a introducir datos alfanuméricos. en el caso del circulo. Espero que le quede claro cada una de estas definiciones. y esa forma es FORMULARIO.. que tiene por defecto el nombre de Form1 El Formulario es un objeto. figuras. EL FORMULARIO El primer objeto Visual Basic con que nos encontramos es el FORMULARIO. como el puede ser el color de la línea o circulo. No necesitamos decirle como lo tiene que haver. que sirve de soporte de otros objetos. puesto que eso ya lo sabe hacer VB sin necesidad de que se lo expliquemos. Y As Single) End Sub Observe que los parámetros están entre paréntesis. etc. el radio y las coordenadas del centro. por ejemplo. En realidad un formulario es lo que normalmente conocemos por VENTANA.Private Sub Command1_MouseUp(Button As Integer. Por ejemplo. Un Método es una operación que la realiza Visual Basic sin necesidad de escribir código para realizarla. De alguna forma lo hay que llamar. utilizaremos el método Print. cajas donde podemos elegir una u otra opción . A eso le llamamos también pasarle parámetros. Pueden pedir parámetros optativos. Procuraremos usar el nombre apropiado: FORMULARIO. y dentro de muy poco tiempo le serán muy familiares estos conceptos. si queremos dibujar una línea en un formulario o en la impresora utilizaremos el método Line. el punto inicial y el final.. A los métodos les tenemos que pasar datos. lugares donde podemos escribir. al igual que un formulario de papel contiene textos escritos. Los métodos solo permiten introducir los parámetros que necesita el método para ejecutarse. parece en principio que sería mas correcto el nombre de "ventana". o incluso. De hecho. lo que tenemos es. El nombre de FORMULARIO lo toma precisamente porque. cada vez que iniciamos Visual Basic (VB) nos presenta en pantalla un nuevo formulario. figuras. pantalla.. lugares donde podemos escribir.. Si queremos dibujar una circunferencia usaremos el método Circle. Podemos usar ese valor dentro del código del procedimiento como un dato más.

Botones. un formulario tiene propiedades. Vamos a ver las propiedades del formulario. En este caso. Como cualquier objeto Visual Basic. pero solo veremos las que son específicas para un formulario.3 Un formulario que parece un equipo de radio (Programa realizado por el autor) Ejemplo de un formulario para una aplicación industrial. 2. parece que el nombre de ventana le viene mejor que el de formulario. que hacen la misma función que el botón real en el equipo de radio. en este caso las frecuencias de transmisión y recepción. Este formulario reproduce el panel de control de un transmisor . Aquí haremos referencia a esas LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 52 . y un par de displays. que muestran un texto.Fig.2 Forma inicial del formulario. procedimientos y métodos. Observe que dentro del formulario existen gran cantidad de objetos. El resto las podrá ver al final del capítulo. 2. Fig.receptor de radio.

No confundir Nombre (Name) con Título (Caption) Control Box Menú de Control en la parte sup. Puede cambiarse en tiempo de ejecución. Con este valor. Nota. no aparece dicho icono y por tanto no se puede desplegar dicho menú.11) para desplegar el menú de control de este formulario. Son igualmente propiedades booleanas. Caption Título Es el texto que aparecerá en la barra de Título cada vez que aparezca en pantalla este formulario. Nombre por defecto: Form1 (Form2 y sucesivos) Este nombre por defecto debe cambiarse. Si esta propiedad se pone como False. No se puede cambiar en tiempo de ejecución. MinButton MaxButton Valor por defecto: True Botones de minimizar y maximizar este formulario. barra de título y botones de maximizar y minimizar.propiedades con un asterisco (*) que significa que esa propiedad no tiene una notación especial para los formularios. y mediante el arrastre de uno de los bordes con el ratón. El programa no accede a este formulario por el título. Si esta propiedad es True. sino por el nombre. (debería cambiarse por norma en el momento de introducir el formulario). Se introduce en tiempo de diseño y no se puede variar durante la ejecución. PROPIEDADES. 3 . (Propiedad WindowState=2) el formulario no aparece. sí se pretende maximizar el formulario hijo. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 53 . BorderStyle Tipo de borde Define el tipo de borde que tendrá el formulario durante la ejecución.Fixed Dialog El formulario tendrá borde grueso. MinButton y MaxButton para poder maximizar el formulario hijo. 2-Sizable El formulario tendrá borde grueso. De no ponerlas a true. No puede tener los botones de maximizar ni minimizar. Deben configurarse de una u otra forma. ya que de no hacerlo corremos el riesgo de borrar el código existente de otro formulario del mismo nombre en el momento de guardar la aplicación. no aparecerá dicha flecha.Fixed Single El formulario tendrá un borde fino. es necesario poner a true las propiedades ControlBox. y se podrá cambiar su tamaño en tiempo de ejecución mediante los botones de maximizar y minimizar. NOTA. Si están en true. Valor por defecto : True Propiedad Booleana que admite los valores de true (verdadero) o False (Falso). Izda.None El formulario no tiene borde alrededor 1 . que admiten el valor True o False. No tiene otra función dentro del programa. Name Nombre Define al objeto durante la ejecución del programa. Seguiremos esta norma con todos los controles. En los formularios MDI child. Solo podrá cambiarse de tamaño utilizando estos botones. Admite los siguientes valores: 0 . dependiendo si se quiere minimizar / maximizar este formulario durante la ejecución. aparecerá en la esquina superior izquierda el icono (el "menos" en W-3. y no se podrá redimensionar durante la ejecución. el formulario puede tener un menú de control.. y no podrá cambiarse su tamaño durante el tiempo de ejecución. aparecerá la flecha correspondiente. Si están en False.

toma el color blanco Autoredraw Valor por defecto: False Propiedad Booleana. aparecerá sin reflejar ese cambio. Backcolor Color del fondo Establece el color del fondo del formulario. Imaginemos que en este formulario existe un texto. plano) y 1 (=3D) Si tiene el valor 1 (3D). Verá mas adelante los efectos de esta propiedad. Si esta propiedad Autoredraw está en False. El formulario no aparece en la barra de tareas de W95. El color de fondo se ve afectado al cambiar esta propiedad. DrawStile DrawWidth Enabled LSB (*) (*) (*) Valor por defecto : 0 Valor por defecto: 1 Visual Basic – Guía del Estudiante Capítulo 1 Página 54 . al hacer visible este formulario. En Windows 95 muestra el botón Cerrar. Valor por defecto: El establecido en el Panel de Control de Windows. El formulario no aparece en la barra de tareas de W95. Si se cambia a 3D. Si esta propiedad está en True.51 y anteriores se comporta como Fixed Single. el formulario aparecerá durante la ejecución como una superficie plana.Fixed ToolWindow En las versiones de 16 bits de Windows y Windows NT 3. y el texto de la barra de titulo aparece con un tamaño de fuente reducido. el fondo (Backcolor) toma el color definido en Windows en el Panel de Control. En W95 muestra el botón Cerrar y el texto de la barra de titulo aparece con un tamaño de fuente reducido. estando en True. permite actualizar el contenido del formulario y de sus controles incluso cuando no están visibles. 5 . y los controles que le introduzcamos a este formulario aparecerán como esculpidos dentro de él. Si se cambia a Flat. Con valor 0 (Flat) en esta propiedad. Appearance Apariencia Valor por defecto: 3D Admite los valores 0 (=Flat. Valor por defecto: 2 . aparecerá actualizado. Establece si un evento Paint vuelve a dibujar el objeto entero (True) o si solamente dibujan las partes que han sufrido cambios (False) DrawMode Establece un valor que determina el aspecto de la salida de un método gráfico o el aspecto de un control Shape o Line. el formulario aparecerá con cierto efecto tridimensional. No puede cambiar de tamaño.Sizable ToolWindow En las versiones de 16 bits se comporta como Sizable. que se haya cambiado por programa mientras este formulario no estaba visible. Pueden cambiarse a True posteriormente.4 . ClipControls Valor por defecto: False Propiedad Booleana. Puede cambiarse en tiempo de ejecución. las propiedades MaxButton y MinButton se ponen a False. Esta propiedad. Sizable Nota: Al cambiar a determinados valores.

Al seleccionar esta propiedad en la ventana de propiedades. En tiempo de diseño. Como valor de esta propiedad se le puede asignar directamente el icono o el nombre de un archivo (con su path correspondiente) que lo contiene. aparece un cuadro de dialogo donde se eligen ambos parámetros. Si el formulario es el formulario padre o formulario de inicio de una aplicación. si se pulsa una tecla. FontItalic.. la pantalla será para VB el objeto Screen). FontUnderline Height HelpContextID Icon Altura (*) Identificador de contexto de la Ayuda Icono (*) Esta propiedad define el icono que va a representar a este formulario cuando esté minimizado. y si éste no la procesa. sino que lo toma automáticamente de la posición que tenga el LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 55 . pasa esa pulsación al formulario.ForeColor Valor por defecto: Negro Establece el color del primer plano del formulario. (Lo verá mas adelante. la propiedad Font de estos controles tomará el valor que tenga esta propiedad en el Formulario. Esta propiedad la usará frecuentemente cuando quiera realizar alguna función pulsando una letra. Es el color que tendrán las letras si escribimos en él. Cuando un formulario tiene dentro de sí varios controles. este icono es el que toma el Asistente de Instalación para colocarlo como icono de apertura del programa en el grupo de programas Windows correspondiente. si lo que hacemos es dibujar. haciéndolo directamente sobre la caja de propiedades. determina el color de la rejilla. KeyPreview Valor por defecto: False Propiedad Booleana. Pone KeyPreview a True. o los dibujos. esa pulsación la recibe en primer lugar el control que esté activo. debe ponerse esta propiedad en True. y puede conocer que tecla se ha pulsado en el procedimiento KeyPress del formulario. Valor por defecto: el icono que se le haya programado en la personalización. Cuando introduzca nuevos controles en el Formulario. uno de ellos es el que está activo. En estas condiciones. FontTranparent Texto Transparente Valor por defecto: True Establece si el texto o gráfico de fondo del formulario se muestra (True) o no se muestra entre los caracteres de texto escritos en el propio formulario. Left Posición del Borde Izquierdo Indica la posición del borde izquierdo del formulario respecto a la parte izquierda de la pantalla. Para hacer que esa pulsación pase previamente por formulario. ese procedimiento no se ejecuta ya que la pulsación “no pasa” por el formulario. Normalmente no se introduce como valor numérico. FontStrikethru. Especifica el tipo y tamaño de la letra que se usará en el formulario al utilizar el método Print. Si la tiene a False. Puede servirle este pequeño truco para utilizar en todos los controles una determinada fuente sin tener que teclearla para cada control. FillStyle FillColor Font Tipo de relleno Color del relleno Tipo de letra (*) (*) Valor por defecto: El determinado en la personalización. FontSize Tamaño de letra (*) (*) FontBold.

Podemos elegir una cifra para el ancho y el alto del Formulario de forma que podamos controlar mejor las distintas posiciones que van a ocupar en él los controles. y si en estas condiciones queremos colocar un control o un dibujo justo en el medio del Formulario. para mover el formulario. que el Formulario mida 400 de ancho (ScaleWidth = 400) y 300 de alto (ScaleHeight = 300) forzándole estas propiedades. Podemos poner. independientemente de las dimensiones físicas que tenga sobre la pantalla. Observe que la propiedad ScaleMode se ha cambiado automáticamente a User (0) al introducir las dimensiones de ancho y alto que nosotros queremos. Puede tomar los siguiente valores: 0 . sabemos que tenemos que colocarle en las coordenadas 200. LinkMode Valor por defecto: 0 Permite que una aplicación destino inicie una conversación DDE con el formulario (origen de datos). en un Label o en un PictureBox de este Formulario.formulario en el tiempo de diseño.No hay interacción DDE 1 . las propiedades ScaleHeight y ScaleWidth nos vendrán dadas automáticamente dependiendo del ancho del Formulario. No se puede cambiar en tiempo de ejecución. por ejemplo. ¿Que unidad de medida estaremos utilizando entonces en el Formulario ? Unas definidas por el usuario (distintas para el ancho y el alto) que serán las necesarias para que el Formulario mida de ancho lo que le hayamos puesto en la propiedad ScaleWidth y de alto lo que le hayamos puesto en la propiedad ScaleHeight. medidos en la unidad que hemos elegido. Pulgadas (Inch) (5). bien en tiempo de diseño en la caja de propiedades. Pixel (3). cuando funciona como origen. los textos o los dibujos. medirá 400 de ancho y 300 de alto. Es por este tema por el que se debe llamar a este formulario cuando actúa de origen en una conversación DDE MDIChild Valor por defecto: False Establece que este formulario es un formulario Hijo dentro de un formulario MDI. Entonces sabemos que el formulario. Character (4). Acepta Twips (1). 150. Es una propiedad Booleana True = es formulario hijo MouseIcon MousePointer Picture (*) (*) Gráfico Valor por defecto: flecha False =No lo es Mediante esta propiedad podemos poner un gráfico como fondo del formulario.ICO ScaleHeight. Centímetros (7). El dato que se va a traspasar en esa comunicación DDE estará en un TextBox.Source. ScaleMode. Indican la unidad de medida de dimensión de altura y anchura del Formulario. El gráfico puede ser un bit-map o un fichero . LinkTopic Establece el tema al que este formulario va a responder a una conversación DDE. o en tiempo de ejecución mediante código. Puede cambiarse en tiempo de ejecución. Indica que este Formulario es origen de una comunicación DDE. Milímetros (6). Point(2). ScaleWidth. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 56 . Si colocamos la propiedad ScaleMode en cualquiera de estos valores. ScaleMode indica en qué unidades de medida se van a medir esas dimensiones. y no se extrañe si encuentra para estas propiedades valores tan peregrinos como 4815 y 7423. Al haber elegido la unidad de medida. los valores de ancho (ScaleWidth) y alto (ScaleHeight) serán los que tengan que ser.

expresan las coordenadas iniciales de la parte izquierda y de la parte superior respectivamente del Formulario.Maximizado El formulario aparece maximizado. Evento Click) y un procedimiento es el código escrito en ese evento. desde la esquina superior izquierda. Recuerde que un evento es lo que le puede ocurrir a un formulario o control (p. si está en “Normal” ocupará el mismo sitio que se dio en tiempo de diseño). ocupando toda la pantalla. Se medirán en su ancho y alto con la unidad de medida definida para el ancho y alto del Formulario. y ScaleHeight = 300. 1 . Como aclaración de las relaciones entre distintas unidades de medida. 1Pixel=15 Twips : 1 Charecter=240 Twips . Recuerde que las medidas de un formulario crecen. Los valores de Top y Left definen la esquina superior izquierda del Formulario. Visible Width WindowState Establece el estado en el que aparecerá el formulario cuando se activa y presenta en pantalla.Normal El formulario recupera la posición y tamaño que tenía en el tiempo de diseño. Si ponemos ahora las propiedades del Formulario ScaleLeft a 30 y ScaleTop a 10. que se ejecutará cuando ocurra el evento.e. pero estas propiedades se verán afectadas además por las propiedades ScaleLeft y ScaleTop del Formulario que se verán a continuación. Evento Activate Activación Ancho (*) (*) Valor por defecto: True LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 57 .52 Twips 1 cm=566 Twips Tag Top (*) Posición del borde superior Esta propiedad establece la posición del borde superior del formulario respecto a la parte superior de la pantalla (Objeto Screen). medidas en la unidad de medida elegida para el ancho y alto mediante las propiedades ScaleMode. variar la posición del Formulario. ScaleWidth y ScaleHeight anteriores. 2 . ScaleTop Estas propiedades.Estas unidades de medida afectarán a los controles que metamos en este Formulario. puede ver en la siguiente table la correspondencia entre cada una de ellas y la unidad imaginaria Twip. 1 Point=20 Twips . ese control.Minimizado El formulario aparece minimizado. Lógicamente también afectará a las propiedades Left y Top de los controles. Si colocamos un control justamente en el centro del Formulario tendrá sus propiedades Top =150 y Left=200. ScaleLeft. Admite tres opciones: 0 . las propiedades ScaleWidth = 400. Normalmente no se introduce como valor numérico sino que lo toma automáticamente de la posición que tenga el Formulario durante el tiempo de diseño Este valor puede cambiarse durante la ejecución para. según avanzamos hacia abajo y hacia la derecha. conjuntamente con Left. representado por su icono. Estas propiedades no afectan a la posición del Formulario en la pantalla (Si está maximizado seguirá ocupando toda la pantalla. Supongamos que se le asigna a un Formulario. EVENTOS DEL FORMULARIO Se explican a continuación los eventos de un formulario. 1 Inch (pulgada) =1440 Twips 1mm=56. para seguir en el centro del Formulario deberá tener sus propiedades Top a 160 (150 + 10) y Left a 230 (200 + 30).

Evento DragDrop Evento DragOver Evento GotFocus Acción de Soltar durante el Drag & Drop Pasar el ratón por encima en una operación de Drag & Drop El formulario obtiene el foco (*) (*) Este evento ocurre cuando el formulario toma el foco. No pasa parámetros. Existe una diferencia entre el evento click del formulario y el de cualquier control : en el formulario se ejecuta con cualquiera de los botones del ratón. y en los controles. Cosa un poco difícil. Este evento no pasa parámetros. Shift As Integer KeyCode es el código ASCII de la tecla pulsada. (Vea propiedad KeyPreview) Estos tres procedimientos son excluyentes y tienen la jerarquía con el orden siguiente: KeyDown. Evento Click Click Este evento se ejecuta cuando hacemos Click (con cualquier botón del ratón) en una parte del formulario que no esté ocupada por un control. Sólo uno de ellos puede ser el formulario activo. (Que no tenga código escrito en el evento MouseDown). esta segunda vez (y sucesivas) no se produce este evento Evento KeyDown Evento KeyPress Evento KeyUp Pulsar una tecla (Instante en que se ha pulsado) Pulsar una tecla Soltar una tecla (Instante en que se levanta) Estos tres eventos solamente se producirán en el formulario cuando la propiedad KeyPreview está a True. o que todos los controles existentes en el formulario y que puedan tomar el foco. Pasa los siguientes parámetros: KeyDown : KeyCode As Integer. Esto sucede múltiples veces cuando tenemos en el programa mas de un formulario. Si el procedimiento KeyDown tiene código que pueda realizar una operación. Este evento no se ejecuta si tenemos escrito código en el procedimiento Click. estén desactivados. No se suele usar este procedimiento. Si es el procedimiento KeyPress quien tiene el código que ejecuta una operación. Evento DblClick Doble click Este evento se ejecuta cuando hacemos doble click con cualquier botón del ratón sobre una parte del formulario que no esté ocupada por un control. KeyPress y KeyUp. Para que se ejecute el evento Click es necesario que no se ejecute el procedimiento MouseDown. ya que para que el formulario tome el foco debe ocurrir. No debe emplearse para los parámetros iniciales del formulario. no se ejecutará el KeyUp. o que no tenga ningún control capaz de tomar el foco. No pasa parámetros. Shift As Integer KeyPress : KeyAscii As Integer KeyUp : KeyCode As Integer.Este evento se ejecuta al convertirse el formulario en formulario activo. Evento Initialize Inicialización del formulario Se produce al cargar por primera vez el formulario. Para que realice esta exclusión es necesario que el código pueda realizar alguna operación. Evento Deactivate Desactivación Se produce cuando el formulario deja de ser el formulario activo. solamente con el botón izquierdo. KeyAscii es el código ASCII de la tecla pulsada. no se ejecutará el procedimiento KeyPress ni el KeyUp. Este procedimiento no pasa parámetros.Show). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 58 . Esto significa que si en una aplicación cargamos ese formulario una vez (la primera) se realiza este evento. Vea Activate. pero si descargamos el formulario (con Unload Formxx) y luego lo volvemos a cargar (con Formxx. Úsese para este fin el evento Load o el Initialize.

Por lo tanto es aquí donde suele LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 59 . Evento LostFocus Perder el foco Ocurre cuando el formulario pierde el foco. Se ejecuta después del evento Initialize del formulario.). teclado numérico. iniciar una operación de Drag & Drop manual. Evento MouseUp Soltar una tecla del ratón Este evento sucede cuando se levanta la tecla pulsada del ratón. Evento MouseMove Mover el ratón (Detecta la posición del ratón sobre el formulario) Se produce cada vez que se mueve el ratón sobre el formulario. siempre se usa con una condición (que esté pulsada la tecla de mayúsculas. abrir bases de datos. X e Y As Single. No es lo mismo. 1 = Izquierdo. tras el evento Resize. etc. 2 = Derecho. Pasa como parámetros Button (Botón pulsado. Cosa que no es fácil que ocurra. Una de ellas. No se confunda con el hecho de que el KeyCode de algunas teclas coincida con el KeyAscii. Evento Load Cargar el formulario Este evento es se ejecuta en el momento de la carga del formulario. Shift (Tecla de Mayúsculas) y la posición del puntero del ratón sobre el formulario (X e Y). etc. Alt. Puede aprovecharse para redibujar el contenido del formulario (de ahí su nombre) tras un cambio de tamaño.La diferencia entre KeyCode y KeyAscii es que el primero se refiere a las teclas del teclado (Todas las letras y números. Shift indica si está pulsada la tecla “Mayúsculas”. pero este evento Load. Y un formulario solo puede perder el foco cuando lo tenía. Es el que presenta en la ventana de código por defecto. 3= Central) Shift (Mayúsculas). Tenga cuidado al usar este evento. 3 = Central). Y es el mas usado porque es el mas apropiado para introducirle a ese formulario los valores y parámetros iniciales. Evento Paint Redibujar tras un cambio de tamaño Se produce al cambiar el tamaño del formulario. ya que cualquier movimiento del ratón lo va a desencadenar. 0 si no lo está. Vea el capítulo del DDE para mas detalles. estando el cursor encima de un punto del formulario libre de controles. usando la particularidad de que como pasa la tecla Shift como parámetro. Todavía estamos a tiempo de evitar que se descargue. excepto cuando se minimiza. Evento MouseDown Pulsar una tecla del ratón Ocurre cuando se pulsa cualquier botón del ratón.) mientras que KeyAscii solamente tiene valor cuando se pulsa una tecla de letra o número. que esté pulsado uno de los botones del ratón. uno de los mas usados en el formulario. Para introducir código de inicialización debe utilizar este evento Load. Shift As Integer. etc. No pasa parámetros Evento QueryUnload Confirmación de descarga Este procedimiento se ejecuta cuando el formulario recibe la instrucción de descargarse. al contrario que el Initialize. Contiene un 1 si está pulsada. F1 a F12. Evento LinkError Evento LinkExecute Evento LinkOpen Error de enlace Ejecución de un enlace de datos Romper el enlace Estos tres procedimientos ocurren cuando el formulario forma parte de un enlace DDE. Este evento puede usarse para muchas cosas. etc. Puede observar que el KeyCode de un número tecleado en el teclado numérico es distinto del KeyCode de ese mismo número pulsado en el teclado alfanumérico. tal como se explicó en el Evento GotFocus. Pasa como parámetros Button (Botón pulsado. Los parámetros que pasa son Button As Integer. Este evento no pasa parámetros. muy típica. 1 = Izdo. es decir. Por eso. puede obligarse a pulsar esa tecla para iniciar el D & D. X e Y (Single) como posición del puntero del ratón Este evento suele usarse para mostrar PopupMenús. evitando así cualquier activación accidental. 2 = Dcho. se ejecuta cada vez que cargamos el formulario. deshacer una operación iniciada con MouseDown.

guardar la configuración usada por la aplicación. para que vuelva a arrancar con la última configuración usada.) o con el comando Cerrar o el X del formulario. bien porque le cambia con las flechas del ratón arrastrando uno de sus bordes. Constante vbFormControlMenu vbFormCode vbAppWindows 2 vbAppTaskManager cerrando la vbFormMDIForm Valor 0 El usuario eligió el comando Cerrar del menú Control del formulario o hizo click en el X del mismo. Un formulario MDI hijo se está cerrando porque el formulario MDI padre también se está cerrando. 3 El Administrador de tareas de Microsoft Windows está 4 aplicación. al igual que lo hace QueryUnload. Aquí ya no podemos abortar la descarga. Unload ni Terminate. se detiene la descarga. Este procedimiento no se ejecuta cuando sale de la aplicación mediante la instrucción End. UnloadMode es un valor o constante que nos da el sistema. Este evento no se produce si sale de la aplicación con la instrucción End. Solamente se ejecuta cuando con la instrucción Unload. o con el comando Cerrar del menú Control del formulario. UnloadMode As Integer.colocarse una caja de mensaje donde se obliga al usuario a ratificar o revocar la orden de descarga del formulario. o con el comando Cerrar del menú Control del formulario. por ejemplo. o haciendo click en el X del mismo. Solamente podremos. después de QueryUnload y Unload. Pasa como parámetro Cancel. Este procedimiento no se ejecuta cuando sale de la aplicación mediante la instrucción End. Solamente se ejecuta cuando con la instrucción Unload. En caso de que en realidad no queramos descargarlo. No pasa parámetros. Evento Unload Descargar el formulario Este evento se produce en el momento en el que se descarga el formulario. Cancel es un parámetro que debemos introducir para abortar la descarga del formulario. Evento Resize Cambio de tamaño Se ejecuta cuando cambia el tamaño del Formulario. Si se pone a un valor distinto de 0. bien porque lo maximizamos. La sesión actual del entorno operativo Microsoft Windows está finalizando. p. dependiendo de la causa que ha provocado la descarga del formulario. Eventos del OLE LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 60 . Puede usar este evento para redistribuir o cambiar el tamaño de los controles. El evento QueryUnload se utiliza con frecuencia para guardar la configuración actual de la aplicación. ponemos a tamaño intermedio o minimizamos. Me permito recomendarle que No termine sus aplicaciones mediante End. Evento Terminate Este evento se produce al descargar el formulario. Es la última oportunidad de cancelar la descarga del formulario. No podrá usar los eventos QueryUnload.e. basta con poner Cancel = True (o Cancel = 1) y no se producirá la descarga. o haciendo click en el X del mismo. haciendo Cancel = True o Cancel = cualquier valor distinto de 0. Pasa como parámetros Cancel As Integer. 1 Se invocó la instrucción Unload desde el código. Solamente si lo hace mediante Unload (Unload Me.

hecha al final del capítulo) PROPIEDADES Name Nombre(*) Caption Título (*) Es el texto que aparece en el botón. COMMAND BUTTON BOTON DE COMANDO El Command Button es un objeto que sirve para introducir datos a través de la pantalla. DataFormat As Integer) Evento OLEStartDrag (Data As DataObject. Effect As Long. se pueden colocar los objetos (controles) que forman parte de la aplicación. Los controles. Se elige el nuevo control. No se deben introducir mas controles de los necesarios. Estos puntos nos permiten variar su tamaño en tiempo de diseño. El tamaño puede cambiarse a voluntad. State As Integer) Evento OLEGiveFeedback (Effect As Long. uno de ellos (el Command2) marcado con unos puntos en su contorno. Si tiene metido en la caja de herramientas un control que no necesita. Shift As _ Integer. DefaultCursors As Boolean) Evento OLESetData (Data As DataObject. Button As Integer. Sobre todo. Estos controles se irán viendo en próximos capítulos. AllowedEffects As Long) LOS CONTROLES MAS ELEMENTALES DE VISUAL BASIC Una vez introducido un Formulario. (Las propiedades marcadas con (*) no varían de la descripción general. Effect As Long. De momento se enumeran con los parámetros que pasan. Y As Single) Evento OLEDragOver (Data As DataObject. Evento OLECompleteDrag (Effect As Long) Evento OLEDragDrop (Data As DataObject. basta con “tomarlo” de la caja de herramientas existente en la parte izquierda de la pantalla de VB y llevarlo al Formulario. cuando vaya a compilar el proyecto. X As Single. lo introducirá en los discos de distribución igual que si lo necesitara. Este control ya pasa a la caja de herramientas. Puede cambiarse en tiempo de ejecución. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 61 . Procedimientos y Métodos. Para colocar un control en un Formulario. marcando la caja de opción a la izquierda de su nombre. o para validar cualquier operación. El Botón de Comando tiene la siguiente forma: El botón de comando puede usarse para la entrada de datos con el ratón. y haciendo click en ACEPTAR. Button As Integer. tienen Propiedades. Shift As _ Integer. deberemos ir a “cogerlo” a Proyecto | Componentes de la barra de menú de VB. No tiene otra función dentro del programa.Existen varios eventos relacionados con el OLE de Windows. lo mismo que el Formulario. X As Single. Y As Single. Se estudiarán cuando se estudie el OLE. pero la forma siempre es rectangular. Si no existiese el control deseado en la caja de herramientas. También puede cambiarse su tamaño y posición en tiempo de ejecución. En la figura anterior vemos dos botones de comando.

DownPicture Estas propiedades solamente están disponibles cuando se pone la propiedad Style a Graphycal. esta propiedad solamente controla el color de un pequeño cuadrado que aparece rodeando el título.Appearance Apariencia (*) Backcolor Color de fondo (*) Esta propiedad permite cambiar el color del botón cuando la propiedad Style está puesta a Graphycal. Default Establece un valor que determina el control CommandButton que es el botón de comando predeterminado de un formulario. Al hacer click sobre el botón de comando. KeyPress o KeyUp) de la tecla ENTRAR a menos que el usuario haya movido el enfoque a otro botón de comando del mismo formulario. Sólo un botón de comando de un formulario puede ser el botón de comando predeterminado. el usuario puede elegir el botón de comando (invocando su evento Click) presionando ENTRAR. Permiten poner un icono diferente para el estado de deshabilitación del botón (Cuando está la propiedad Enabled = False) o cuando el botón está pulsado respectivamente. Es una propiedad booleana. se ejecutará el evento validate de ese control que acaba de perder el foco. Causes Validation Esta propiedad habilita o deshabilita la ejecución del evento Validate del control que tenía el foco antes de cambiar el foco a este control. DisabledPicture. al presionar ENTRAR se elige el botón de comando que tiene el enfoque en lugar del botón de comando predeterminado. El evento Validate de un control se ejecuta inmediatamente antes de que pierda el foco. y admite los valores True o False. no se ejecutará. (Se dice que un control tiene el foco cuando es ese control el que está activado). Puede utilizar la propiedad Cancel para dar al usuario la opción de cancelar los cambios que no se han hecho efectivos y devolver el formulario a su estado anterior. En un formulario sólo puede haber un botón de comando con la propiedad Cancel = True. Cuando la propiedad Default del botón de comando está establecida a True y su formulario primario está activo. DragIcon DragMode Enabled Font Height HelpContextID Index LSB Icono en la operación de arrastre Modo de iniciar el Drag & Drop Habilitado Fuente Altura (*) (*) (*) (*) (*) Número de Contexto para la Ayuda Indice (*) Capítulo 1 (*) Visual Basic – Guía del Estudiante Página 62 . Cancel Establece un valor que indica si un botón de comando es el botón Cancelar de un formulario. Cualquier otro control que tuviera el enfoque no recibe evento de teclado (KeyDown. Puede cambiarse en tiempo de ejecución. Juntamente con la propiedad Picture permite hacer un juego de imágenes sobre el botón que varían de acuerdo a su estado o posición. Observe que esta propiedad afecta a un control diferente del que ostenta la propiedad. siempre habrá algún control que pierda el foco para que lo tome el botón de comando. Si la propiedad Style esta puesta a Standars. En este caso. Si está a false. Si el botón de comando tiene la propiedad Causes Validation a True. se define automáticamente a False para el resto de los botones de comando del formulario. Cuando Default se define a True para un botón de comando.

Solamente está disponible cuando la propiedad Style está puesta a Graphical. (*) MaskColor Establece cual es el color de la imagen del botón que actuará como máscara para producir zonas transparentes.Left Posición de su parte izquierda. Pone un icono sobre el botón. Style Define el estilo del botón. Windows 95) (*) (*) (*) (*) (*) (*) (*) (*) WhatsThisHelpID Width Ancho PROCEDIMIENTOS DEL BOTON DE COMANDO Click KeyDown MouseDown DragDrop KeyPress MouseMove DragOver KeyUp MouseUp GotFocus LostFocus ¡ El botón de Comando no tiene el procedimiento DbClick ! LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 63 . Para ello. UseMaskColor Determina si el color asignado en la propiedad MaskColor se usa como máscara para crear zonas transparentes. DownPicture o DisabledPicture. Poniendo esta propiedad a Graphycal podemos cambiar el color del botón 8con la propiedad Backcolor) e incluso introducir un fráfico (en la propiedad Picture. No he sido capaz de sacar partido a esta propiedad. la propiedad UseMaskColor debe estar a true. TabIndex TabStop Tag ToolTipText Top Visible Nº de orden para tabulador Sale del control de la tecla TAB Valor auxiliar Etiqueta de información (W95) Posición de la parte superior Visible (Propiedad. (¡) MouseIcon Icono para el puntero del ratón (*) (*) MousePointer Puntero ratón Picture. aceptando dos valores: Graphycal y Standard.

y el texto justificado a la izquierda. y eligiendo con borde en esta propiedad. Se ha incluido la trama para poder observar los límites de la etiqueta sin borde. el color o Picture del formulario. a la derecha o centrado. el tamaño de la etiqueta se ajusta al tamaño del texto de su propiedad Caption Backcolor BackStyle Color de fondo Tipo de fondo (*) Opaco o transparente. Cuando se selecciona transparente. La etiqueta debe usarse en aquellos casos en los que exista una información estática o dinámica que no deba ser cambiada por el operador. Caption DataSource Título DataField (*) Establecen el control data asociado y el campo de la base de datos que se presentará en la LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 64 . (*) Autosize Si está a True. En caso de haber elegido en la propiedad Appearance el modo tridimensional. Cuando se selecciona opaco. a la derecha. o se centra sobre la etiqueta. borde plano o sin borde. Puede adoptar estas formas: con borde tridimensional. este texto se vé sobre un fondo gris. dejando ver como fondo entre las letras. BorderStyle Tipo de borde Sin borde o con borde. el aspecto adopta una forma como incrustada en el formulario. se ve solamente el texto de la etiqueta. Appearance Apariencia Plana o tridimensional. PROPIEDADES Alignment Justificación Establece si el texto se justifica a la izquierda.LABEL ETIQUETA Una etiqueta es un control que nos permite presentar un texto.

Devuelve o establece un valor que indica si al incluir el signo (&) en el texto de la propiedad Caption del control Label se define una tecla de acceso. Se verán con mas detalle al estudiar los enlaces DDE MouseIcon Top MousePointer (*) Name TabIndex Tag ToolTipText UseMneumonic Es una propiedad Booleana. True El control Label se expande o contrae horizontal y verticalmente para adaptarse al texto y al tamaño de la fuente. Visible WordWrap Devuelve o establece un valor que indica si un control Label con el valor True en su propiedad AutoSize se expande vertical u horizontalmente para adaptarse al texto especificado en su propiedad Caption. con la ayuda de un control Data (Se verá mas adelante) DragIcon Index DragMode Left Enabled (*) Font ForeColor Height LinkItem LinkMode LinkTimeout LinkTopic Estas propiedades establecen la forma en que debe llevarse a cabo una conexión DDE con otra aplicación. al presionar ALT+ la tecla de acceso definida en la propiedad Caption del control Label. independientemente del tamaño del control Label y del valor de la propiedad WordWrap. Estas propiedades permiten presentar los datos de una Base de Datos mediante un procedimiento muy sencillo. Nota Si se establece False en AutoSize. En tiempo de ejecución. Es una propiedad Booleana. El signo (&) no aparece en el Caption del control Label. Los valores que puede tomar son True o False.propiedad Caption. PROCEDIMIENTOS DEL LABEL Click DragOver Change LinkClose DbClick LinkError DragDrop LinkNotify WhatsThisHelpID Width (*) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 65 . ya que el control Label no se expande en ninguna dirección. Contempla para la expansión horizontal la colocación de los espacios del texto. el enfoque se desplaza al control siguiente al control Label en el orden de tabulación. True (Predeterminado) Los caracteres (&) que aparezcan en el texto de la propiedad Caption definen al carácter siguiente como tecla de acceso. el control Label se expande o contrae horizontalmente para adaptarse a la longitud del texto y verticalmente para adaptarse al tamaño de la fuente y al número de líneas. el texto siempre se ajustará a la línea siguiente. False Los caracteres (&) que aparezcan en el texto de la propiedad Caption aparecen como tales en el Caption del control Label. Esto puede ocultar parte del texto. False (Predeterminado) El texto no se ajusta a la siguiente línea.

basta con conseguir que esa caja de texto tenga el foco y teclear el texto en el teclado. Si la propiedad Multiline está a False. La caja de texto no se debe usar nunca para presentar textos que el operador de la aplicación no deba cambiar. bien con la tecla TAB. ignorándose en caso contrario. bien haciendo click con el ratón en esa caja de texto. DataField Nombre de un Campo DataSource Nombre de un control Data Establecen el control Data y el campo donde está el texto que se llevará a la propiedad Text. En caso de haber elegido en la propiedad Appearance el modo tridimensional. Es por tanto un control bidireccional. Las cajas de texto pueden tener una o varias líneas. Esto se puede lograr. control no bidireccional. o se centra sobre la etiqueta. Esta propiedad no puede cambiarse en tiempo de ejecución. La capacidad máxima de una caja de textos es de 64 Kbytes. el aspecto adopta una forma como incrustada en el formulario. que además tiene la ventaja de ocupar menos memoria de programa. permite colocar el texto justificado a la derecha cuando ese texto puede ser de varias líneas. Esta propiedad solamente tiene efecto cuando la propiedad Multiline está a True. Es decir. La forma de una caja de texto es la siguiente. según esté la propiedad Multiline. se justifica siempre a la izquierda. Úsese para ello la etiqueta. o para la presentación de aquellos que el operador pueda cambiar. pero sí puede leerse en que condición está. Para cambiar o escribir un texto en una caja de texto. Appearance Backcolor (*) BorderStyle Tipo de borde Sin borde o con borde. y eligiendo con borde en esta propiedad. a la derecha. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 66 .TEXT BOX CAJA DE TEXTO Las cajas de texto son los controles en los que Visual Basic presenta o introduce textos. Normalmente se usan para introdución de textos. dependiendo de las propiedades BorderStyle y Appearance: PROPIEDADES Alignment Justificación Establece si el texto se justifica a la izquierda. bien por programa.

Cuando se pone esta propiedad a True. cambiando la propiedad Text. cambiar. es conveniente que no se pueda leer lo que se escribe en la caja de texto. se pueden colocar barras de desplazamiento del texto hacia arriba y abajo.Estas propiedades permiten presentar de una forma muy sencilla datos de una Base de Datos. MaxLenght Indica. Esta propiedad puede tomar los siguiente valores : 0 .No salen barras 1 . puede cambiarse el texto mediante teclado.Barras de desplazamiento horizontal 2 . Si no se establece o si se pone valor 0.Ambas barras. El texto que tenga en la propiedad Text no cambia por el hecho de presentar en pantalla un carácter distinto. No se puede escribir el él ni pasarle el foco. Esta propiedad nos permite indicar un carácter que sustituye a cualquier carácter que tenga la caja de texto. caso por ejemplo de la entrada de un password o palabra de paso.Barras de desplazamiento vertical 3 . o hacia los lados. MouseIcon Puntero del ratón personalizado (*) MousePointer Puntero ratón Lo típico para esta propiedad es el I-Beam (barra vertical) Name Nombre(*) PasswordChar En ocasiones. no tienen efecto los eventos que se produzcan sobre el TextBox. Se verán con mas detalle al estudiar los enlaces DDE Locked Establece si el texto se puede editar. Puede ser una buena alternativa para impedir que el usuario pueda cambiar un determinado texto. Esto nos permite tener una caja de texto de tamaño reducido y poder leer en ella un texto mayor que la propia caja. pero sí se le puede cambiar el texto mediante el programa. pero no puede variarse tecleando un nuevo texto. ScrollBars Cuando la propiedad Multiline de la caja de texto está a True. TabIndex LSB Tag (*) Capítulo 1 Página 67 Visual Basic – Guía del Estudiante . Se puede cambiar por programa. e incluso copiarlo al portapapeles. Se verán cuando se estudie el control Data y el motor de bases de datos DragIcon DragMode (*) Enabled Habilitado Propiedad Booleana que habilita o deshabilita la etiqueta Cuando está deshabilitado (Enabled = False). (Típicos el * o ?). Font ForeColor Height HelpContextID Index Left (*) LinkItem LinkMode LinkTimeout LinkTopic Estas propiedades establecen la forma en que debe llevarse a cabo una conexión DDE con otra aplicación. la longitud máxima del texto. permite cualquier longitud de texto. Esta propiedad puede cambiarse en tiempo de ejecución.PasswordChar = “” La propiedad PasswordChar se ignora cuando la propiedad Multiline está a True. Si está en False. el texto existente en la caja puede resaltarse con el ratón. Para quitar el PasswordChar basta con forzarlo al carácter nulo : Text1. si se establece. es decir. Esta propiedad puede variarse en tiempo de ejecución.

ni los controles que contiene. También puede utilizar un Frame para subdividir un formulario funcionalmente por ejemplo. se pone la propiedad Visible del Frame a True y se verán todos los controles que tiene dentro. Top Visible WhatsThisHelpID Width (*) PROCEDIMIENTOS DE LA CAJA DE TEXTO Click KeyDown Change KeyPress DblClick KeyUp DragDrop LinkClose DragOver GotFocus FRAME RECUADRO Se obtiene directamente de la caja de herramientas Tiene la siguiente forma : Un control Frame proporciona un agrupamiento identificable para controles. Para agrupar controles. aunque físicamente esté dentro de el. Los controles Frame se utilizan para poner dentro de ellos diversos controles. los controles interiores al Frame quedan también invisibles. Su equivalente es la propiedad Text que es el texto que tiene en su interior. y hacemos invisible al Frame. el control se colocará sobre el Frame. Página 68 Visual Basic – Guía del Estudiante . De este modo podrá mover al mismo tiempo el Frame y los controles que contiene. pero no pertenecerá a el. Si no se cumple esa condición. si es un OptionButton este se comportará como si estuviese fuera del Frame. Appearance LSB Backcolor Capítulo 1 Caption (*). para separar grupos de controles OptionButton. intenta moverlo dentro de éste. se pone la propiedad Visible del Frame a False y no se verá ni el Frame. que solo aparecerán en el programa cuando se cumpla una determinada condición. PROPIEDADES Las señaladas con (*) no presentan novedades respecto a las ya comentadas para los controles precedentes. Es decir. en primer lugar trace el control Frame y. Cuando esa condición se cumpla. Cuando un control Frame tiene dentro otros controles. a continuación. a continuación. meta los controles dentro de Frame.Text Texto La caja de texto no tiene la propiedad Caption. mediante su propiedad Visible = False. Si traza un control fuera del Frame y.

tanto los procedimientos asociados al propio control Frame como todos los controles dentro del Frame estarán inhabilitados.ClipControls Si esta propiedad está a True. Si esta propiedad está a False dibujarán solamente las áreas últimamente expuestas. En tiempo de ejecución. DragIcon DragMode (*) Enabled Cuando esta propiedad está a False. WhatsThisHelpID Width (*) PROCEDIMIENTOS DEL FRAME Click MouseMove DblClick MouseUp DragDrop DragOver MouseDown LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 69 . esta propiedad es de sólo lectura. Font (*) ForeColor Color de las letras del título del Frame. Height HelpContextID MousePointer Name TabIndex Index Tag Left Top MouseIcon (*) Visible Cuando un Frame está con la propiedad Visible = False. los métodos gráficos en eventos Paint vuelven a dibujar el objeto entero. todos ellos están habilitados. Si esta propiedad está a True. tanto el propio Frame como todos los controles interiores a el serán invisibles. Antes del evento Paint se crea una zona de recorte alrededor de los controles no gráficos del formulario.

Generalmente. dibuje dentro los controles OptionButton. un control PictureBox o un formulario. existen tres grupos de OptionButton. se puede seleccionar cualquier número de controles CheckBox. Aunque puede parecer que los controles OptionButton y CheckBox funcionan de forma similar. y el otro grupo está en el formulario. Una X en una casilla de verificación indica que está seleccionada. activada. o con valor True.CHECK BUTTON OPCION) Y OPTION BUTTON (BOTONES DE ELECCION Y Se obtienen directamente de la caja de herramientas. Otro grupo está en el interior de un control Frame. los otros controles del mismo grupo OptionButton dejan de estas disponibles automáticamente. pero interiormente al grupo solamente puede LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 70 . Los tres grupos son independientes entre sí. permite elegir una opción (activada/desactivada. a continuación. Todos los controles OptionButton que están dentro del mismo contenedor actúan como un solo grupo. dibuje en primer lugar el Frame o PictureBox y. Los controles OptionButton se agrupan dibujándolos dentro de un contenedor como un control Frame. Para agrupar controles OptionButton en un Frame o PictureBox. uno en un PictureBox. True/False) que el usuario puede establecer o anular haciendo click. como contenedor de controles OptionButton. Dada la similitud de ambos controles. a voluntad del operador. hay una diferencia importante: Cuando un usuario selecciona un OptionButton. que actúa. e independientes de los controles OptionButton de otros grupos distintos. o casilla de verificación. los controles OptionButton se utilizan en un grupo de opciones para mostrar opciones de las cuales el usuario sólo puede seleccionar una. En el ejemplo de la figura. Por contraste. se comentan conjuntamente. Cada casilla de verificación es independiente de las demás que puedan existir en el formulario. pero con dependencia del estado de otros controles OptionButton que existan en el formulario. pudiendo tomar cada una de ellas el valor True o False. al tiempo que como cuadro de imagen. El control CheckBox. Un control OptionButton muestra una opción que se puede activar o desactivar.

Left Justify 1 . Para el OptionButton podemos utilizar indistintamente las siguiente formas : Option1. Atención. podemos utilizar tanto Value = 0 como Value = False. no al tamaño del botón. En este caso.Value = True Option1. Mediante esta propiedad. La altura del control solamente afecta a la colocación del Titulo (Puede ponerse un título largo en varias líneas). justificado a la izquierda. cuando lo que se quiere es poner la propiedad a True hay una diferencia entre ambos controles. Presenta una diferencia entre uno y otro control respecto a la forma de expresarse respecto a su valor cuando está seleccionado. caso que el cuerpo total del control se haya hecho mas largo que la palabra del título. que como puede verse. pegado a la figura del botón. es decir. el título del control aparece a la derecha del botón. HelpContextID TabIndex Index TabStop Left Tag MouseIcon Top MousePointer (*) Name Value Común a ambos controles El valor de esta propiedad indica si el control está seleccionado (Value = 1) o no seleccionado (Value = 0 ó Value = False). no tiene porqué aparecer con su parte derecha pegado al botón. Appearance Backcolor Caption (*). podemos tanto forzar el valor como leerlo. Para forzar que el control NO esté seleccionado. comenzando en la parte izquierda del cuerpo total del control. Para el CheckBox solamente se podrá usar para este propósito la instrucción : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 71 . Al igual que en los controles Label y TextBox esta propiedad nos permite visualizar datos de una base de datos de una forma muy sencilla. DataField DataSource Propiedades del CheckBox solamente. Admite los siguientes valores : 0 . Cuando se elige el valor 1. se pueden seleccionar los que se desee. Establecen el control Data asociado y el campo donde están los datos (True / False) que se llevarán a la propiedad Value . Esta propiedad puede cambiarse en tiempo de ejecución. sin ningún tipo de exclusión entre ellos. que es invariable.Value = 1 Con cualquiera de ellas seleccionaremos ese control por programa. Alignment Común a ambos controles. Sin embargo. En el formulario también existen tres CheckBox.seleccionarse uno de los OptionButton que lo componen. DragIcon DragMode Enabled Font ForeColor (*) Height Común a ambos controles. o para leer el Value cuando no está seleccionado.Right Justify Cuando se elige el valor 0. justificado a la derecha. el CheckBox solamente permite presentar (logicamente) datos de tipo Booleano. el título (Caption) aparece a la izquierda del botón. PROPIEDADES Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.

Value donde variable tomará el valor 1 (no True) Para el control OptionButton emplearemos una instrucción igual : variable = Option1. Para leer el dato existente en un CheckBox es necesario utilizar la forma : variable = Check1. existe una diferencia entre el valor devuelto por el CheckBox y el devuelto por el OptionButton.Value Visible WhatsThisHelpID donde variable tomará el valor True (no 1) (*) Width PROCEDIMIENTOS Click KeyDown DblClick (Solo OptionButton) KeyPress KeyUp DragDrop LostFocus DragOver GotFocus LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 72 .Check1.value = 1 El poner como Value el valor True nos dará en este control un error. Para la lectura del Value.

El ComboBox está normalmente sin desplegar. el elemento elegido pasa a la parte TextBox del Combo y la lista vuelve a replegar. Si el número de elementos supera el número que puede mostrarse. muestra la lista con todos sus elementos. Anterior). Estos controles toman la siguiente forma : Puede verse en la figura un ejemplo de presentación de un ListBox (izquierda). se estudian conjuntamente. En resumen. se agregará automáticamente una barra de desplazamiento al control ListBox. y de un TextBox. Se despliega cuando se hace click con el ratón en la flecha que tiene en su parte derecha (véase fig.LIST BOX Y COMBO BOX Estos dos controles. con comportamiento análogo a un TextBox sencillo. debido a su similitud.Indica el número de elementos que tiene la lista LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 73 . El ListBox (y por tanto el ComboBox) tiene unas propiedades y métodos particulares que solamente se pueden aplicar durante el tiempo de ejecución : Propiedades ListCount . Como el número de elementos de la lista tiene mas elementos de los que le podían caber. un ComboBox con la lista desplegada (Centro) y un ComboBox con la lista sin desplegar (Combo2 a la derecha). Los usuarios pueden introducir información en la parte del cuadro de texto y seleccionar un elemento en la parte de cuadro de lista del control. generó automáticamente la barra de desplazamiento vertical. Cada línea de esta lísta es un elemento de la lista. que se comporta como si de un ListBox se tratase. Al desplegarse. o elegir uno de los que figuran en la parte ListBox del Combo. un ComboBox es la combinación de un ListBox. con la particularidad aquí de que el texto se le puede introducir por teclado. Se obtienen directamente de la caja de herramientas : Un control ListBox muestra una lista de elementos en la que el usuario puede seleccionar uno o más. Haciendo click con el ratón en cualquiera de sus elementos. Un control ComboBox combina las características de un control TextBox y un control ListBox. La lista tiene varios elementos.

que es concretamente. Métodos AddItem . Ese elemento se resaltará con fondo en azul. y el valor de la propiedad ListCount siempre es uno más que el valor mayor de ListIndex. el elemento añadido es la palabra ELEMENTO NUEVO.Listcount Variable contendrá un número con el número total de elementos de la lista List1. comenzando por el 0 para el elemento que ocupa el primer lugar. En este caso. Clear – Borra todos los elementos de la lista ListCount valdrá 0 si la lista no tiene ningún elemento. En este caso. y en vez de introducir un número para definir el elemento que se desea. En el ComboBox la propiedad Text contiene el texto que contenga la parte TextBox del Combo. el valor de la propiedad ListIndex será -1.List (n) Variable contendrá el elemento que ocupa el número de orden n dentro de la lista.AddItem Variable Añade un elemento a List1.Elimina un elemento de la lista. el elemento añadido es la palabra VISUALBASIC. y n si tiene n elementos.List (List1. basta con hacer click con el ratón sobre él. List1.Obtiene el elemento seleccionado. Variable = List1. Ejemplos Supongamos que tenemos un ListBox llamado List1. List (n) . Variable = List1.ListIndex . y un ComboBox llamado Combo1. la propiedad ListIndex tomará el valor del número de orden que ocupa ese elemento en la lista.AddItem “ELEMENTO NUEVO” Añade un elemento a List1. bien haya sido introducida desde teclado o mediante la recuperación de un elemento la parte ListBox del mismo.Indica el número de orden del elemento seleccionado dentro de la lista. El primer elemento de la lista es ListIndex 0.ListIndex Variable contendrá un número con el número de orden del elemento de la lista seleccionado en ese momento. Una vez seleccionado un elemento.Obtiene el elemento cuyo orden dentro de la lista es n. Variable = List1.Añade un elemento a la lista. se introdujo el valor ListIndex de List1. RemoveItem . Se ha utilizado la propiedad List para obtener el elemento. Variable = “VISUALBASIC” List1. Para seleccionar un elemento de la lista. Variable = List1. Se enumeran distintas formas de obtener información de ellos. el número de orden del elemento LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 74 .ListIndex) Variable contendrá el elemento que estaba seleccionado en List1.Text Variable contendrá el elemento que estaba seleccionado en List1. Si no se selecciona ningún elemento. (Variable será una cadena de caracteres) Variable = List1. Text .

RemoveItem (List1. Esta propiedad puede asignarse en diseño. Appearance Columns Backcolor (*) Propiedad de ListBox solamente. Determina si los elementos se presentan en una sola columna o en varias columnas. Recuerde : El número que se le asigna a la propiedad Columns no indica el número de columnas que tendrá el ListBox sino el número de columnas que presenta. sí es posible cambiar durante la ejecución el número de columnas de un ListBox de múltiples columnas. mediante la caja de propiedades. Si la propiedad se pone a un número distinto a 0. Esta propiedad no puede definirse a 0 o cambiada desde 0 en tiempo de ejecuciones decir. le aparecerán barras de desplazamiento horizontales para poder movernos por todas las columnas que tenga.Text. Sin embargo. presentará en cada columna los elementos que le quepan dependiendo de su dimensión vertical. List1.List (List1. DragIcon DragMode Enabled Font HelpContextIDIndex (*) ItemData Propiedad muy importante. Observe que poner List1. y presentará los elementos uno debajo de otro.RemoveItem (n) Elimina el elemento n de List1.ListIndex) Elimina el elemento que estaba seleccionado en ese momento. ForeColor Height Devuelve o establece un número específico para cada elemento de un control ComboBox o ListBox. y tendrá tantas columnas como sea necesario para albergar el número de elementos que tenga.seleccionado en ese momento. y la forma de presentar los elementos en el ListBox. List1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 75 . Si esta propiedad se pone a 0 la lista tendrá solamente una columna. DataField DataSource . List1.ListIndex) es idéntico a poner List1. Establecen el control Data asociado y el campo donde están los datos que se llevarán al TextBox o ComboBox para presentar datos procedentes de una Base de Datos. aparecen automáticamente unas barras de desplazamiento vertical. y si no puede presentar todos los elementos en las columnas que muestra. Presentará en su cuadro tantas columnas como se le indique en el valor de esta propiedad. Cuando los elementos sean mas que los que se pueden presentar en la lista. o en tiempo de ejecución mediante una instrucción como esta : Nombrelista. no se puede convertir en tiempo de ejecución un ListBox de múltiples columnas en un ListBox de columna única o un ListBox de columna única en un ListBox de múltiples columnas.Columns = número .listIndex = n Selecciona el elemento n de List1 (Se resalta en azul el elemento n) PROPIEDADES DE ListBox y de ComboBox Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes. el ListBox es de tipo multicolumna.

True Los elementos de la lista se ordenan alfabéticamente (sin distinguir entre mayúsculas y minúsculas). y los elementos agregados con posterioridad pueden no ordenarse correctamente.Sintaxis NombreDeLaLista. Los valores que puede adoptar son True o False.ItemData(índice) [= número] NombreDeLaLista Nombre del ListBox o ComboBox. incluyendo el cambio de los números de índice cuando se agregan o eliminan elementos. Sin embargo. etc. número El número que se asocia con el elemento especificado. también se rellena los elementos correspondientes de la matriz ItemData con los números correspondientes. retiene el valor que estaba en esa posición antes agregar el elemento a la lista. MouseIcon Sorted Establece o devuelve un valor que indica si los elementos de un ListBox o ComboBox se colocan automáticamente en orden alfabético. TabIndex TabStop Tag Top Visible WhatsThisHelpID Width (*) MousePointer Name (*) PROCEDIMIENTOS Click Change (Solo ComboBox) DblClick DropDown (Solo ComboBox) GotFocus KeyUp LostFocus MouseDown (Solo ListBox) MouseUp (Solo ListBox) LSB Visual Basic – Guía del Estudiante Capítulo 1 DragDrop DragOver KeyDown KeyPress MouseMove (Solo ListBox) Página 76 . Left (*) List Es el contenido de la lista. Visual Basic se encarga de casi todo el procesamiento de cadenas necesario para mantener el orden alfabético. Cuando se usa la propiedad ItemData. Por ejemplo. Nota Cuando se inserta un elemento en una lista con el método AddItem. False (Predeterminado) Los elementos de la lista no se ordenan alfabéticamente. Nota El uso del método AddItem para agregar un elemento en una posición específica de la lista puede romper el orden alfabético. Cuando se rellena el ListBox. el valor no se reinicializa a cero. Los números asociados con cada elemento se pueden usar para cualquier fin. La propiedad ItemData es una matriz de valores enteros largos cuyo número de elementos es el valor de la propiedad ListCount del control. pueden introducirse los elementos en el cuadro de propiedades durante el diseño. La propiedad ItemData se usa a menudo como índice de una matriz de estructuras de datos asociados con los elementos de un control ListBox. índice El número de un elemento concreto del objeto. el elemento también se inserta automáticamente en la matriz ItemData. el número de identificación de un empleado. Cuando esta propiedad tiene el valor True. Si la lista de elementos es corta e invariable. asegúrese de establecer su valor al agregar nuevos elementos a la lista. se puede usar en la confección de una lista de teléfonos.

CONTROLES HScrollBar y VScrollBar Son dos controles similares. El HScrollBar está en posición horizontal. caso del HScrollBar. para introducir un dato cuasi-analógico en una aplicación. caso del HScrollBar. y el VScrollBar en posición vertical. DragIcon DragMode Enabled Height HelpContextID Index (*) LargeChange Esta propiedad establece la variación de la propiedad Value cada vez que se hace click en el interior de la barra de desplazamiento. (Recuerde que el cursor está en el máximo. PROPIEDADES de HScrollBar y VScrollBar Las señaladas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes. MouseIcon MousePointer Name (*) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 77 .NOTA MUY IMPORTANTE El procedimiento Change del ComboBox solamente se efectúa cuando el cambio se produce mediante la entrada de un texto DESDE EL TECLADO. caso del HScrollBar. o cuando está en la parte mas baja. caso del HScrollBar. Min Esta propiedad establece el valor mínimo para la propiedad Value. producido al llevar un elemento desde la parte List a la parte Text. es decir. no por un cambio en la parte Text de este control. (Recuerde que el cursor está en el mínimo. el valor de esta propiedad cuando el cursor está en su parte máxima. cuando está mas a la izquierda. y tienen un aspecto parecido al de un control de volumen de un equipo de música. cuando está mas a la derecha. Left (*) Max Esta propiedad establece el valor máximo para la propiedad Value. es decir. Se toman directamente de la caja de herramientas. el valor de esta propiedad cuando el cursor está en su parte mínima. Mediante estos controles se pueden introducir datos variando la posición del cursor. en la parte por donde pasa el cursor. o cuando está en la parte mas alta.

SmallChange Esta propiedad establece la variación de la propiedad Value cada vez que se hace click en las flechas superior o inferior de la barra de desplazamiento. es este procedimiento el que se debe usar para conseguir el efecto de un cambio continuo mientras se está moviendo el cursor. En tiempo de ejecución. establecido por Min y un máximo. pero se le parece) Se toma directamente de la caja de herramientas. establecido por Max. el control permanece invisible. no se produce el evento Timer. Esto produce el efecto de que el cambio que se tenga que producir con el movimiento del cursor no se realiza de una manera continua. y tiene el aspecto siguiente : PROPIEDADES Enabled Index (*) Interval El valor de esta propiedad nos dará el intervalo de tiempo (en milisegundos) en que se producirá un evento Timer y consecuentemente. realizará el procedimiento asociado a este evento. Esta propiedad es la que se debe leer para conocer la posición del cursor. Visible WhatsThisHelpID Width (*) PROCEDIMIENTOS DE HScrollBar y VScrollBar Change KeyUp DragDrop LostFocus DragOver Scroll GotFocus KeyDown KeyPress Comentario El Procedimiento Change se produce cuando. se suelta el botón del ratón. (El control Timer está deshabilitado cuando la propiedad Interval = 0) Left Name Tag Top (*) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 78 . Presenta una novedad respecto a los controles estudiados hasta ahora. El timer no es un reloj exacto. Por lo tanto. TabIndex TabStop Tag Top (*) Value Esta propiedad lee o establece el valor dado por la posición del cursor. Si el valor de la propiedad Interval está a 0 (Predeterminado). (Casi independiente. El control Timer solamente se ve durante el tiempo de diseño. La temporización producida por el Timer es independiente de la velocidad de trabajo del ordenador. El procedimiento Scroll se realiza en el instante que se está moviendo el cursor. tras mover el cursor. TIMER TEMPORIZADOR Este objeto permite establecer temporizaciones. Este valor tiene un mínimo.

punto). Este control no tiene Procedimientos. Si BorderWidth no es 1 y BorderStyle no es 0 o 6. PROPIEDADES Backcolor (*) BackStyle Esta propiedad establece si Shape permite ver a su través (Transparent) o n lo permite (Opaque) BorderColor Establece el color del borde.punto . BorderWidth Establece el ancho de la línea. Puede ser : Transparent. dashDot-Dot. DrawMode FillColor FillStyle Height Index Left Name (*) Shape Establece la forma del control. En realidad. BorderStyle se establece como 1. Solid. pero no tiene ninguna aplicación en cuanto a programa. (línea de raya . (línea a rayas). cuadrado.Dash.punto). CONTROL SHAPE Se toma directamente de la caja de herramientas : Shape es un control gráfico que se muestra como un rectángulo. ovalado. Dot. (raya continua) El efecto de establecer la propiedad BorderStyle depende del valor de la propiedad BorderWidth. (línea de raya . por ejemplo. InsideSolid. Puede ser : Rectangular. (Esto quiere decir que un control Shape nunca le servirá. un círculo. BorderStyle Establece el tipo de borde. (línea a puntos). (No se ve el borde). un rectángulo redondeado o un cuadrado redondeado. solamente sirve para mostrar un determinado gráfico. (Borde de línea continua). envolver gráficamente a otros controles. un cuadrado. Es un “adorno” para sus aplicaciones. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 79 . para albergar varios OptionButton y pretender que sean independientes de otros controles OptionButton que se encuentren fuera del control Shape. Dash-Dot.PROCEDIMIENTOS Timer Se produce cada vez que se cumple un intervalo completo. cuadrado con esquinas redondeadas y rectangular con esquinas redondeadas. redondo. Un control Shape no actúa como contenedor de controles. una elipse.

(línea a rayas). DrawMode X1. La pregunta es ahora. Width (*) PROCEDIMIENTOS CONTROL LINE Se toma directamente de la caja de herramientas Line.DLL\3) y Visual Basic Objets And Procedures (VB6. Dash-Dot. dashDot-Dot.punto . (*) PROCEDIMIENTOS AÑADIR CONTROLES A LA CAJA DE HERRAMIENTAS Los controles descritos hasta ahora son parte de los que aparecen en la caja de herramientas mas elemental de Visual Basic. Dot.Tag Top Visible No tiene. InsideSolid. Solo sirve para aportar una característica gráfica. (Línea continua). Visual Basic For Aplications (MSVBVM60. es un adorno.Dash. Y2 Left Name Tag Visible Establece las coordenadas y del inicio y final No tiene.DLL). X2 Index Y1. al igual que Shape. Solid. (raya continua) BorderWidth Establece el ancho de la línea. Para ello. como lo que es imprescindible para que funcione una aplicación realizada en VB. Lo que ocurre es que hay que introducirlos en la caja de herramientas. Visual Basic Runtime Objets And Procedures (MSVBVM60. (línea a puntos). por lo que no sirve para aportar código al programa.punto). Estos. otros que se estudiarán en el capítulo 4 (Controles para mostrar imágenes). PROPIEDADES BorderColor Establece el color de la línea. necesita esos tres ficheros. son los que están incluidos en la caja de herramientas mas elemental. no tiene procedimientos. (línea de raya . BorderStyle Establece el tipo de línea : Puede ser : Transparent. (No se ve la línea).OLB). La razón es que estos controles vienen como lo más elemental de Visual Basic. Pero posiblemente no haya ninguna aplicación práctica que se pueda realizar con esos controles. ¿qué es lo más elemental de VB? Son tres DLLs. el control Data y el contenedor OLE que se estudiarán en la segunda parte del curso. Hay más. basta con desplegar el menú de Proyecto de la barra de menú: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 80 . (línea de raya . es un control gráfico que solamente sirve para poner una línea en un formulario. Una aplicación. Del mismo modo.punto). por muy elemental que sea.

Eligiendo el elemento Componentes de este menú desplegado nos muestra todos los componentes existentes en el disco. Obviamente estos controles suelen ser de pago. Puede observarse que está seleccionado el control Calendar. No utilice nunca un control adquirido por este procedimiento si no tiene plena confianza en el origen del mismo y lo ha probado concienzudamente. En la siguiente figura puede ver el cuadro con los controles existentes en el PC del autor. Observe que hasta Kodak realiza (o le realizan) controles. no tienen ninguna garantía. lógicamente.OCX). En este tema debe tener especial precaución con los controles que se distribuyen de forma gratuita por Internet. No todos los controles son de Microsoft. unas con mejor calidad que otras. y que le puedan aportar garantía de funcionamiento. que podremos sacar a nuestra caja de herramientas para poder utilizarlos. Suelen fallar con bastante frecuencia y. y en la parte de abajo puede verse la ubicación y nombre del fichero que contiene ese control (MSCAL. Sea prudente y utilice solamente aquellos controles de firmas de reconocido prestigio. Existen muchas empresas que venden controles. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 81 .

Windows necesita registrarlos para poder encontrarlos. No se trata de registrarlos ante el fabricante para poder utilizarlos. Para registrar un control basta con ejecutar este programa. Esto se hace en Inicio | Ejecutar. Con ello Windows conoce el CLSID de ese control. Para registrar un control se utiliza el programa Regsvr32. No se asuste.exe. pero pueden estar en cualquir otra carpeta).Ocx introduciríamos ese fichero Ocx en C:\Windows\System y a continuación ejecutamos: regsvr32 c:\windows\system\ VB_GuiaEst. su ubicación en el disco duro (los controles suelen estar en C:\Windows\System.Ocx LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 82 .Estos controles que adquiere con posterioridad a la instalación del Visual Basic hay que registrarlos. Se trata de introducirlos en el registro de Windows. pasandole como parámetro el nombre y ubicación del control a registrar. para registrar el conjunto de controles VB_GuiaEst. Por ejemplo.

que es el conjunto de todos los controles existentes en un formulario.Locked = True ' lo bloquea End If Next Pepe Puede usar este código para bloquear todos los TextBox de un formulario. En este caso.e.1 If TypeOf Controls(I) Is TextBox Then Controls(I). Sirve para saber a que tipo de control pertenece un determinado elemento. Una de ellas es la colección Controls. Esa expresión es TypeOf y siempre se debe usar con una sentencia condicional If y aplicarla solamente sobre una variable tipo objeto. que se distinguen unos de otros mediante el Indice colocado entre paréntesis. Vamos a ver una expresión que nos puede ayudar mucho. No vamos a entrar en demasiados detalles de momento. La numeración de los elementos de una colección siempre va del 0 al n-1. (No se preocupe al leer esto. Ahora podemos poner For Each Pepe in Controls ‘ Para cada valor que tome Pepe haciedole recorrer todos ‘ los elementos de la colección Controls If TypeOf Pepe Is TextBox Then ' Si pepe es un TextBox …. la variable I que tomará los valores entre 0 y n-1) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 83 .Count . siendo n el número de elementos de esa colección. Pepe. las colecciones tienen sus propiedades.El conjunto de todos los controles es la colección Controls Verá a lo largo del curso que Visual Basic utiliza mucho las colecciones. Visual Basic trata a las colecciones como un objeto más. Por ejemplo. Un código similar sería Dim I As Integer For I = 0 To Controls. que es precisamente el número de elementos que componen esa colección. Se mete en un procedimiento llamado Bloquear (p. trabajamos directamente sobre los elementos de la colección. Podemos declarar una variable como Control Dim Pepe as Control Pepe será un control. es muy fácil) (No se puede utilizar con Select Case) Una variable tipo objeto es una variable que no contiene un dato numérico o string.Locked = True End If Next (Observe que en la segunda versión. Así. pero una de las propiedades de todas las colecciones en Count.) y cada vez que queramos bloquear todos los TextBox del formulario basta con citar a este procedimiento. Contiene un objeto. un control.

Los valores posibles de esta propiedad son: 0 1 DrawStile Estilo de dibujo Manual Automático Establece el estilo de línea de la salida de métodos gráficos: Valores: 0 . FillStyle Tipo de relleno Establece el modo de rellenar controles Shape.Puntos 3 . o figuras (círculos o cuadrados) creados con los métodos gráficos Circle y Line. impidiendo de esta forma.Continuo interior.Raya .Punto 5 .Punto 4 .Diagonal hacia abajo 6 .Punto .Rayas 2 . se desactiva.Diagonal hacia arriba 5 . que se pueda trabajar con él.Resumen de Propiedades de los controles Visual Basic Caption Título Es el texto del control o lo que figura en la barra de menú del formulario.Cruzado 7 . DragMode Modo de iniciar una operación de Drag & Drop Establece un valor que determina si se usa el modo de arrastre manual o automático en una operación de arrastrar y colocar.Transparente 6 .Diagonal cruzada FillColor Color de relleno Especifica el color del relleno contemplado en FillStyle. Puede cambiarse en tiempo de ejecución. presentando un tono pálido tanto en su cuerpo como en su título. Puede cambiarse en tiempo de ejecución.Raya . Enabled Activado Propiedad Booleana. FontSize LSB Tamaño de letra Capítulo 1 Página 84 Visual Basic – Guía del Estudiante .Línea Horizontal 3 .Continuo 1 . Valores: 0 . el control no tiene efecto. y su apariencia varía. Font Fuente Es el tipo de letra para el título o el texto del control.Transparente 2 . el formulario o control está activado y se puede interactuar con él. Puede variarse en tiempo de ejecución. Si está en True.Línea continua 1 .Línea Vertical 4 . Cuando un control está deshabilitado (Enabled = False). El valor debe expresarse en pixeles. DrawWidth Ancho de la línea Establece el ancho de una línea dibujada. Si está en False.

Esta propiedad puede variarse en tiempo de ejecución.e. cursiva. MousePointer Valor por defecto: flecha Determina la forma del puntero del ratón cuando se coloca encima del formulario o control. y se diferencian por un índice. Son propiedades Booleanas True / False Height Altura Define la altura de un formulario o control. sino que la toma automáticamente de la posición que se le de al control en tiempo de diseño. el Printer). Puede cambiarse en tiempo de ejecución. Este número se aplica para determinar la ayuda interactiva asociada a este formulario o control. cada vez que el puntero del ratón pase por este Formulario o control. tachado y subrayado.No se especifica número de contexto >0 Un entero que especifique un contexto Indica la posición del control. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 85 . Vea mas adelante. El tamaño debe expresarse en puntos. Puede tomar los siguientes valores : válido. p. FontStrikethru.Establece el tamaño de la letra que se usará en ese formulario o control (U otro objeto VB. el tema Ayuda de Windows. La propiedad Index de ese control toma el número de ese índice. Left Posición de su parte izquierda. Máximo. Este icono puede ser un Bitmap de los existentes en el directorio Icons de Visual Basic o cualquiera que tengamos. Puede cambiarse durante el tiempo de ejecución. sino que toma el valor automáticamente. Todos tendrán el mismo nombre. FontBold.e. las letras pulsadas en el teclado van a ese TextBox. Normalmente esta propiedad no se introduce numéricamente. debemos poner en esta propiedad el valor 99. Si se pone 99 como valor de la propiedad MousePointer (siguiente). Puede elegirse uno de los punteros preestablecidos (15 en total) o el personalizado visto en la propiedad anterior. dependiendo de las dimensiones del objeto durante el tiempo de diseño. solamente uno de ellos tiene el foco. El valor de esta propiedad no se introduce normalmente como un dato numérico. en tiempo de ejecución. cambiar un texto a negrita. o. Esta expresión de tener el foco significa que ese control está remarcado y en esa condición. HelpContextID Número de Contexto Establece un número de contexto asociado para este formulario. concretamente de la parte izquierda del mismo. Index Indice En el caso de que se tengan varios controles que realicen una función similar (Las teclas numéricas de una calculadora. TabIndex Nº de orden para tabulador Cuando disponemos de varios controles en un mismo formulario. p. Para elegir ese icono personalizado.) puede hacerse un array con estos controles. MouseIcon Valor por defecto: ninguno Establece un icono personalizado para el puntero del ratón cuando esté encima del Formulario o control. en el caso de un TextBox. 0 . FontUnderline Permiten. 2160 puntos. FontItalic. cambiará su forma y adoptará la del icono elegido. si pulsamos la tecla ENTER haría el mismo efecto que hacer click con el ratón en ese control.

Top Posición de la parte superior Indica la coordenada de la parte superior del control. Puede variarse durante el tiempo de ejecución. en tiempo de ejecución. Puede cambiarse. Sin embargo sigue manteniendo el índice de la propiedad TabIndex descrita anteriormente. y asignándole el valor False. Width Ancho Define la anchura del formulario o control. WhatsThisHelpID (Propiedad. Juntamente con Height define el tamaño del objeto. Normalmente no se introduce como valor numérico sino que lo toma automáticamente del tamaño que tenga el formulario o control durante el tiempo de diseño. no se verá. Es el evento habitual para introducir el código que queremos que realice el programa al hacer click sobre un determinado control. No es el LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 86 . Pero también le puede servir para almacenar en ella una variable para que la use un código ajeno al formulario. Esta propiedad. juntamente con Left definen la esquina superior izquierda del botón de comando. Visible Propiedad Booleana. Este valor puede cambiarse durante el tiempo de ejecución para ocultar y hacer visible el formulario o control correspondiente. Asignándole el valor True al control o formulario. TabStop Sale del control de la tecla TAB Propiedad Booleana. está ahí para lo que el programador quiere. el botón no tomará el foco cuando se pulse la tecla del Tabulador. En estos casos. Tag Valor auxiliar Esta propiedad no la usa directamente Visual-Basic. Windows 95) Devuelve o establece un número de contexto asociado a un objeto.Esto es necesario. cambiando el valor a esta propiedad. Normalmente esta propiedad no se introduce numéricamente. ya que existen ordenadores que no disponen de ratón (típico de algunos portátiles). Cuando esta propiedad está a False. El foco irá cambiando de uno a otro control (pueden ser controles de distinto tipo) cada vez que pulsemos la tecla TABulador. Sirve para asociar al formulario información adicional para fines externos a la programación. sino que la toma automáticamente de la posición que se le den al botón en tiempo de diseño. será visible. Resumiendo. cuando por facilidad para el usuario. Esta propiedad TabIndex marca el orden que seguirá el foco a través de cada control. Se utiliza para dotar a las aplicaciones de Ayuda interactiva con el menú emergente ¿Qué es esto? de la Ayuda de W 95. para elegir uno u otro control debemos pulsar repetidas veces la tecla TABulador. Esto nos permite descartar algún botón de tomar el foco. sea conveniente en determinados puntos del programa. Puede cambiarse en tiempo de ejecución.Podemos variar el foco de un control a otro mediante la tecla TAB (TABulador). Puede cambiarse durante el tiempo de ejecución RESUMEN DE LOS EVENTOS DE LOS OBJETOS VISUAL BASIC Evento Click Hacer Click con el botón izquierdo del ratón Lo tienen casi todos los controles y el formulario. El autor de esta Guía del Estudiante tiene por costumbre utilizar la propiedad Tag del formulario inicial para guardar el parámetro que se le pasa a algunos programas para acceder a ellos con unos determinados privilegios.

) Shift es la posición de la tecla Mayúsculas (1=pulsada. F2. que es el código Ascii de la letra cuya tecla se ha pulsado. durante una operación de Drag & Drop. y X e Y las coordenadas del puntero del ratón en el momento de soltar. Ocurren respectivamente cuando se cierra el enlace DDE. Si un control tiene el foco. justo en el instante que llega a su posición inferior..Insert. Los parámetros son los mismos que en el procedimiento anterior. Vea el capítulo de Drag & Drop Evento DragOver Arrastrar por encima Ocurre cuando se pasa por encima de un formulario o control durante la operación de Drag & Drop. se ejecutará su evento Click al pulsar ENTER o la barra espaciadora. después del KeyPress. Hay algunos controles que no tienen procedimiento GotFocus porque nunca toman el foco (Label. p. cuando LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 87 . pero que funcionan de distinta forma. Y As Single. State As Integer. Evento KeyUp Levantar la tecla pulsada (Ocurre cuando el control tiene el foco) Ocurre al levantar la tecla. Shift As Integer Estos tres eventos se producen también en el formulario (y antes que en el control). 0=levantada) Evento KeyPress Pulsar una tecla (Ocurre cuando el control tiene el foco) Este evento se produce después del KeyDown. Hay teclas que no tienen Keyascii y sí tienen KeyCode F1. El KeyCode es el código de la tecla (no confundir con Keyascii.único evento donde podemos hacerlo. si el formulario tiene la propiedad KeyPreview = True LinkClose LinkError LinkNotify LinkOpen Son eventos relacionados con el DDE (Intercambio Dinámico de Datos). X As Single. Pasa los parámetros Source As Control.e. Tomar el foco significa que se acaba de convertir en el control activo. que es el código de la letra. En los controles. State es un entero que indica el estado de transición del puntero sobre el formulario.. (por ejemplo. y pasa como parámetro el KeyAscii As Integer. El evento Click no pasa parámetros Evento DragDrop Acción de Soltar durante el Drag & Drop Se produce cuando se ‘suelta’ el ratón sobre un formulario o control. Vea el capítulo de Drag & Drop Evento GotFocus Tomar el Foco Ocurre este evento cuando el control toma el foco. . MouseUp). El evento Click en el formulario se efectúa cada vez que pulsamos uno de los botones del ratón. donde Source es el control donde se originó el Drag & Drop. KeyCode As Integer. Pasa como parámetros el KeyCode As Integer y el Shift As Integer. 2 = Sobre (El puntero del ratón se desplaza de una posición a otra dentro del formulario o control). cuando llevamos el cursor y hacemos click sobre un Text Box. Pasa como parámetros los mismos que KeyDown. Pasa los parámetros Source As Control.) Evento KeyDown Pulsar una tecla (Ocurre cuando el control tiene el foco) Se produce sobre el control que tiene el foco al pulsar una tecla. Toma los siguientes valores : 0 = Entra (El puntero del ratón está entrando al formulario o control). 1 = Deja (El puntero del ratón está saliendo del formulario o control). Y As Single. X As Single. sólo con el botón izquierdo. cuando ocurre un error en el enlace. pues también tenemos otros muy parecidos (MouseDown.

o para comprobar que es correcto. cuando está el puntero encima del formulario o control correspondiente. LostFocus Ocurre cuando el control pierde el foco. Y As Single) Se ejecuta cuando pasa por encima del formulario o0 control el puntero del ratón MouseUp(Button As Integer. X As Single. pues se irán viendo según avance el curso. MouseDown(Button As Integer. 3 = centro). se le dedicaba en versiones anteriores de la Guía del Estudiante un capitulo LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 88 . Existen mas eventos. Shift As Integer. =0 no pulsada) y las coordenadas X e Y del puntero del ratón. No se van a mencionar aquí todos. pero cuando se levanta el botón. 3 Controles (Continuación) El CommonDialog CONTROLES DE BUSQUEDA DE FICHEROS El CommonDialog es un control del que se libran muy pocas aplicaciones. Vea el capítulo dedicado al DDE para mas detalles. Este evento es muy importante. Y As Single) Se ejecuta en el instante de apretar el botón de mouse. X As Single. Les pasa a todos. Y As Single) Similar a MouseDown. Visual Basic . Shift As Integer. MouseMove(Button As Integer. y cuando se inicia una conversación DDE. la tecla mayúsculas (Shift=1 significa pulsada.Guía del Estudiante Cap. Dada la importancia de este control. para dar el formato adecuado al texto contenido en ese Text Box. 2 = derecho. etc. X As Single. Pasa como parámetros el botón pulsado (1= izquierdo. Shift As Integer. Y no se preocupe si este capitulo le ha resultado muy pesado.han cambiado los datos en origen y en destino se ha establecido la propiedad LinkMode a Notify. El próximo va a ser mas divertido. por ejemplo en un Text Box.

En esta edición se le a anexado el estudio sobre los controles para la búsqueda de ficheros. mediante código. Es decir. CUADRO DE DIALOGO CommonDialog Normalmente se encuentra en la caja de herramientas Este control no se presenta en tiempo de diseño mas que con un simple icono : El cuadro de diálogo. abriremos o guardaremos ficheros. para que. fuentes disponibles. Nótese el icono para crear nueva carpeta. el CommonDialog NO realiza mas funciones que mostrar ficheros existentes. colores. CommonDialog se utiliza para varias funciones : • • • • • Abrir Ficheros Guardar Ficheros Elegir colores Seleccionar Impresora Seleccionar Fuentes CommonDialog mostrando la función Abrir.único. abramos esos ficheros o usemos una LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 89 . En realidad el cuadro de diálogo permite conocer datos con los cuales. El conocimiento de este capítulo es fundamental si desea llegar a ser un buen programador de VB. y mediante el código adecuado. objeto del comentario siguiente. elegiremos colores o seleccionaremos fuentes.

pulsando el botón derecho del ratón con el puntero colocado encima del icono del cuadro de diálogo. en la propiedad Flags del cuadro de diálogo.FontItalic = (True / False) Si es True.FontBold = (True / False) Si es True. el valor de 1.Color Indica el color de la fuente (Abrir con Flags=256+1. se ha elegido "Subrayada" Si se elige una versión Negrita Cursiva serían True las opciones FontBold y FontItalic LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 90 . Dependiendo de la aplicación para la que vaya a usarse se deberá activar de distintas formas. se ha elegido "Cursiva" CD1. Esta diferencia operativa hace que si usamos el mismo CommonDialog para seleccionar impresora y abrir ficheros. El control CommonDialog es un control personalizado (Microsoft CommonDialog Control COMDLG32. Al introducir el control en la aplicación está introduciendo la versión más moderna del mismo. se ha elegido "Tachada " CD1.ShowFont y haber puesto. por ejemplo. es recomendable usar uno exclusivamente para seleccionar la impresora. Los valores que se pueden obtener de este cuadro de dialogo son: CD1.FontStrikethru = (True / False) Si es True. se ha elegido "Negrita" CD1. de la impresora o ambos. le dirá que no tiene fuentes instaladas. debe ejecutarse la instrucción: CD1.FontUnderline = (True / False) Si es True.que se ha puesto para el cuadro de diálogo en todos los ejemplos es CD1) CUADRO DE DIALOGO MOSTRANDO FUENTES Para mostrar el cuadro de diálogo correspondiente a Tipos de Letra ( Fonts ). Esta última recomendación se debe a que.FontName Indica el nombre de la fuente CD1. Ya hace algo directamente. (Véase la propiedad Flags mas adelante) Si no pone uno de estos valores. El CommonDialog no es un control propio de Visual Basic. Y la versión de este control que Windows pone en W98 permite que pueda crear una nueva carpeta. lo haya diseñado para eso. el CommonDialog SI realiza las funciones de selección de impresora predeterminada. No se extrañe que el CommonDialog empleado en su aplicación pueda crear una nueva carpeta sin que Vd. Analizando las propiedades. para el control de la impresora. Puede accederse a las propiedades mediante el cuadro de propiedades típico de otros controles. Esto es porque agrupa todas las propiedades correspondientes a la cinco funciones que puede desarrollar.Name . sino de Windows. Se entiende que el nombre . se “cuelgue” el CommonDialog. vemos que tiene gran cantidad de ellas. 2 ó 3. correspondiente respectivamente a los tipos de letra de la pantalla. La expresión anterior se ha recuadrado porque ya no es completamente cierta. Se detalla a continuación la forma de usar el CommonDialog para cada aplicación. Si el cuadro de diálogo se va a usar para seleccionar la impresora y para otras aplicaciones. y como casi todos los controles personalizados presenta un asistente de propiedades propio. o mediante el asistente. 2 ó 3) CD1.FontSize Indica el tamaño de la fuente CD1.OCX).determinada fuente.

FontBold = CD1. Es decir.FontName = CD1.FontSize TbPrueba.FontStrikethru If TbPrueba = "" Then TbPrueba = "Texto de prueba" & vbCrLf & vbCrLf TbPrueba = TbPrueba & "The Quick Brown Fox Jumps Over The Lazy Dog 1234567890" End If End Sub LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 91 .FontUnderline TbPrueba. Programa de ejemplo.El cuadro de diálogo que se presenta es el siguiente: (CommonDialog Mostrando fuentes.Font.FontSize = CD1. con la propiedad Flags = 263) El objeto Font no puede aplicarse al CommonDialog. Mediante un CommonDialog elegimos el tipo de letra de un TextBox (TbPrueba) y escribimos un texto de prueba con todas las letras del abecedario.ShowFont TbPrueba.Size sino Variable = CD1.FontItalic = CD1.Flags = 259 'Muestra las fuentes de la pantalla (1).FontItalic TbPrueba. las de la impresora (2)y muestra las opciones de 'tachado.FontBold TbPrueba. Private Sub BMostrarFonts_Click() CD1.FontName TbPrueba. no podemos poner : Variable = CD1. subrayado y color (256) 1 + 2 + 256 = 259 CD1.FontStrikethru = CD1.Fontsize En el ejemplo que acompaña a este capítulo.FontUnderline = CD1. puede ver como se introducen las características de una determinada fuente elegida en un cuadro de texto.

Variablecolor debe declararse como tipo Long Programa de ejemplo. Private Sub BColores_Click() CD1.) El número correspondiente al color elegido se puede conocer analizando la propiedad color de cuadro de diálogo. Mediante un CommonDialog elegimos el color de fondo de un TextBox (TbPrueba). En nuestro ejemplo. El valor del color puede establecerse de tres formas que se comentan a continuación. se deberá ejecutar la instrucción: CD1.ShowColor El cuadro de diálogo puede tener una de estas dos formas (Dependiendo de su propiedad Flags): (Si la parte derecha del cuadro no sale. se pondrá un valor de color a la propiedad correspondiente de ese objeto. lo obtendríamos con Variablecolor = CD1.Flags = 2 'Hace que el cuadro de diálogo se muestre completo CD1.ShowColor TbPrueba.Color End Sub Nota acerca del número del color. Para establecer un color por medio de código.BackColor = CD1. se saca haciendo click en Definir colores personalizados. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 92 .CUADRO DE DIALOGO MOSTRANDO COLOR Para mostrar el cuadro de diálogo correspondiente al color.Color donde Variablecolor contendrá un número correspondiente al color elegido.

ejecutaríamos la sentencia : Label1. verde. Si queremos poner al Label anterior un color mediante la sentencia RGB. Por ejemplo: el rojo puro sería: el verde puro sería: el azul puro sería: Hex(0000FF) = 255 Hex(00FF00) = 652280 Hex(FF0000) = 16711680 Una mezcla de un poco de rojo (HB1).Backcolor = RGB (128. pondríamos la instrucción Label1. según la siguiente lista: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 93 . Si queremos poner el color de fondo a un control Label. 16. verde. y con la que mejor controlaremos el mismo. verde un número comprendido entre 0 y 255 indicando la cantidad de verde. usaremos la propiedad Backcolor. Si el Label se llama Label1. 100) Mediante la Función QBColor (Obsoleta. Sintaxis Objeto.Colores en Visual Basic. mediante la sentencia RGB ( rojo.777. Podríamos verlo muy bien en numeración Hexadecimal: Color = Hex XX YY ZZ Donde ZZ es un número Hexadecimal que representa la cantidad del color rojo. donde rojo es un número entre 0 y 255 que indica la cantidad de color rojo que se aporta al color. Esta es la forma mas sencilla de poner la propiedad color. azul).215 (FFFFFF en hexadecimal) corresponde a los famosos 16 millones de colores de las tarjetas gráficas. y lo mismo para azul. Se introduce por motivos de compatibilidad) Esta función se ha puesto en Visual Basic para compatibilidad con los colores que se usan en Quick-Basic y Qbasic. Observe que esa cantidad. El mínimo estaría en 0 (H00) y el máximo en 255 (HFF) YY representaría la cantidad de color verde y XX la de color azul. 30. Mediante esta función se obtienen solamente 16 colores. Visual Basic acepta para especificar un color. poniendo simplemente RGB (rojo. azul ) o mediante la función QBColor.QBColor(color) El argumento color es un número entero entre 0 a 15. tres procedimientos: Mediante el número de color.Backcolor = 12345678 Por la sentencia RGB Se puede expresar el color. ambos con los mismos límites explicados para el rojo. la componente verde y la componente azul. Por número El número que representa el color en VB está formado por la suma de la componente roja. otro poco de verde (H56) y otro poco de azul (H1F) daría el siguiente número: Hex(1F56B1) = 2053809 El número de color puede estar comprendido entre 0 (correspondiente al negro) y el 16777215 (correspondiente al blanco.

NúmeroColor 0 1 2 3 4 5 6 7 Negro Azul Verde Aguamarina Rojo Fucsia Amarillo Blanco NúmeroColor 8 9 10 11 12 13 14 15 Gris Azul claro Verde claro Aguamarina claro Rojo claro Fucsia claro Amarillo claro Blanco brillante Para el mismo Label anterior. ejecute la instrucción: CD2. usaríamos la sentencia : Label1. Para presentar el cuadro de elección de impresora. Utilice un CommonDialog exclusivamente para impresoras. Aparecerá el siguiente cuadro de diálogo: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 94 .Backcolor = QBColor (12) Fin de la nota acerca del número del color CUADRO DE DIALOGO MOSTRANDO IMPRESORAS Nota: Si utiliza un CommonDialog para impresoras y otras aplicaciones.ShowPrinter (A este cuadro de dialogo le hemos llamado CD2 para evitar los problemas referidos en la nota). puede tener problemas.

EXE |Ficheros de otro |*. Este objeto es el encargado de pasar al Administrador de Impresión todos los trabajos de impresión que generen las aplicaciones Visual Basic: Nombredelaimpresora = Printer.*. El separador es el carácter ASCII 124. debe tener a True la propiedad PrinterDefault del cuadro de diálogo. Puede buscar varios tipos de ficheros.La impresora elegida puede conocerla llamando a la propiedad DeviceName de un objeto que aún no hemos visto: el objeto Printer.) CD1.Filter = "Ficheros ejecutables |*.DeviceName Para que la impresora quede como impresora por defecto de Windows.EXE CD1.Filter = "Ficheros Word |*. La sintaxis para introducir un filtro es la siguiente: CD1.*. por lo puede observar diferencias respecto a la figura mostrada anteriormente. Se pueden seleccionar por el nombre.EXE). CD1.extensión" donde "nombre" puede ser un nombre o usar caracteres comodín.COM |Otros ficheros |*. Programa Ejemplo. separando los caracteres de busca por medio del carácter punto y coma (. con cualquier nombre y extensión .Filter = "Descripción del fichero|nombre. para buscar archivos ejecutables. debe ejecutar la instrucción : CD1.ShowSave pero antes deberá introducir el filtro o filtros de archivos que necesite.ShowPrinter End Sub EL COMMONDIALOG PARA ABRIR Y GUARDAR ARCHIVOS Posiblemente las opciones mas usadas del cuadro de diálogo. separados por el separador | (En una línea solamente). Muestra el cuadro de dialogo de impresoras Private Sub BImpresora_Click() CD1.BAT” Por ejemplo : LSB CD1.WRI" Capítulo 1 Página 95 Visual Basic – Guía del Estudiante . El cuadro mostrado para la impresora dependerá de la impresora que tenga instalada en su ordenador. ¡ ANTES ! Un filtro sirve para que en el cuadro de diálogo se presenten solamente los ficheros de nuestro interés.ShowOpen Si lo que necesita es abrir el cuadro de diálogo para guardar un fichero.DOC|Ficheros Write |*.BAT" Puede también introducir dos filtros. la extensión o las dos cosas. No ponga ningún espacio entre el separador y los caracteres de busca. Ojo. Lo mismo para "extensión" Por ejemplo.exe" Observe el carácter separador entre la descripción de los ficheros (Ficheros ejecutables) y el parámetro de busca (*.EXE.Filter=”Ficheros de un tipo |*. Para presentar el cuadro de diálogo correspondiente a Abrir Archivo. debe ejecutar la instrucción: CD1.COM.Filter = "Ficheros ejecutables |*.

cuando se presente el cuadro de diálogo. Este directorio con el que. por lo que puede emplearse directamente la salida del CommonDialog para abrir un fichero. solamente presentará uno de los filtros. se quedaría solamente con la última ! En este caso. nombre y dirección completa. deberá ejecutar esta instrucción. comenzará por el directorio actual. y deberá seleccionar manualmente el otro en un cuadro situado en la parte inferior izquierda del cuadro de diálogo. Para predeterminar cuál de los dos filtros saldrá sin tener que seleccionarlo.¡ No se pueden poner dos líneas con filtros. por defecto. El cuadro de diálogo deberá presentar un directorio. se emplea la propiedad FileName : Nombrefichero= CD1. se puede introducir mediante la propiedad InitDir. El orden de los filtros comienza por 1. El cuadro de diálogo de abrir o cerrar tiene esta forma : El cuadro de guardar es similar. Si no se especifica. viene con su path. es decir. Nombrefichero en la sentencia anterior. Para conocer el nombre del fichero elegido. Observe que en este caso hemos desplegado la segunda opción de filtro de ficheros : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 96 . aparecerá por defecto el filtro escrito en segundo lugar.FilterIndex = 2 En este caso. ANTES de invocar el cuadro de diálogo CD1.filename El nombre del fichero. que deberá contener el nombre del directorio y su path. aparece el cuadro de diálogo.

También en que el cuadro Guardar como presenta los nombres de los ficheros con un tono apagado.Como ve ambos cuadros son prácticamente iguales. Aparecerá esto : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 97 . Haga click sobre Propiedades en el popmenú que se presenta. le aparecerá la siguiente advertencia : Si desea otra leyenda en la barra de título. que lo obtendrá colocando el cursor del ratón sobre el icono del CommonDialog y pulsando el botón derecho. y dependiendo de la propiedad Flags que verá mas adelante. puede cambiarla usando el asistente de propiedades. Solamente se difieren en que uno pone Abrir y el otro Guardar como en su barra de título. Funcionalmente difieren. si quiere guardar un fichero con un nombre ya existente. Por ejemplo.

HLP de Windows) Pese a que se pueden presentar estos ficheros basándonos en el CommonDialog.PRESENTAR AYUDAS Mediante el CommonDialog se puede presentar un fichero de ayuda. definido con la opción Contents de la sección [OPTION] del archivo . también se debe especificar un contexto con la propiedad HelpContext.Exe. &H2 cdlQuit Notifica a la aplicación Ayuda que el archivo de Ayuda especificado ya no se está utilizando. &H3 cdlContents Muestra el tema de contenido de ayuda.HelpCommand =Valor Las opciones para valor son: 1 2 3 3 4 5 LSB &H1 cdlContext Muestra la Ayuda de un contexto determinado.1) Para mostrar el fichero de ayuda debe poner el nombre (y Path) del fichero de ayuda en la propiedad HelpFile del CommonDialog CD1. que puede ejecutarlo mediante la función Shell : VariableID = Shell (“WinHelp.HPJ. o una página concreta de ese fichero. &H3 cdlIndex Muestra el índice del archivo de Ayuda especificado. (Ficheros del tipo .hlp”. &H5 cdlSetContents Visual Basic – Guía del Estudiante Capítulo 1 Página 98 . es preferible usar directamente el programa WinHelp.HLP" Puede mostrar el índice. Cuando se usa esta valor. CD1. Para ello debe jugar con la propiedad HelpCommand. que le va a indicar al CommonDialog qué ayuda debe mostrar. Las aplicaciones sólo deben utilizar este valor para un archivo de Ayuda con índice único. &H4 cdlHelpOnHelp Muestra la Ayuda para utilizar la propia aplicación Ayuda.Exe FicheroAyuda.HelpFile = "C:\MiCarpeta\MiFicheroAyuda.

&H8 cdlContextPopup Muestra en una ventana emergente un tema de Ayuda determinado. mostraremos la ayuda con el Método ShowHelp CD1. &H102 cdlCommand Ejecuta una macro de Ayuda. Si se muestra un archivo incorrecto. &H5 cdlSetIndex Establece el contexto especificado en la propiedad HelpContext como índice actual para el archivo especificado en la propiedad HelpFile. WinHelp abrirá el correcto. CD1. &H105 cdlPartialKey Muestra el tema de la lista de palabras claves que coincide con la palabra pasada en el parámetro dwData.HPJ.ShowHelp Repitiéndole que no se debe usar el CommonDialog para mostrar ayudas. Utilice este valor sólo para los archivos de Ayuda con más de un índice. Si se muestra el archivo correcto. &H9 cdlForceFile Asegura que WinHelp muestre el archivo de Ayuda correcto. deberá especificar también una palabra reservada con la propiedad HelpKey. pondríamos esta propiedad de la forma : CD1. Para que aparezca el cuadro de diálogo Buscar sin pasar una palabra reservada.HelpCommand = cdlHelpIndex Para mostrar la página que se ha puesto en el fichero de ayuda como Contexto 2 (En Sección [MAP] del fichero . Si se encuentra más de uno.HelpContext = 2 Para mostrar la Ayuda de la Ayuda de Windows : CD1.5 8 9 257 258 261 Determina el tema de contenido a mostrar cuando el usuario presiona la tecla F1. Este índice seguirá siendo el actual hasta que el usuario acceda a un archivo de Ayuda distinto. &H101 cdlKey Muestra la Ayuda sobre una palabra reservada determinada. utilice un puntero largo a una cadena vacía.HPJ (Vea Creación de Ficheros de Ayuda).HelpCommand = cdlHelpContext CD1. no sucede nada. aparecerá el cuadro de diálogo Buscar mostrando los temas encontrados en el cuadro de lista Ir a.HelpCommand = cdlHelpHelpOnHelp Una vez establecidas estas propiedades. Si queremos que se muestre el índice de la ayuda. si sólo se encuentra uno. se enumeran a continuación el resto de propiedades que afectan a la presentación de ayuda : HelpFile HelpContext HelpKey LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 99 . Si no se encuentra ninguno. Al usar esta opción. identificado por un número de contexto definido en la sección [MAP] del archivo . pero para cumplir el objetivo de plasmar en este texto la mayor información acerca de cada control. se mostrará el cuadro de diálogo Buscar.

se producirá el error número 32755 (cdlCancel) cada vez que el usuario elija el botón Cancelar. ShowSave. Muestra el cuadro de diálogo Guardar como. como se explicó mas atrás. Nombre. si el error producido ha sido el 32755. De lectura : Entrega el color elegido. procederá en consecuencia. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 100 . Realiza las mismas funciones que ShowFont. Muestra el cuadro de diálogo Color.PROPIEDADES DEL CommonDialog La Propiedad Action La propiedad Action se incluye en la versión 4 de VB solamente por motivos de compatibilidad con anteriores versiones. (Predeterminado) No se genera ningún error. ShowColor. Utilice en su lugar ShowFont. Color Esta propiedad es de lectura / escritura De escritura :Establece el color predeterminado con que aparecerá el CD para elegir color. Para que aparezca este color predeterminado. y Vd. sino los equivalentes citados. Muestra el cuadro de diálogo Abrir. Copies Establece el valor predeterminado para número de copias que aparecerá en el CD cuando se abra para elegir impresora. ShowPrinter. La sintaxis de Action es : Valor 0 1 2 3 4 5 6 Descripción Ninguna acción. Ejecuta WINHELP. De ser así. Cuando se establece True en esta propiedad. Muestra el cuadro de diálogo Fuente. No debe usarse esta propiedad. ShowPrinter. DefaultExt Devuelve o establece la extensión de archivo predeterminada para el cuadro de diálogo.CancelError = (True / False) Se genera un error. Puede introducirse como RGB o numéricamente. debe detectar con la rutina de detección de errores adecuada. bien en el cuadro de elección de fuente. es que han pulsado ese botón. Muestra el cuadro de diálogo Impresora. ShowColor y ShowHelp CancelError Devuelve o establece un valor que indica si se genera un error cuando el usuario elige el botón Cancelar. Debe poner esta propiedad a true cuando quiera detectar que se ha pulsado el botón CANCELAR. ShowOpen . bien en el cuadro de elección de color. ShowOpen y ShowSave. en previsión de que pueda ser eliminada en futuras versiones. debe poner la propiedad Flags a 1.EXE. Sintaxis : True False objeto. Luego.Action [= valor] NO utilice la propiedad Action.

Flags [= valor] Capítulo 1 Página 101 Visual Basic – Guía del Estudiante . pues aparecerían en los valores de descripción y valor. se le agregará automáticamente la especificada en esta propiedad. La lectura de esta propiedad devuelve el nombre del archivo seleccionado actualmente en la lista. Si no hay ningún archivo seleccionado.TXT o . o por programa. Sintaxis Nombre. Filter (Explicada mas atrás) Devuelve o establece los filtros que aparecen en el cuadro de lista Tipo de un cuadro de diálogo. Importante para el CommonDialog de Guardar: Cuando se guarde un archivo sin extensión.FilterIndex [= número] Esta propiedad indica el filtro predeterminado cuando se han especificado varios filtros para un cuadro de diálogo Abrir o Guardar. Al especificar más de un filtro en un cuadro de diálogo. Sintaxis LSB CD1.Sintaxis objeto. Para obtener el carácter ASCII 124. y para un cuadro de diálogo Guardar como es Guardar como..Filter [= descripción1 |filtro1 |descripción2 |filtro2. No incluya espacios antes ni después del símbolo de canalización. sin dejar de pulsarla. (ASCII 124) ) para separar los valores de descripción y de filtro. Flags Propiedad que tiene distintos significados para cada tipo de cuadro de diálogo.DefaultExt [= cadena] Puede utilizar esta propiedad para especificar una extensión de archivo predeterminada. FileName Devuelve o establece la ruta y el nombre de archivo de un archivo seleccionado. utilice la propiedad FilterIndex para especificar el filtro predeterminado..DialogTitle [= título] Esta propiedad puede introducirse en la ventana de propiedades. El título predeterminado para un cuadro de diálogo Abrir es Abrir.] Utilice el símbolo de canalización ( | . El índice del primer filtro definido es 1. como por ejemplo . Puede utilizar esa propiedad para mostrar el nombre del cuadro de diálogo en la barra de título. Sintaxis CD1. DialogTitle Devuelve o establece la cadena mostrada en la barra de título del cuadro de diálogo. Tiene la misma sintaxis para todos los cuadros.DOC. FileName devuelve una cadena vacía. teclee 124 en el teclado numérico. FilterIndex Devuelve o establece un filtro predeterminado para un cuadro de diálogo Abrir o Guardar Como. Nota para los que no tiene teclado de 102 teclas. Nota El control CommonDialog ignora el valor de la propiedad DialogTitle cuando muestra los cuadros de diálogo Color o Fuente. pulse la tecla ALT y. Sintaxis CD1.

El parámetro valor establece distintas alternativas. evitando que el 2 4 8 Se pueden poner varias de estas condiciones. Al hacerlo. &H8& cdlShowHelp Hace que el cuadro de diálogo muestre un botón Ayuda. incluyendo la sección que permite al usuario crear colores personalizados. &H2& cdlOverwritePrompt Hace que el cuadro de diálogo Guardar como genere un cuadro de mensaje si el archivo seleccionado ya existe. El usuario puede seleccionar más de un archivo en tiempo de ejecución presionando la tecla MAYÚS y utilizando las teclas FLECHA ARRIBA y FLECHA ABAJO para seleccionar los archivos deseados. poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. &H4& cdlHideReadOnly Oculta la casilla de verificación Sólo lectura. Visual Basic – Guía del Estudiante Capítulo 1 Página 102 2 4 8 16 256 512 LSB . &H10& cdlShowHelp Hace que el cuadro de diálogo muestre el botón Ayuda. Para el cuadro de diálogo Color Las opciones para valor son: 1 &H1& cdlRGBInit Establece como valor de color inicial para el cuadro de diálogo el indicado en su propiedad Color. &H8& cdlNoChangeDir Hace que el cuadro de diálogo restablezca como directorio actual el que lo era en el momento de abrirse. usuario defina colores. Funciona tanto con el cuadro de Abrir como con el de Cerrar. la propiedad FileName devolverá una cadena con los nombres de todos los archivos seleccionados. Los nombres están delimitados en la cadena con espacios. Sin esta opción. el usuario debe elegir el botón de comando Definir colores personalizados para mostrar tal sección. Tenga cuidado a la hora de crear un archivo con nombre no válido ! &H200& cdlAllowMultiselect Especifica que el cuadro de lista Nombre de archivo admita selecciones múltiples. Para los cuadros Abrir y Guardar Las opciones para valor son: 1 &H1& cdlReadOnly Hace que la casilla de verificación Sólo lectura aparezca marcada inicialmente al crear el cuadro de diálogo. &H100& cdlNoValidate Especifica que el cuadro de diálogo común permita caracteres no válidos en el nombre de archivo devuelto. Este indicador también señala el estado de la casilla Sólo lectura cuando el cuadro de diálogo está cerrado. dependiendo de cada cuadro. &H4& cdlPreventFullOpen Desactiva el botón de comando Definir colores personalizados. &H2& cdlFullOpen Hace que el cuadro de diálogo se muestre completo al crearlo. El usuario deberá confirmar que desea sobrescribir el archivo.

El valor de este indicador puede comprobarse al cerrar el cuadro de diálogo. si las extensiones coinciden. &H100& cdlEffects Especifica que el cuadro de diálogo permita efectos de tachado. &H2& cdlPrinterFonts Hace que el cuadro de diálogo muestre solamente las fuentes que admite la impresora. Este indicador activa automáticamente cdlPathMustExist. &H800& cdlNoVectorFonts Especifica que el cuadro de diálogo no permita seleccionar fuentes vectoriales. para el cuadro de diálogo de abrir.1024 &H400& cdlExtensionDifferent Indica que la extensión del nombre de archivo devuelto es distinta de la especificada en la propiedad DefaultExt. para el cuadro de Abrir. Para el cuadro Mostrar Fuentes: Las opciones para valor son: 1 2 &H1& cdlScreenFonts Hace que el cuadro de diálogo muestre solamente las fuentes de pantalla que admite el sistema. &H400& cdlANSIOnly Especifica que el cuadro de diálogo sólo permita seleccionar las fuentes que utilizan el juego de caracteres de Windows. Este indicador no estará activado si la propiedad DefaultExt es Null. si se le pulsa CANCELAR desaparece esta advertencia y el CommonDialog espera a que se le escriba o seleccione otro fichero. Visual Basic – Guía del Estudiante Capítulo 1 Página 103 3 4 256 1024 2048 LSB . 32768 &H8000& cdlNoReadOnlyReturn Especifica que el archivo devuelto no tenga el atributo de Sólo lectura ni esté en un directorio protegido contra escritura. especificadas por la propiedad hDC. poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. Si se establece este indicador y el usuario introduce una ruta no válida. Si se establece este indicador. 16384 &H4000& cdlShareAware Especifica que se ignoren los errores al compartir archivos. Este indicador establece automáticamente los indicadores cdlPathMustExist y cdlFileMustExist. 8192 &H2000& cdlCreatePrompt Especifica. Esta advertencia dice : Este Archivo no existe ¿desea crearlo ? y aparecen los botones de ACEPTAR y CANCELAR. Presenta un aviso (tanto en el cuadro de abrir como en el cerrar) que impide elegir un fichero de estas características. 4096 &H1000& cdlFileMustExist Especifica. Se pueden poner varias de estas condiciones. aparecerá un mensaje de advertencia. que si no existe el fichero consulte al usuario antes de crear un archivo que no existe actualmente. &H3& cdlBoth Hace que el cuadro de diálogo muestre las fuentes de impresora y de pantalla disponibles. o si el archivo no tiene extensión. Si el usuario pulsa aceptar el CommonDialog se cierra normalmente. el usuario no podrá seleccionar una fuente que sólo contenga símbolos. 2048 &H800& cdlPathMustExist Especifica que el usuario sólo pueda introducir una ruta de acceso válida. La propiedad hDC identifica el contexto de dispositivo asociado a la impresora &H4& cdlShowHelp Hace que el cuadro de diálogo muestre un botón Ayuda. subrayado y color. Si este indicador está activado y el usuario introduce un nombre de archivo no válido. aparecerá una advertencia. que el usuario sólo pueda escribir en el cuadro de texto Nombre de archivo nombres de archivos existentes.

Si no se especifica cdlPageNums ni cdlSelection. debe establecer cdlScreenFonts. Visual Basic – Guía del Estudiante Capítulo 1 Página 104 2 4 8 16 32 LSB . también deben establecerse cdlBoth (sume 3 a este número) y cdlScalableOnly (sume 131072 a este número) 65536 &H10000& cdlForceFontExist Especifica que aparezca un cuadro de mensaje cuando el usuario intente seleccionar una fuente o un estilo que no existan. cdlPrinterFonts o cdlBoth en la propiedad Flags. se producirá el error No hay fuentes. 8192 16384 &H4000& cdlFixedPitchOnly Especifica que el cuadro de diálogo seleccione sólo fuentes de espaciado fijo. &H1& cdlSelection Devuelve o establece el estado del botón de opción Selección. Si se establece este indicador. 2 ó 3) Se pueden poner varias de estas condiciones.4096 &H1000& cdlNoSimulations Especifica que el cuadro de diálogo no permita simulaciones de fuente de interfaz de dispositivo gráfico (GDI). Flags=1. instaladas) Las opciones para valor son: 0 1 &H0& cdlAllPages Devuelve o establece el estado del botón de opción Todas las páginas. &H20& cdlPrintToFile Devuelve o establece el estado de la casilla de verificación Imprimir a un archivo. &H2& cdlPageNums Devuelve o establece el estado del botón de opción Páginas. &H8& cdlNoPageNums Desactiva el botón de opción Páginas y el control de edición asociado. 262144 &H40000& cdlTTOnly Especifica que el cuadro de diálogo permita seleccionar solamente fuentes TrueType. 32768 &H8000& cdlWYSIWYG Especifica que el cuadro de diálogo permita seleccionar solamente fuentes disponibles al la vez en la pantalla y en la impresora. (O dicho de otra forma. Depende de las impresoras que tenga Vd. 131072 &H20000& cdlScalableOnly Especifica que el cuadro de diálogo permita seleccionar solamente fuentes escalables. En caso contrario. &H4& cdlNoSelection Desactiva el botón de opción Selección. Para el Cuadro de Diálogo Imprimir (Observará seguramente que lo que se describe a continuación no se cumple siempre. poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. &H10& cdlCollate Devuelve o establece el estado de la casilla de verificación Intercalar. el botón de opción Todas estará seleccionado. Nota Antes de mostrar el cuadro de diálogo Fuentes. &H2000& cdlLimitSize Especifica que el cuadro de diálogo seleccione sólo los tamaños de fuente comprendidos en el rango especificado por las propiedades Min y Max.

Sintaxis Variable = CD1. el valor de estas propiedades contiene la opción elegida para la letra (si FontBold=True es que hemos elegido negrita. etc. El contexto se devuelve en la propiedad hDC del cuadro de diálogo.FontBold Los valores de Variable son: True Se ha elegido negrita False (Predeterminado) No se ha elegido negrita. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 105 . Si el controlador sí admite múltiples copias.).64 128 &H40& cdlPrintSetup Hace que el sistema muestre el cuadro de diálogo Configurar impresora en lugar de Imprimir. Un contexto de información proporciona un método rápido de obtener información sobre el dispositivo sin crear un contexto de dispositivo. &H80& cdlNoWarning Evita que aparezca una advertencia cuando no hay una impresora predeterminada. al establecer este indicador el cuadro de diálogo almacenará el número de copias solicitado en la propiedad Copies. cursiva. 2048 &H800& cdlShowHelp Hace que el cuadro de diálogo muestre el botón Ayuda 262144 &H40000& cdlUseDevModeCopies Si un controlador de impresora no admite copias múltiples. FontItalic Los valores de Variable son: True si se ha elegido cursiva. al establecer este indicador se desactiva el control de edición de número de copias. FontItalic Propiedad Booleana que establece o devuelve que el tipo de letra usado es Cursiva. 512 &H200& cdlReturnIC Devuelve un contexto de información para la impresora seleccionada en el cuadro de diálogo. Sintaxis Variable = CD1. Una vez seleccionado el tipo de letra. El contexto de información se devuelve en la propiedad hDC del cuadro de diálogo. etc. Las seis propiedades siguientes nos dan las características especiales de la fuente elegida (negrita. Use este Flag cuando lo que desea es cambiar la impresora predeterminada. Propiedades que afectan al tipo de letra. &H100000& cdlHidePrintToFile Oculta la casilla de verificación Imprimir a un archivo. 524288 1048576 &H80000& cdlDisablePrintToFile Desactiva la casilla de verificación Imprimir a un archivo. 256 &H100& cdlReturnDC Devuelve un contexto de dispositivo para la impresora seleccionada en el cuadro de diálogo.) FontBold Propiedad Booleana que establece o devuelve que el tipo de letra usado es Negrita. False (Predeterminado) en caso contrario.

FontBold. FontItalic. En general. En las propiedades relacionadas con las fuentes sólo pueden establecerse valores para los que exista una fuente. luego especificar la propiedad FontName y después establecer de nuevo el tamaño con FontSize. deberá modificar FontName antes de establecer los atributos de tamaño y estilo con las propiedades FontSize. Sintaxis Variable = CD1. El entorno operativo Microsoft Windows utiliza una fuente distinta para las fuentes TrueType con un tamaño inferior a 8 puntos. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 106 . FontItalic. Nota Las fuentes disponibles en Visual Basic varían dependiendo de la configuración del sistema y de los dispositivos de presentación e impresión. Debe ser una variable tipo Integer o Long Sintaxis Variable = CD1. deberá modificar FontName antes de establecer los atributos de tamaño y estilo con las propiedades FontSize.FontName (Variable toma el valor del nombre de la fuente.FontUnderline Los valores de Variable son: True. FontStrikethru Los valores de Variable son: True si se ha elegido tachado. primero deberá establecer el tamaño en puntos con la propiedad FontSize. FontStrikethru y FontUnderline. FontUnderline Propiedad Booleana que establece o devuelve que el tipo de letra usado es Subrayado. False (Predeterminado) en caso contrario FontName Devuelve el nombre de la fuente elegida. en puntos. FontBold. Sin embargo.FontStrikethru Propiedad Booleana que establece o devuelve que el tipo de letra usado es Tachada. Lo verá mas adelante FontSize Devuelve de la fuente elegida. Sintaxis Variable = CD1. si se ha elegido subrayado. cuando especifique un tamaño inferior a 8 puntos para una fuente TrueType. Nota En tiempo de ejecución puede obtener información sobre las fuentes disponibles a través de las propiedades FontCount y Fonts. Es una variable tipo String Sintaxis Variable = CD1. Variable = “Arial” En general. Por ejemplo. FontStrikethru y FontUnderline. False (Predeterminado) en caso contrario.FontSize donde Variable será una expresión numérica que especifica el tamaño de fuente a utilizar.

Sintaxis objeto. MaxFileSize Devuelve o establece el tamaño máximo del nombre de archivo abierto con el control CommonDialog. en los que el CD aparece siempre en la parte superior izquierda de la pantalla. controlando la posición de ese formulario.PrinterDefault = True / False Capítulo 1 Página 107 Visual Basic – Guía del Estudiante . InitDir Devuelve o establece el directorio de archivos inicial. Esto no ocurre para sistemas a 32 bytes. El rango de esta propiedad es 132KB. El valor predeterminado es 256. Algunos programadores han optado por poner un formulario para contener solamente al CommonDialog.InitDir [= cadena] La sintaxis de la propiedad InitDir consta de las siguientes partes: objeto Nombre que define al CommonDialog cadena Expresión de cadena que especifica el directorio de archivos inicial. y así. Sintaxis LSB CD1. se utilizará el directorio actual. Name Nombre que define al CommonDialog PrinterDefault Devuelve o establece una opción que determina si la configuración elegida por el usuario en el cuadro de diálogo Imprimir se utiliza para modificar la configuración predeterminada de impresora del sistema. Left y Top Estas propiedades solamente afectan a la colocación del icono en el formulario. independientemente de donde esté el formulario que lo contiene. En VB 4 de 16 bits. Sintaxis objeto. No afectan a la colocación del CommonDialog durante la ejecución.MaxFileSize [= valor] La sintaxis de la propiedad MaxFileSize consta de las siguientes partes: objeto = Nombre que define al CommonDialog valor = Número entero que especifica el tamaño máximo del nombre de archivo en bytes.Index Igual que el ya estudiado para otros controles. La posición del CommonDialog en tiempo de ejecución no puede controlarse. el CommonDialog aparece aproximadamente en la parte superior izquierda del formulario que lo contiene. Esta afirmación de que la posición del CommonDialog no es controlable es válida para sistemas a 32 bytes. Si no se especifica esta propiedad. poder controlar la posición (aproximada) en la que aparece el CD.

y no quiere cambiar la impresora predeterminada por el hecho de haber seleccionado en este momento otra impresora. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 108 . orientación. para poner o no poner como impresora predeterminada. Tag Lo mismo que se ha explicado para otros controles. Utilice esta propiedad. la impresora seleccionada con el CommonDialog. Puede por ejemplo. Ponga esta propiedad a False (recuerde que por defecto está a True) para que la impresora seleccionada no se quede como impresora por defecto. etcétera) se utilizan para modificar la configuración de impresora almacenada en el Registro).True Las opciones que elija el usuario en el apartado Configurar del cuadro de diálogo Imprimir (selección de la impresora. pero solo ese texto. False Las opciones que elija el usuario no se utilizan para modificar la configuración de impresora predeterminada del sistema. que por defecto está a True. querer imprimir un texto en una impresora determinada.

Puede crear cuadros de diálogo que permitan al usuario abrir un archivo de una lista en cualquier unidad disponible. DriveListBox desplegado y sin desplegar Name (nombre) por defecto List1 Posee las propiedades típicas de cualquier control VB respecto a su geometría y color. Sin embargo. ListCount y ListIndex Drive devuelve el nombre de la unidad de disco seleccionada : Variable = List1. estos controles son listas. las carpetas de un disco o los discos visibles desde la máquina. para determinadas necesidades sí son muy prácticos. FileListBox muestra los ficheros existentes en un determinado directorio. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 109 . • DriveListBox. Repase el control ListBox para recordar sus propiedades. que en este caso. Al tratarse de controles tipo Lista.Drive Variable = a : (ó c :[MS-DOS_6] ó D ) Este control se trata de una lista como su nombre indica. Se obtienen directamente de la Caja de Herramientas. List. Las propiedades mas destacables de este control son : Drive.CONTROLES DE BUSQUEDA DE FICHEROS CONTROLES DE BUSQUEDA DE FICHEROS Y DIRECTORIOS Estos controles apenas si se usan. DirListBox muestra los directorios existentes en un árbol. Estúdieselos con el mismo entusiasmo que si no existiese el CommonDialog. Le aclarará sobre todo los términos empleados para definir los elementos de la lista. DriveListBox Este control permite elegir una unidad de disco válida en tiempo de ejecución. en los iconos siguientes: • • • DriveListBox permite elegir una unidad de disco. La razón es que el CommonDialog ya estudiado sustituye con creces a estos tres controles en su conjunto. y posee las propiedades List. DirListBox Y FileListBox. le recomiendo que lea el capítulo correspondiente al ListBox. son los ficheros de una carpeta. ListCount y ListIndex para permitir al usuario tener acceso a elementos de la lista. Tal como indica su nombre. Utilice este control para mostrar una lista de todas las unidades válidas del sistema de un usuario.

Nota El valor que devuelve Path es distinto del de List (ListIndex). El número n comienza por 0.disco C :. el que tenga por defecto. ListCount y ListIndex. El valor de la propiedad Path es una cadena que indica una ruta de acceso. Nombre. No presenta ficheros. como era de esperar. List1. List1. bien el que se le haya impuesto mediante esta misma propiedad Path.List (n) devuelve el texto que define a la unidad colocada en el lugar n. en la figura anterior. podrá realizar un explorador de ficheros en cualquier disco de su ordenador. n-1 para el último) Utilizando el control DriveListBox en combinación con DirListBox y FileListBox. y. que corresponde a los tres discos disponibles .ListCount será 3. el DirListBox presentas las siguientes propiedades particulares : Path Devuelve o establece la ruta de acceso actual. List (ListIndex) devuelve el camino completo del directorio seleccionado. cambia cada vez que cambiamos la selección del directorio. No está disponible en tiempo de diseño. Presenta un cuadro de la siguiente forma: donde puede verse el árbol completo de un directorio.Path [= pathname] LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 110 . Aparte de las propiedades geométricas de todos los controles. Por ejemplo. como C:\WINDOWS\SYSTEM. List.. Path devuelve siempre un mismo camino. El DirListBox solamente presenta directorios.list(1) devolverá c :[MS-DOS_6] ListCount proporciona información acerca del número de unidades de disco disponibles (En el ejemplo. disco A : y disco D : ) ListIndex devuelve el índice del disco seleccionado en la lista (0 para el primero. ListCount y ListIndex Al igual que cualquier lista. El valor predeterminado es la ruta de acceso actual Cuando se cambia la propiedad Path en tiempo de ejecución se genera un evento Change. el DirListBox tiene las propiedades List. Sintaxis donde Nombre es el nombre del DirListBox pathname Una expresión de cadena que evalúa en el nombre de vía de acceso del directorio por defecto del DirListBox. DirListBox. y si no se le ha impuesto con anterioridad.

ListCount devuelve un valor numérico igual al número de directorios existentes en el último nivel. FileListBox Esta lista nos presenta los ficheros existentes en un directorio.) Variable = C:\Archivos de programa\Microsoft Visual Basic32 (p. List (n) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 111 . List1. Filename Devuelve el nombre del fichero seleccionado. o el que tenga por defecto. el valor -2 cuando se selecciona el directorio situado 2 niveles jerárquicos por encima del último nivel. Esta lista de ficheros tiene las siguientes propiedades destacables : Path Devuelve o establece la ruta de acceso de su directorio actual. devuelve -1 si no hay ningún elemento seleccionado. cuando el número de ficheros supera el número que puede presentar. Si en vez de n colocamos el ListIndex nos devolverá. Como se puede apreciar. el camino del elemento seleccionado.) ListCount Devuelve el número total de ficheros que hay en ese directorio. Variable = List1. independientemente de los directorios que tuviesen por arriba. Como todas las listas. El primer elemento de una lista tiene el índice = 0. No está disponible en tiempo de diseño. Este directorio puede ser el que se le haya impuesto mediante esta propiedad Path. Toma el valor -1 cuando se selecciona el directorio inmediatamente superior al último nivel. etc. logicamente. e.ListIndex devuelve el valor del índice del directorio seleccionado. 1 para el siguiente.ListCount Variable = 19 (p. List (n) devuelve una cadena de caracteres con el camino completo del elemento cuyo orden sea el señalado entre paréntesis. El valor devuelto es cero cuando está seleccionado el primer directorio de los situados al final del árbol. aparecen automáticamente las flechas de scroll verticales.Path e. (El directorio por defecto sería el del ejecutable de la aplicación) Si le ponemos el nombre por defecto. etc. para todos los ejemplos : variable = List1. ListIndex Devuelve un número con el índice del elemento seleccionado.

Comentarios La propiedad Pattern juega un papel clave en el diseño de las funciones de examen y tratamiento de archivos de una aplicación.EXE).Pattern [= valor] La sintaxis de la propiedad Pattern consta de las siguientes partes: objeto : Nombre del Control FileListBox valor: Expresión de cadena que indica una especificación de archivo. El atributo System de un fichero indica que el fichero es un fichero de sistema. Hidden.*.Archive [= booleano] objeto. *.BAT se obtendría una lista con todos los archivos ejecutables y todos los archivos por lotes de MS-DOS. El atributo Hidden indica si el fichero se trata de un fichero oculto. Sintaxis objeto.EXE. Hidden. Si en lugar de n ponemos el valor de ListIndex : variable = List1. Por ejemplo. separándolos con caracteres punto y coma (.).Filename Veamos otras propiedades del FileListBox Pattern Devuelve o establece un valor que indica los nombres de archivo mostrados en un control FileListBox en tiempo de ejecución. Normal y System tiene la siguiente partes: objeto :Nombre del FileListBox booleano :Una expresión booleana (True / False) que especifica el tipo de archivos presentados. en una aplicación dedicada a iniciar otros programas.Devuelve el nombre del fichero que ocupa el lugar n en la lista. podría hacer que sólo apareciesen los archivos .* o *. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 112 . con *. Archive. La cadena predeterminada es *. Observe que en este último caso. Al modificar el valor de la propiedad Pattern se genera un evento PatternChange. Puede utilizar Pattern en combinación con otras propiedades de control de archivos para proporcionar al usuario formas de explorar archivos o grupos de archivos similares.FRM. Normal.Normal [= booleano] objeto. como *. que obtiene una lista de todos los archivos. Además de utilizar caracteres comodín.Hidden [= booleano] objeto.EXE en el cuadro de lista de archivos (*.List (List1. Normal o System. System Devuelven o establecen un valor que determina si un control FileListBox presenta los archivos con los atributos Archive. Sintaxis objeto.ListIndex) obtendremos el nombre del fichero seleccionado. también puede especificar varios modelos. Hidden. Por ejemplo. Variable = List1.System [= booleano] Las sintaxis de la propiedades Archive. El atributo Archive de un fichero indica si se ha variado ese fichero después de la última copia de seguridad. el resultado es el mismo que el de List1. El atributo Normal indica que el fichero es un fichero “normal” (No está oculto ni es de sistema).List (5) Variable = nombre del fichero que ocupa el 5º lugar en la lista.

en una operación de buscar y reemplazar se podrían presentar solamente archivos del sistema estableciendo la propiedad System a True y las demás propiedades a False. bien porque. Ejemplo : Introduzca una línea de código con la siguiente sentencia Variable = CurDir Al ejecutarla la variable Variable contendrá la información : (p. El directorio por defecto es el último que se ha seleccionado por algún procedimiento. puede estar trabajando en el directorio C:\CursoVB\Ejemplos y ser este el directorio actual en el disco C :. Asegúrese en sus aplicaciones que siempre elige la propiedad Path antes de presentar ficheros o directorios a través de los controles anteriores. ese directorio es el que queda por defecto. el directorio por defecto será el mismo donde se encuentra el ejecutable. para evitar que pueda mostrarle ficheros de un directorio no deseado. Pero si a lo largo de la aplicación cambiamos el directorio. False : (Predeterminado para Hidden y System) Presenta archivos sin el atributo de la propiedad en el control FileListBox. seleccionando otro mediante un CommonDialog. La función CurDir nos devuelve el directorio actual. como parte del procedimiento de copia de seguridad. Por ejemplo. Por ejemplo. al no haberse forzado ninguno. ya que era precisamente la unidad C la unidad actual. e. al arrancar una aplicación. utilice el directorio por defecto. bien porque haya sido forzado el control correspondiente a tener ese directorio en su propiedad Path. Para conocer el directorio actual de la unidad A emplearía la expresión : Variable = CurDir (“A”) Variable tomará entonces el valor Variable = “A :\ApVB\Tema1” Decíamos que el disco C era la unidad actual. La definición de estas propiedades en el código en tiempo de ejecución hace que el control FileListBox presente sólo aquellos archivos con los atributos especificados. Por ejemplo. Puede comprobar cual es el directorio actual. mediante la sentencia ChDrive seguida de una letra (entre comillas dobles) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 113 . y tener un disquete en la unidad A : en el que la última vez que trabajó fue en el directorio A :\ApVB\Tema1 y ese es su directorio por defecto en el disco A. También. Para conocer el directorio actual del disco C : no necesitó especificar la unidad. se podría establecer la propiedad Archive a True para relacionar solamente aquellos archivos modificados a partir de la última copia de seguridad.) Variable = C:\Archivos de programa\Microsoft Visual Basic32 Puede darse el caso de que desee conocer el directorio actual de varias unidades de disco.El valor booleano puede presentar los siguientes valores : True :(Predeterminado para Archive y Normal) Presenta archivos con el atributo de la propiedad en el control FileListBox. También podemos cambiar la unidad actual. PROCEDIMIENTOS del FileListBox Click KeyDown Change KeyPress DragDrop KeyUp DragOver GotFocus SENTENCIAS DE MANEJO DE DIRECTORIOS Y FICHEROS El Directorio Actual Se llama directorio Actual al directorio que está actualmente en uso. Use estas propiedades para especificar el tipo de archivos a presentar en un control FileListBox. basándose en los atributos de archivos estándar usados en el entorno operativo.

A poco Inglés que sepa se habrá dado cuenta que esta función sirve para quitarse algo de enmedio.. La función Dir A esta función le debemos añadir como parámetro el criterio de búsqueda.EndDoc ‘Le decimos que imprima todos (*.Print fichero fichero = Dir Loop Printer. aunque si lo desea.txt” borra el fichero Ejemplo1.*") Do Until fichero = "" Printer. sacaremos por impresora los nombres de los ficheros existentes en el directorio actual : (Este código lo meteremos en el procedimiento click de un botón de comando) fichero = Dir("*. Ejemplo : ChDir “C :\Windows\System” cambiaría el directorio actual al especificado.. Función Kill. Esta función borra un fichero del disco. Observe que el parámetro A no tiene que llevar los dos puntos ( : ). tenemos una forma que facilita esta labor. Pero solamente tendremos que introducir el criterio de búsqueda la primera vez. con un FileListBox. También es indiferente que la letra sea mayúscula o minúscula. Si el directorio actual es el C:\VB\Icons y ejecutamos la sentencia : MkDir “Varios” crearíamos el directorio C:\VB\Icons\Varios Podemos incluso eliminar un directorio.. por lo que tendremos que repetirla tantas veces como ficheros tenga el directorio. Dir devuelve solamente el nombre de un fichero. La sentencia para eliminar un directorio es RmDir ¡ Cuidado ! Visual-Basic no le advertirá que puede borrar algo que no desea. Copia un fichero.. directorio \ CursoVB\Ejemplos Función FileCopy. criterio formado por los caracteres o comodines que deseemos. Podemos incluso crear un directorio. En el siguiente ejemplo. Muy sencillo. Destino LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 114 . Vamos a ver ahora como podemos ver los nombres de los ficheros existentes en un determinado directorio. Usaremos para ello la sentencia MkDir. También podemos forzar a que un directorio sea el directorio por defecto.. ‘Termina la impresión y saca la hoja de la impresora Ya sabemos sacar el directorio. si deseamos imprimir la lista de ficheros existentes. La sentencia que tendremos que usar en ChDir.. Efectivamente. que se encuentra en el disco C. Asegúrese muy bien mediante un aviso al usuario cada vez que elimine un directorio. guardarla en un fichero. Igual que en DOS. etc. ‘Imprime la variable fichero en la impresora ‘Toma el nombre de otro fichero ‘Vuelve a Do Until . puede ponerlos.*) ‘Hasta que fichero sea una cadena de longitud cero. Kill “C:\CursoVB\Ejemplos\Ejemplo1. La sintaxis de esta función es la siguiente : FileCopy Origen. Sin embargo. sobre el directorio actual. así podría ser para presentarlos en pantalla. Vamos a ver que otras cosas se pueden hacer con ficheros.txt. Esta sentencia crea el directorio con el nombre indicado.Ejemplo ChDrive “A” cambia la unidad actual a la unidad A.

Si la ruta de acceso especificada en nombrerutanuevo existe y es distinta de la ruta de acceso especificada en nombrerutaantiguo. ejecutaremos la sentencia : FileCopy “A :\CursoVB\Ejemplo1” . precisamente lo escrito en el código. pero no se puede mover un directorio o carpeta. puede incluso moverlo de sitio. el tiempo previsto para enviarlo por módem. En el ejemplo. y nombrerutanuevo es una expresión de cadena que especifica el nombre nuevo y. La instrucción Name cambia el nombre de un fichero. etc. para copiar ese fichero ejecutaremos la sentencia : FileCopy Text1. La sintaxis es la siguiente : Variable = FileLen("C:\CursoVB\Ejemplos\Ejemplo1") Variable tomará un valor numérico igual al número de bytes del fichero.Si tenemos un TextBox llamado Text1 donde vamos a introducir el nombre (con su Path) del fichero origen. En el caso anterior no llevaba dobles comillas. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 115 . la instrucción Name coloca el archivo en el nuevo directorio o carpeta y cambia el nombre del archivo. si un fichero le va a caber en lo que le queda libre de un disquete. Antes de cambiar el nombre de un archivo. Name coloca el archivo en la nueva ubicación. Ejemplo1. sin cambiar el nombre del archivo. aparte de cambiarlo de nombre. por ejemplo. La sintaxis de Name es la siguiente : Name nombrerutaantiguo As nombrerutanuevo Donde nombrerutaantiguo es una expresión de cadena que indica el nombre del fichero (con su path) al que se le quiere cambiar el nombre. lo que indica el origen y el destino. Tanto nombrerutanuevo como nombrerutaantiguo deben encontrarse en la misma unidad de disco. Mediante esta instrucción podrá saber. de ser necesario. No solamente puede cambiar un nombre.Text.Text Si queremos copiar un fichero del disco A. vamos a cambiar el nombre del fichero C:\CursoVB\Ejemplos\Ejemplo1 por el de C :\CursoVB\Ejemplos\Prueba1 Name “C:\CursoVB\Ejemplos\Ejemplo1” As “C :\CursoVB\Ejemplos\Prueba1” En el siguiente. “C:\CursoVB\Ejemplos\Ejemplo1” Observe la necesidad de dobles comillas para especificar que es. pero siempre en la misma unidad de disco. le cambiamos de directorio. la nueva ubicación del archivo y la unidad de disco. El nombre y ubicación especificados en nombrerutanuevo no pueden ser los de un archivo existente. en el directorio CursoVB y de nombre Ejemplo1 al disco y directorio C:\CursoVB\Ejemplos y con el mismo nombre que tenía en el disco A. otro TextBox donde introduciremos el nombre (con su Path) que queremos dar a la copia. se debe cerrar. Por medio de Name se puede mover un archivo de un directorio o carpeta a otro. Text2. Si se utiliza Name con un archivo abierto se produce un error. debido a que era el contenido de un TextBox lo que se usaba para indicar el origen y el destino. si se desea mover de directorio. Name “C:\CursoVB\Ejemplos\Ejemplo1” As “C :\CursoVB\Ejercic\Prueba1” Existe una función que le permite conocer el volumen de un fichero : FileLen. es decir. Si nombrerutanuevo y nombrerutaantiguo tienen distintas rutas de acceso y el mismo nombre de archivo.

) Puede aprovechar esta función para borrar o hacer Backup de determinados ficheros que tengan mas de un tiempo de permanencia. Archivo de sistema. no puede pretenderse darle a ese directorio atributos que solamente se pueden aplicar a un fichero. con su Path y unidad de disco. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 116 . para el caso del ejemplo : Variable = FileDateTime ("C:\CursoVB\Ejemplos\Ejemplo1") Variable puede tomar un valor como el siguiente : Variable = 13/02/97 14:59:20 (Observe que de esta función se obtiene una variable de cadena. se lo indicará devolviendo el valor 16. Si la expresión nombreruta representa un directorio. El archivo ha sido modificado después de efectuar la última de seguridad. ni puede pretender darle a un fichero un valor en el que entre el 16 como sumando. Esta función devuelve un número. etc. Los atributos de un fichero se refieren a si son de solo lectura. Oculto. utilizaremos la función GetAttr. igual a la suma de los siguientes valores de atributos: Valor 0 1 2 4 16 32 copia Constante vbNormal vbReadOnly vbHidden vbSystem vbDirectory vbArchive Descripción Normal. y atributos es una o varias de las constantes o valores anteriores. que le permite conocer la fecha y hora de creación o de la última modificación de un fichero.Otra función para el tratamiento de ficheros es FileDateTime. si ha sido modificado desde la última vez que se ha realizado un Backup. con su Path y unidad de disco. Para cambiar un atributo utilizaremos la función SetAttr. cuya suma especifica los atributos de archivo. Podemos obtener y modificar los atributos de un fichero. Dado que el valor 16 indica que lo expresado en nombreruta es un directorio. directorio o carpeta o una etiqueta de volumen. sustituir ficheros por versiones mas recientes. de sistema. ficheros ocultos. La sintaxis de esta función es la siguiente Sintaxis SetAttr nombreruta . Sintaxis Variable = GetAttr (nombreruta) Donde nombreruta es una expresión de cadena que especifica un nombre de archivo. La sintaxis es. atributos Donde nombreruta es una expresión de cadena que especifica un nombre de archivo. Para conocer los atributos de un fichero. que representa la suma de los atributos de un archivo. El valor devuelto por GetAttr es un número. Estos casos le producirán un error en tiempo de ejecución. se producirá un error en tiempo de ejecución. Directorio o carpeta. Si pretende establecer los atributos de un archivo abierto. Sólo lectura.

Para mostrar una imagen en cualquiera de estos objetos.Guía del Estudiante Cap. pero de otro tipo. Si tipoinformación = 1 nos devuelve el modo de apertura del fichero. según la siguiente lista Valor 1 2 4 8 32 Modo del archivo Entrada Salida Aleatorio Añadir Binario La Ayuda de VB dice que tipoinformación puede ser =2 para que FileAttr devuelva información sobre el selector de archivos del sistema operativo. Mediante una instrucción para cambiar esta propiedad. bien natural (tipo fotografía) o sintética. es necesario especificarlo en su propiedad Picture. 4 CONTROLES PARA MOSTRAR IMÁGENES CREAR CONTROLES EN TIEMPO DE EJECUCIÓN EL EXAMINADOR DE OBJETOS _______________________________________________________________ __ Una imagen representa una figura. Esta función es FileAttr Función FileAttr Devuelve el modo de apertura de un archivo.Existe una función. tipoinformación) Donde numerocanal es el número del canal de apertura de ese archivo. Algunas veces la información de ayuda de VB promete cosas que. Los objetos que admiten una imagen son: • • • Formularios PictureBox Image Existen mas controles gráficos que se irán viendo a lo largo del curso. La forma de especificarle al objeto la imagen que debe presentar puede hacerse de dos formas: • • En la caja de propiedades. Sintaxis variable = FileAttr (numerocanal . Esta función no tiene una gran aplicación práctica. Vea para mas detalles la sentencia Open. Información que conocemos desde el mismo momento de abrirlo. si no se va a variar la imagen durante la aplicación. son difíciles de comprobar. Visual Basic . y tipoinformación es el tipo de información que deseamos de ese fichero. La instrucción es la siguiente: Nombreobjeto. Logicamente debe referirse a un archivo abierto en el momento de ejecutar esta función. Estos tres son los mas usados y con los que comenzaremos a trabajar. que no tiene nada que ver con la anterior. ya que comprueba la forma en la que hemos abierto un archivo. Para presentar una imagen es necesario hacerlo sobre un objeto que la admita.Picture = LoadPicture (Path. sin dudar de que sean ciertas. aunque puede parecerlo por su parecido semántico y que también devuelve atributos. Fichero) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 117 .

lógicamente.WMF que se encuentra en el directorio C:\VB\METAFILE\BUSINESS.Método LoadPicture) un ejemplo muy ilustrativo. gráficos. Para ello debemos declarar una o varias variables tipo Picture. LinkItem. Para ello se utiliza el método gráfico Print que veremos en el capítulo de métodos gráficos CONTROL PICTURE BOX Este objeto se encuentra en la caja de herramientas estándar: Este objeto permite presentar todo tipo de ficheros gráficos (. (A través de un control Data o un objeto Recordset o rdoResultset) Las propiedades de un PictureBox son: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 118 . un fichero de icono ( . Por ello. ya que la variable )o variables conteniendo la(s) imágenes están en la RAM.Por ejemplo. Vea en el capitulo 7 (Métodos Gráficos . EL FORMULARIO Ya hemos visto lo que es el Formulario. WMF.Picture = LoadPicture (“C:\VB\METAFILE\BUSINESS\DOLLAR. basta con ejecutar la misma instrucción sin fichero alguno: Form1. tiene las propiedades LinkMode. También puede tomar el dato del gráfico de una Base de Datos. variando las propiedades Height y Width.CUR) Las dimensiones del PictureBox se establecen en el diseño o mediante programa. deberemos ejecutar la instrucción: Form1. No intente nunca mejorar una aplicación mediocre con un fondo artístico en un Formulario. Un fondo gráfico sobre el Formulario puede convertir una aplicación de buena a excelente.Picture = LoadPicture ( ) También pueden tomar la imagen desde otro control de imagen. Dispone de una propiedad. LinkTimeout y LinkTopic. y meter en ellas una imagen mediante el método LoadPicture. También puede cambiarse su posición mediante las propiedades Top y Left. mediante un procedimiento de Intercambio Dinámico de Datos (DDE) (Solo el PictureBox) Puede también meter una imagen en una variable.WMF).ICO) o un Metarchivo (. Simplemente podemos añadir a lo ya dicho.WMF”) Para "descargar" esa imagen de ese formulario. Este método es muy rápido. se puede escribir texto en un formulario. Inferior o a uno de los lados del formulario que lo contiene. . Align que permite colocarlo adosado en la parte superior. que un formulario tiene la propiedad Picture. El Control PictureBox puede ser destino de los datos de un enlace DDE. ya que no necesita acceder al disco para buscar una imagen. con lo que podemos poner como fondo un bit-map. Además de presentar imágenes. si tenemos un formulario llamado Form1 y queremos rellenarlo con una imagen contenida en el fichero de Windows metafile DOLLAR. y luego poner en uno de los controles citados anteriormente la imagen guardada en la variable. pero emplea mucha memoria RAM. .ICO. (Los datos serán.BMP.

CUR) El control Image no puede ser destino de una comunicación DDE. El control Picture puede ser contenedor de otros controles. o FillStyle. el tamaño del bit-map no cambiará. o sobrará espacio en el control. WMF.Align Appearance ClipControls DataField DrawWidth Enabled Fontransparent ForeColor Height LinkMode LinkTimeout Negotiate Picture ScaleWidth TabIndex WhatThisHelp Width Autoredraw DataSource FillColor Autosize DragIcon FiilStyle Backcolor DragMode Font Left MousePointer ScaleMode Top BorderStyle DrawStile LinkItem Name ScaleTop Visible HelpContextID Index LinkTopic MouseIcon ScaleHeight ScaleLeft TabStop Tag Un PictureBox puede disponer de los siguientes procedimientos : Click KeyDown Change KeyPress DblClick DragDrop DragOver GotFocus Al igual que en el formulario. . Puede tomar la imagen de una base de datos. Poniendo esta propiedad a True el gráfico se adaptará a las dimensiones del control Image.BMP). pero sólo admite una parte de las propiedades. Esto quiere decir que puede poner otros controles dentro del picture. es decir. deja ver el fondo del formulario en las partes no ocupadas por su gráfico.BMP. no tendrían sentido en este control propiedades como Backcolor. presentándose solamente una porción del bitmap. variando las propiedades Width y Height del control Image. bien a través de un control Data o a través de un objeto Recordset. El control Image utiliza menos recursos del sistema y repinta con más rapidez que un control PictureBox. y esos controles tendrán un comportamiento especial en ciertos casos. Si el gráfico es un bit-map (Fichero . los eventos y los métodos de PictureBox. en caso contrario. con la propiedad Stretch a True podemos variar el tamaño del bit-map. caso que el control Image sea menor que el tamaño del bit-map. Use la propiedad Stretch para determinar si el gráfico se escala para que se ajuste al control o viceversa. . Si esta propiedad está a False. utilizando el método Print. Por lo tanto. (Verá más adelante el control Option) CONTROL IMAGE Este control se encuentra en la caja de herramientas estándar: Este control permite presentar todo tipo de ficheros gráficos (. Las propiedades de un Image son: Appearance LSB BorderStyle Datafield Capítulo 1 DataSource DragIcon DragMode Página 119 Visual Basic – Guía del Estudiante . FillColor.ICO. Un Image es transparente. Si se pone a False. propiedades que se pueden cambiar en tiempo de ejecución. el control Image tomará las medidas del gráfico que contenga. se puede escribir texto en un PictureBox.

en el izquierdo (Align Left) o en el derecho (Align Right) del formulario que lo contiene. el control mantiene el tamaño y la posición tiempo de diseño. De esta forma realizamos una barra de herramientas. un control con la propiedad Align establecida a 1 ó 2 modificará su tamaño de forma automática para ajustarse a la anchura del formulario. Al ser el PictureBox un contenedor. Para no alinearlo con ningún borde basta con poner la propiedad Align a 0-None. Si en un formulario hay dos barras de herramientas. el tamaño del control se ajusta automáticamente a la anchura o altura del formulario. Con este valor. en el inferior (Align Bottom). El control se coloca en la parte izquierda del formulario y su altura es a la altura del formulario. Puede tomar los siguientes valores : (Predeterminado cuando el control se coloca en un formulario no MDI). Sintaxis NombrePictureBox.Enabled Height Name Picture WhatThisHelp Width Index Stretch Left Tag MouseIcon Top MousePointer Visible Un Image puede disponer de los siguientes procedimientos : Click MouseMove DblClick DragDrop MouseUp DragOver GotFocus MouseDown PROPIEDADES DE LOS CONTROLES PictureBox e Image Align (PictureBox solamente) Permite colocar el control en el borde superior (Align Top). Cuando un usuario cambie el tamaño del formulario. De la misma forma se puede crear barras de herramientas a los lados izquierdo o derecho de un formulario. y colocar en este PictureBox varios controles Image. una en la parte superior (o inferior) y otra en un lateral. puede poner un PictureBox en la parte superior de un Formulario. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 120 . Se puede usar propiedad Align para crear rápidamente una barra de herramientas o una barra de estado en la parte superior o inferior de un formulario. la de la parte superior o inferior es la que se extiende hasta la esquina. teniendo preferencia sobre las colocadas verticalmente a la izquierda o a la derecha. El control se coloca en la parte derecha del formulario y su altura es la altura del formulario. a los que se les puede poner un icono. (Predeterminado cuando el control se coloca en formularios MDI) El se coloca en la parte superior del formulario y su anchura es igual a la anchura del formulario. Cuando se adosa a uno de los bordes.Align [= número] número 0-None asignada en 1-Top control 2-Bottom igual 3-Left igual 4-Right igual a Un entero que especifica cómo se presenta el control. El control se coloca en la parte inferior del formulario y su anchura es a la anchura del formulario.

el control no presentará las imágenes o texto que no se hayan dibujado realmente (caso por ejemplo de un formulario minimizado) o que se hayan borrado por haber sido puestas tras otro control. Ninguno o fijo. Esta propiedad no es muy usual. si la imagen es mayor que el PictureBox la recortará. por lo que omitimos una mayor explicación. Si es False. Le permitirá también introducirla de una forma muy sencilla en la base de datos. Igual que otros controles BorderStyle (PictureBox e Image) Tipo de borde. un método gráfico repintará todo el Picture. solamente repintará la zona de la imagen que ha variado. Si es False. como en otros controles (PictureBox solamente) Permite que el Formulario o PictureBox (El control Image no tiene esta propiedad). Autosize (PictureBox solamente) Si esta propiedad es True se cambia automáticamente el tamaño del PictureBox para acomodarse al tamaño de la imagen. Si esta propiedad es True.Negotiate (PictureBox solamente) Esta propiedad le permite mostrar o no mostrar el PictureBox dentro de un formulario donde tiene una barra de herramientas. Si Autoredraw está a False. Recurra a la ayuda para obtener mas detalles Appearance Autoredraw (PictureBox e Image) 3D o Flat. mantenga siempre la imagen o el texto presente. ClipControls (PictureBox solamente) Devuelve o establece un valor que determina si los métodos gráficos en eventos Paint vuelven a dibujar el objeto entero o solamente las áreas últimamente expuestas. BackColor (PictureBox solamente) Color de fondo. No está disponible en tiempo de ejecución. Le van a permitir presentar una imagen desde una base de datos. y si es menor. Lo verá en el capítulo correspondiente Enabled (PictureBox e Image) Habilitado. DragIcon DragMode DrawMode DrawStyle DrawWidth (PictureBox e Image) (PictureBox solamente) (PictureBox solamente) (PictureBox solamente) Igual que otros controles Formas de responder a los métodos gráficos. DataField DataSource (PictureBox e Image) (PictureBox e Image) Verá con mas detalles estas propiedades cuando estudie los Objetos enlazados a Datos. Igual que otros controles. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 121 . presentará una zona sin imagen. Igual que otros controles.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 122 . Se estudiará con mas detalles al estudiar el Intercambio Dinámico de Datos.MouseIcon = Picture1. o nombre de una variable tipo Picture. 2 Cruz (puntero en forma de cruz). HelpContextID Index (PictureBox solamente) (PictureBox e Image) Igual que otros controles Igual que otros controles (PictureBox solamente) LinkItem. Image1.picture La propiedad MouseIcon proporciona un icono de mouse personalizado que se utiliza cuando el valor de la propiedad MousePointer es 99. Left. De esta forma podemos cargar como un icono el gráfico que tengamos en otro objeto o en una variable tipo Picture. Font. Fontransparent. MousePointer (PictureBox e Image) MouseIcon Establece un icono de mouse personalizado.FillColor.MouseIcon = LoadPicture(ruta) objeto. Height. Top (PictureBox e Image) Definen el tamaño y la posición del control.MouseIcon = LoadPicture("C:\vb\icons\computer\disk05. de un control PictureBox o de un control Image. MousePointer. FillStyle. LinkTimeout. MouseIcon. Así podemos cargar un icono de los existentes en el disco. En el control Image el tamaño puede depender del gráfico que se introduzca y del valor de la propiedad Stretch.MousePointer [= valor] objeto Nombre del objeto PictureBox o Image valor Número entero que especifica el tipo de puntero de mouse que aparece.MouseIcon = imagen ó donde : objeto Nombre del objeto PictureBox o Image ruta Expresión de cadena que especifica la ruta y el nombre del archivo que contiene el icono personalizado. Sintaxis objeto. según se describe mas adelante. Image1. LinkTopic Propiedades que afectan al comportamiento de este control como DESTINO de una conversación DDE. (Una vez que comenzamos a estudiar las propiedades gráficas. Width . 1 Flecha. ForeColor (PictureBox solamente) Igual que otros controles.ico") imagen Propiedad Picture de un objeto Form. Ej. Ej. Establece el tipo de puntero de mouse que aparece cuando se pasa el puntero del ratón por encima de un objeto en tiempo de ejecución. LinkMode. Las opciones para valor son: 0 (Predeterminado) Forma que determine el objeto. se comenta cómo se puede cambiar el icono de la propiedad MouseIcon de todos los controles) Sintaxis objeto.

ScaleLeft. Name Picture (PictureBox e Image) (PictureBox e Image) Devuelve o establece un gráfico mostrado en un control. 4 Icono (pequeño cuadrado dentro de otro cuadrado). Nombre del control Nota Las propiedades ScaleHeight y ScaleWidth son distintas de las propiedades Height y Width. 7 Tamaño N S (flecha doble apuntando al norte y al sur).ScaleMode [= valor] Nombre del Control LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 123 . ScaleTop. Sintaxis objeto valor objeto. 11 Reloj de arena (espera). no a la escala ! ScaleHeight. 13 Flecha y reloj de arena. sur. o al situar controles. ScaleWidth. ScaleTop Devuelven o establecen las coordenadas horizontal (ScaleLeft) y vertical (ScaleTop) de los bordes izquierdo y superior de un objeto al utilizar métodos gráficos o al situar controles.3 Forma de I. ScaleMode Propiedades del PictureBox solamente. ¡Todas las propiedades Scale ? ? ? afectan a la medida de las coordenadas. ScaleLeft. 5 Tamaño (flecha de cuatro puntas: norte. ScaleWidth Establecen el número de unidades de medida horizontal (ScaleWidth) y vertical (ScaleHeight) del interior de un objeto al utilizar métodos gráficos o al colocar controles. Estas coordenadas están medidas de acuerdo con la unidad de medida establecida en las propiedades ScaleHeight y ScaleWidth ScaleMode Devuelve o establece un valor que indica la unidad de medida de las coordenadas de un objeto al utilizar métodos gráficos. Ya se ha estudiado mas atrás como cambiar la propiedad Picture. 8 Tamaño NO SE (flecha doble apuntando al noroeste y al sudeste). 15 Tamaño de todo (personalizable en Microsoft Windows NT 3.ScaleWidth [= valor] Nombre del Control Expresión numérica que especifica la medida horizontal o vertical. 9 Tamaño O E (flecha doble apuntando al oeste y al este). 10 Flecha hacia arriba. Sintaxis objeto. este y oeste).51) 99 Icono personalizado especificado en la propiedad MouseIcon explicada anteriormente.ScaleHeight [= valor] objeto. ScaleHeight. 6 Tamaño NE SO (flecha doble apuntando al nordeste y al sudoeste). 14 Flecha e interrogación. 12 No soltar.

Además. 5 Pulgada. según se describe a continuación. al cambiar el tamaño del control también se cambiará el del gráfico que contenga. (Predeterminado) El control cambia su tamaño para ajustarlo al del Si Stretch tiene el valor True. 7 Centímetro. y en ScaleLeft y ScaleTop se establece 0. puede configurar un sistema de coordenadas completo. 0 Indica que una o más de las propiedades ScaleHeight. Cuando aumenta el tamaño del control. Se usa entonces una unidad de medida definida por el usuario (User) 1 (Predeterminado) Twip (1440 twips por pulgada lógica. Debe controlarse por programa el tamaño del mismo. en ScaleMode se establece automáticamente 0. ScaleLeft y ScaleTop tienen valores personalizados. 4 Carácter (horizontal = 120 twips por unidad. Sintaxis objeto. ScaleLeft y ScaleTop. con coordenadas positivas y negativas. Igual que resto de controles. Otros controles que pueden manejar imágenes LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 124 . vertical = 240 twips por unidad). Al establecer en ScaleMode un número mayor que 0.Stretch [= lógico] objeto Nombre del control Image lógico Expresión booleana que especifica si el gráfico adapta su tamaño. 3 Píxel (la unidad mínima de la resolución del monitor o la impresora). TabIndex. Estas cuatro propiedades de escala se relacionan con la propiedad ScaleMode de la siguiente forma: Al establecer un valor en cualquier otra propiedad de escala. según se describe a continuación.objeto Nombre del Control valor Número entero que especifica la unidad de medida. mantiene las nuevas medidas aunque se le introduzca un gráfico de menor tamaño. 6 Milímetro. True False gráfico. 567 twips por centímetro lógico). El gráfico cambia su tamaño para ajustarlo al del control. Utilizando las propiedades relacionadas ScaleHeight. ScaleHeight y ScaleWidth cambian a la nueva unidad de medida. 2 Punto (72 puntos por pulgada lógica). ScaleWidth. TabStop (Solo control PictureBox) Igual que otros controles Tag Top Visible WhatsThisHelpID Width Comunes a ambos. ScaleWidth. los valores de CurrentX y CurrentY cambian para reflejar las nuevas coordenadas del punto actual. Stretch (Solo control Image) Devuelve o establece un valor que indica si un gráfico cambia su tamaño para ajustarlo al de un control Image.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 125 .

OCX) (Vea Nota 1) Este control nos permite almacenar varias imágenes.IMAGE LIST Lo verá mucho mas ampliamente en un capítulo posterior. pueden verse las propiedades de un ImageList con varias imágenes cargadas. ProgressBar. Se verá con más detalle en un próximo capítulo (Cap. sin necesidad de tener que acceder a leerlas en el disco. Solamente sirve de “almacén” para pasarlas rápidamente a otro control (PictureBox. 16) Para introducir imágenes en el control ImageList deberemos acceder a sus propiedades. Verá mas adelante como se realiza una barra de herramientas (La barra de herramientas solo está disponible para la versión de 32 Bits) Un ImageList permite tener varias imágenes dentro de él. ListView y Slider. contiene imágenes. Este control es necesario para almacenar las imágenes que se mostrarán en los iconos de la barra de herramientas. StatusBar. un PictureBox o un control Image.e. Es. como un ListBox pero que en vez de contener textos. Este control no está normalmente en la caja de herramientas. Hay que introducirlo mediante los Proyecto | Componentes y pertenece al grupo Microsoft Windows Common Controls (COMCTL32. bien mediante F4 y luego haciendo click sobre Personalizado. tal como indica su nombre. p. En la siguiente figura. La utilidad de este control es para almacenar en él distintas imágenes. TreeView. y servirlas desde él a otro control. que conllevaría una importante pérdida de tiempo si el cambio de imágenes debe ser rápido. Se incluye en este capítulo para que lo pueda ir usando. Aparecerá un cuadro donde podemos insertar imágenes LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 126 . bien pulsando el botón derecho del ratón sobre el icono del control. Toolbar. Nota 1.OCX) incluye además de este los controles TabStrip. El grupo de controles Microsoft Windows Common Controls (COMCTL32.) que será el que las presenta en pantalla. pero este control no las presenta.

ya que Picture es una propiedad de la colección ListImages Como cualquier colección.ICO El control ImageList tiene una colección llamada ListImages. y un control Picture llamado Picture1 donde queremos presentar la animación. Entre ellos el TOOLBAR Barra de Herramientas.Picture = ImageList1. que nos servirá para contar el número de imágenes que guarda. Control Toolbar LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 127 . Así la imagen número 3 será : ImageList1.ListImages. En el procedimiento Timer de un Timer pondríamos Static pepe As Integer pepe = pepe + 1 If pepe > ImageList1. Como toda colección. dé la sensación de movimiento.El tipo de imágenes pueden ser mapas de bits :BMP o iconos .ListImages (3) . Para ello necesitamos varias imágenes que poniendo una tras otra. Picture Observe que tras ListImages ( ) es necesario poner la propiedad Picture. estas imágenes están guardadas en la memoria RAM.Count Then pepe = 1 Set Picture1. será un array donde podemos elegir uno de sus elementos designándolo por su nombre seguido de su número (Index) encerrado entre paréntesis. en su posición 3. ListImages.Picture = ImageList1. Esta colección contiene todas las imágenes introducidas en el ImageList y las propiedades de cada imagen.Listimages (3) Si tenemos un control Picture llamado Picture1 y queremos poner en su propiedad Picture la imagen cargada en el ImageList1.Picture Una de las mayores aplicaciones del ImageList es proporcionar imágenes para otros controles. Numerodeimágenes = ImageList1. es fácil realizar una animación. ListImages tiene la propiedad Count.ListImages(pepe).Count Dado que al guardar imágenes en un ImageList. Imaginemos un número indeterminado de imágenes dentro de un ImageList. usaríamos la expresión : Set Picture1.

por lo que también es habitual poder programar los iconos que aparecen en la barra de herramientas. Esto facilita la operación al no tener que desplegar menús para buscar la operación a realizar. Todas las imágenes del Toolbar deben estar en un único ImageList. A cada botón se le denomina Button y a la colección de botones se le denomina Buttons. solamente las mas frecuentes. Para introducir el Toolbar es necesario que esté presente en la caja de herramientas el control personalizado Microsoft Windows Common Controls (COMCTL32. Pero ocurre que la función que para un usuario es muy frecuente.OCX). Aparecerá un cuadro de diálogo como este : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 128 . Por lo tanto. un control ImageList es un almacén de imágenes. Como se recordará. es necesario introducir un control ImageList en cualquier aplicación que use un control Toolbar. Cada Button es un elemento de la colección Buttons y por lo tanto podemos referirnos a cada uno de ellos por el índice que tiene dentro de la colección. que podemos usar en cualquier parte de la aplicación. Normalmente se ponen en la barra de herramientas los iconos que representan las acciones mas frecuentes de una aplicación. Estos iconos realizan una determinada función. Para realizar la barra de herramientas en tiempo de diseño.Este control permite realizar una barra de herramientas. sino como decíamos. Como el espacio que ocupan los iconos es grande. como ya conocerá. Los iconos de cada uno de los botones del Toolbar debe introducirse previamente en un control ImageList. es también bastante normal que no estén representados en la barra de herramientas todas las funciones posibles de la aplicación. Y este ImageList debe estar en el mismo formulario que el Toolbar La barra de herramientas puede realizarse en tiempo de diseño (este sería el caso para cuando no existiese variación ni elección de botones a lo largo de la ejecución de la aplicación) o en tiempo de ejecución (caso que correspondería con una aplicación que tuviese una barra de menú programable o que variase esta barra de menú dependiendo de cada operación que se esté ejecutando en la aplicación). La barra de herramientas es. una barra donde existen varios iconos. Una de esas partes es la confección de la barra de herramientas. para otro no lo es. El control Toolbar es un contenedor de un array de iconos. Estos iconos forman botones sobre los que se puede insertar código en sus procedimientos. Todo ello lo puede hacer el control Toolbar. basta con visualizar el cuadro de propiedades que aparece pulsando el botón derecho del ratón sobre el control Toolbar.

buttons(1) ) La propiedad Key es un nombre que se puede añadir a cada botón. lo insertaría en segundo lugar. pero no se mantiene pulsado) Botón Biestable. En el cuadro botones podemos introducir los datos deseados para cada uno de los botones que compondrán la colección Buttons. (El uso de estos pequeños rótulos pueden hacer una aplicación muy bonita) La propiedad AllowCustomize permite. Deberá elegirse el ImageList que contenga las imágenes de los iconos que queremos introducir en el Toolbar. Esta propiedad lleva implícito que los botones que forman un grupo son biestables. pulsado). no pulsado.Default 1 . El Caption (opcional) es la palabra que figurará debajo del icono del botón. El ImageList debe estar en el mismo formulario que el Toolbar. Pueden hacerse varios grupos independientes introduciendo un botón que no pertenezca a un grupo (tipos 0. no en el último lugar como podría creerse). Pressed. si el Toolbar aparece por defecto habilitado o deshabilitado (Enabled) y si muestra o no un rótulo programable al pasar el ratón por encima de cada botón del Toolbar. La propiedad Style define el tipo de botón : 0 . Esta propiedad sirve para identificar el botón que se ha pulsado. cambiar el orden de los botones e introducir separadores (vea evento DobleClick). Este cuadro nos permite también introducir la forma que adoptará el puntero del ratón cuando entre en el Toolbar (MousePointer). También podemos eliminar un botón haciendo click sobre Eliminar botón. (Se mantiene pulsado y se levanta con otro LSB Visual Basic – Guía del Estudiante .Check click) 2 . (Unpressed. ( Toolbar1. La propiedad Value es el valor por defecto. si es True. (Se pulsa. (ShowTips).Button Group Solo uno de los botones del grupo puede estar pulsado. Un botón se identifica por su índice. 3 ó 4) entre los dos grupos que se independientes que se pretenden formar Capítulo 1 Página 129 Botón monostable. con el que aparecerá el botón al comienzo de la aplicación.Puede ver que en el cuadro ImageList aparece el nombre de un ImageList. 1. pero no para nombrar al botón. Para insertar un nuevo botón hay que hacer click sobre Insertar botón e insertará un nuevo botón inmediatamente después del que figura en la propiedad Index (en la figura del ejemplo. Al desplegar la lista aparecerán todos los ImageList que existan en el formulario.

Haciendo doble click en una zona LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 130 . Then podemos iniciar la parte de la aplicación asociada a cada botón.Index = 2 Then . Style es un número del 0 al 4 con el tipo de botón. Recuerde que los botones se identifican por su índice : Toolbar1. . El control Toolbar tiene los siguientes eventos : ButtonClick Este evento se produce cada vez que se hace click sobre un botón del Toolbar. Image es el número de la imagen en el ImageList. . Si se hace doble click sobre un botón se produce solamente el evento click (dos veces). [Key]. Podremos saber que botón se ha pulsado mediante sentencias condicionales : Private Sub Toolbar1_ButtonClick(ByVal Button As Button) If Button. Click Este evento se produce cuando se hace click sobre cualquier botón del Toolbar.Key presenta en Text1 el texto introducido en la propiedad Key del último botón pulsado.add ( [Indice]. Este valor debe ser único para cada botón. y la propiedad AllowCustomize esté a True. . El control Toolbar también puede realizarse en tiempo de ejecución. pero no pasa parámetros.3 . Para que aparezca debe estar habilitada la propiedad ShowTips. El botón se convierte en un separador de anchura variable. [Imagen]) NombreBotón puede ser cualquier nombre (es el nombre del objeto botón) NombreToolbar es el nombre del Toolbar Indice es el número de orden de ese botón dentro del Toolbar Key es el valor de la propiedad Key del botón. Pasa como parámetro el índice del botón pulsado. If Button.PlaceHolder El botón se convierte en un separador de anchura fija. Con la lectura de la propiedad Key.Index = 1 Then .Enabled = False Para saber que botón se ha pulsado. (No distingue sobre que botón se ha hecho click) Podemos utilizarlo cuando se quiera realizar una operación común para todos los botones (Que suene un Beep.. por ejemplo) DobleClick Este evento solamente se produce cuando se hace doble click en la parte del Toolbar donde no hay botones.Separator 4 . [Caption]. Para introducir u botón en el Toolbar hay que crear el botón y añadirlo a la colección Buttons de Toolbar.Buttons(Indice). . Vea lista mas arriba Imagen es el número de la imagen para ese botón. [Style]. dentro del ImageList que las contiene.Buttons. Podemos hacerlo en una sola instrucción : Set NombreBotón = NombreToolbar. .. También podríamos usar la propiedad Key como se dijo mas atrás. Los botones pueden habilitarse y deshabilitarse usando la propiedad Enabled (True / False). .Text = Button. ToolTipText es el texto que aparecerá al lado del botón cada vez que se ponga el cursor del ratón sobre el botón. puede leerse la propiedad Key : Text1. y la sentencia Case o If .

0=múltiples paneles. o mostrar la fecha y la hora La barra de estado puede configurarse como de un solo panel o de múltiples paneles. mediante el control personalizado múltiple Microsoft Windows Common Controls (COMCTL32. control StatusBar se introduce en la caja de herramientas al mismo tiempo que el control Toolbar. tecla Insert activada.libre de botones. Dado que el control Picture dispone de propiedad Align y puede servir como contenedor de otros controles. puede realizarse una barra de herramientas similar a esta. (Propiedad Style. tal como el estado de la tecla Bloqueo de Mayúsculas. La barra de estado puede albergar hasta 16 paneles. Bloqueo del teclado numérico. Private Sub Toolbar_MouseDown(Button As Integer. Change Se produce solamente cuando se ha realizado algún cambio del orden por el procedimiento anterior. a excepción de sus botones ! ! ! LA BARRA DE ESTADO Este control es muy parecido a la barra de herramientas. y suele usarse. También pueden contener información del Hardware. Pero para 16 bits puede hacerse una cosa parecida (y mas sencilla) utilizando un control Picture como contenedor de tantos controles Image como necesitemos. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 131 . colocándolo en la parte inferior de la ventana. la tecla de mayúsculas. 1= panel único) Las dimensiones de cada panel pueden configurarse como fijas o ajustadas al tamaño del texto o imagen que presentan. mediante el siguiente cuadro. y As Single) Este control solamente funciona en la versión de VB de 32 Bits. x As Single. Las propiedades pueden establecerse en tiempo de diseño.OCX). La barra de estado. MouseMove. DragOver Igual que cualquier control. y posiblemente de forma mas sencilla. ¡ El control Toolbar NO sirve de contenedor de otros controles. que pueden contener texto o gráficos. MouseUp. Shift As Integer. y las posiciones x e y del ratón. DragDrop. con la propiedad AllowCustomize = True nos permite cambiar el orden de los botones e introducir separadores. MouseDown Igual que el resto de los controles Pasa como parámetro el índice del botón. para indicar el proceso que está en curso en la aplicación. tecla Scroll Lock activada.

Es la propiedad Key de ese panel (El contenido de esta propiedad lo podemos leer desde cada panel Variable = statusbar1.En este control las imágenes no es necesario introducirlas previamente en un ImageList. muy similar a la del control Toolbar.[estilo].sbrNum El panel muestra el estado de la tecla Bloq. Pueden introducirse directamente sobre el cuadro de diálogo que sale pulsando el botón derecho del ratón .Index).[gráfico] que entran a formar parte en la sintaxis de creación del panel se explican a continuación. PanelNuevo) Los términos [índice]. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 132 PanelNuevo = Nombrebarraestado.Panels.Propiedad estilo del panel. De esta forma.Add. Acepta imágenes tipo Bit-map o .en la ventana correspondiente a paneles.sbrTime El panel muestra la hora 6 .sbrIns El panel muestra el estado de la tecla Insert 4 .sbrText El panel mostrará el Texto de la propiedad Text de ese panel 1 . Indice .Opcional. Este gráfico puede obtenerse desde un ImageList.Necesario. Para realizarla en tiempo de ejecución basta con visualizar la ventana de propiedades. Key .[key].[Text]. La barra de estado puede realizarse en tiempo de diseño o en tiempo de ejecución.sbrScrl El panel muestra el estado de la tecla Scroll / Lock 5 .ICO.[key]. .Es el gráfico que va a tener el panel. PanelNuevo debe declararse como variable objeto Panel donde sea necesario según el ámbito que le queramos dar. Números 3 . Los paneles pueden combinar una gráfico y un texto. 0 . una vez creado.[estilo].El texto que queremos figure en el panel (Solo si la propiedad Estilo está en sbrText Estilo . Es el índice que define al panel dentro del StatusBar.sbrDate El panel muestra la fecha Gráfico . Para añadir un panel en tiempo de ejecución basta con añadirlo a la colección Panels del control StatusBar mediante la sentencia : Set [gráfico] Donde PanelNuevo es el nombre con el que se va a conocer ese panel que acabamos de crear. nos podremos referir a ese panel simplemente citándolo por su nombre (En este caso.Panels(Panel.sbrCaps El panel muestra el estado de la tecla Bloqueo Mayúsculas 2 .( [índice].propiedades .Key Text .[Text].

ListImages(n).Panels. deben mantenerse las comas separadoras. podemos añadir varios paneles de la siguiente forma : Dim PanelNuevo As Panel Dim pepe As Integer ‘Donde deba declararse a efectos del ámbito Set PanelNuevo = statusbar1. ya que VB ha dejado una puerta abierta para realizar controles a medida. mediante el método LoadPicture . .ImageList1. "Texto " & Str(pepe). y a través de Internet.LoadPicture("C:\vb\icons\comm\net09a. podrá encontrar una amplia gama de fabricantes y controles. "Contenido del Key " & Str(pepe).ico") Si no se pone alguna de las propiedades opcionales intermedias. Existen varias empresas de software dedicadas a la fabricación de controles personalizados.o directamente desde el disco duro. Puede obtener muchos controles en el CD-ROM que acompaña a varias revistas especializadas en programación VB. Como ejemplo.ico")) Estos son los controles gráficos mas importantes. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 133 . LoadPicture("C:\vb\icons\comm\net09a. y en el aspecto de controles gráficos.Picture .Add(pepe. y más que podrá encontrar entre diferentes suministradores de controles. Verá a lo largo del curso que existen otros.

Era complicado. y yo me limito a mi obligación de enseñárselo. por lo tanto sus mismas propiedades Left y Top. una vez vaya avanzando en el curso. por lo que habrá que cambiarle de posición y coocarlo en las coordenadas deseadas.Guía del Estudiante . Al ser una matriz. Desde mis comienzos en la actividad educativa de esta asignatura. introduciremos primero uno con Index = 0 cmdBotonInicial(0) y cuando queramos crear un botón nuevo. se ha decidido alojarlos en capítulos que no eran demasiado “gruesos”.Left + 1000 Es un poco complicado. todos los controles comparten el código de sus procedimientos.Visual Basic . Se le pone la propiedad Visible = False y ya tenemos una matriz de controles. Este podría ser un código para crear un botón de comando Load cmdBotonInicial(1) cmdBotonInicial(1). Supongo que exista alguna razón que yo desconozco para ello. Por lo tanto. Una de las propiedades que no se pasan al nuevo control es la propiedad Visible. Sean los alumnos los que busquen utilidad a ello. aunque el contenido de los ademdums no encaje ni por su contenido. Una matriz de un solo control.Ademdum 1 al Capitulo 4 CREAR CONTROLES EN TIEMPO DE EJECUCIÓN Los ademdums se fueron introduciendo una vez que la Guía del Estudiante estuvo “casi” terminada.Left = cmdBotonInicial(0). Había que meter un control y ponerle Index = 0. invocamos el método Load. los alumnos siempre me preguntaron por la posibilidad de crear controles en tiempo de ejecución. Dejo al alumno la posibilidad de jugar con este método. No se preocupe que algunos ademdums no los entienda. Esta siempre comienza a False. y no han sido precisamente pocos. Se suele hacer esto para que aparezca un control justamente donde hacemos clic con el ratón sobre el formulario. ni se acoplan lógicamente a ninguno de los capítulos escritos. varios botones de comando. Resultado: el nuevo botón queda completamente solapado con el inicial. Había que crear una matriz de controles y añadir en tiempo de ejecución tantos controles nuevos a esa matriz como necesitemos. Veamos un método más sencillo.Visible = True cmdBotonInicial(1). es decir. Por lo tanto también hay que ponerla a True para que veamos el nuevo control. ni por los conocimientos anteriores. Posiblemente estemos usando un lenguaje que no se ha visto todavía en los capítulos estudiados. pero al tener la propiedad Index = 0 ya era una matriz. En anteriores versiones de VB era un proceso un poco tedioso. Los temas tratados en los ademdums no constituyen en sí mismos materia suficiente para un nuevo capítulo. Los nuevos elementos de la matriz tendrán todas las propiedades del elemento inicial. se utilizada el método Load para crear los controles que necesitamos. Quiero decir con esto que la creación de controles en tiempo de ejecución es algo muy llamativo. pero de escaso sentido práctico. Los podrá repasar cuando lo considere oportuno. Sintaxis LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 134 . Y digo esto porque no he tenido la necesidad de ello en ninguno de mis proyectos. Add (Método de la colección Controls) Agrega un control a la colección Controls y devuelve una referencia al mismo. Para crear por ejejmplo. las del elemnto que tienen indice 0. Ya en ejecución. Recuerde que el nuevo botón tendrá las mismas propiedades que el objeto inicial.

Add("VB. Picture1) NuevoBoton. sino que tendrá los mismos eventos (WithEvents) que un CommandButton.Visible = True NuevoBoton. y la tercera es la declaración de un Objeto TextBox: Dim NuevoBoton As Control Dim NuevoBoton As CommandButton Dim NuevoTextBox As TextBox Esta declaración es suficiente si no va a poner código en los procedimientos de ese control.Visible = True NuevoTextBox. name. Para ello debe declararse de otra forma: Private WithEvents NuevoBoton As CommandButton Mediante esta declaración (Que debe ponerse en la sección de declaraciones del formulario). container) Donde: NombredelControl ser recomiendo que esta dar al control en su NombredelFormulario ProgID biblioteca ver en el citado Es la referencia del nuevo control devuelta por el método Add. Le repito lo de más atrás. Puede hacerlo según estos tres ejemplos. Un contenedor de controles puede ser un PictureBox o un Frame. Name Es el nombre que va a tener el control.Controls. Se obtiene del Examinador de Objetos de Visual Basic. El problema es que con esa declaración no se puede introducir código. en el primero se declara que NuevoBoton es un control. Ponga aquí la misma cadena que en NombredelControl. Le variable tipo objeto tenga el mismo nombre que le va a parámetro Name.Add("VB. Debe una variable tipo Control declarada previamente. le diremos que ese control es precisamente un CommandButton) . separados ambos por un punto.Left = 2000 NuevoTextBox. (Puede ser Me) Es una cadena que identifica al control. (declaración suficientemente válida ya que posteriormente al crearlo. El código para crear estos dos controles es el siguiente: (En el ejemplo se ha puesto en el procedimiento click de un botón de comando) Set NuevoBoton = Me.Left = 100 NuevoBoton.TextBox". Picture1) Set NuevoTextBox = Me.CommandButton".Controls. seguido del nombre que puede analizador de Objetos. Consiste en una cadena que indica la donde se encuentra. Le ahorrará muchas confusiones. Aquí se pondría el nombre del ese contenedor que debe existir en el formulario. Container Es el nombre del contenedor de ese control si es que se quiere meter dentro de un contenedor que a su vez está dentro del formulario. "NuevoBoton1". no solamente estamos declarando que NuevoBoton es un CommandButton.Controls. Es el formulario donde se va a meter el nuevo control.Caption = “Soy un Botón” NuevoTextBox.Add (progID.Top = 120 NuevoBoton. "NuevoTextBox". Vamos a ver como se puede declarar una variable tipo Control.Set NombredelControl = NombredelFormulario. en la segunda ya lo declaramos como objeto CommandButton.Top = 100 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 135 .

Hay formas más complicadas de crear controles. E insisto que nunca me he visto en la necesidad de crear controles (lo cual no demuestra nada. al hacer click sobre él sale el Mensaje Box. Volvamos a ver el código. Ya hemos introducido código en el botón recién creado. Lógicamente. En el desplegable de la parte izquierda aparecen solamente los nombres de los controles existentes en el formulario. El siguiente ejemplo quita el control NuevoTextBox agregado dinámicamente: Me. Pero ¡Oh sorpresa!.Remove "NuevoTextBox" LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 136 . Cuando introducimos un procedimiento nuevo creado por nosotros. MsgBox "Esto Funciona" Ejecutamos el programa y vemos que efectivamente. que se quitan mediante Unload ). ya que no va a contener código. y como si fuese un botón que realmente existe en tiempo de diseño. ese procedimiento aparece en el desplegable de la derecha de la ventana de código. lo reconozco) Quitar controles Para quitar controles agregados dinámicamente. Continuamos escribiendo el código deseado en ese nuevo procedimiento que acabamos de crear. Solamente se pueden quitar los controles agregados con el método Add (a diferencia de los controles agregados con la instrucción Load. yo soy tu Lobo" Texto que aparecerá en el TextBox como si se tratase de un TextBox introducido durante el diseño. Está en la parte izquierda.Ahora vamos a introducir el código en el procedimiento Click del botón de comando. Podemos cambiarle las propiedades. si ejecutamos la linea anterior antes de crear el TextBox dará un error. el procedimiento NuevoBoton_Click no está en el desplegable de la parte derecha.Text = "Hola Mi Amor. se utiliza el método Remove. pero creo que con esta le basta. Para el TextBox no ha hecho falta declararlo con la segunda declaración. estre ellas su propiedad Text: NuevoTextBox. Para ello vamos a Herramientas | Agregar Procedimiento y tecleamos el nombre del procedimiento: NuevoBoton_Click.Controls. una vez creado el botón.

en la ventana de la derecha. Si observa la figura de la página siguiente verá que está desplegado. Comencemos por arriba. basta con pulsar F2 Este es el analizador de objetos. Aparecen concretamente los controles que figuran en la barra de herramientas al abrir un nuevo proyecto. Si seleccionamos ese control. Si añadimos más componentes (Haciendo clic en la barra de menú Proyecto | Componentes) veremos que aparecen nuevos controles en el desplegable.Visual Basic . LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 137 . los métodos. por ejemplo) aparecerá esa referencia en la lista desplegable. Los controles básicos aparecen en la referencia VB. porque a ese proyecto le habíamos introducido el CommonDialog. mostrando todas las referencias y controles que tienen en ese momento. nos aparecen en la ventana Classes todas las colecciones que tiene el CommonDialog. (Miembros) aparecerán todas la propiedades. Lo entenderemos mejor abriéndolo. y los eventos (Claro que un CommonDialog no tienen eventos. Puede ver que tienen varias partes. métodos y eventos de los controles. las constantes . las propiedades. Puede ver que tienen el MSCommDlg. El desplegable donde pone Todas sirve para elegir una parte de todo lo que nos puede mostrar. En este caso está mostrando todo lo que tienen el proyecto. Para abrirlo. los métodos del proyecto. que si lo seleccionamos.Ademdun 2 al Capitulo 4 EL EXAMINADOR DE OBJETOS El Examinador de objetos es una herramienta que tienen Visual Basic para ver los objetos de las colecciones. pero sí aparecerán si mostramos cualquier otro control) Si le añadimos ahora una referencia (El acceso a una base de datos mediante DAO.Guía del Estudiante . entre ellas el propio control.

métodos y eventos.En la casilla Miembros aparecen los métodos. Nada más lejos de la realidad. procedimientos y eventos de la clase seleccionada. y que la va a comprender una vez se decida a usarla. Adelante. mucho antes que el tiempo que necesitaría para leérselo en este libro. Verá que es una herramienta que le va a ser muy útil. Visual Basic . 5 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 138 . Al hacer click sobre cualquiera de estas propiedades. en la parte inferior aparece la explicación del elemento elegido. Parece que es un poco complicado.Guía del Estudiante Cap.

El objeto Clipboard se usa para manipular el texto y los gráficos del Portapapeles.MENUS EMERGENTES EL PORTAPAPELES. copie y pegue texto y gráficos en la aplicación. formato Opcional. No acepta argumentos con nombre. ¿Quién no ha cortado y pegado en Windows? Pues al hacerlo está introduciendo texto en el portapaleles y copiándolo en otra parte.SetText datos. El objeto Clipboard puede contener varias unidades de datos siempre y cuando cada una tenga un formato diferente. El portapapeles es una herramienta de windows que permite transportar texto o imágenes de una parte a otra dentro de la misma aplicación. o entre dos aplicaciones distintas. EL OBJETO CLIPBOARD El objeto Clipboard Proporciona acceso al Portapapeles del sistema. El gráfico que se va colocar en el objeto Clipboard. como se describe a continuación : Los valores de formato son: Constante vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descripción Información de conversación DDE Formato de texto enriquecido (Predeterminado) Texto Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador de objetos. Una constante o valor que especifica uno de los formatos del LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 139 . formato Requerido. Los datos del Clipboard se pierden cuando se colocan otros datos con el mismo formato en el Clipboard desde el código o mediante un comando de menú. Por ejemplo. SetData Pone una imagen en el objeto Clipboard usando el formato gráfico especificado. Sintaxis datos Clipboard. Cadena de datos que se va a colocar en el Portapapeles. Una constante o valor que especifica uno de los formatos del Portapapeles reconocidos por Visual Basic. Sintaxis datos Clipboard. Este objeto puede usarse para permitir que el usuario corte.PORTAPAPELES INTERCAMBO DINAMICO DE DATOS EL DRAG AND DROP (Drag & Drop) Arrastrar y Soltar EL OLEDRAGDROP Drag & Drop con otras aplicaciones MENÚS . No acepta argumentos con nombre. SetText Pone una cadena de texto en el objeto Clipboard usando el formato del objeto Clipboard especificado. formato Opcional. Después se puede usar el método GetText para recuperar el texto o el método GetData para recuperar el gráfico.SetData datos. formato Requerido. se puede usar el método SetData para poner un mapa de bits en el Clipboard con el formato CF_BITMAP y después usar el método SetText con el formato CF_TEXT para poner texto en el Clipboard.

La constante o valor debe ir entre paréntesis. como se describe mas adelante. Image o PictureBox.WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador de objetos.objeto Clipboard reconocidos por Visual Basic. GetData Devuelve un gráfico del objeto Clipboard. Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripción Mapa de bits (archivos .GetText (formato) formato Opcional. No acepta argumentos con nombre. no se devuelve nada. GetText Devuelve una cadena de texto del objeto Clipboard. Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripción Mapa de bits (archivos .GetData (formato) formato Opcional. Si formato se omite. Una constante o valor que especifica el formato gráfico de Clipboard.BMP) Metarchivo (archivos . se crea un DIB de tamaño mínimo (1 x 1). Sintaxis Clipboard. Un valor o constante que especifica el formato del objeto Clipboard. No acepta argumentos con nombre.BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores Si en el objeto Clipboard no hay ningún gráfico que coincida con el formato esperado. GetData usa automáticamente el formato apropiado. El gráfico que se va colocar en el objeto Clipboard se define mediante la función LoadPicture o la propiedad Picture de los objetos Form. se devuelve una cadena vacía (""). como se describe mas adelante. Los valores de formato son: Constante vbCFLink vbCFText Valor Descripción Información de conversación DDE (Predeterminado) Texto &HBF00 1 Si en el objeto Clipboard no hay ninguna cadena de texto que coincida con el formato esperado. como se describe mas adelante. Si en el objeto Clipboard sólo hay una paleta de colores. La constante o valor debe ir entre paréntesis. Sintaxis Clipboard. SetData determina el formato gráfico automáticamente. Si formato es 0 o se omite. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 140 .

el control contenedor OLE elimina cualquier objeto existente en el control. si no.PasteOK Objeto es el nombre del contenedor OLE donde se quiere pegar el contenido del portapapeles. Esta propiedad puede usarse si se quiere que la aplicación implemente un comando Pegar en un menú Edición. Si no se ha ejecutado el método Paste. PasteOK Devuelve un valor booleano que determina si el contenido del Portapapeles del sistema se puede pegar en el control contenedor OLE. La propiedad OLETypeAllowed se usa para especificar el tipo del objeto (vinculado o incrustado) que se quiere pegar en el control contenedor OLE. el objeto del Portapapeles del sistema se pega basándose en las selecciones del usuario en el cuadro de diálogo. Este método puede usarse para implementar un comando Edición Pegar en un menú. Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el objeto. (Establezca OLETypeAllowed = 2 y después use el método PasteSpecialDlg). GetFormat Devuelve un entero que indica si un elemento del objeto Clipboard coincide con un formato especificado. Cuando se presenta este cuadro de diálogo. el contenido del Portapapeles del sistema se puede pegar en el control contenedor OLE. Los valores de formato son: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 141 . se puede verificar el valor de la propiedad OLEType para determinar el tipo de objeto que ha sido creado. Una vez que un objeto se ha pegado en el control contenedor OLE. Los comandos de menú se habilitan y se deshabilitan estableciendo su propiedad Enabled a True o False. Un valor o constante que especifica el formato del objeto Clipboard. la propiedad OLEType es vbOLELinked (0) o vbOLEEmbedded (1). presente un cuadro de diálogo Pegado especial cuando el usuario elija el comando Edición Pegar . respectivamente. Para ofrecer mayor flexibilidad al usuario. Cuando el valor de esta propiedad es True.GetFormat (formato) formato Requerido. No acepta argumentos con nombre. Si PasteOK es False. puede habilitarse. No se puede pegar con éxito a menos que PasteOK devuelva True. defina la propiedad OLETypeAllowed y después verifique el valor de la propiedad PasteOK. el comando del menú se deshabilita. Si se ha ejecutado el método Paste. Sintaxis VariableLong = Clipboard. como se describe mas adelante. Los objetos se pegan en el control contenedor OLE con el método Paste. Sintaxis VariableBooleana = objeto.Paste Copia datos desde el Portapapeles del sistema en un control contenedor OLE. Comentario Para usar este método. Sintaxis objeto. La constante o valor debe ir entre paréntesis. la propiedad OLEType es vbOLENone (3).Paste Objeto es el nombre del Panel Contenedor OLE donde se quiere depositar el contenido del Portapapeles.

Clear Borra el contenido del Portapapeles del sistema. Este método puede usarse para implementar un comando Edición | Copiar en un menú. Copy Copia el objeto de un control contenedor OLE al Portapapeles del sistema. Sintaxis objeto. Para los formatos vbCFDIB y vbCFBitmap. En el Portapapeles del sistema se pueden copiar objetos vinculados y objetos incrustados. donde pueden verse todas las posibilidades del Portapapeles.BMP) Metarchivo (archivos . todos los datos y la información de vinculación asociados con el objeto se copian en el Portapapeles del sistema.Copy Objeto es el nombre del contenedor OLE cuyo contenido queremos copiar Cuando se copia un objeto en el Portapapeles del sistema. Si no. la paleta de colores que se encuentre en el Clipboard se usa para presentar el gráfico.Constante vbCFLink vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor HBF00 1 2 3 8 9 Descripción Información de conversación DDE Texto Mapa de bits (archivos . Cree un formulario de la siguiente forma : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 142 .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores El método GetFormat devuelve True si algún elemento del objeto Clipboard coincide con el formato especificado. Sintaxis Clipboard.Clear Con Clear se borra todo el contenido del portapapeles. texto y gráficos. devuelve False. EJERCICIO Se propone el siguiente ejercicio.

" Case Else Msg = "No hay nada en el Portapapeles." Case 3 Msg = " El Portapapeles contiene texto y un archivo de mapa de bits.Caption = Clipboard.Picture = LoadPicture End Sub Private Sub Command8_Click() LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 143 . End Sub Private Sub Command3_Click() Clipboard.SetText Label2.SetData Picture1." Case 8 Msg = " El Portapapeles contiene solamente un archivo MetaFile.GetFormat(vbCFBitmap) Then ClpFmt = ClpFmt + 2 If Clipboard." Case 5 Msg = " El Portapapeles contiene texto y un archivo DIB.GetData() End Sub Private Sub Command7_Click() Picture2.Clear End Sub Private Sub Command4_Click() Clipboard. If Clipboard.Caption End Sub Private Sub Command5_Click() Label3.GetFormat(vbCFText) Then ClpFmt = ClpFmt + 1 If Clipboard.Caption = Msg ' Muestra el mensaje." Case 9 Msg = " El Portapapeles contiene texto y un archivo MetaFile." Case 2 Msg = " El Portapapeles sólo contiene un archivo de mapa de bits." End Select Label1.Image End Sub Private Sub Command2_Click() Dim ClpFmt As Integer Dim Msg As String On Error Resume Next ' Configura el controlador de errores.Picture = Clipboard.GetFormat(vbCFMetafile) Then ClpFmt = ClpFmt + 8 Select Case ClpFmt Case 1 Msg = "El Portapapeles sólo contiene texto.El gráfico que tiene el Picture de la izquierda puede ser cualquiera.GetText End Sub Private Sub Command6_Click() Picture2.GetFormat(vbCFDIB) Then ClpFmt = ClpFmt + 4 If Clipboard. El código de este formulario es el siguiente: Option Explicit Private Sub Check1_Click() End Sub Private Sub Command1_Click() Clipboard.

Text) If UCase(Right(Text1.Value = 1 Then Clipboard.Value = 0 End If If Check1.Text).Text1.Value = 1 Else Check1. 3)) = "BMP" Then Check1.Text = Trim(Text1.SetData LoadPicture(Text1.Text) End If End Sub LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 144 .SetData LoadPicture(Text1.Text. 8 Else Clipboard.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 145 .

El destino de un texto ha de ser necesariamente un Label. aplicación cliente. Para un formulario tiene dos valores posibles : 0 = None 1= Source No puede existir comunicación DDE con ese formulario El formulario permite que exista una comunicación DLL entre uno de sus controles y otra aplicación. Si se establece a 1 en tiempo de diseño. • Imágenes. que quieran leer la información en aquella. Puede darse el caso que una aplicación esté recibiendo datos de otra aplicación. se generará un error. y a su vez envíe datos a una tercera. LinkTopic. La aplicación servidor debe estar funcionando antes de que la aplicación cliente le pida la información. de un Label o un TextBox. Dentro de este formulario origen estará el Label. TextBox o PictureBox que contiene la información a enviar. LinkItem. Propiedad LinkMode Tiene distinta forma si se trata de un control (Label. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 146 .INTERCAMBO DINAMICO DE DATOS (Dinamic Data Exchange) DDE El intercambio dinámico de datos es una utilidad de Windows que utiliza Visual Basic. y a la que la recibe. A la aplicación que envía la información se le llama aplicación servidor. no podrá cambiarse en tiempo de ejecución. y el destino de un gráfico debe ser un PictureBox. Si se establece el valor de esta propiedad a 0 en tiempo de diseño. Si no es así. y nos permite crear aplicaciones que tomen datos una de otras. El origen de un intercambio DDE siempre es un formulario. una que se deje leer. TextBox y PictureBox) ó un formulario. dos aplicaciones (lógico). e indicarle el tiempo de espera para un intercambio en la propiedad LinkTimeout. Para indicar que un formulario es origen de información para un intercambio DDE debemos decírselo en sus propiedades LinkMode y LinkTopic. Cuando queremos que uno de estos controles sea el destino de un intercambio DDE debemos indicarlo en sus propiedades LinkMode. de un PictureBox. se podrá cambiar a 0 y volver a ponerla a 1 en tiempo de ejecución. Para pasar datos de una aplicación a otra se necesitan al menos. un TextBox. Los datos a traspasar de una aplicación a otra pueden ser: • Textos. y la otra (u otras).

El tema será el mismo al que “responde” el formulario donde se encuentra el control que contiene la información a traspasar.EXE (si se ejecuta como un archivo ejecutable independiente). En el control de la aplicación destino donde debe llevarse la información. Sintaxis NombredelFormulario. es decir. se genera el evento LinkNotify. enlaces DDE) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 147 . para un formulario de origen. en cuyo procedimiento podremos escribir el código necesario dependiendo de nuestra aplicación.LinkTopic [= tema] Para un control destino. 1=Automático No existe comunicación DDE con ese control Los datos se traspasarán desde la aplicación servidor a este control de la aplicación cliente cada vez que cambie el dato en la aplicación servidor (origen) Los datos se traspasarán cuando lo pida la aplicación cliente (destino). tanto para los controles como para los formularios.Para un control.LinkMode [= número] donde número es un entero que especifica el tipo de conexión. Véase para mas detalles el manual de Windows. (por su Name). para un control. mediante la orden LinkRequest. esta propiedad es de lectura y escritura. la propiedad LinkMode le permite que inicie una conversación DDE con una aplicación servidor. La sintaxis de esta propiedad es : objeto. Tiene 4 valores posibles : 0=None. (origen). Para traer la información. Cuando existe un cambio en los datos de la aplicación origen. debe ejecutarse la orden LinkRequest. pero no le envía el dato nuevo. Windows establece que el estándar de un vinculo DDE es Aplicación | Tema | elemento.VBP (si la aplicación se está ejecutando en el entorno de desarrollo de Visual Basic). o para forzar esa propiedad a un determinado valor. 1. pero no lo hace así. La propiedad LinkTopic contiene el nombre de la aplicación y el tema. (DDE es una utilidad de Windows. A este nombre se le denomina Tema. se puede usar para saber que valor tiene esta propiedad en un determinado control. ambos separados mediante el carácter | (carácter 124) Sintaxis NombredelControl. y cómo iniciarla. La propiedad LinkTopic. Al ese formulario podría llamarle por su nombre. (0. Cuando un control destino quiere establecer una comunicación DDE “llama” a la aplicación origen. Le llama por un nombre que le debemos poner al formulario en su propiedad LinkTopic. ésta notifica a la aplicación destino que el dato ha cambiado. Propiedad LinkTopic Esta propiedad es de lectura y escritura. o el nombre de la aplicación de Visual Basic sin la extensión . y dentro de ella. 2 ó 3 según se ha visto) y objeto es el nombre del control. (Véase mas adelante) 2=Manual 3=Notify En tiempo de ejecución. al formulario que contiene el control cuya información debe ser traspasada. (Nótese que la aplicación origen puede tener varios formularios).LinkTopic [= aplicacionorigen|tema] El nombre de la aplicación origen será el nombre del de proyecto de Visual Basic sin la extensión . devuelve o establece el tema al que el formulario “responde” en una conversación DDE.

Propiedad LinkTimeout Devuelve o establece la cantidad de tiempo que un control espera una respuesta a un mensaje DDE. Nota La plazo mayor de tiempo que un control puede esperar es 65. es decir.Propiedad LinkItem La propiedad LinkItem solamente la tiene el control destino de la información. Método LinkRequest Pide a la aplicación origen de una conversación DDE que actualice el contenido de un control Label. Esta propiedad es de lectura y escritura. puesto que si fuese así habría puesto la propiedad LinkMode a 1. actualizando la propiedad Caption si objeto es un control Label. Si se usa LinkTimeout de forma correcta se puede evitar la generación de un error por Visual Basic si una aplicación origen tarda mucho en responder. a sabiendas de que este evento se produce cuando cambia la información en origen. como para establecerlo en tiempo de ejecución. PictureBox o TextBox. Evento LinkNotify Ocurre cuando el origen ha cambiado el dato definido por el vínculo DDE si la propiedad LinkMode del control destino está establecido a 3 (Notificar). Cuando quiera colocar el dato en el control destino. El usuario puede forzar que el control deje de esperar presionando la tecla ESC. Sintaxis objeto.LinkItem = cadena donde cadena es el nombre del control origen que tiene los datos y objeto es el nombre del control al que le estamos poniendo la propiedad LinkItem.. puede utilizar el método LinkRequest para obtener el nuevo dato de la fuente.535 décimas de segundo. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 148 . Objeto es el nombre de un control Label. Private Sub objeto_LinkNotify([índice As Integer]) End Sub En este procedimiento se puede escribir el código necesario para nuestra aplicación.LinkTimeout = número donde número es una expresión numérica que especifica el tiempo de espera en décimas de segundo. Sintaxis objeto. sobre 1 hora y 49 minutos. LinkRequest provoca que la aplicación origen envíe los datos actuales al objeto. No la tiene el formulario origen. Sintaxis objeto. En esta propiedad deberá expresarse el nombre del control origen de la información. Posiblemente no quiera depositarlo de inmediato en el control destino. Al establecer LinkTimeout a 1 se indica al control que espere la respuesta en una conversación DDE durante el mayor plazo de tiempo. PictureBox o TextBox involucrado en una conversación DDE como destino. Use esta propiedad para ajustar el tiempo que un control destino espera la respuesta de una aplicación origen.LinkRequest Siendo objeto el nombre del control destino de la aplicación. la propiedad Picture si objeto es un control PictureBox o la propiedad Text si objeto es un control TextBox. El tiempo de respuesta DDE desde aplicaciones origen varía. tanto sirve para saber el nombre del control origen de los datos. es decir.

si la aplicación origen no acepta los datos. PictureBox o TextBox a la aplicación origen de una conversación DDE. Si la propiedad LinkMode del objeto está definida como 2 (Manual) . LinkPoke transfiere el contenido de la propiedad Text al origen. Visual Basic requiere el uso del método LinkSend para notificar explícitamente a las aplicaciones destino DDE cuándo cambia el contenido de un control PictureBox. Sin embargo.LinkSend Objeto debe ser un control PictureBox de un objeto Form que sea origen de una conversación DDE. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 149 . Si la propiedad LinkMode del objeto está definida como 3 (Notify). Sin embargo. LinkPoke transfiere el contenido de la propiedad Caption al origen. PictureBox o TextBox involucrado en la conversación DDE como destino. la aplicación origen actualiza objeto sólo cuando se usa LinkRequest. Método LinkSend Transfiere el contenido de un control PictureBox a la aplicación destino de una conversación DDE. la aplicación origen actualiza objeto automáticamente y LinkRequest no es necesario. Como la cantidad de datos de un gráfico pueden ser muy grande y como no tiene sentido actualizar la aplicación destino por cada cambio de píxel de la imagen. Cuando otras aplicaciones establecen vínculos automáticos con un objeto Form de su aplicación.LinkPoke Objeto es el nombre del control Label. Sintaxis objeto. Método LinkPoke Transfiere el contenido de un control Label. Si objeto es un control PictureBox. Si objeto es un control Label. el origen notifica al destino que los datos han cambiado invocando el método LinkNotify. Normalmente. El destino debe entonces usar el método LinkRequest para actualizar los datos. en una conversación DDE la información fluye de origen a destino. LinkPoke permite que un objeto destino suministre datos al origen. LinkPoke transfiere el contenido de la propiedad Picture al origen. Visual Basic las notifica cuando el contenido de un control TextBox o Label origen cambia.Si la propiedad LinkMode del objeto está definida como 1 (Automático). No todas las aplicaciones origen aceptan información de esta forma. Visual Basic no notifica automáticamente a una aplicación destino DDE cuando el valor de la propiedad Picture de un control PictureBox origen cambia. Si objeto es un control TextBox. se produce un error. Sintaxis objeto.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 150 .

cosa que resulta bastante desagradable en cualquier aplicación. la operación de arrastrar y soltar se inicia automáticamente cada vez que hacemos click sobre el botón izquierdo del ratón. DragOver . Sin embargo la realidad es distinta. Es decir. el desplazamiento se expresa mediante un rectángulo del tamaño del control origen. Debe ponerse por lo tanto un icono en esta propiedad. Sin dejar de pulsar el botón izquierdo del ratón se desliza (se arrastra) el puntero del ratón hasta el punto de la interface gráfica donde lo queremos dejar. El Drag & Drop tiene un efecto visual muy didáctico. Si durante la operación de arrastre pasamos por encima de un control. Ese punto puede ser un control o un formulario. El valor de esta propiedad puede establecerse en tiempo de diseño.Icon pondría como icono el del formulario Form1. El efecto de “tomar” algo de un control le denominaremos Drag. Los controles contenedores OLE sólo se arrastran automáticamente cuando no tienen el enfoque. Sintaxis NombreControlOrigen. mediante la operación de colocar el puntero del ratón y pulsar su botón izquierdo sobre ese algo que se quiere tomar. la referencia a un icono válido puede darse igualando el valor de esta propiedad a un icono ya existente en la aplicación (NCO. Si está a 1. Una vez en el punto de destino se suelta el botón del ratón y se “deja caer” lo que habíamos tomado en el punto de origen. Para ello se toma algo de una parte de la interface gráfica. ya que no sabe si lo que quiere hacer es llevarle el foco o iniciar una operación de Drag & Drop.DragMode = número Donde número puede tomar los valores 0 (Manual) ó 1 (Automático). Parece en principio mas práctico tener esta propiedad a 1. no toma nada del control origen ni lo suelta al llegar a destino. DragDrop). Devuelve o establece un valor que determina si se usa el modo de arrastre manual o automático en una operación de arrastrar y soltar. Esta propiedad va a marcar el icono que aparezca durante la operación Drag & Drop desplazándose a lo largo de la ventana. Esa acción de tomar algo en el origen o soltarlo al llegar al destino debemos realizarla mediante código en los eventos adecuados (MouseDown. Pero NO HACE otra cosa. Cuando esta propiedad está a 0 (Manual) se debe emplear el Método Drag para iniciar una operación Drag & Drop.DragIcon = LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 151 . NCO. Propiedad DragIcon Devuelve o establece el icono que se presenta como puntero del ratón durante una operación de arrastrar y soltar. teniendo el puntero del mismo sobre el control. y utilizando el método Drag. dando los valores adecuados a las propiedades DragMode y DragIcon. Si no se especifica esta propiedad.DragIcon = Form1.EL DRAG & DROP (Arrastrar y Soltar) El Drag & Drop es una forma visual de representar el movimiento de algo. El poner esta propiedad en automático conlleva también el hecho de que el control no toma el foco haciendo click sobre él.DragIcon = icono Donde Icono es cualquier referencia a un icono válido. se producirá en ese control el evento DragOver Al efecto de dejar caer le denominaremos DragDrop. pese a que en este caso deberemos utilizar el método Drag para iniciar el proceso. eligiendo el icono en el cuadro de Propiedades del control origen. o en tiempo de ejecución. El valor predeterminado es el 0. Propiedad DragMode Es una propiedad de lectura y escritura. Sintaxis NombreControlOrigen. En este caso. Se controla mucho mejor el Drag & Drop poniendo esta propiedad a 0 (Manual).

Usando el método Drag puede controlar exactamente cuando quiere que se produzca el inicio del Drag & Drop y el final.Drag TipoAcción NombreControlOrigen es el nombre del control donde se inició la operación Drag & Drop. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 152 .DragIcon = LoadPicture (C :\Iconos\Icono1. Por lo tanto debe cambiar la propiedad DragIcon a lo largo del tiempo que dura el arrastre. para simular el movimiento NCO.ICO y formato de icono. (8 por ejemplo) puede crear otras tantas variables tipo Picture. Inicia el arrastre del objeto..DragIcon pondría el mismo icono de Text1 para esta propiedad). no es conveniente acceder al disco (mediante la función LoadPicture) cada vez que tiene que cambiar la imagen del icono. según se describe a continuación : Constante vbCancel vbBeginDrag vbEndDrag Valor 0 1 2 Descripción Cancela la operación de arrastre.DragIcon = Variable2 . El autor de esta Guía del Estudiante vuelve a recomendar que ponga la propiedad DragMode = 0 (Manual). Para Nota.DragIcon = Variable1 NCO. Dado que el cambio debe ser rápido.0.Text1.. Entre otras razones por la siguiente : Cuando tenemos la propiedad DragMode de un TextBox a 1 (automático) ese TextBox no podrá coger el foco. El uso del método Drag para controlar una operación de arrastrar y soltar sólo se requiere cuando la propiedad DragMode del control origen tiene el valor Manual (0). debe usar varios iconos en secuencia. cargar las 8 imágenes secuencialmente desde esas variables. Termina el arrastre y suelta el objeto. En Visual Basic versión 4. una hoja de papel que se destruye . Como para simular un movimiento tan sencillo son suficientes pocas imágenes. la acción predeterminada es iniciar el arrastre del objeto.. Es el precio a pagar por la rapidez y la buena presentación de una aplicación. Sin embargo. En versiones anteriores de Visual Basic. Menu.ejemplos tomados de W95-). Método Drag Inicia.. o cargándolo mediante la función LoadPicture : (NCO.. Puede utilizar para ello un temporizador (control Timer) o basarse en las coordenadas del formulario por donde se mueve (para eso introducen en el evento DragOver del Formulario). termina o cancela una operación de arrastre de cualquier objeto excepto los controles Line. Drag es un método síncrono y las instrucciones siguientes no se ejecutan hasta que la acción de arrastre no haya terminado.DragIcon = Variable8 Esto le ocupará mas memoria. Drag puede usarse con objetos cuya propiedad DragMode tenga el valor 1 (o vbAutomatic).ICO) El archivo que se cargue debe tener la extensión . Sintaxis NombreControlOrigen. TipoAcción es un valor o una constante que especifica la acción a realizar. Shape o Timer. cargar las imágenes al comienzo de la aplicación (con la función LoadPicture) y cuando necesite el movimiento animado del icono. (al menos de forma fácil) y si lo consigue no puede seleccionar el texto que tiene actualmente. Cuando quiera colocar un icono animado en la propiedad DragIcon (una hoja de papel que oscila al moverse. Si se omite TipoAcción. NCO. Drag era un método asíncrono y las instrucciones siguientes se ejecutaban incluso aunque la acción de arrastre no hubiera terminado.

se produce el evento DragOver de ese control o formulario. cosa que no podría hacer si pone DragMode=1. pero ese algo deberemos programarlo. independientemente que ese control o formulario sea o no sea origen ni destino de esa operación. Caso de que el Control Origen fuese parte de un array de controles. estado Entero que nos indica el estado de transición del control que se está arrastrando en relación al formulario o control destino: 0 = Entra.]origen As Control. el Drag & Drop solamente es una manifestación visual de algo que se está produciendo. Debemos tener siempre presente que el procedimiento DragOver se realiza cada vez que pasamos por encima de un control o formulario durante una operación de Drag & Drop. Se genera también en el control origen en el instante que se pulsa el botón del ratón. y As Single. x As Single. cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los márgenes aceptables.Visible = False. control en el que se inició la operación de Drag & Drop. La acción de llevar el dato a la variable debemos hacerla en el procedimiento mas adecuado. Dependiendo si se trata de un Formulario convencional. si el valor que llevamos está dentro de los márgenes que admite la aplicación.) mediante una operación D & D. ya que cualquier operación de D & D comienza haciendo click en el control origen. Este valor se produce en el instante en el que entra el cursor del ratón a este control o Formulario. estado As Integer) Private Sub MDIForm_DragOver(origen As Control. el procedimiento DragOver captura distintos parámetros : Private Sub Form_DragOver(origen As Control. El dato debemos llevarlo a una variable que nos permita. etc. iniciándose de esta forma el D & D. Es típico poner la señal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratón. Estas coordenadas se expresan siempre en términos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight. Si tiene la propiedad DragMode de ese control en Manual. Source. ese control toma el foco y. puede arrastrar con el ratón para cambiar el texto. introducir ese dato en el TextBox final. 2 = Sobre Este valor se produce cuando el cursor se está moviendo sobre el control o el Formulario destino. al final de la operación. estado As Integer) Private Sub Control_DragOver([índice As Integer. es muy típico llevar un dato de una casilla a otra (de un TextBox a otro p. Por ejemplo. el Index de ese control se tiene en índice x. y As Single. 1 = Deja Este valor se produce cuando el cursor sale del control o Formulario. (Como el control LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 153 . un Formulario MDI o un control. Evento DragOver Cuando una operación de arrastrar y soltar está en progreso y el cursor del ratón pasa por encima de un control o un formulario.ya que VB no puede saber si lo que está ocurriendo es que queremos seleccionar el texto o si deseamos iniciar la operación D & D. x As Single. Puede ser por ejemplo. el procedimiento MouseDown del control origen. y As Single. ScaleLeft y ScaleTop. estado As Integer) Donde : origen = Control que se está arrastrando. ScaleWidth. Es muy llamativo por ejemplo. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. x As Single.e. en el momento de hacer Click. Mediante el parámetro origen (completado con índice si el origen se trata de un array) podemos conocer el control desde el que se inició la operación de Drag & Drop. Puede emplearse el procedimiento DragOver para comprobar si ese valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando. (No olvide declarar la variable en el lugar correspondiente para que sea válida en ambos controles). caso de un TextBox. O dicho de forma mas ortodoxa. Dentro de este procedimiento puede hacer referencia a sus propiedades y métodos con este argumento. y Número que especifica la posición horizontal (x) y vertical (y) actual del puntero del mouse dentro del control o formulario destino. Como decíamos al principio. Por ejemplo.

dependiendo de los valores u otros factores de la aplicación. x As Single. Icono6 As Picture El Form1.Dragicon = . En el siguiente ejemplo. puede mover el contenido del control origen a un nuevo lugar o copiar un archivo de un lugar a otro.DragIcon = icono1 ‘Al salir de Text1 se recupera el icono original If State = 1 Then Source. x As Single. ) Recuerde en este caso que al abandonar ese control debe restaurar el icono original.ico") Set Icono5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 154 . este evento captura los siguientes parámetros : Private Sub Form_DragDrop(origen As Control. Debe poner en este Procedimiento (DragDrop) el código necesario para que se realice la operación deseada. y As Single) Private Sub Control_DragDrop([índice As Integer. Recuerde que la operación Drag & Drop no hace otra cosa que lo que se puede ver en la interface gráfica. Dependiendo de si soltamos sobre un Formulario convencional. Icono2 As Picture.. Formulario MDI o Control.. Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico") Set Icono3 = LoadPicture("C:\vb\icons\dragdrop\drag3pg.. y As Single) Estos parámetros son idénticos a los del Procedimiento DragOver ya comentados Utilice un procedimiento de evento DragDrop para controlar qué ocurre tras completarse una operación de arrastrar. x As Single.DragIcon = Icono4 Evento DragDrop Ocurre cuando se completa una operación de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botón del mouse o utilizar el método Drag con su argumento acción establecido a 2 (Drop).DragIcon = Icono4 En el control destino se cambia el icono si el valor de la variable transportada (pepe) es mayor de 999 : En el procedimiento DragOver If Val(pepe) > 999 Then Source. Para ello es útil cargar varias variables con los distintos iconos que se van a usar y luego igualar la propiedad DragIcon del control origen a una u otra variable. Por ejemplo.Load se cargan los valores de estas variables con seis iconos existentes en el disco. El icono asignado al control origen (Text1) es Icono4.]origen As Control.ico") Set Icono4 = LoadPicture("C:\vb\icons\dragdrop\drop1pg. se declaran 6 variables tipo Picture que van a almacenar seis iconos distintos : En General .origen se pasa como parámetro al procedimiento DragOver con el nombre Origen basta con poner Origen..Declaraciones Dim pepe as string Dim icono1 As Picture. depositar un valor sobre un control etc. Icono5 As Picture. y As Single) Private Sub MDIForm_DragDrop(origen As Control. Icono3 As Picture Dim Icono4 As Picture.ico") Set Icono6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico") Set Icono2 = LoadPicture("C:\vb\icons\dragdrop\drag2pg.ico") Text1.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 155 .

Parece como si el OLE Drag & Drop reuniera las dos ventajas de DDE y de Drag & Drop. no se haga demasiadas ilusiones. A ese mecanismo se le denomina OLE Drag & Drop. Mediante estas propiedades. cuando hacíamos Drag & Drop normal. en la que el valor de la variable se mantiene mientras estuviésemos dentro del ámbito donde se ha declarado. pero de forma rígida. OLEDragDrop. en el Drag teníamos que meter lo que queríamos transportar (Texto o imagen) en una variable y en el Drop poníamos el contenido de esa variable en el control final. en el método OLEStartDrag se pasa como parámetro un objeto DataObject llamado Data. También existe el Método OLEDrag. o al menos. OLEDragOver. El DDE permite llevar información desde una aplicacióna otra. sin una intervención realizada de forma gráfica con el ratón. es decir. El DataObject tiene sus propiedades y métodos. OLEGiveFeedback. Cuando veíamos las propiedades de los controles relacionadas con el Drag & Drop. veíamos otras que hablaban de Drag y Drop. Y además recuerde que el mecanismo de arrastrar y soltar no es tan fácil como copiar y pegar. sin intervención del usuario. Métodos del DataObject Método SetData Inserta datos en un objeto DataObject con el formato de datos especificado. que eran OLEDragMode y OLEDropMode. desde un control a otro control. Esa “variable” debe ser un objeto superior a las dos aplicaciones que van a intercambiar datos. Desde una aplicación nuestra podemos llevar texto o imágenes a Word. Lo mismo ocurre en sentido contrario. El Objeto DataObjet El objeto DataObjet es un contenedor que utiliza OLE para transportar datos. Private Sub Text1_OLEStartDrag(Data As DataObject. Esa fue la idea con la que Microsoft creo esta herramienta. ya que aparece en todos los procedimientos donde es posible introducir o sacar datos del DataObject. Este objeto no es necesario declararlo. Por lo tanto.EL OLE Drag & Drop El Drag & Drop visto hasta ahora permite llevar datos desde un control a otro siempre dentro de la misma aplicación. Por ejemplo.SetData [datos]. Sintaxis objeto. [formato] objeto es un objeto tipo DataObjet. y en el Formulario veíamos solamente esta última: OLEDropMode. OLESetData y OLEStartDrag. al menos para personas poco hábiles. Mediante el OLE Drag & Drop ya podemos enlazar nuestras aplicaciones a las aplicaciones compradas. Entre los procedimientos observábamos algo parecido: OLECompleteDrag. utilizando la misma interfase gráfica para “ver” el movimiento de los datos. Es concretamente el DataObjet El objeto DataObject es un contenedor de datos donde se pueden transportar datos desde un componente de origen a un componente de destino. Esto puede hacerse cuando se trata de una misma aplicación. procedimientos y método. incluyendo una interface gráfica muy didáctica para presentar ese movimiento de información. Recuerde. ¿Cómo haríamos esto para pasar un texto a Word? Debe haber una “variable” que mantenga su contenido entre dos aplicaciones. Pero piense que lo que va a conseguir con el OLE Drag & Drop ya lo tiene prácticamente igual con el portapapeles. podemos hacer que desde una aplicación (Word por ejemplo) pase información a una aplicación hecha por nosotros. AllowedEffects As Long) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 156 .

SetData Text1. vbCFText End Sub Data es un objeto tipo DataObject donde se ha metido el texto que contienen el Text1. Effect As Long. que determina el formato de los datos que se van a obtener. x As Single.Text LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 157 . Vea valores posibles en el cuadro más abajo.Clear Data.Data. un parámetro llamado Data del tipo DataObject. Private Sub RTB1_OLEDragDrop(Data As RichTextLib. En el ejemplo anterior. Sintaxis objeto.wmf) Metarchivo mejorado (archivos . Sintaxis objeto.GetData (formato) objeto es el objeto tipo DataObject formato es un valor o constante. por lo que a partir de la ejecución de ese procedimiento OLEStartDrag el texto introducido en Data está disponible para cualquier aplicación Windows que sepa recogerlo.Text.SelText = Data. Ese objeto llamado Data lo ha pasado el procedimiento (Data As DataObject) por lo que podemos meterle los datos sin necesidad de crearlo previamente. Este argumento es opcional. AllowedEffects As Long) Data.SetData Text1. datos es el dato a introducir en el DataObject. era el texto contenido en Text1 formato es un valor o constante que especifica el tipo de datos introducidos.GetData(vbCFText) End Sub Loa valores o constantes para formato en ambos métodos son: Constante vbCFText vbCFBitmap vbCFMetafile vbCFEMetafile vbCFDIB vbCFPalette vbCFFiles vbCFRTF Valor 1 2 3 14 8 9 15 -16639 Descripción Texto (archivos .txt) Mapa de bits (Archivos .Clear Puede ejecutar este método antes de introducir nuevos datos en el DataObject para asegurarse que ha borrado los datos existentes Private Sub Text1_OLEStartDrag(Data As DataObject.DataObject. Los valores para formato se pueden ver en el cuadro más abajo.bmp) Metaarchivo (archivos . y As Single) RTB1. Un ejemplo de GetData. Shift As Integer. En el procedimiento OLEDragDrop de un RichTextBox con la propiedad OLEDropMode existe este código para poner el texto que llevaba el DataObject en el RichTextBox. Método GetData Devuelve datos de un objeto DataObject en forma de Variant. Este objeto es único para Windows.rtf) Método Clear Elimina el contenido del objeto DataObject.emf) Mapa de bits independiente del dispositivo (DIB) Paleta de colores Lista de archivos Formato de texto enriquecido (archivos . Button As Integer. Observe que también se pasa en este procedimiento.

Método GetFormat Devuelve un valor booleano que indica si un elemento del objeto DataObject coincide con un formato especificado. y As Single) If Data.GetFormat formato Ejemplo Puede asegurarse que el formato contenido en el DataObject es el deseado antes de proceder a colocarlo en un control en la operación de Drop: Private Sub RTB1_OLEDragDrop(Data As RichTextLib. ya que solamente tiene una: Propiedad Files Devuelve una colección DataObjectFiles.GetFormat(vbCFText) = True Then RTB1. Sintaxis NombredelObjetoDataObject.End Sub Este método sólo está disponible para los orígenes de operaciones de arrastre de componentes. Aunque se ha pretendido realizar un ejemplo de esta propiedad. el autor cede ese honor al alumno interesado en el tema.GetData(vbCFText) End If End Sub Propiedades del DataObject Deberíamos decir mejor. como el Explorador de Windows. La colección Files puede rellenarse para permitir a las aplicaciones de Visual Basic actuar como origen de operaciones de arrastre de una lista de archivos. No he podido obtener los elementos de la colección DataObjectFiles. Shift As Integer. Effect As Long. Colección DataObjectFiles Es la colección de cadenas con los nombres de ficheros de la propiedad Files del objeto DataObject. propiedad. debe usar la propiedad Files del objeto DataObject para ver y manipular el contenido de la colección DataObjectFiles. se producirá un error.Files(índice) La colección Files sólo se puebla con nombres de archivo cuando el objeto DataObject contiene datos de tipo vbCFFiles. que a su vez contiene una lista con todos los nombres de archivo utilizados por un objeto DataObject (por ejemplo los nombres de los archivos que un usuario arrastra hacia o desde el Explorador de archivos de Windows). Button As Integer. x As Single. Si se invoca Clear desde un destino de la operación de colocación de componentes. Aunque la colección DataObjectFiles tiene sus propios métodos y propiedades.DataObject. Volvamos sobre las propiedades y métodos de los controles involucrados en un OLE Drag & Drop Propiedad OleDragMode Esta propiedad establece la forma en la que comienza a realizarse la operación de Drag.SelText = Data. Sintaxis objeto.DataObjectFiles La colección DataObjectFiles es una colección de cadenas que representan un conjunto de archivos seleccionados mediante el método GetData o en una aplicación. Si LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 158 . Sintaxis NombredelObjetoDataObject.

Acepta tres valores: 0 El componente no acepta operaciones de Drop. es decir. Parece normal. puede controlar lo que hace la información tanto en destino como en origen. Propiedad OLEDropMode Esta propiedad va a determinar la forma en la que el componente destino toma los datos transportados medainte OLE Drag & Drop. 2 vbOLEDropAutomatic Automático. Ya se verá al estudiar este procedimiento. El componente de destino desencadena los eventos OLE de colocar. pero cada aplicación y cada programador es una caso distinto. En este caso. la información en el origen se mueve al destino. en el destino no se producen los eventos del mouse ni eventos OLE de arrastrar y colocar. tipo que podemos determinar mediante el método GetFormat. ya que no tenemos porque saber el nombre del control origen si éste es de una aplicación externa (Word por ejemplo). al volver a marcarlo con el ratón. Estando en Automático.está en Automático basta con seleccionar el texto o la imagen a pasar a otra aplicación y una vez seleccionado. Sintaxis Private Sub objeto_OLEStartDrag(datos As DataObject. En el OLE Drag & Drop solamente podemos basarnos para eso en el tipo de información que transporta el DataObject. Ese parámetro Source lo empleábamos para saber si un control podía recibir o no la información. y colocar en este el código correspondiente. donde recomendábamos poner la propiedad similar a manual. y su propiedad OLEDragMode está establecida a Automatic. A diferencia del Drag & Drop estudiado anteriormente. para poder controlar lo que ocurre con la información tanto en destino como en origen. ya que si está en automático se genera antes el Drag & Drop ordinario y no se producirá el OLE Drag & Drop. efectosPermitidos As Long) vbOLEDropNone LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 159 . Si se pone esta propiedad a Manual es necesario iniciar el drag mediante el método OLEDrag. Esto puede que no sea lo deseado por el programador. En ese instante se ejecuta el procedimiento OLEStartDrag donde deberemos colocar el código para que VB haga lo que nosotros queramos. Una cosa que podemos advertir en todos los eventos relacionados con el OLE Drag & Drop es la ausencia del parámetro Source que teníamos en los eventos DragDrop y DragOver del Drag&Drop convencional. se inicia el Drag. que ejecuta el procedimiento OLEStartDrag. en este caso es mucho más práctico ponerlo en automático y además no es molesto. La propiedad DragMode de ese control debe estar ahora a Manual. Evento OLEStartDrag Se produce cuando se ejecuta el método OLEDrag de un componente o cuando un componente inicia una operación OLE de arrastrar y colocar. El componente de destino acepta automáticamente las operaciones OLE de colocar si el objeto DataObject contiene datos en un formato que reconoce. Cuando pasa el cursor del ratón sobre él durante una operación de OLE Drag & Drop. Si pone esta propiedad en Manual. dependiendo del origen de la misma. No es práctico. muestra el icono de No Colocar 1 vbOLEDropManual Manual. Eventos relacionados con el OLE Drag & Drop. ya que el Drag no se inicia si no se ha seleccionado previamente parte del texto o la imagen a enviar a la otra aplicación. desaparece del origen al tiempo que se pone en el destino. (Evento OLEDragDrop) lo que permite al programador controlar la operación en el código. Es normal poner esta propiedad a manual.

2 = Dcho. Para que se pueda terminar la operación de OLEDrag&Drop el componente destino tienen que permitirlo. Sintaxis LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 160 . para introducir en él los datos deseados. Indica el botón que se está pulsando: 1 = izdo. AllowedEffects As Long) Data. 4 = Central. Los datos se colocan en el destino y desaparecen del control origen. Objeto tipo DataObject que transporta los datos Este parámetro es similar al AllowedEffects del evento OLEStartDrag y tiene los mismos valores. medidas en las unidades de medida del formulario. Nota Este evento sólo se produce cuando OLEDropMode está establecido a 1 (Manual). Por lo tanto podemos realizar sobre este objeto el método SetData visto anteriormente.Clear Data.Vemos que pasa como parámetro el objeto datos que es del tipo DataObject. Veamos un ejemplo: Private Sub Text1_OLEStartDrag(Data As DataObject. Si hay más de una tecla pulsada. mayúsculas As Integer. 2 = CTRL. estado As Integer) Este evento solamente ocurre cuando la propiedad OLEDropMode está en manual nombredelcontrol datos efecto boton mayusculas x. botón As Integer. estado Valor que indica uno de los tres estados siguientes: 0 1 2 vbEnterEl ratón está entrando al control vbLeave El ratón está saliendo del control vbOver El ratón está dentro del control Evento OLEDragDrop Se produce cuando se termina la operación de OLEDrag&Drop sobre el control. x As Single. Evento OLEDragOver Se produce cuando el puntero del ratón pasa por encima de un control durante una operación de OLE Drag & Drop. Indica el estado de pulsación de las teclas MAYUSCULAS. y Nombre del control sobre el que pasa el puntero del ratón. será la suma de los valores de cada uno.Text AllowedEffects = 1 End Sub El parámetro EfectosPermitidos va a determinar lo que ocurre con el dato en el control origen. será la suma de los valores de cada una. Ocurre el efecto de mover los datos. Si está pulsado más de uno. Acepta 3 valores: 0 1 2 vbDropEffectNone vbDropEffectCopy vbDropEffectMove No se inicia el OLE Drag & Drop Los datos se copian en el destino y no se modifican en el control origen. CTRL y ALT 1 = MAY. en el que se produce el evento OLEDragOver. Posición del puntero del ratón dentro del control destino. y As Single. 4 = ALT.SetData Text1. efecto As Long. Sintaxis Private Sub nombredelcontrol_OLEDragOver(datos As DataObject.

bien dentro de la misma aplicación. x As Single. el control origen (Text1) se pone rojo cuando se termina el OLEDrag&Drop: Private Sub Text1_OLECompleteDrag(Effect As Long) Text1. Y posiblemente piense en un enorme número de posibilidades de aplicación. y eso le vienen muy bien al usuario porque le ahorra tiempo de teclear.Private Sub objeto_OLEDragDrop(datos As DataObject. botón As Integer. En el ejemplo siguiente. Y el realizar un arrastre con el ratón es una operación que no todos terminan con éxito. Exceptuando el OLEDrag&Drop. Sintaxis Private Sub objeto_OLEGiveFeedback(efecto As Long. y As Single) En este evento podemos escribir el código necesario para que el dato se coloque de la forma deseada (por ejemplo. como cambiar el cursor del mouse para indicar lo que ocurrirá si coloca el objeto o señalar visualmente la selección (en el componente de origen) para indicar lo que va a ocurrir. OLEGiveFeedback permite al componente de origen proporcionar al usuario una indicación visual. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 161 . Debe haber establecido un cursor de mouse con la propiedad MousePointer del objeto Screen. lo bueno es lo que acepta y le gusta al usuario. Quizás sea esa la razón de no usarlo tan profusamente. En este capítulo hemos visto tres formas de transvasar información. True (predeterminado) = utiliza el cursor predeterminado. efecto As Long. e informa al componente de origen de que se ha completado o cancelado dicha operación. Los parámetros pasados por este evento son iguales al del evento anterior. Es posible que le haya llamado la atención estas herramientas. Se produce después de cada evento OLEDragOver. cursoresPredeterminados As Boolean) efecto igual a los eventos anteriores. Como siempre en programación. bien de una aplicación a otra. Evento OLECompleteDrag Se produce en el origen cuando se ha completado la operación de arrastre (cuando se levanta el botón del ratón). mayúsculas As Integer. vistas a priori las ventajas que tienen. Sintaxis Private Sub objeto_OLECompleteDrag([efecto As Long]) Efecto es idéntico a los eventos anteriores. False = no utiliza el cursor predeterminado. La realidad le va a demostrar que se aplican muy pocas veces. que le permite exportar texto a / desde Word.BackColor = 255 End Sub Evento OLEGiveFeedback Este evento se produce en el control Origen. puede analizar el tipo de dato y proceder de acuerdo al contenido del DataObject). CursoresPredeterminados Valor booleano que determina si Visual Basic utiliza el cursor predeterminado del mouse que indica el componente o si utiliza un cursor definido por el usuario. los demás no se usan con la profusión que se debería.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 162 .

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 163 .

donde pueden verse distintos nombres. etc. con lo que se puede conseguir una cantidad de palabras tan grande como necesitemos. Tan distintos como las operaciones de Abrir y Guardar respecto a la última orden del menú desplegable que es SALIR de la aplicación. En las figuras anteriores pueden verse tres formas distintas de ver el mismo Menú. Pero en las palabras que sirven para desplegar un menú no tiene sentido que se ponga ningún código en su procedimiento. Para cada palabra se produce el evento click. desplegado en su totalidad. puede desplegarse un Menú desplegable con mas palabras. En la segunda figura puede verse un árbol de Menú largo. Será en las palabras finales donde se colocará el código correspondiente. y sobre cada palabra. ya que están ahí justamente para desplegar otras palabras. La Barra de Menú es un componente de un Formulario. En la tercera puede verse el Menú desplegable de la palabra Archivo de la Barra de Menú. Cada palabra de la Barra de Menú lleva anexo un único procedimiento. (En principio vacío) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 164 . Le aparecerá el siguiente cuadro. En la primera figura el Menú está sin desplegar.EL EDITOR DE MENUS El Menú o Barra de Menú es la segunda línea de cualquier ventana Windows. Esta línea separadora es muy práctica para separar dos temas distintos dentro de un Menú desplegable. que se ejecutará al hacer click sobre la palabra. que se encuentra en la Barra de Menú de VB en Herramientas | Editor de menús. Sobre cada una de estas puede a su vez desplegarse otro conjunto de palabras. Para crear un menú debe usarse el Editor de Menú. Puede apreciarse en este menú desplegable una línea que separa las palabras Guardar Como y SALIR. La Barra de Menú puede tener tantas palabras como se desee.

Para pasar a la siguiente línea de edición (crear una nueva palabra). El autor LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 165 . a que palabra se refiere.Visible = False El nombre usado para nombrar a una de las palabras del menú puede ser cualquiera. y puede tener Index (si existen varias palabras con el mismo Name). puede hacerse bien con el cursor del ratón. y por otra. permite introducir un número de contexto para la ayuda de Windows. dependiendo de la evolución de la propia aplicación. que ese nombre corresponde a una de las palabras del menú. esa palabra aparecerá por defecto deshabilitada. La presentación en el menú cuando está deshabilitada es con color pálido. Para cambiar una de estas propiedades en tiempo de ejecución. por una parte. Solamente puede existir una palabra en un menú con esta propiedad activada. Sin embargo es prudente usar un nombre que nos pueda identificar. Como su nombre indica. su Name (Nombre). Si se quita la marca de esa casilla. por lo que esta propiedad puede usarse para deshabilitar ciertas funciones de la aplicación. Existen otras propiedades aparte del Caption y Name que se introducen directamente en las casillas al efecto. Habilitado. basta con pulsar ENTER. Enabled. Puede cambiarse en tiempo de WindowList Indica si esa palabra es la que va a mostrar todos los formularios abiertos en una aplicación de documentos múltiples (MDI). La solución puede ser cualquiera. que sea visible o no lo sea.Cada palabra del menú tiene su Caption (La palabra que aparece en el menú). ejecución. Visible. no por su Caption). Al hacer click sobre esta palabra. Esta propiedad no puede variarse en tiempo de ejecución. bien con el tabulador. Esta propiedad puede leerse y cambiarse en tiempo de ejecución. se desplegará un submenú con todos los Caption de los Formularios hijo abiertos en ese momento. basta con citar por su nombre a esa palabra (por su Name. Para introducir estas propiedades basta con teclearlas directamente en cada una de las casillas al efecto del cuadro del editor de menús. e igualar a True o False su valor : nmuDocumentos. HelpContextID Igual que esta propiedad en el resto de los controles. Para colocar el cursor de escritura en una u otra casilla.

Como es lógico. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 166 . Para elegir una de estas combinaciones. al lado de la palabra (Véase figura siguiente. El menú no se muestra en la barra de menús cuando el objeto está activo. Observará que algunas de ellas (&Edicion. un menú desplegable debe colgar de una palabra de las de la barra de menú. quitamos la tabulación. No está disponible en tiempo de ejecución. Esta combinación de teclas aparecerá en el menú.recomiendo no usar acentos e los Names de VB). La palabra de la que cuelga el submenú es la palabra sin tabular inmediatamente anterior. Al comienzo de este capítulo puede ver un ejemplo de ello.Hay otra que no se vé. y haciendo click sobre el botón con flecha hacia la izquierda. Para tabular las palabras. Otras propiedades Shortcut Atajo. y que “colgando” de la primera aparece un menú desplegable. 3 Derecha. basta con hacer click sobre la línea que la contiene. seguido del Caption de esa palabra.de estos apuntes propone poner las letras mnu (o menu . en la parte de abajo donde están todos los Caption de las palabras del menú. El menú se muestra en medio de la barra de menús cuando el objeto está activo. 1 Izquierda. Se desplegará una lista con todas ellas. Establece un valor que determina si los controles Menu de nivel superior se muestran en la barra de menús mientras un objeto vinculado o incrustado de un formulario está activo y mostrando sus menús. El menú se muestra a la izquierda de la barra de menús cuando el objeto está activo. hay que hacer click en el botón en forma de flecha a la derecha que está sobre la ventana de edición: Situandonos sobre una de las líneas ya editadas. Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las líneas ya editadas. Las combinaciones de teclas posibles se muestran haciendo click en la flecha hacia abajo que tiene esa casilla. El menú editado con los datos de la figura anterior tendrá esta forma en tiempo de ejecución : Observe que tiene cuatro palabras en la línea superior. Ayuda . Puede tener los valores 0 (Predeterminado) Ninguno. Podemos hacer varios niveles de submenús a base de introducir varias tabulaciones. Las palabras que están completamente a la izquierda son las que figurarán en la barra de menú de forma permanente. y las demás están separadas de la parte izquierda por unos guiones. Las que están separadas (tabuladas) corresponden a las que aparecerán en los menús desplegables. &Archivo) están completamente a la izquierda de la ventana. 2 Medio. El menú se muestra a la derecha de la barra de menús cuando el objeto está activo. Para conseguir un menú desplegable fíjese en la figura del Editor. Documentos. SALIR Ctrl + X) NegotiatePosition. Esta propiedad admite varias combinaciones de teclas para acceder al procedimiento click de esa palabra sin necesidad de usar el ratón.

y. pág. Este método pesenta un menú emergente en un objeto MDIForm o Form en la posición actual del mouse o en las coordenadas especificadas. (Vea The Windows Interface Guidelines for Software Design. las palabras tenían el siguiente Caption y Name : Caption Edición Copiar Cortar Pegar Name mnuEdicion mnuCopiar mnuCortar mnuPegar Tabulada NO SI SI SI Recuerde que las palabras del menú que estaban tabuladas son las que aparecían en el menú desplegable. donde aparecen las tres palabras mágicas de Copiar. NOTA MUY IMPORTANTE Siempre se recomienda poner la orden de SALIR en la primera palabra de la barra de Menú. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 167 . Una de ellas es el carácter & que está delante de los Caption de Archivo y Edición.). que solamente tiene efectos estéticos. Por ejemplo. x. Puede verse en el menú desplegado de la figura anterior una línea entre Guardar Como y SALIR. Cortar y Pegar. Justamente la letra que está subrayada en la palabra del menú. en este último caso. en el menú que hemos editado como ejemplo anteriormente. Es normal en los procesadores de texto que se obtenga un menú emergente pulsando el botón derecho del ratón. se logra introduciendo como Caption un guión ( . Esas mismas serán las que aparezcan en el PopUpMenu. Para crear un menú emergente o PopUpMenu es necesario tener en el menú de ese formulario una palabra de la que se despliegue un submenú con las mismas palabras que queremos que aparezcan en el PopUpMenu. La sintaxis de este método es la siguiente : NombreFormulario. Si analizamos la edición realizada. Puede ir en el medio de la palabra. No se olvide de poner el Name incluso para este guión. El editor de menús solamente le permite el guión en una palabra de menú desplegable (Tabulada). Para ello utilizaremos el Método PopupMenu. de la que se desplegaba el Submenú Copiar.124) POPUP MENÚS Un PopUpMenú o Menú Emergente es un menú que despliega en cualquier punto de un Formulario (MDI o normal) con varias opciones. indics. Cortar y Pegar. existía una palabra Edición. negrita Donde NombreFormulario es el nombre del formulario donde presentamos el PopUpMenu. separada mediante una línea separadora.Quedan un par de cosas. Bien que esa primera palabra sea Salir o que esté en el menú desplegable de la primera palabra de la Barra de Menú. Esta línea. Otra cosa. El carácter & no tiene porqué ir precisamente al comienzo de la palabra.PopupMenu nombremenú. Este carácter nos permite acceder al procedimiento click de esa palabra pulsando la tecla Alt + la tecla correspondiente a la letra que está detrás del carácter &. Puede omitirse. De esta forma se subrayará una letra intermedia.

Indics. . y las coordenadas x e y (el menú emergente aparecerá donde esté situado el cursor del ratón). Nota. Si no se especifican. que colgaban en el menú de la palabra Edición. Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando se levanta el botón derecho del ratón. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 168 Valor 0 Descripción (Predeterminado) El lado izquierdo del menú vbPopupMenuRightButton cuando se 2 los botones primario o . en el evento MouseUp. con la condición de que Button=2. La aplicación ignora este argumento cuando se ejecute bajo versiones de 16 bits de Windows o Windows NT 3. Es decir. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95. Es el Name de la palabra del menú de donde cuelga el menú desplegable. La palabra del menú a que se refiere Nombremenú debe tener al menos un submenú. Los elementos del menú emergente reaccionan a los clic del mouse usen secundario. Queremos también que la palabra Copiar salga resaltada en negrita. el parámetro indics. como se describe a continuación : Constante (posición) vbPopupMenuLeftAlign se vbPopupMenuCenterAlign 4 vbPopupMenuRightAlign 8 Constante (comportamiento) vbPopupMenuLeftButton sitúa en x. ningún control del menú aparece en negrita.51 y anteriores. mnuCopiar End If End Sub Observe que se ha omitido el nombre del Formulario (Opcional). y Parámetro(s) opcionales que especifican las coordenadas x e y donde va a aparecer el menú emergente. Si se omite. Y As Single) If Button = 2 Then PopupMenu mnuEdicion. negrita. Parámetro opcional. Imaginemos que queremos presentar en un menú emergente las palabras Cortar. La forma mas habitual de presentar un menú emergente es mediante el botón derecho del ratón. Shift As Integer.Nombremenú. Para combinar la los valores de indics de posición y comportamiento basta con sumar los valores. Observe también que las comas separadoras de los parámetros hay que colocarlas. Valor 0 Descripción (Predeterminado) Los elementos del menú emergente sólo reaccionan a los clic del mouse cuando se use el botón primario del mouse. Un valor o constante que especifica la posición y el comportamiento del menú emergente. aparecerá donde esté el puntero del mouse. X As Single. . X. Parámetro opcional que especifica el nombre de un control menú del menú emergente para presentar su título en negrita. Iríamos al procedimiento MouseUp del Formulario y escribiríamos : Private Sub Form_MouseUp(Button As Integer. Copiar y Pegar del ejemplo anterior. (Vea mas atrás).0 o anteriores. Este parámetro es requerido. El lado derecho del menú se sitúa en x. Nota El parámetro indics no tiene efecto en las aplicaciones que se ejecuten bajo Microsoft Windows versión 3. Las unidades de medida de las coordenadas x e y se definen mediante la propiedad ScaleMode. . El menú emergente se centra en x.

No puede activar la propiedad WindowList en un elemento que forma parte de un menú emergente. Ponga la propiedad Visible del elemento del menú desde el que se va a desplegar el submenú a False. Pero este ejercicio lo va a repetir con casi todas las aplicaciones que realice en su vida profesional. Ahora es posible que le cueste un poco de trabajo.Cuando se presenta un menú emergente. sólo puede presentarse un menú emergente al mismo tiempo.Secuenciales . También puede poner la propiedad Enabled a False si así lo precisa. El problema puede ser que no queramos que esté en la barra de menú. con un menú que diga Copiar | Cortar | Pegar donde pueda utilizar el portapapeles. 6 FICHEROS EN VISUAL BASIC Existen tres tipos de ficheros donde podremos almacenar y leer datos: . FICHEROS SECUENCIALES LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 169 . Eso sí. No es problema. Si les pone esa propiedad a False. el código que sigue a la llamada al método PopupMenu no se ejecuta hasta que el usuario elige un comando del menú (en cuyo caso se ejecuta antes el código del procedimiento de evento Click) o cancela el menú.Binarios Cada uno de ellos tiene sus aplicaciones y particularidades. Puede aprovechar esta circunstancia para hacer menús emergentes con mas o menos elementos. las palabras del submenú deben tener la propiedad Visible = True. No se verá ya en la barra de menú ni esa palabra ni el submenú que de ella se despliega. Si queremos presentar un menú emergente es necesario tener ese menú en el menú del formulario. no se verán en el menú emergente. por lo tanto.Guía del Estudiante Cap. Ejercicio propuesto: un editor de texto.Aleatorios (Random) . según las necesidades de su aplicación. Visual Basic . las llamadas a este método se ignoran si el menú emergente está presentado actualmente o si un menú desplegable está abierto. Además.

Son los mas sencillos de manejar. si ya existía un fichero llamado Nombrefichero. Es la forma típica de hacerlo cuando modificamos un texto. Para introducir la información. Representa el número del canal por donde introduciremos los datos. Sirve para guardar textos. Permiten guardar datos en un fichero con un determinado nombre. Text1. "machacando" la información de otro posible fichero que ya estuviese en el disco con el mismo nombre. Para cerrar un fichero secuencial. que se pueden leer con el Bloc de Notas. No puede haber mas de un archivo abierto con un número de canal determinado. deberemos abrirlo con la siguiente instrucción: Open Nombrefichero For Append As # Numerocanal Numerocanal debe ser un número comprendido entre 1 y 255. Cuando los datos se han introducido con la instrucción Print. Por ejemplo si deseamos guardar en ese fichero el contenido de una caja de texto llamada Text1. pueden emplearse dos métodos: centraremos de momento solamente en Print. o añadir la información nueva a continuación de la ya existente. En este tipo de ficheros. basta con ejecutar la instrucción: Close # Numerocanal Si no se especifica Numerocanal (la instrucción Close a secas) se cerrarán todos los ficheros abiertos actualmente. carácter tras carácter.Este tipo de ficheros nos permite guardar información de cualquier longitud. Print Introduce la información de forma secuencial. la información se guarda colocando un carácter tras otro. debemos ejecutar la siguiente instrucción: Open Nombrefichero For Output As # Numerocanal De esta forma. # Numero de canal) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 170 Print y Write Nos . byte tras byte tal como se comentó. y los utilizados para guardar texto en ASCII. basta con ejecutar la siguiente instrucción: Print #NumerodeCanal. Para añadir la nueva información tras la ya existente. la forma de acceder a ese texto es muy sencilla: Se abre el archivo con la instrucción Open Open Nombrefichero For Input As # Numerodecanal Se utiliza la instrucción Input o Line Input para sacar los datos del fichero. La forma de leerlos es. (Byte tras byte). Para abrir un fichero secuencial para guardar información.Text El texto queda en el fichero en caracteres ASCII. Normalmente se llama también número de archivo. sobreescribiremos dicho fichero perdiendo la información que contuviese. igualmente. La instrucción Input tiene en este caso la siguiente sintaxis: VariableString = Input (Numero de caracteres.

534. Dim MiVariable as String MiVariable es una variable tipo string donde vamos a meter todo el contenido del fichero Do Until EOF(1) cuando lectura carácter siguiente El programa ejecutará este bucle hasta que se cumpla que EOF(1) sea True. Claro que para leer un fichero carácter a carácter debe poner un bucle en el que se van leyendo los caracteres hasta que llaga al final del fichero. VariableString = Input (1. La forma de hacer este bucle es la siguiente: Dim A As String A es la variable donde meteremos el carácter que extraemos del fichero. EOF(NumerodeCanal) es una propiedad de los ficheros están abiertos. LOF devuelve un valor igual a la longitud total del fichero. este procedimiento de leer todo el fichero de un golpe solamente se podrá hacer si la longitud del fichero (LOF(1)) es inferior a 65. Si lo ponemos en un RTB esta línea RTB. avances de línea. comillas y espacios iniciales.534 bytes. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 171 . incluyendo retornos de carro. Este procedimiento puede ahorrarle cierto tiempo a la hora de la lectura. colocándose sobre el primer carácter no leído. #1) extrae un carácter del fichero abierto como #1. podríamos texto sobre un TextoBox o un RichTextBox (RTB) (Lo proximamente). Al leer este carácter. pues es la instrucción que deberá utilizar para leer archivos instrucción Write ).Por ejemplo. Sólo se utilizará la instrucción Input con archivos abiertos en modo Input Binary Se verán a continuación) A diferencia de la instrucción Input #. Cierra el fichero o Binary. utilizaremos de ahora en adelante el número 1 como número de canal. que es True cuando la posición del puntero de apunta al carácter Fin De Fichero (End Of File) que es el al último carácter de texto de ese fichero.. le recomiendo que lea los ficheros secuenciales carácter a carácter. MiVariable = MiVariable & A poner ese verá sería: Loop Close #1 Con esta línea vamos anexando el carácter leído a la variable MiVariable. Input(1. continuación. Tenga esto presente cuando vaya a leer un fichero que no sabe que longitud tiene. El número máximo de caracteres a extraer de un golpe mediante la instrucción Input está limitado a 65. #1) LOF(1)=longitud del fichero #1 leeremos el fichero de una única vez. #1) Estrae un carácter del fichero abierto por el canal número 1. Input devuelve todos los caracteres que lee. (Por lo dicho anteriormente.SelText = A Vuelve al comienzo del bucle. Recuerde que ese número puede ser un número comprendido entre el 1 y el 255 VariableString = Input (LOF(1). Si ejecutamos la instrucción : Para no emplear una palabra tan larga como Numerodecanal. el puntero de lectura avanza automáticamente tantos caracteres como haya leído. A = Input (1. En vez de utilizar una variable.#X) pues tarda poco mas que leyéndolo de un golpe. Para curarse en salud. Verá un poco mas adelante la propiedad LOF de los ficheros secuenciales. (Los (la veremos a escritos con la puntos y coma.

no funciona. Puede ahorrar un poco de memoria usando esta instrucción en lugar de Input. En el primero. y depositar su contenido en TBTexto pondremos este código en BAbrir : Private Sub BAbrir1_Click() Dim VarTexto As String CD1. ya puede realizar un pequeño edito de textos. y dos BGuardar para guardar.Filter = "Ficheros de Texto |*.txt” Para abrir el fichero. al guardar el texto borramos el contenido que del fichero. con un filtro CD1.txt" CD1. deberá introducirlos para evitar que le salga todo el texto en una única línea. Mejor dicho.avance de línea no se tienen en cuenta y no se añaden a la cadena de caracteres extraída mediante esta instrucción.avance de línea (Chr(13) + Chr(10)). Para conocer el nombre del fichero. VariableString Mediante esta instrucción se extrae una línea completa (los caracteres delimitados entre dos retornos de carro). #1) 'leemos todo el fichero de un golpe Close #1 TBTexto = VarTexto End Sub Cuando el fichero es mayor de 64 kilobytes.Filter = "Ficheros de Texto |*. carácter a carácter o línea a línea. que asume que el dato a leer es un String. lo anexamos al final del mismo .Existe una instrucción. Las secuencias de retorno de carro . el leerlo de un golpe puede dar problemas.filename For Input As #1 Do Until EOF(1) ‘Hacemos un bucle de lectura hasta que encontremos EOF(1) ‘ Vea mas adelante la Propiedad EOF en Propiedades de los ficheros Secuenciales LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 172 . En este último. Con lo que se ha explicado.filename For Input As #1 VarTexto = Input(LOF(1). Para leer carácter a carácter : Private Sub BAbrir_Click() Dim VarTexto As String CD1. En lugar de especificar el número de caracteres a devolver.ShowOpen Open CD1. Este sencillo editor tiene un TextBox llamado TBTexto. si ya existiera. Cuando lea un archivo mediante Line Input # y lo quiere presentar en un TextBox o en el Printer.Filter = “Ficheros de Texto |*. (Cadena de caracteres).txt" CD1. uno abriendo el fichero For Append y el otro abriéndolo For Output. ponemos un CommonDialog llamado CD1. Tiene la siguiente sintaxis: Line Input # Número de canal. Nota Se proporciona otra función (InputB) para su uso con datos de byte incluidos en archivos de texto. tres botones llamados BAbrir (1). para abrir el fichero y poner su contenido en TBTexto. donde podemos escribir el texto que queramos (con la propiedad MultiLine = True y ScrollBars = Vertical). Input$ . (2 a y b) y (3).ShowOpen Open CD1. Deberemos leerlo en ese caso. número especifica el número de bytes. y se le asigna esa cadena a VariableString Una línea es un trozo de texto delimitado por los caracteres 13 (Retorno de carro) y 10 (Avance de línea) La instrucción Line Input # lee un carácter cada vez en un archivo hasta que encuentra un retorno de carro (Chr(13)) o una secuencia retorno de carro . INSTRUCCION LINE INPUT La instrucción Line Input se utiliza para extraer una línea completa.

Si esa operación hay que hacerla una vez por carácter. no se puede introducir texto. Loop Close #1 Los Botones de Guardar tienen el código : Private Sub BGuardar_Click() Dim VarTexto As String CD1.ShowSave Open CD1.VarTexto = Input(1.txt" CD1.filename For Append As #1 Print #1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 173 . #1) TBTexto = TBTexto & VarTexto Loop Close #1 End Sub 'leemos el fichero carácter a carácter 'vamos añadiendo los caracteres leídos a TBTexto (NOTA. TBTexto.filename For Input As #1 Do Until EOF(1) Line Input #1.filename For Output As #1 Print #1. sino de explicarla. sino datos.Lo expuesto funciona perfectamente.. TBTexto. aunque esos datos sean de texto.Filter = "Ficheros de Texto |*. INSTRUCCIÓN WRITE La otra forma de introducir datos en un fichero secuencial es Write.ShowSave Open CD1.txt" CD1. .Filter = "Ficheros de Texto |*.Text Close #1 End Sub O para el caso de abrir con For Append Private Sub BGuardar2_Click() Dim VarTexto As String CD1. Para evitar esto. Mediante esta instrucción. Mediante la instrucción Write puede crear una pequeña base de datos.ShowOpen Open CD1. puede tardar mucho tiempo. una base de datos de escasa calidad.Meter un texto en un TextBox o en un Label es una operación que tarda cierto tiempo. VarTexto 'leemos el fichero Línea a Línea TBTexto = TBTexto & VarTexto & vbCrLf 'vamos añadiendo las líneas leídas a TBTexto '(Hay que introducir un retorno + avance de línea con cada línea (vbCrLf). cuando vaya a leer un fichero carácter a carácter.txt" CD1.Text Close #1 End Sub Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial. pero el hecho de meter en un TextBox carácter a carácter eterniza la aplicación. Pero no es momento de cuestionar la calidad de esta base de datos. Eso sí.Filter = "Ficheros de Texto |*. métalo primero en una variable y luego realice un volcado único de esa variable al TextBox o Label) Y podemos hacerlo también leyendo línea a línea con Line Input Dim VarTexto As String CD1. ya que VarTexto no ‘contiene los retornos ni avances de línea.

”Editorial XX”.Text For Append As #1 Write #1. Quedará de la siguiente forma: “Luis Suárez”. y leerlos mediante el programa de una forma muy sencilla. No sería la forma mas adecuada.”El Qijote”. Hacemos.”3200”.”5000”.”51” “Miguel de Cervantes”.Write Puede introducir varias informaciones.” VisualBasic .Text EXISTENCIAS = LIBRETBEX.Text PRECIO = LIBRETBPREC. Esta forma de introducir datos en un fichero secuencial permite realizar un fichero con distintos datos que se pueden leer en el propio fichero.”Editorial XX”. con sus comas y comillas dobles. se creará un fichero que tiene esta apariencia: “Luis Suárez”.”51” Si realizamos otra introducción de datos. EDITORIAL.”27” ¿Que pasaría si leemos este fichero con la instrucción Input o Line Input # vista anteriormente ? Pues simplemente que lo leeríamos tal como está. ‘Ahora los metemos en el fichero con la instrucción Write.”27” Observe que el contenido de este fichero se diferencia algo de una simple sucesión de caracteres.” VisualBasic .Guía del estudiante”.Text AUTOR = LIBRETBAUTOR.Guía del estudiante”.”El Qijote”. AUTOR. dado que lo hemos abierto con Append.Guía del estudiante”.”5000”. TITULO. (Verá a lo largo de su vida profesional que lo de pequeña no es cierto. Un fichero secuencial con datos introducidos mediante la instrucción Write tendrá esta forma : “Luis Suárez”. que posteriormente se podrán leer de forma separada con la instrucción Input #. Existe un Botón de comando con el siguiente código: Private Sub Command1_Click() TITULO = LIBRETBTITULO. pues es la forma mas sencilla de guardar datos cuando la cantidad de estos datos no es muy grande) Lo que estamos haciendo en realidad al escribir datos mediante la instrucción Write es escribir estos datos en un fichero secuencial.”3200”. PRECIO. Imaginemos una aplicación.”Editorial YY”. Ya están el las variables TITULO. con la que introducimos datos de libros. ya que lo que queremos es obtener sucesivos datos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 174 .”Editorial YY”.”51” “Miguel de Cervantes”. AUTOR. una pequeña base de datos.Text ‘Donde LIBRETBTITULO. en realidad.”3200”. Tiene varias partes separadas por una coma. son los nombres de los TextBox ‘Ha leído los datos de los TextBox. LIBRETBAUTOR. La aplicación es un único formulario donde podemos introducir la información mediante varios TextBox.Text EDITORIAL = LIBRETBEDITORIAL. utilizando una coma como separador entre los distintos datos. puesto que se guardan en ASCII. Cada una de ellas es un dato. con la segunda línea del ejemplo anterior. y lo guardará en el directorio ‘C :\cursoVB Open TBNombreFichero.” VisualBasic . EXISTENCIAS Close #1 End Sub Si introduce los datos del ejemplo anterior.”Editorial XX”. El nombre del fichero será el ‘que hayamos puesto en el TextBox LIBRETBFICHERO. Etc. Etc. los datos existentes en ese fichero no se borrarán.

Text = "" : LIBRETBEX. En nuestro ejemplo. Sirve para ver los sucesivos títulos que tenemos en nuestra base de datos tan sui generis.Text = TIT LIBRETBAUTOR. podríamos hacerlo de esta forma. PRE. es decir. editoriales. Observe también que se ha introducido un temporizador. AUT. Interrumpíamos momentáneamente la lectura para presentar cada LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 175 . TIT. títulos.Text For Input As #1 Do Until EOF(1) ' Introducimos una parada para poder leer datos DETENERSE = True Input #1. Si por ejemplo. Para sacar estos datos debemos leerlos con la instrucción Input #. este tipo de ficheros no es recomendable.Text = "" : LIBRETBEDITORIAL. Pero es obligación del autor explicarlo … y de advertirlo. aprovechando los mismos TextBox: Private Sub Command2_Click() ' Limpiamos los TextBox LIBRETBTITULO.Text = AUT LIBRETBEDITORIAL.Text = "" 'Abrimos el fichero Open TBNombreFichero.de autores. Esta instrucción saca los datos que hemos metido. Este tipo de ficheros no es el mas adecuado para construir bases de datos. precios y existencias. Se ha pretendido presentar unos datos de esta pequeña base de datos sin complicarnos mucho la vida. lo único que importa es que el número de variables para la lectura sea igual al número de variables que se utilizó para la escritura. EXS LIBRETBTITULO. En esta pequeña aplicación mostrábamos las informaciones sucesivamente según las íbamos leyendo del fichero. elimina las comillas y la coma que servían de separadores. por lo que para tener muchos datos.Text = EXS ' Refrescamos los TextBox Refresh ' Esto produce una pequeña parada Do While DETENERSE = True A=A+1 If A = 100000 Then DETENERSE = False: A = 0 Loop ' terminó la parada y vuelve a leer datos Loop Close #1 End Sub Observe que los nombre de las variables en el proceso de lectura tienen distintos nombres a los utilizados durante la escritura. No es aconsejable ni para muchos datos ni para pocos datos. es complicado manejar ficheros de mas de unas pocas líneas. Como en el fichero no se guarda ninguna referencia al respecto.Text = "" LIBRETBPREC. Mas adelante veremos como presentarlos de una forma correcta.Text = NED LIBRETBPREC. y que el orden de las variables sea correcto. el número de variables usadas en la introducción de datos fuese distinto al número de variables usado en la lectura.Text = "" : LIBRETBAUTOR. Visual Basic nos daría un error.Text = PRE LIBRETBEX. NED.

”1995”."MCGRAWHILL". Esto nos lleva a pensar en otro tipo de archivo que veremos a continuación."GUNTER GRASS". Entre ellas. si deseamos disponer de todos los datos."DESTINO".”28”."CEBALLOS"."KAFKA".25 "LA METAMORFOSIS".3400."PLAZA&JANES"."PLANETA". La interfaz gráfica quedó de la siguiente forma : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 176 . “4ª”. para introducir la edición."UMBERTO ECO"."ORWELL".1000. pues no se trata de texto.21 "ENCICLOPEDIA DEL VB".”SEGUNDA”. El fichero creado tras introducir varios libros quedó de la siguiente forma : "EL RODABALLO". donde lo que interesa es disponer de todos los datos para usarlos cuando sea necesario. ya que como tenemos cinco datos distintos en cada registro y cinco TextBox para presentarlos.2000.”CUARTA”. (Observe también la gran ventaja de tener una base de datos con datos completamente legibles) Se han introducido alguna variaciones en el programa.23 "LA GRANJA ANIMAL". los Random (aleatorios). ya que no permiten ir a leer hacia atrás.1000. Por lo tanto.101 "VB4 PARA WINDOWS95". Esto nos lleva a crear una matriz para albergar todos los datos de la base."LUIS SUAREZ".información durante un instante.21 "EL NOMBRE DE LA ROSA". Imagínese que estamos tratando datos de varios miles de libros en el ejemplo anterior. Si la información de cada campo es medianamente extensa."ANTONIO GALA"."AGUILAR".6500.25 Observe que los dos últimos campos (correspondientes a PRECIO y EXISTENCIAS) no están entre comillas. También se ha introducido otro campo tipo texto. no tendríamos memoria RAM suficiente en el ordenador para albergarlos.”45”."PLANETA".”1ª”.”PRIMERA”. ya que los ficheros secuenciales se leen y se les tiene que extraer toda la información de un golpe. donde hemos hecho una variación.2500. Esto no parece en principio una solución práctica para una base de datos. los campos PRECIO y EXISTENCIAS los vamos a tratar ahora como números (Integer). Pero volvamos a nuestra aplicación de librería. que permiten leer solamente los registros que nos interesan."CEU". se crea una matriz de variables de 5 x n (n=número de registros). en una matriz.12 " VisualBasic ."GARY CORNELL".78 "LA PASION TURCA". sino de números. También se le añaden unos botones para poder recorre toda la base de datos.12000."RAMA". deberemos presentar una información tras otra.1200. deberemos guardarlos en la memoria.Guía del Estudiante ".

EXISTENCIAS Donde las variables TITULO."CEU".El programa necesita que le introduzcamos el nombre del fichero que alberga la base de datos. con el siguiente código : Type REGISTROLIBRO AUTOR As String TITULO As String EDITORIAL As String LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 177 . y cada una de ellas puede ser de un tipo distinto. y tantas filas como apuntes (registros) tengamos..1000. como corresponde a datos numéricos. cuatro String y dos numéricos). EDITORIAL."LUIS SUAREZ". antes de nada debemos definir un tipo de variable.) y es cierto. La variable que necesitamos no es de ningún tipo de esos. AUTOR.”PRIMERA”. PRECIO.Text For Input As #1 Do Until EOF(1) Input #1.BAS. Está compuesta por varias secciones. TITULO.21 los cuatro primeros parámetros van entre comillas dobles. EDICION. Integer .. Pero existe otra forma mejor (al menos un poco mas complicada) para leer estos datos. Podemos meter los datos a una matriz que tenga tantas columnas como datos (campos) (en el ejemplo 6. Podemos saberlo. aunque solo sea un momento. EDITORIAL y EDICION serán del tipo String y PRECIO y EXISTENCIAS serán de tipo numérico. Este tipo de definiciones debe hacerse en un módulo (Véase instrucción Type en la ayuda de VB).Guía del Estudiante ". ya que son datos tipo texto. y los dos últimos van sin comillas. los datos. Para ello. Por sencillez no se ha usado ningún CommonDialog y se introduce directamente el nombre de este fichero en un TextBox llamado TBNombreFichero El fichero anterior podemos leerlo tal y como indicábamos antes : Open TBNombreFichero. String. Parece que no nos basta con los tipos de variable que trae VB (Long. y evitar el problema que teníamos antes de tener que hacer un temporizador para poder ver. ya que en una línea cualquiera del fichero anterior : " VisualBasic . AUTOR. por lo que se ha creado un módulo llamado LIBREMD2. mediante la instrucción Type.

y además que es una variable del tipo REGISTROLIBRO. TITULO.Text = "" LIBRETBPREC.Text EDICION = LIBRETBEDICION. lo primero es que no conocemos el número de registros existentes. Al leer los datos.Text = "" LIBRETBEX.Text) EXISTENCIAS = Val(LIBRETBEX. y además declaramos que va a se similar a REGISTROLIBRO ya definida en el módulo.Text = "" NR = 0 ‘ NR=número de registros LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 178 . entre ellas una variable. puesto que se la hemos definido en un módulo. REGISTROLIBROS. En el ejemplo preparado podemos escribir y leer datos. EDICION. Esta operación es la primera que se realiza en el procedimiento click del botón LEER : Private Sub Command2_Click() LIBRETBTITULO. EXISTENCIAS Close #1 End Sub Tras reiteradas entradas. tipo de variable que ya conoce.Text = "" ‘Pone todos los TextBox en blanco LIBRETBAUTOR. Y dese cuenta de que es un tipo de variable (REGISTROLIBRO) formado por varias partes (AUTOR. el fichero de la BD quedó como se vio anteriormente.) Observe que DEFINIR una variable NO es lo mismo que DECLARAR En el apartado de Declaraciones del General del formulario declaramos las variables.Text EDITORIAL = LIBRETBEDITORIAL. EDITORIAL.Text = "" LIBRETBEDICION. Como cada registro va en una línea del fichero. TITULO. Etc.Text AUTOR = LIBRETBAUTOR.Text) ‘TextBox para introducir el título ‘ autor ‘ editorial ‘ edición ‘ precio ‘ existencias ‘(Observe que para introducir el precio y las existencias se transformó el contenido del TextBox a ‘un valor numérico mediante la instrucción Val. PRECIO.) Open "C:\cursoVB\" + LIBRETBFICHERO.Text For Append As #1 Write #1.Text PRECIO = Val(LIBRETBPREC. si contamos el número de retornos de carro (Chr(13)) obtendremos el número de registros. Veamos de nuevo como se escriben El código del procedimiento click del botón BIntroducir1 es : Private Sub BIntroducir1_Click() TITULO = LIBRETBTITULO.EDICION As String PRECIO As Integer EXISTENCIAS As Integer End Type Esto es lo que se llama DEFINIR una variable. de la cual decimos que va a ser una matriz mediante los paréntesis que la acompañan. Es como hacerse un traje a medida. Dim NR As Integer Dim REGISTROLIBROS() As REGISTROLIBRO Dim NRP As Integer Observe que al usar paréntesis al declarar la variable REGISTROLIBROS le estamos diciendo a VB que esa variable será un Array. AUTOR.Text = "" LIBRETBEDITORIAL.

EDITORIAL.‘ Abre el fichero.Text = REGISTROLIBROS(NRP).Text For Input As #1 Do Until EOF(1) A = Input(1.PRECIO.PRECIO Input #1.REGISTROLIBROS(I). de momento.EDITORIAL Input #1. y cada campo del fichero lo vamos asignando a los elementos ‘que componen la matriz.. REGISTROLIBROS(I).Estas líneas podríamos heberlas puesto en una línea única : Input#1. el ‘número 1 NRP = 1 LIBRETBTITULO. lo lee entero y cuenta el número de retornos de carro. Existirán tantos apuntes (registros) como retornos de carro existan.TITULO Input #1. REGISTROLIBROS(I)._ REGISTROLIBROS(I).REGISTROLIBROS(I).Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.PRECIO LIBRETBEX. REGISTROLIBROS(I).EDICION.AUTOR LIBRETBEDITORIAL. Private Sub BMas1_Click() NRP = NRP + 1 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 179 .AUTOR Input #1.. ReDim REGISTROLIBROS(1 To NR) ‘Volvemos a abrir el fichero Open TBNombreFichero. REGISTROLIBROS(I). REGISTROLIBROS(I).Text = REGISTROLIBROS(NRP). REGISTROLIBROS(I).TITULO.EXISTENCIAS End Sub Copiamos este código de presentación de datos y lo llevamos a las flechas de incrementar o disminuir el número del registro a presentar.EDITORIAL LIBRETBEDICION.Text For Input As #1 ‘Leemos los registros del 1 al NR.Caption = Str(NR) + " Registros)" 'Redimensionamos la matriz de REGISTROLIBROS a NR elementos. #1) If A = Chr(13) Then NR = NR + 1 Loop Close #1 ‘ Presenta en LNumFich el número de registros LNumFich.EXISTENCIAS ‘NRP = Número del Registro Presentado.Text = REGISTROLIBROS(NRP).EXISTENCIAS Next I Close #1 NOTA. Open TBNombreFichero. ya que cada registro ocupa una línea.AUTOR.EDICION Input #1.Text = REGISTROLIBROS(NRP). Lo hacemos igual a 1 para presentar.REGISTROLIBROS(I)._ REGISTROLIBROS(I). For I = 1 To NR Input #1.Text = REGISTROLIBROS(NRP). REGISTROLIBROS(I).EDICION LIBRETBPREC.

Text = REGISTROLIBROS(NRP). es un problema cuando leemos un dato situado en un punto de ese fichero.Text = REGISTROLIBROS(NRP). No solamente hemos visto una forma de crear una base de datos.TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).If NRP > NR Then ‘protegemos que salga error de NRP fuera de intervalo MsgBox "No existen mas registros en esta dirección" NRP = NR Else LIBRETBTITULO. Este tipo de bases de datos son la Tipo Texto que verá mas adelante. Habrá observado instrucciones tales como: Do until EOF(1) (Hazlo hasta que encuentres el EOF del canal 1) Do While Not EOF(1) (Hazlo mientras EOF del canal 1 sea False) Estas expresiones se usan en un bucle. deberemos terminar de leerlo.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.EDICION LIBRETBPREC.EXISTENCIAS End Sub Observe que es muy sencillo trabajar con ficheros secuenciales para bases de datos. y luego tenemos que leer un dato colocado en una posición anterior.Text = REGISTROLIBROS(NRP). Esto que no es ningún inconveniente para un fichero de texto.EDICION LIBRETBPREC. pero restando 1 a NRP Las flechas dobles llevan al registro 1 y al último.PRECIO LIBRETBEX. La de disminuir es igual. y volver a comenzar por el principio.Text = REGISTROLIBROS(NRP).Text = REGISTROLIBROS(NRP). sino que hemos visto como movernos a lo largo de los registros. La sintaxis de esta propiedad es: LOC (Numero de canal) la información devuelta para un archivo secuencial es la posición de byte actual en el LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 180 .Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.EDITORIAL LIBRETBEDICION. El inconveniente es la cantidad de memoria necesaria para la matriz de datos. En este caso.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION. o incluso para un fichero de datos que leemos una única vez. Tienen este código Private Sub BMas2_Click() NRP = NR LIBRETBTITULO.Text = REGISTROLIBROS(NRP). También tienen un gran inconveniente: solamente se pueden leer de hacia adelante. Este es un gran inconveniente para hacer bases de datos con ficheros secuenciales. EOF será False hasta que encuentre el final del fichero secuencial.EXISTENCIAS End If End Sub Esta es la de incrementar.Text = REGISTROLIBROS(NRP). para ir extrayendo con la instrucción Input o Line Input los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF) LOC Devuelve la posición de lectura/escritura actual en un archivo abierto.Text = REGISTROLIBROS(NRP). Propiedades de los ficheros Secuenciales: EOF Indica el fin del fichero (End Of File). Verá esto con mucho mas detalle cuando demos bases de datos. Un fichero secuencial hay que leerlo de una sola vez.AUTOR LIBRETBEDITORIAL.TITULO LIBRETBAUTOR.

todos ellos de la misma longitud. LOF Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open. podíamos introducir informaciones de cualquier longitud. la información de varios datos podíamos introducirla mediante la instrucción Write. pero bastante difícil de almacenarlas en la memoria cuando el número de estas colecciones superaba una cierta cantidad. pues un fichero secuencial no permite “remendar” el trozo que queremos cambiar. no había mucho problema para guardarla. Cambiar una información dentro del fichero secuencial también implica una complicación adicional. Los ficheros aleatorios nos permiten guardar una información similar a la anterior. pero sí para almacenarla en memoria para poder usarla luego."Editorial". Teníamos que leer todo el fichero. Seek devuelve la posición de byte en la que se va a ejecutar la siguiente operación.483.archivo. Para archivos abiertos en modo Output. sino simplemente acceder a los registros que nos interesen. Append o Input. Sintaxis Seek(númeroArchivo) Para obtener la longitud de un archivo que no está abierto utilice la FileLen. y si la información que debemos almacenar tiene menos que la longitud preestablecida. longitud que no se puede sobrepasar. Todo esto tiene un precio: En los archivos secuenciales. Tal como habíamos visto en los ficheros secuenciales. En los archivos secuenciales."Existencias" Si deseábamos guardar la información de muchos libros. Sintaxis LOF(numeroarchivo) Ejemplo Long = LOF (1) Observaciones función SEEK Devuelve la posición actual de lectura/escritura de un archivo abierto con la instrucción Open. perderemos esa capacidad sobrante. Los ficheros aleatorios permiten almacenar información en registros que pueden ser fácilmente leídos. el almacenar una serie de colecciones de datos en un fichero secuencial era muy fácil. sin necesidad de leerlos todos. FICHEROS ALEATORIOS (RANDOM) Un fichero aleatorio es un conjunto de registros. y extraer de él la colección de informaciones y guardarlas en una matriz. Para abrir un fichero aleatorio debemos emplear la expresión: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 181 ."Edición". y para leerla no es necesario leer todo el fichero. sin alterar los demás.647 (equivalente a 2^31-1) inclusive. pudiendo leer los registros uno a uno. En los archivos aleatorios cada dato tiene una longitud asignada.147."Precio"."Autor". referida a cualquier número de libros. También permite realizar el cambio de un registro de una forma sencilla. que nos permite guardar varias colecciones de datos. El primer byte de un archivo está en la posición 1. (Véala mas abajo) Seek devuelve un valor entre 1 y 2. y conseguíamos un registro de la forma: (Recuérdese el ejemplo de los datos de un libro) "Título". dividida por 128. ya que debemos rehacer el fichero completo. el segundo en la posición 2 y así sucesivamente.

en el caso de los libros visto anteriormente. Editorial. primero debemos definir el registro. Se debbe hacer en la sección de declaraciones de un módulo o de un formulario. etc.Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro Nombrefichero es el nombre que queremos dar al fichero Numerocanal es el número del canal (número de fichero) que puede ser de 1 a 255 LogitudRegistro es la longitud total del registro. podemos decir que una variable es del tipo definido para Registro. Observe la diferencia de esta definición con la que hacíamos en los ficheros secuenciales. Para "saber" como se colocan estos datos dentro del registro será necesario definirlo. es decir : Dim MiVariable as Registro Entonces MiVariable ya puede almacenar los datos de Titulo. un registro va almacenar los datos del titulo. Edición. Lo sabe porque se lo hemos dicho al definir Registro. No es necesario utilizar separaciones ya que el programa sabe que longitud tiene cada dato y el orden de colocación. editorial. una vez abierto. Precio y Existencias. en el mismo orden que lo habíamos definido para Registro. En aquellos no poníamos la longitud de cada sección. y siempre antes de declarar una variable como variable de ese tipo. Autor. la variable tipo Registro. Un fichero aleatorio (Random). (La definición de la variable debe hacerse en la sección de declaraciones del módulo o formulario con ámbito suficiente para que sea válida en todas las partes de la aplicación donde se necesite esa variable) Podemos hacerlo con la instrucción Type: Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edición As String * 6 Precio As String * 4 Existencias As String * 3 End Type Asignamos 30 caracteres para el título Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edición Asignamos 4 caracteres para el precio Tres caracteres para existencias. es decir. puede utilizarse para leer o escribir datos. Si los datos a introducir son : Titulo : Autor : Editorial : Edición : Precio : Existencias : Guía del Estudiante Luis Suárez Bernaldo Ediciones XX 2ª 3500 25 el registro correspondiente a este libro tendrá una forma mas o menos así : Guía del Estudiante///////////Luís Suárez Bernaldo//////////Ediciones XX///2ª////350025/ LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 182 . ya que la longitud de un registro (y también de cada campo) es fija. Para escribir datos en un fichero aleatorio. Aquí es necesario. sin ninguna separación. colocando un dato tras otro. En realidad lo que vamos a hacer es definir una variable de las denominadas “Definidas por el usuario” Con esto lo que hacemos es crear un nuevo tipo de variable. Ya una vez definido como es Registro. en el ejemplo. autor.

etc. Un Registro está formado por varios Campos. En el ejemplo anterior era bastante fácil. inclusive) ocupa 4 bytes y un integer (número entero entre -32. a esas partes que componen el registro lea vamos a llamar CAMPOS. Existencias as Integer deberíamos tener en cuenta que un Long (número entero entre -2.768 y 32. Pero si declaramos en la instrucción Open que el registro es mayor que la suma de los caracteres de todos los campos que lo componen. ya que todos los campos eran del tipo String (cadena de caracteres) y cada carácter ocupa un byte. o estrictamente igual ? La respuesta es igual o mayor. porque nos obligará a recordar cuantos bytes ocupa un integer. Tipo de Dato Byte Boolean Integer Long(entero largo) Single(coma flotante Simple precisión) Double(coma flotante Doble Precisión) LSB Visual Basic – Guía del Estudiante Capítulo 1 Ocupa 1 byte 2 bytes 2 bytes 4 bytes 4 bytes 8 bytes Página 183 . La cosa se complica si uno o varios de los campos son de tipo numérico. tanto como la diferencia entre lo declarado en la instrucción Open menos la suma de los caracteres de cada uno de los campos. Imagínese que introducimos otro libro. ¿Deberá ser igual o mayor. El primer campo de ese nuevo registro se colocará en el fichero inmediatamente después del último campo existente. y cada Campo contiene una información.483. sin ningún tipo de separación. Si hubiésemos declarado en la instrucción Type Precio as Long. que puede tomar 256 valores y ocupa solamente un Byte.) Para hablar con propiedad. estaremos perdiendo espacio de disco duro. Si se molesta en contar los caracteres que tiene el registro observará que son 88. etc. Y esa cifra. No hace falta esa separación. multiplicada por el número de registros existentes. un Long.647.767) ocupa 2 bytes. Se reproduce a continuación la longitud en Bytes de cada uno de los tipos de datos. No se moleste en aprendérsela de memoria.147.648 y 2. pues en la Ayuda de Visual Basic puede encontrarla como Resumen de tipos de datos.donde se ha sustituido el carácter nulo por una barra ( / ) con el fin de hacerlo visible en el texto. que repetimos aquí por comodidad : Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro (Si se omite el dato LongitudRegistro VB colocará la longitud por defecto. ya que la longitud total del registro se le ha introducido en la instrucción para abrir el fichero. Por lo tanto debe declararse en la instrucción Open exactamente la suma de los caracteres de todos los campos. 128 caracteres) LongitudRegistro deberá ser igual o mayor que la suma de caracteres de cada uno de los campos declarados en la instrucción Type. que también reproducimos : Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edición As String * 6 Precio As String * 4 Existencias As String * 3 End Type Asignamos 30 caracteres para el título Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edición Asignamos 4 caracteres para el precio Tres caracteres para existencias.483. pues VB conoce donde finaliza un registro y comienza otro.147. Autor. Pero fíjese en algo tan curioso como que un dato tipo Boolean que solamente puede tomar 2 valores (Sí / No) ocupa 2 bytes frente a un dato tipo Byte. que es la suma de 30 + 30 + 15 + 6 + 4 + 3 que son los caracteres asignados a cada uno de las partes que forman el registro (Título.

Basta conocer la longitud del fichero mediante la instrucción LOF si el fichero ya está abierto. Esta instrucción Type en realidad lo que está haciendo es definir un nuevo tipo de variable. vamos a retomar el ejemplo de la biblioteca. ¿No habrá algo que nos lo facilite ? Sí. o con la instrucción FILELEN si no lo está. Por lo tanto. Editorial. Edición. Ahora nos cabe una pregunta ¿Cuantos registros tiene un fichero Random? La respuesta es sencilla. Y echando números para saber la longitud exacta de la variable y no perder ningún byte del disco duro desaprovechándolo sin información. lógicamente. NumeroRegistro. y dividir el dato obtenido con cualquiera de las dos instrucciones anteriores por el valor LongitudRegistro. Instrucción Put Una vez abierto el fichero Random podemos leer y escribir datos en él. debemos declarar una variable en la parte que corresponda del programa. Declararemos (posiblemente en la sección de declaraciones del formulario) una variable que llamaremos p. dependiendo del ámbito que se le quiera dar a esa variable. Usando la declaración de Registro del ejemplo anterior. Para escribir datos utilizaremos la instrucción Put. (una variable definida por el usuario) que servirá de “muestra” para que en otra parte del programa le digamos. mediante una instrucción Dim. Autor.Currency Date Object String (longitud variable) String (longitud fija) Variant (con números) Variant (con caracteres) 8 bytes 8 bytes 4 bytes 10 bytes + longitud de cadena longitud declarada de la cadena 16 bytes 22 bytes + longitud de cadena Ya le estoy viendo tomando buena nota de cuanto ocupa cada variable.e. La declaración del registro mediante la instrucción Type debe hacerse en la sección de declaraciones de un Módulo. Precio y Existencias) y que cada campo tiene los caracteres especificados en la instrucción Type. abra el fichero de esta forma : Open Nombrefichero For Random As # Numerocanal Len = Len (MiVariable) Ni que decir tiene que si se abre ese fichero en varias partes del programa con distintas instrucciones Open el valor de LongitudRegistro debe ser igual en todas ellas. La instrucción LEN LEN nos da la longitud de un texto (Var=Len (“Hola que tal”). Variable LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 184 . REGLIBROS de la siguiente forma : Dim REGLIBROS as Registro A partir de este momento. Escribir datos en un fichero Random. que tal variable es del tipo definido anteriormente mediante la instrucción Type. o de una variable Var=Len(Variable) Podemos usarla para conocer la longitud total de la variable MiVariable LongitudRegistro = Len (MiVariable) Pero si quiere reducir mas la cosa. el programa sabe que REGLIBROS es una variable que tiene 6 campos (Titulo. diciendo que será del tipo de la declarada mediante la instrucción Type. La sintaxis de Put es la siguiente: Put # Numerocanal .

Editorial = TBEDITORIAL. cada uno de una longitud determinada. Antes de introducir REGLIBROS en el fichero habrá que decir que valor tiene. Pero cada campo que lo compone tendrá un valor.Precio = TBPRECIO. la definida en la instrucción Type. Edición.Autor = TBAUTOR.Existencias = TBEXISTENCIAS. Luego REGLIBROS tendrá 6 campos (Titulo. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 185 . REGLIBROS ya tiene un valor que se puede escribir en el fichero mediante la instrucción Put. a través de varios TextBox.Titulo = TBTITULO. la variable REGLIBROS contendrá los mismos campos que habíamos declarado para Registro en la instrucción Type. NumeroRegistro es el número del registro que queremos escribir. Editorial. Siguiendo con nuestro ejemplo de biblioteca. Precio y Existencias). sino una variable definida por el usuario ya que la declaramos con Dim REGLIBROS as Registro.Text (Si se hubiese omitido alguna de estas igualdades.Text REGLIBROS. Variable tiene en este caso el nombre REGLIBROS. el número de registro que se escribirá será el siguiente al último registro escrito. En este caso. El nombre de cada uno de los TextBox para cada uno de los datos es el siguiente : Campo Título : TBTITULO TBEDITORIAL Campo Edición :TBEDICION TBEXISTENCIAS Campo Autor : Campo Precio : TBAUTOR TBPRECIO Campo Editorial : Campo Existencias : La aplicación deberá introducir en cada campo el valor (string) existente en cada uno de esos TextBox.Text REGLIBROS. Autor. y el número de registro en el cual queremos escribir. Recuerde : Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edición As String * 6 Precio As String * 4 Existencias As String * 3 End Type Asignamos 30 caracteres para el título Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edición Asignamos 4 caracteres para el precio Tres caracteres para existencias.Text REGLIBROS. el campo correspondiente contendría el valor nulo) De esta forma. Podríamos hacer una aplicación en la que. El valor de la variable REGLIBROS lo compondremos de la siguiente forma : REGLIBROS.Text REGLIBROS.Edicion = TBEDICION. y Variable es el contenido de ese registro.Puede omitirse NumeroRegistro. le introdujésemos los valores de los campos. que no es un String ni un Integer. Por lo tanto.Text REGLIBROS.

Val(TBLEERESCR).Text REGISTROLIBRO.Edición = TBEDICION. de registros ‘Pone ese Nº. en el Label Veamos como se escribe un registro. abre el fichero indicado en TBNOMBREFICHERO. botones para leer.El formulario de esa aplicación tendrá esta forma : Observe que ya se le han introducido otros controles (TextBox para introducir el nombre del fichero. El TextBox para introducir el nombre del fichero se llama TBNOMBREFICHERO y en el que debemos introducir el número de registro a leer o escribir TBLEERESCR.Autor = TBAUTOR. un par de botones para subir o bajar el número de registro y un botón para salir de la aplicación. otro para el número de registro. El Botón EXAMINAR cierra cualquier fichero que pudiese estar abierto. Analicemos el código del procedimiento click del botón ESCRIBIR Private Sub BESCRIBIR_Click() REGISTROLIBRO.Text cada REGISTROLIBRO.Text REGISTROLIBRO. abrir el fichero (EXAMINAR). REGISTROLIBRO End Sub ‘Se asignan los valores de ‘uno de los campos de la ‘REGISTROLIBROS ‘Se escribe el registro Observe que el Nº.Precio = TBPRECIO.Caption = NUMREGS End Sub ‘Cierra cualquier fichero ‘Abre el fichero deseado ‘Obtiene su longitud ‘Calcula el Nº.Titulo = TBTITULO. escribir.Existencias = TBEXISTENCIAS.Text REGISTROLIBRO. calcula el número de registros y escribe este número en el Label con nombre LNUMFICH.Editorial = TBEDITORIAL.Text Put #1. El código de su procedimiento Click es el siguiente : Private Sub BEXAMINAR_Click() Close abierto Open TBNOMBREFICHERO For Random As #1 Len = 88 LONGITUDFICH = LOF(1) NUMREGS = LONGITUDFICH / 88 LNUMFICH. de registro es el valor que figure en el TextBox TBLEERESCR LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 186 .Text variable REGISTROLIBRO.

Variable tiene por nombre REGISTROLIBRO (El mismo que tenía para la instrucción Put de escribir. Ese registro contendrá varios campos. y seguramente nos interesará conocer el valor de cada campo dentro de ese registro.Existencias End Sub Funciones e instrucciones aplicables a los ficheros Random. Es pura comodidad del programador. el número devuelto por la función Loc es 0. En nuestra aplicación. REGISTROLIBRO ‘Lee el registro completo TBTITULO. Variable es una variable que contendrá todos los campos. Val(TBLEERESCR). Precio TBEDITORIAL.Text = REGISTROLIBRO.Precio ‘dato TBEXISTENCIAS. Editorial. Variable Puede omitirse NumeroRegistro.Autor ‘Autor.Leer datos en un fichero Random. escritura. bien por lectura.Text = REGISTROLIBRO.Edición ‘TextBox correspondientes a cada TBPRECIO. Si abrimos el fichero y no se ha hecho ninguna lectura o escritura de registros. En este caso.Text = REGISTROLIBRO. La sintaxis de la función Seek es : Variable = Seek (Numerocanal) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 187 . realizaremos un proceso similar al empleado para la escritura. Instrucción Get Para leer los datos de un fichero Random utilizaremos la instrucción Get.Text = REGISTROLIBRO. Veamos el contenido del procedimiento click del botón LEER Private Sub BLEER_Click() Get #1. La sintaxis de la función Loc es : Variable = Loc (Numerocanal) Variable tomará un valor igual al número del registro escrito o leído por última vez. el número de registro que se leerá será el siguiente al último registro leído.Text = REGISTROLIBRO. Si abrimos el fichero y no se ha hecho aún ninguna operación de lectura o escritura. NumeroRegistro.Text = REGISTROLIBRO. Mediante la Función Seek podemos conocer el próximo registro que será manipulado en una operación de lectura o escritura. Funciones Seek y Loc. pretendemos poner el contenido de cada campo en los mismos TextBox que se utilizaron para escribirlos. En los ficheros Random tienen especial importancia las funciones Seek y Loc.Titulo ‘Obtiene el valor del campo Titulo TBAUTOR.Editorial ‘y Existencias y los pone en los TBEDICION. Edición. Su sintaxis es la siguiente : Get # Numerocanal . pero al revés. Puede tener cualquier otro nombre) Para obtener el contenido de cada campo. Seek devuelve el valor 1. Mediante la Función Loc podemos conocer la el último registro manipulado. La Instrucción Get leerá un registro completo. En nuestra aplicación de biblioteca.

EOF devuelve False hasta que se haya ejecutado una instrucción Get y no haya podido leer el registro completo. Registros = LOF / longitud Recuerde Para obtener la longitud de un archivo que no está abierto utilíce la función FileLen. mediante las funciones LOF. en cuyo caso devolverá True. No acepta el 0 como número de registro. dividiendo el valor devuelto por LOF por la longitud del registro declarada en la instrucción Open (LEN = longitud) Nº. Si se intenta forzar a la posición 0 dará un error. y es muy fácil controlar cuantos registros existen en el fichero y en que registro nos encontramos o nos vamos a mover. posición posición es el número de registro que se va a leer o escribir en la siguiente operación. el mas bajo debe ser el 1. LOC y SEEK LOF ( Lenght Of File ) Devuelve la longitud de un fichero . Sintaxis EOF(Numerocanal) En archivos Random. Sintaxis Variable = LOF(Numerocanal) Mediante la función LOF podemos conocer el número de registros existentes en un fichero Random. Sintaxis Seek (Numerocanal). La función EOF no suele emplearse en ficheros Random.ATENCION ¡¡¡ Seek puede ser una función (lee un Dato) o una instrucción (fuerza un dato) ! ! ! Instrucción Seek La instrucción Seek establece el próximo registro a leer o escribir en un fichero Random. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 188 . Funciones de los ficheros Random: EOF Devuelve un valor que indica si se ha llegado al final de un archivo. ya que en estos nos movemos a base de registros.

y no controlamos bien el número de bytes a introducir y las informaciones que ya existen en el fichero en las posiciones colindantes con las que vamos a introducir los datos. puede que “machaquemos” parte de la información que ya tenemos en el fichero. Put # Numerocanal. (texto y cualquier tipo de datos) . decíamos que eran los mas adecuados para introducir información de un texto. la diferencia se rellenará con el byte nulo ( 0 ). por ejemplo : Dim Variable As String * numero de bytes y en este caso siempre escribirá el número de bytes declarado. los datos sobrantes no se escribirán en el fichero.Si no se conoce de antemano el número de bytes a escribir. Si la posición en la que introducimos esos bytes es una posición intermedia. . Si los datos a escribir en el fichero fuesen menos que los declarados para Variable. Si quiere omitir este dato. Con un fichero binario podemos almacenar cualquier información. usaremos la instrucción Put. con su Path. a base de controlar los registros y sus campos. Cuando se explicaban los ficheros secuenciales. hasta que quepa toda la cadena de bytes que le queremos introducir. con los Random podíamos realizar una base de datos de forma sencilla. y de esta forma se escribirán todos los bytes que componen la variable : Dim Variable As String Pero en este caso debemos volver a decir ¡ Cuidado !.FICHEROS BINARIOS Un fichero binario es una sucesión de bytes. Si se omite el dato Posición. ¡ Cuidado ! Si los datos a introducir sobrepasan el número de bytes declarados para Variable. se tomará como byte de inicio de la escritura el siguiente al último usado por la instrucción Put. No pueden existir al mismo tiempo 2 ficheros abiertos con el mismo Numero de canal. y Variable es el nombre de la variable que contiene el dato a escribir. que define ea fichero. es muy probable que perdamos esa información al introducir la nueva. Posición. podemos leer o escribir datos en él. Para escribir varios bytes podemos hacerlo de dos formas : . si no conocemos el número de bytes que vamos a escribir. podemos declarar la variable sin especificar el número de bytes que tiene. Para abrir un fichero secuencial se abre utilizando la instrucción : Open Nombrefichero For Binary As # Numerocanal Como siempre en VB. uno tras otro. que puede almacenar cualquier tipo de información.Si se puede conocer de antemano el número de bytes a escribir. Nombrefichero es el nombre completo del fichero. Este dato puede ser un byte o varios bytes. Variable Donde Posición es el Byte donde comenzará la escritura. Numerocanal puede ser un número comprendido entre 1 y 255. puede declararse Variable como un string de ese número de caracteres mediante la instrucción Dim. Una vez abierto un fichero se binario. debe conservar las comas que lo separan : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 189 . Para escribir uno o varios caracteres en un fichero binario. pues la instrucción Put va a colocar los bytes que componen Variable en la posición especificada por Posición y siguientes.

Pueden leerse uno o varios Bytes. que como en el caso de Put. Esta es una limitación para el uso de Get. pero ahora surge un pequeño problema. Machacando información ya existente si no se controla bien donde se mete. Variable Donde Posición es el número del primer byte leído. comenzando por el byte 48 (el 48 será el primer byte leído). Posición. como se decía al principio. #1) Variable contendrá ahora los 35 bytes deseados. Esta función viene muy bien en aquellas aplicaciones en las que tenemos que extraer un número fijo de bytes (En la práctica. leerá 10 bytes a partir del byte Posición. . pero no podemos controlar el byte de comienzo. Variable es el nombre de una variable que contendrá los datos leídos. Ese problema lo tenemos resuelto con la instrucción Input. ¿Como le decimos cuantos bytes debe leer ? Sencillamente los especificados al declarar la variable . y otra vez otro. Limite el uso de este tipo de ficheros a las aplicaciones en que sea realmente imprescindible. Número del primer Byte a leer Por ejemplo. 48 Variable = Input (35. Get # Numerocanal. en la mayor parte de las aplicaciones se extrae de uno en uno) Pero pueden existir aplicaciones en las que sea necesario leer una vez un número de caracteres. si queremos leer 35 bytes de un archivo binario. abierto con el número de canal 1. Podemos leer caracteres de un fichero secuencial mediante la instrucción Input : Variable = Input (Numero de bytes. exigen mucho mas control que los anteriores. siempre leeremos un número determinado de caracteres (10 en el caso del ejemplo). que no tiene ningún tipo de separación entre bytes. utilizaremos la instrucción Get. Por lo tanto. # Numerocanal) Mediante la instrucción Input podemos leer el número de caracteres que queramos. ejecutaremos las dos siguientes instrucciones : Seek (1). Variable ¿Qué pasará si el dato Posición indica una posición mayor que la que tiene realmente el fichero ? Simplemente que rellenará las posiciones intermedias que se formarán con un byte (puede verlo con el Block de Notas ÿÿÿ) Un fichero binario es. Imaginemos que la declaración de la variable fue : Dim Variable As String * 10 Con Variable declarada de esta forma. Para leer datos de un fichero binario. una sucesión de bytes. vamos a ver con un ejemplo LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 190 . tomará como valor el byte siguiente al usado en la última instrucción Get. (Incluido) De esta forma. Al igual que se hizo para los ficheros secuenciales y Random. Por lo tanto deberemos ayudarnos de la instrucción Seek para posicionar el puntero de lectura encima del primer byte que queramos leer : Seek (Numerocanal). Cada dato (byte o conjunto de bytes) que introduzcamos en un fichero binario se escribirá en el fichero tal y como se introducen. aunque parece que los ficheros binarios pueden ser mucho mas versátiles que los secuenciales y los Random.Put # Numerocanal. si se omite.

ya que la instrucción Open Nombrefichero For Binary As # Numerocanal intenta abrir un fichero existente llamado Nombrefichero. para poder tener una referencia de que lugar ocupan los distintos caracteres (un fichero binario puede guardar cualquier byte. dejando para las explicaciones del profesor en clase. El botón ESCRIBIR escribe el dato Variable en el fichero. la interpretación de cada una de susu partes. El formulario del ejemplo tiene esta forma : Con el botón ABRIR se abre el fichero deseado. FORMULARIO. lo crea. Posición por defecto presenta la posición que se extrae mediante la función Seek cada vez que se hace una lectura o escritura en el fichero. Si existe el fichero.práctico como se manejan los ficheros binarios. DECLARACIONES Option Explicit ‘Obliga a declarar todas las variables Dim LONGVAR As Integer ‘Se declara la variable LONGVAR Dim COMIENZA As Long ‘Se declara la variable COMIENZA Dim TESTO As String ‘Se declara la variable TESTO Dim pospordef As Long ‘Se declara la variable pospordef LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 191 . SALIR sale de la aplicación. Se enumera a continuación el código de cada uno. por lo que le recomendamos haga esta práctica con un fichero creado por la misma práctica) El botón CERRAR cierra el fichero. de longitud la especificada en el TextBox Longitud de la variable. Si no existe en el disco. y si este no existe. Longitud de la variable permite introducir esa longitud. y LEER (INPUT) lee una cadena de caracteres. o para presentar la variable leída en caso de lectura . El TextBox superior (variable) sirve para introducir la variable a escribir en el fichero. El TextBox posición sirve para indicar la posición del primer byte. para leer mediante la instrucción Input. LEER (GET) lee un único byte. por lo que si abre un fichero generado con cualquier programa puede ser que muchos de los bytes no contengan información de un carácter. presenta todo su contenido en el TextBox inferior. lo crea. o el estudio del alumno.

filename For Binary As #1 ‘Abre el fichero indicado en CD1 TESTO = Input(LOF(1). #1) ‘Lee LONGVAR bytes del canal 1 y los pasa a TEXTO TBVAR1.Text = "1" If Seek(1) >= LOF(1) Then Seek #1. escribe byte pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub BOTON LEER (GET) Private Sub BLEER_Click() TBVAR2. 0) TBVAR2. De la variable en rojo ‘Declara la variable escribe como string.BackColor = RGB(255.Caption <> "" Then COMIENZA = Val(Lvar5. 0.Text <> "" Then COMIENZA = Val(TBVAR3. si existe posición por defecto ‘le indica que comience en la posición por defecto ‘ si no ‘pone el puntero en la posición 1 (byte 1) ‘lee un byte ‘y lo presenta en TBVAR1 ‘busca la nueva posición por defecto ‘y pone ese valor en Lvar5 BOTON LEER (INPUT) Private Sub BLLERINPUT_Click() TBVAR2.Caption) Else COMIENZA = Seek(1) End If Get #1. TEXTO TBVAR1.Text Put #1.BackColor = RGB(255.Text)‘pasa el valor para long. 255.Text) TBVAR3 ElseIf Lvar5. #1) ‘Lee de un golpe el fichero y lo mete en la variable TESTO TBFICHERO. COMIENZA. 0) Dim escribe As String escribe = TBVAR1. Val(TBVAR3) es la posición del 1er ‘Analiza donde quedó el puntero del fichero ‘y pone este valor en la etiqueta Lvar5 ‘Pone en rojo el TB TBVAR2 (long.Text = TEXTO ‘y lo presenta en el TB TBVAR1 pospordef = Seek(1) ‘analiza la nueva posición por defecto LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 192 .BOTON ABRIR Private Sub BABRIR_Click() CD1.Text <> "" Then ‘si ese valor existe (TBVAR3 es distinto de nada) COMIENZA = Val(TBVAR3.ShowOpen ‘CD1 es un CommonDialog para buscar el fichero Open CD1.Text = TEXTO pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub ‘La instrucción Close cierra todos los ficheros abiertos ‘Pone el TB long. de la variable) ‘e indica que la longitud leída es 1 ‘Si está al final del archivo ‘pone el puntero en la posición 1 ‘ ‘Declara la variable TEXTO de un byte ‘Si se le ha indicado donde tiene que comenzar ‘le dice que comience en la posición indicada en ‘si no.Text = TESTO ‘Presenta el fichero en el TextBox TBFICHERO End Sub BOTON CERRAR Private Sub BCERRAR_Click() Close End Sub BOTON ESCRIBIR Private Sub BESCRIBIR_Click() TBVAR2. de variable a LONGVAR If TBVAR3.Text) ‘la variable COMIENZA toma ese valor Seek (1). Val(TBVAR3). sin limitación ‘Pasa el contenido de TBVAR a la variable escribe ‘Instrucción Put. 255) ‘Pone TBVAR2 en blanco LONGVAR = Val(TBVAR2.BackColor = RGB(255. 1 End If Dim TEXTO As String * 1 If TBVAR3. COMIENZA ‘coloca el puntero en ese valor End If ‘ Dim TEXTO As String ‘Declara la variable TEXTO sin limitación TEXTO = Input(LONGVAR. 0.

directorio o carpeta que concuerda con el patrón o atributo de archivo especificado o la etiqueta de volumen de una unidad de disco. Si omite.Lvar5 = Str(pospordef) End Sub BOTON SALIR Private Sub BSALIR_Click() End End Sub ‘y la presenta en Lvar5 ‘ ‘Sale de la aplicación. en las siguientes llamadas se debe especificar nombreruta o se producirá un error. atributos])] Expresión de cadena que especifica un nombre de archivo. no se puede llamar a la función Dir. atributos se Constante o expresión numérica. Sin embargo. cuya suma especifica atributos de archivo. devuelve Null.BackColor = RGB(255. Private Sub TBVAR2_Change() TBVAR2. La primera vez que se llama a la función Dir se debe especificar el nombreruta. 255) en End Sub ‘Vuelve a color blanco si introducimos un dato ‘este Text Box FIN DE LA APLICACIÓN PARA MANEJO DE FICHEROS BINARIOS Funciones y propiedades aplicables a todos los ficheros DIR Devuelve el nombre de un archivo. Para obtener más nombres de archivo que coincidan con el nombreruta. Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Dir permite el empleo de los caracteres comodín '*' (múltiples caracteres) y '?' (un solo carácter) para especificar varios archivos. Sintaxis nombreruta Dir[(nombreruta[. Se puede cambiar el nombreruta sin haber obtenido todos los nombres de archivo que coinciden con el nombreruta actual. Dir devuelve una cadena de caracteres de longitud cero. Puede incluir el directorio o carpeta y la unidad de disco. Si no se encuentra nombreruta. se debe volver a llamar a Dir sin argumentos. FILECOPY LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 193 . devuelve todos los archivos normales que satisfacen el nombreruta. En Microsoft Windows. 255. se debe incluir el nombreruta. de lo contrario se produce un error. Sistema Etiqueta de volumen. si se especifica se ignoran todos los atributos Directorio o carpeta. El argumento atributos tiene estas constantes y valores: Constante vbNormal vbHidden vbSystem vbVolume vbDirectory Valor 0 2 4 8 16 Descripción Normal. Cuando se devuelve una cadena de longitud cero. Si además se especifican atributos de archivo. Oculto. Cuando no hay más nombres de archivo coincidentes.

Sintaxis Variable = GetAttr(nombreRuta) El argumento con nombre nombreRuta es una expresión de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Archivo de sistema. destino Expresión de cadena que especifica el nombre del archivo de destino se puede incluir el directorio o carpeta y la unidad de disco. Si el archivo especificado está abierto cuando se llama la función FileLen.Copia un archivo. Para obtener la longitud de un archivo abierto. destino fuente Expresión de cadena que especifica el nombre de un archivo a copiarse puede incluir el directorio o carpeta y la unidad de disco. Valores devueltos El valor devuelto por GetAttr es la suma de los siguientes valores de atributos: Valor 0 1 2 4 16 32 Constante vbNormal vbReadOnly vbHidden vbSystem vbDirectory vbArchive Descripción Normal. directorio o carpeta o una etiqueta de volumen. Oculto. Directorio o carpeta. FILEDATATIME Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por última vez. que representa los atributos de un archivo. se produce un error. Capítulo 1 Página 194 LSB Visual Basic – Guía del Estudiante . Sintaxis Variable = FileLen(nombreRuta) El argumento con nombre nombreRuta es una expresión de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco.. GETATTR Devuelve un número. Sintaxis Variable = FileDateTime(nombreRuta) El argumento con nombre nombreRuta es una expresión de cadena que especifica un nombre de archivo. Se puede incluir el directorio o carpeta y la unidad de disco. utilice la función LOF. el valor devuelto representa el último tamaño de ese archivo cuando se guardó la ultima vez en el disco. Sólo lectura. FILELEN Devuelve la longitud de un archivo en bytes. El archivo ha sido modificado después de efectuar la última copia de seguridad. Sintaxis FileCopy fuente. Si intenta utilizar la instrucción FileCopy en un archivo abierto actualmente.

FREEFILE Devuelve el siguiente número de archivo disponible para ser usado con la instrucción Open. Se especifica 0 (predeterminado) para devolver un número de archivo en el intervalo 1 a 255. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 195 . inclusive. Sintaxis FreeFile[(númerodeintervalo)] El argumento númerodeintervalo especifica el intervalo desde el que el siguiente número de archivo libre se va a devolver.SETATTR Establece los atributos de un archivo. Observaciones Se usa FreeFile cuando se necesita proveer un número de archivo y se quiere asegurar que el número de archivo no está ya en uso. se producirá un error en tiempo de ejecución. Se especifica 1 para devolver un número de archivo en el intervalo 256 a 511.atributos Expresión de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Las constantes y valores de atributos son los mismos que para la instrucción GetAttr Si se trata de establecer los atributos de un archivo abierto. Constante o expresión numérica cuya suma especifica los atributos de archivo. Sintaxis nombreRuta atributos SetAttr nombreRuta.

y1) . un control PictureBox o el objeto Printer. El color de la línea será el especificado en color. El objeto PRINTER Los métodos gráficos se aplican sobre aquellos objetos que permiten dibujar o escribir sobre ellos. y PSet. Cls.y2).y2. le estamos indicando que las coordenadas que siguen a Step son relativas. pero ¿Respecto a quién son relativas las coordenadas (x1. Sintaxis 1 objeto. y1) .y1 (origen) a las coordenadas también absolutas x2. o que nos permiten analizarlos o borrarlos. Relativas a las coordenadas de comienzo de la línea. color. x2. Print. Point. y2).(x2. y1+y2). CurrentY que existiese antes de ejecutar la sentencia.y2) son relativas al punto (x1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 196 . Sintaxis 2 objeto. que se puede poner en cualquiera de las posibles formas que permite VB.Step (x2. Los parámetros BF se explican mas adelante. Relativas ¿respecto a quien?. y1). que es el valor de la propiedad ForeColor del objeto. pondrá el color por defecto.Line (x1.y2).Line Step (x1.(x1+x2.Visual Basic . PictureBox u objeto Printer sobre el que queremos dibujar. En las expresiones anteriores objeto es el nombre del Formulario.y2. y las coordenadas relativas (x2. METODO Line Dibuja líneas y rectángulos en un objeto.y2).Line (x1. Color es el número de color. Si no se especifica objeto se entiende por defecto que el objeto sobre el que queremos dibujar es el formulario que tiene el enfoque en ese momento. Son el Formulario. Los métodos gráficos de que dispone Visual Basic son : Circle. En principio es fácil entender que (x2. Line. El objeto puede ser un Formulario. color.y1) .Line (x1.y1) . BF (Con esta sintaxis trazará una línea desde las coordenadas absolutas x1. color. el Picture Box y el Printer. PaintPicture. En estas expresiones. Si no se especifica color.Step (x2. Veamos la tercera forma de colocar una línea : Sintaxis 3 objeto. BF Con esta expresión trazará una línea entre las coordenadas relativas (x1.y1) ? Son relativas a la posición del puntero de dibujo en el instante anterior a ejecutar esta sentencia. las coordenadas estarán especificadas en las unidades de medida determinadas por las propiedades ScaleMode o ScaleWidth / ScaleHeight del objeto. color. Es decir. BF Podemos darnos cuenta por la descripción anterior que la palabra Step (palabra reservada de Visual Basic) indica que las coordenadas que le siguen son relativas a algo.y1). es decir al CurrentX. No son muchos estos objetos.Guía del Estudiante Cap. Esta última expresión haría lo mismo que la siguiente expresión : objeto.y1 hasta las coordenadas relativas a (x1. 7 METODOS GRAFICOS MANEJO DE LA IMPRESORA.y1). BF (Con esta sintaxis trazará una línea desde las coordenadas absolutas x1. Se denominan métodos gráficas a aquellos métodos que nos permiten dibujar o representar gráficos ya existentes en un objeto. al poner la palabra Step (paso) antes de las coordenadas finales.

y2). Si se omite. las propiedades CurrentX y CurrentY toman el valor del punto final de la línea. Radio. este parámetro es opcional. un PictureBox o el objeto Printer.y2) De lo explicado se deduce que si el parámetro opcional BF es solamente B dibuja un cuadrado con esquinas en las coordenadas indicadas (pueden ser absolutas o relativas). y si es BF pinta ese rectángulo y además lo rellena con el mismo color elegido en el parámetro color.(x2. círculo.(x2. comience la línea siguiente en el punto final de la línea anterior. con el radio vertical doble respecto al horizontal.2 pi radianes a 2 pi radianes. Final Valor opcional. Cuando se ejecuta Line. La expresión : Form1. en el mismo sistema de unidades de medida. No puede usarse solamente la F pues no tiene sentido “rellenar” de color una figura abierta.0. B dibuja un rectángulo entre los puntos (x1. El valor predeterminado es 1.0). Como los datos de ángulos hay que introducirlos en radianes y nosotros normalmente pensamos en grados. Indica el radio del círculo. Radio Este parámetro es requerido. Es decir. y) son las coordenadas del punto central del círculo. Cuando se dibuja un arco o parte de un círculo o elipse.Circle (x. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 197 . 2 x 3. un Formulario. Puede ser. Para dibujar líneas unidas.1416 radianes equivalen a 360 º. BF dibuja un rectángulo relleno del mismo color de la línea (en este caso verde) con esquinas en las coordenadas (x1.y1) . Sintaxis objeto. Aspecto En la expresión anterior. Si utilizamos en esta propiedad el valor 2 obtendremos una elipse con el radio horizontal de doble valor que el vertical. elipse o arco. Las unidades de medida vendrán determinadas por las propiedades ScaleMode o ScaleWidth / ScaleHeight del objeto. elipse o arco sobre un objeto.y2). se asume que se refiere al Formulario que tenga el enfoque en ese momento.y1) y (x2.Line (x1. La expresión : Picture1. el de final es de 2 pi radianes. inicio y fin especifican (en radianes) la posición inicial y final del arco. objeto es el objeto donde se dibujará el circulo.255. expresado en cualquiera de las formas aceptadas por Visual Basic. METODO Circle Dibuja una circunferencia. como en el caso de la línea. Inicio. Lógicamente. RGB(255.0. Si empleamos 0. Es el número del color. RGB (0.y1) y (x2.1416 / 360 Aspecto Este valor nos convertirá la circunferencia en una elipse. emplee esta fórmula para convertir grados a radianes : Radianes = Grados x 2 x 3.0). y). Si se omite. El rango de ambas es de . La anchura de la línea dibujadas depende de la configuración de la propiedad DrawWidth. Inicio. Color Este parámetro es opcional. (x.y2) .y1) . se utiliza el valor de la propiedad ForeColor.Line (x1. Nota para los que no aprobaron Matemáticas Un circulo completo tiene 2 x pi radianes. lo que crea un círculo perfecto (no elíptico) en la pantalla. elipse o arco. El valor predeterminado de inicio es 0 radianes. Recuerde que una elipse es una circunferencia generalizada.BF es un parámetro opcional.5 obtendremos otra elipse. En realidad este parámetro sirve para que en vez de hacer una línea haga un rectángulo. Color. Final.

las propiedades CurrentX y CurrentY toman el valor del punto central. Los valores de Inicio y Final son siempre positivos. no utilice comas tras el último argumento que especifique. Si le añadimos a Inicio o a Final un signo menos delante. Sintaxis objeto.ICO o . x2. METODO Cls Borra los gráficos y el texto generados en tiempo de ejecución de los controles Form. PictureBox o Printer. altura2. si queremos que además de hacer el arco. Image o PictureBox pueden mantenerse manipulando la propiedad AutoRedraw del objeto con el que se trabaja. control Image o PictureBox. altura1. No se líe con la información que aporta VB para este tema. Sólo se puede rellenar una figura cerrada. anchura1. a sabiendas que VB siempre entenderá los valores de Inicio y Final como positivos. . Es decir. ¡¡¡Está mal !!! Lo expuesto anteriormente NO FUNCIONA para valores de Inicio o Final iguales a 0. x1. pondremos el signo menos ( -) delante de Inicio y de Final.Para rellenar la circunferencia y conseguir un círculo.DIB) en un objeto Form. Si omite un argumento adicional del final. Es decir. METODO PaintPicture Presenta el contenido de un archivo gráfico (.BMP.00000001.BMP al objeto Printer (a la impresora). Opecod La sintaxis del método PaintPicture tiene las siguientes partes: objeto es el objeto donde queremos colocar el gráfico. Esto puede permitirle dibujar un logotipo en un listado.Cls Donde objeto representa un formulario. pero debe incluir la coma del argumento antes de poner el argumento siguiente. elipses o porciones de tipo circular (arcos con líneas de radio dibujadas en ambos lados). Es opcional. La figuras cerradas son círculo. Cuando se ejecuta Circle. p.PaintPicture Imagen. las propiedades CurrentX y CurrentY del objeto se restablecen a 0. Observe que el objeto Printer no tiene método Cls. Image o PictureBox. y2. lo que hace es dibujar un radio desde el centro del circulo hasta el inicio de la circunferencia (si le hemos puesto un a Inicio) o hasta el final del arco (si le hemos puesto un . Cls borra el texto y los gráficos generados en tiempo de ejecución por instrucciones gráficas y de presentación. e. NOTA. Los mapas de bits de fondo definidos usando la propiedad Picture y los controles dispuestos en un Form en tiempo de diseño no se ven afectados por Cls. . si queremos hacer un radio en 0 radianes (línea recta desde el centro a la derecha) deberemos poner una cantidad muy cercana a 0 (0. se asume que el objeto es el control Form que tenga el enfoque.a Final). establezca las propiedades FillColor y FillStyle del objeto en el que se dibuja el círculo o elipse. Puede omitir un argumento opcional en medio de la sintaxis. el texto y los gráficos de los controles Form. El sentido de cuenta de los ángulos es en sentido contrario a las agujas del reloj. NO puede usarse este método para dibujar una imagen contenida en un fichero (Vea mas adelante la función LoadPicture) Puede sacar mucho partido a la propiedad PaintPicture.WMF. Si objeto se omite. . Por lo tanto. se asume que el objeto es el formulario que tenga el enfoque. Sintaxis objeto. Piense solamente que puede volcar una imagen . La imagen deberá estar en un Formulario o en un control Image.) para que ponga el radio. y1. dibuje los radios.EMF. anchura2. Image o PictureBox mientras la propiedad AutoRedraw es True no se ven afectados si AutoRedraw se establece a False antes de llamar a Cls. etc. Si se omite. Se le pueden poner a ambos y cerramos la figura. Después de llamar a Cls. factura. Los gráficos y el texto colocados en controles Form. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 198 .

tanto en sentido vertical como en horizontal. VariableImagen. Opecod Opcional. Opecod se ha omitido. anchura1 Opcional. Indican las coordenadas destino (eje x y eje y) del objeto en las que se ponemos el origen de la imagen.PaintPicture Imagen. anchura2 Opcional. imagen se amplía o se comprime respecto al original. Puede conocerse la anchura y altura de la imagen consultando la anchura y altura de la variable : AnchodelaImagen = VariableImagen. por lo que desconocemos a priori que dato debemos poner a anchura1 y a anchura2. Los valores x1 e y1 determinan el punto del objeto donde se colocará la esquina superior izquierda del gráfico que vamos a introducir. podemos. Para obtener la lista completa de los operadores bit a bit.Width. Debe ser la propiedad Picture de un objeto Form. . Si se quiere especificar un argumento opcional.Height Muchas veces. Las propiedad ScaleMode. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 199 . altura1 Opcional. Indican las coordenadas (eje x y eje y) de la zona de recorte dentro de la imagen origen. Si se omite uno o varios argumentos finales. La propiedad ScaleMode del objeto determina las unidades de medida que se usan. objeto. _ VariableImagen. busque el tema BitBlt en el archivo de Ayuda de Windows SDK (WIN31WH.Width AlturadelaImagen = VariableImagen. pero referido a la altura en este caso. Si se omite. Es el origen del gráfico que se va a presentar en el objeto.Imagen Este parámetro es requerido. Si anchura destino es mayor o menor que la anchura origen (anchura2). pero como es el último. Si al realizar la copia de la imagen a Objeto. altura1. y2 de forma intencionada. no se usan comas a partir del último argumento especificado. x2. Indica la altura destino de la imagen. Define una operación bit a bit (por ejemplo. y1. La propiedad ScaleMode del objeto determina las unidades de medida que se usan. Se desconoce el ancho de esa imagen. control PictureBox o control Image. se deben especificar todos los argumentos opcionales que aparecen antes en la sintaxis. Esto de la zona de recorte significa que podemos cortarle a la imagen origen un trozo. Si es un control. y1 Parámetro requerido. Pueden omitirse tantos argumentos finales como se desee. Con el código siguiente el ancho y alto de la imagen se mantendrá constante independientemente de la anchura y altura que tenga el Bitmap original. El último parámetro. en un Formulario. la imagen que se introduce en la variable tipo Picture es distinta en una ocasión u otras. y2 Parámetro opcional. puede ponerse invisible (Su propiedad Visible = False) con lo que podemos hacer un “almacenillo” de imágenes en un formulario sin que molesten a la hora de trabajar x1. NOTA Como caso práctico. el autor de este texto suele guardar la imagen en una variable tipo Picture. x1. pero observe que hemos seguido respetando su sitio con las comas como separadores. se usa la altura origen. la imagen debe existir en un PictureBox. Todo tiene solución. anchura1. Valor Long o código que se usa sólo con mapas de bits.Height donde hemos omitido x2. Recuerde que las coordenadas en VB crecen desde la esquina superior izquierda. operador Not o Xor) que se realiza sobre imagen al dibujarla sobre objeto. . También puede ser el contenido de una variable tipo Picture. Indica la anchura de la imagen origen. Si altura destino es mayor o menor que la altura origen (altura2). Indica la anchura destino de la imagen. que vendrá dado por la anchura real del Bitmap. bien rebajar el parámetro anchura1 o aumentar anchura2. en un control Image o en una variable. no hace falta dejarle las comas. Lo mismo que para anchura2. Este parámetro se usa para establecer la relación entre la anchura de la imagen final y la anchura de la imagen origen.HLP). Es decir. el que contiene la imagen. imagen se amplía o se comprime respecto al original. esta nos sale muy grande. puesto que la medida real del ancho de la imagen final estará en relación directa con el cociente anchura1/anchura2 altura2 Opcional. o ScaleWidth y ScaleHeight del objeto determinan las unidades de medida que se usan. se usa la anchura origen. Si se omite.

0) en su esquina superior izquierda. PSet establece un píxel al color especificado.PSet Step (x. y) Requeridos. y). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 200 . y Parámetro requerido. La forma en que se dibuja el punto depende de los valores de las propiedades DrawMode y DrawStyle. x. Estas coordenadas se refieren a las coordenadas del objeto destino. las propiedades CurrentX y CurrentY toman el valor del punto especificado en los argumentos. Cuando se ejecuta PSet. Si objeto se omite se asume que el objeto es el formulario que tenga el enfoque. Valor entero largo que indica el color RGB especificado para el punto. Si el punto definido por las coordenadas x e y está fuera de objeto. Si se omite objeto. como entero Long. PictureBox o Printer). Color Parámetro opcional. Cuando DrawWidth es 1.PSet (x.Point(x. el color rojo . Estas coordenadas se refieren a las coordenadas del objeto que contiene el gráfico. con origen (0. Cuando DrawWidth es mayor que 1. se asume como objeto el Formulario que tenga el enfoque. Color objeto. Sintaxis ó objeto. El objeto puede ser un Formulario. y) donde objeto Opcional. Valores Single que indican las coordenadas horizontal (eje x) y vertical (eje y) del punto según la propiedad ScaleMode del objeto Form o control PictureBox. se utiliza el valor de la propiedad ForeColor. Color La sintaxis del método PSet tiene las partes siguientes: objeto Opcional.verde .METODO Point Devuelve. Nombre del objeto (Formulario. un PictureBox o el objeto Printer. Deben colocarse entre paréntesis. Si se omite. se centra el punto en las coordenadas especificadas. Valores de simple precisión que indican las coordenadas horizontales (eje x) y verticales (eje y) del punto a establecer. Nombre del Formulario o PictureBox donde se va a analizar el color. METODO Pset Asigna a un punto de un objeto un color especificado. El tamaño del punto dibujado depende del valor de la propiedad DrawWidth. Sintaxis objeto. con origen (0. el método Point devuelve el valor -1.azul (RGB) del punto especificado de un objeto Form o control PictureBox. y). (x.0) en la esquina superior izquierda del mismo. Puede utilizar la función RGB o la función QBColor para especificar el color.

desde el código que está dentro de el se le nombra con Me. Sintaxis Objeto. LoadPicture (Función) Carga un gráfico en un objeto Form. Picture Box u Objeto Printer Sintaxis Objeto.FontBold = True Me.Print Expresión Donde Objeto es el nombre del Formulario. tipo. Como complemento a los Métodos gráficos.FontSize = 12 Me. METODO Print Imprime texto sobre un Formulario. se guarda usando el mismo formato del archivo original. un control PictureBox o un control Image. de un control PictureBox o de un control Image en un archivo.FontName = "Arial" Me. Me. guardamos en el fichero LUIS. donde se desea escribir Expresión Es una cadena de caracteres o variable que contiene el texto a escribir El tamaño. bueno será comentar las formas posibles de introducir colores en VB y otras propiedades que tienen relación con los métodos gráficos.Vacíe un píxel con el método PSet especificando las coordenadas del píxel y utilizando el valor de la propiedad BackColor como argumento color.Picture. en tiempo de diseño o en tiempo de ejecución. Veamos un ejemplo para excribir sobre un formulario. El Formulario.BMP). PictureBox o el Printer.LoadPicture ([expcadena]) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 201 . El lugar donde se inicia la escritura será el de la propiedad CurrentX y CurrentY actuales. Ejemplo: SavePicture Picture1.Print "Hola Mundo" SavePicture (Instrucción) Guarda un gráfico de un objeto Form. "c:\suarez\luis. expcadena La sintaxis de la instrucción SavePicture tiene las siguientes partes: imagen es el nombre del objeto que contiene los gráficos que se van a guardar en el archivo. color y otras propiedades de la letra serán las que tenga el objeto sobre el que se va a escribir en ese momento. Los gráficos de la propiedad Image siempre se guardan como archivos de mapas de bits (.BPM que está en el directorio C:\SUAREZ el gráfico que contiene el PictureBox denominado Picture1 Si un gráfico ha sido cargado en la propiedad Picture desde un archivo.bmp" En este ejemplo. mas su propiedad Picture o Image y expcadena es el nombre del archivo gráfico que se va a guardar. Sintaxis SavePicture imagen.

WMF).Picture = MiVariable1 End Sub Private Sub Command2_Click() Picture1.Icon = LoadPicture ("UNICONO.Picture = LoadPicture ("FIESTA. ya que no necesita acceder al disco para buscar una imagen. Usando LoadPicture sin argumento se borran los gráficos de los formularios y los controles PictureBox e imagen. pero emplea mucha memoria RAM.Picture = MiVariable2 End Sub Mediante este programa lo que hemos hecho fue guardar dos imágenes en sendas variables.ICO).ICO") Para cargar gráficos en el Portapapeles del sistema se usa LoadPicture de la forma siguiente: Clipboard.Picture = LoadPicture (FIESTA. el valor devuelto por LoadPicture debe ser asignado a la propiedad Picture del objeto en el se quiere presentar la imagen.BMP") Para asignar un icono a un formulario.bmp ") Set MiVariable2 = LoadPicture("c:\list_tel\rr1.Donde Objeto es el nombre del Formulario.BMP") Imagen1.DragIcon = LoadPicture ("UNICONO.RLE) y Metarchivo (. Los formatos gráficos reconocidos por Visual Basic incluyen archivos de mapas de bits (. Image o como fondo de un formulario. Por ejemplo: Form1.BMP).Picture = LoadPicture ("FIESTA. en el momento de cargar el formulario.BMP") (Vea Capítulo del Portapapeles) Puede también meter una imagen en una variable.bmp") End Sub Private Sub Command1_Click() Picture1. archivos de longitud codificada (. Este método le permite presentar una imagen muy rápidamente. Por ejemplo: Comando1. MiVariable2 As Picture Private Sub Form_Load() Set MiVariable1 = LoadPicture("c:\pruebavb\ athena. se asigna el valor devuelto por la función LoadPicture a la propiedad Icon del objeto Form: Form1.ICO") Los iconos también pueden ser asignados a las propiedades DragIcon de todos los controles excepto los controles Timer y Menú. Para ello hay que declarar las variables como Picture Option Explicit Dim MiVariable1 As Picture. y el argumento expcadena es el nombre del archivo gráfico que se quiere cargar. PictureBox o control Image que se va a rellenar con el gráfico. ya que la variable (o variables) conteniendo la(s) imágenes están en la RAM.BMP") Picture1. y luego poner en uno de los controles citados anteriormente la imagen guardada en la variable. imágenes que se pasan posteriormente al control Picture1 con los botones de comando Command1 y Command2 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 202 . Para cargar gráficos para presentarlos en un control PictureBox.SetData LoadPicture ("FIESTA. archivos de icono (.

Sintaxis objeto. Mask Pen NotCombinación de los colores comunes al Pen y al inverso de la muestra. El efecto exacto de un valor DrawMode depende del modo en el que el color de una línea dibujada en tiempo de ejecución se combina con los colores de la pantalla. 11.punto. Sintaxis objeto. 7. Puntos. los valores de DrawStyle entre 1 y 4 producen una LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 203 . según la siguiente lista: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Blackness. Merge PenCombinación del color del Pen y el color de muestra. Rayas. Whiteness. tal como se describe a continuación: 0 1 2 3 4 5 6 (Predeterminado) Continuo. y número es un entero que especifica el estilo de línea. y número es un entero que especifica el aspecto.Propiedades de varios controles aplicables a los métodos gráficos DrawMode (Propiedad) Devuelve o establece un valor que determina el aspecto de la salida de un método gráfico o el aspecto de un control Shape o Line. Merge Not PenCombinación del color de muestra y el inverso del color del Pen.punto. Use esta propiedad para producir efectos visuales con controles Shape o Line o al dibujar con métodos gráficos. o los controles Shape o Line. Copy Pen (Predeterminado)Color especificado por la propiedad ForeColor. este valor desactiva el dibujado. 6. Raya . Xor PenCombinación de los colores en el Pen y en el color de la muestra. Not Mask PenInverso del valor 9 (Mask Pen). InvertInverso del color de muestra. De hecho. 13 y 16 producen los mejores resultados. Visual Basic compara cada píxel de la plantilla de dibujo con el píxel correspondiente del fondo existente y después aplica operaciones a nivel de bit. PictureBox. pero no de ambos. Raya . NopNadano hay cambios.DrawStyle = número Donde objeto es el nombre del Formulario. Transparente. DrawStyle (Propiedad) Devuelve o establece un valor que determina el estilo de línea de la salida de métodos gráficos. PictureBox. el valor 7 (Xor Pen) usa el operador Xor para combinar un píxel del dibujo con un píxel del fondo. Continuo interior. Los valores 1. Not Merge PenInverso del valor 15 (Merge Pen). objeto Print sobre el que se va a dibujar. objeto Print. Mask PenCombinación de los colores comunes al Pen y a la presentación.punto . Not Xor PenInverso del valor 7 (Xor Pen). Por ejemplo. Merge Pen NotCombinación del color del Pen y el inverso del color de muestra. Si DrawWidth se define con un valor mayor que 1.DrawMode = número Donde objeto es el nombre del Formulario. Mask Not PenCombinación de los colores comunes del color de fondo y el inverso del Pen. Not Copy PenInverso del valor 13 (Copy Pen).

tal como se describe a continuación: 0 1 2 3 4 5 6 7 Continuo. PictureBox. Puede incrementar el valor de esta propiedad para aumentar la anchura de la línea. y número es un entero que especifica el estilo de relleno. cuando la propiedad FillStyle se define con su valor predeterminado. es decir. objeto Printer sobre el que se va a dibujar. 1 (Transparente). Línea vertical. PictureBox. (Predeterminado) Transparente. Línea horizontal. el valor de FillColor se ignora. con cualquiera de los criterios de VB para definir el color. Si el valor de la propiedad DrawWidth es mayor que 1. 1 (Transparente). Si se establece 1 en DrawWidth. Diagonal hacia abajo. excepto en el objeto Form. FillColor está definido como 0 (Negro). Sintaxis objeto. FillColor (Propiedad) Devuelve o establece el color usado para rellenar formas. Excepto en el objeto Form. De forma predeterminada. Diagonal Cruzada. objeto Printer sobre el que se va a dibujar. PictureBox. Cuando la propiedad FillStyle se define con su valor predeterminado. y valor es un valor o constante que determina el color de relleno.FillStyle = número Donde objeto es el nombre del Formulario. El valor predeterminado es 1.DrawWidth = tamaño Donde objeto es el nombre del Formulario. el valor de FillColor se ignora. Si DrawWidth se define como 1. DrawStyle producirá los resultados mostrados en la tabla de esta propiedad. objeto Printer sobre el que se va a dibujar. Cruzado.767 que representa la anchura de la línea en pixeles.FillColor = valor Donde objeto es el nombre del Formulario. FillStyle (Propiedad) Devuelve o establece el modelo usado para rellenar controles Shape así como los círculos y los cuadros creados con los métodos gráficos Circle y Line. DrawWidth (Propiedad) Devuelve o establece la anchura de línea de lo dibujado con los métodos gráficos. y tamaño es una expresión numérica comprendida entre 1 y 32. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 204 . un píxel de ancho. Diagonal hacia arriba. DrawStyle produce el efecto para cada valor descrito en la tabla anterior. Sintaxis objeto.línea continua (el valor de la propiedad DrawStyle no cambia). los valores de 1 a 4 en la propiedad DrawStyle producirán una línea continua (el valor de DrawStyle no se modifica). Sintaxis objeto. FillColor también se usa para rellenar círculos y cuadros creados con los métodos gráficos Circle y Line.

Carácter. Nadie es capaz de saber la medida que va a tener una línea medida en Twips.AutoRedraw = booleano Donde objeto es el nombre del Formulario o PictureBox sobre el que se va a dibujar. la salida anterior se convierte en parte del fondo de la pantalla. MEDIDAS DE LOS OBJETOS QUE PERMITEN METODOS GRAFICOS Cuando mencionamos la sintaxis de los métodos gráficos todos ellos hablan de medidas. cm o pulgadas. Cls. Visual Basic invoca el evento Paint del objeto cuando se necesita volver a dibujar dicho objeto. La pregunta viene ahora. los gráficos de fondo no se eliminan si se borra el área de dibujo con el método Cls. en el método Line: objeto. Print y PSet. Si se define AutoRedraw a False. Esta propiedad es importante cuando se trabaja con los siguientes métodos gráficos: Circle. esta propiedad debe ponerse a False cuando no se van a utilizar métodos gráficos sobre ese objeto (se ahorra memoria) y a True cuando se van a utilizar métodos gráficos Sintaxis objeto. y1. y2 se refieren a valores de las coordenadas x e y del objeto donde se va a ejecutar ese método gráfico. y booleano es una expresión booleana que especifica la forma en la que objeto es vuelto a dibujar. hace que el Formulario o Picture guarden el gráfico aunque estén minimizados o pase por encima de ellos otro objeto. Al establecer AutoRedraw a True la salida de estos métodos se vuelve a dibujar automáticamente en un objeto Form o en un control PictureBox cuando. tal como se describe a continuación: True Activa el redibujado automático de un objeto Form o control PictureBox. Y encima. Los gráficos y el texto se escriben en la pantalla y en una imagen almacenada en memoria. las medidas que va a tener de ese formulario donde va a poner pueden ser número como 5715 x 8953. color. Pixels.Line Step (x1. Use las propiedades ScaleWidth y ScaleHeight para determinar cuanto quiere que le mida de ancho y de alto respectivamente. se vuelve a dibujar cuando es necesario. BF los valores x1. Al volver a establecer AutoRedraw a True y después usar Cls se borran los gráficos de fondo. El objeto no recibe eventos Paint. y1 y x2 e LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 205 .Step (x2.y1) . Le sugiero una forma mucho mas práctica de poner las medidas a un objeto soporte de métodos gráficos. False (Predeterminado) Desactiva el redibujado automático de un objeto y escribe los gráficos y el texto solamente en la pantalla. Point. Cuando AutoRedraw se define a False.AutoRedraw (Propiedad) Esta propiedad es aplicable a los formularios y el PictureBox. Line. en Points. No se preocupe de cuanto va a medir ahora la unidad de medida. Si pone para un formulario o PictureBox rectangular que ScaleWidth = 12000 y ScaleHeight = 8000 sabe que ese formulario o PictureBox mide esas cantidades que ha puesto. Por regla general. y hasta podemos hacerlo en mm. Se puede establecer AutoRedraw en el código en tiempo de ejecución para alternar entre dibujar gráficos persistentes (como color de fondo o cuadrícula) y gráficos temporales. se cambia de tamaño al objeto o se vuelve a presentar después de haber estado oculto por otro objeto. x2. Ahora ya será mucho mas fácil definir los valores de x1. por ejemplo.y2). usando la imagen almacenada en memoria. podemos trazar una línea midiéndola en Twips. Asi. Por ejemplo. Si está a true. En que unidades de medida se miden esas coordenadas? La respuesta en principio es sencilla: en lo establecido en la propiedad ScaleMode.

otro poco de verde (H56) y otro poco de azul (H1F) daría el siguiente número: Hex(1F56B1) = 2053809 Por la sentencia RGB Se puede expresar el color. Por número El número que representa el color en VB está formado por la suma de la componente roja. Esta observación es especialmente útil cuando estamos trabajando con el Printer. precisión suficiente para realizar dibujos que necesiten alta definición (Circuitos impresos. y lo mismo para azul. azul ) o mediante la función QBColor. la unidad de medida sería la centésima de mm. por ejemplo). tres procedimientos: Mediante el número de color. azul). donde rojo es un número entre 0 y 255 que indica la cantidad de color rojo que se aporta al color. ambos con los mismos límites explicados para el rojo. aplicables a todos los objetos que aceptan métodos gráficos.y2 en la línea de código anterior. puede calcular los valores de las coordenadas X e Y usando un escalímetro. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 206 . (Este texto es repetición del expuesto en el capitulo del CommonDialog) Visual Basic acepta para especificar un color.2000 Colores en Visual Basic. Por ejemplo: el rojo puro sería: el verde puro sería: el azul puro sería: Hex(0000FF) = 255 Hex(00FF00) = 652280 Hex(FF0000) = 16711680 Una mezcla de un poco de rojo (HB1). donde se va a comenzar a escribir mediante el método Print o el punto de inicio del método gráfico Line. Es decir. 2000) Dibuja una línea desde el punto donde se encontrase en ese momento el CurrentX y CurrentY hasta el punto 2000. definen el punto de inicio para los siguientes métodos gráficos o de impresión. verde. verde un número comprendido entre 0 y 255 indicando la cantidad de verde. Propiedades CurrentX y CurrentY Estas propiedades. En el caso del papel de la impresora. Podríamos verlo muy bien en numeración Hexadecimal: Color = Hex XX YY ZZ Donde ZZ es un número Hexadecimal que representa la cantidad del color rojo. El Printer es la impresora. si no se especifica el origen del mismo. la componente verde y la componente azul. Y en este caso podrá poner unas medidas que sean acordes con el tamaño del papel que esté usando (Por ejemplo 21000 para ScaleWidth y 29700 para ScaleHeight si se trata de un papel de 210 x 297 mm (DIN A4) En estas condiciones. La instrucción Me. verde. mediante la sentencia RGB ( rojo.Line -(2000. El mínimo estaría en 0 (H00) y el máximo en 255 (HFF) YY representaría la cantidad de color verde y XX la de color azul. poniendo simplemente RGB (rojo.

Mediante la Función QBColor Devuelve o establece el código de color RGB correspondiente a un número de color.caption = i Label1.Esta es la forma más sencilla de poner la propiedad color. Sintaxis Objeto. en cuyo procedimiento click le introducimos el código: Static i As Integer i=i+1 If i = 16 Then i = 0 Label1.QBColor(color) El argumento color es un número entero entre 0 a 15. Tengamos un Label llamado Label1 y un botón de comando. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 207 . según la siguiente lista: Número Color 0 1 2 3 4 5 6 7 Negro Azul Verde Aguamarina Rojo Fucsia Amarillo Blanco Número Color 8 9 10 11 12 13 14 15 Gris Azul claro Verde claro Aguamarina claro Rojo claro Fucsia claro Amarillo claro Blanco brillante Ejemplo.BackColor = QBColor(i) En el Label podremos ver el color y su número de color. y con la que mejor controlaremos el mismo.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 208 .

Si queremos imprimir algo en la impresora. Si tiene 2100 unidades de ancho.) si pusiésemos Printer. p. 50. (Estamos suponiendo que el papel está colocado en posición vertical). . y 2970 décimas de milímetro de alto. etc. nuestra unidad de medida será de 0. La precisión con la que podemos colocar un punto sobre el papel será por tanto 0. Pero imaginemos que el objeto Printer es una hoja de papel.5 Printer. . La forma de indicarle las dimensiones del papel varían dependiendo del driver de impresora usado.ScaleHeight = 2970 le estamos diciendo a nuestro programa que el papel mide 2100 unidades de ancho y 2970 unidades de alto. Esa hoja de papel tendrá unas dimensiones que deberemos indicar al objeto Print. 0..ScaleWidth = 21000 y Printer. Lo mismo que para escribir en un formulario. El driver de la impresora sabrá que el papel que tiene es un DIN A4.Print "ABCD" Para escribir en el objeto Printer el código será: Printer.La Impresora .e. escribíamos el código Form1. Ahora solamente nos falta que nuestra aplicación lo sepa también.1 mm. Este es uno de los Objetos de VB que no tiene representación gráfica en la pantalla.Print “ABCD” Para enviar gráficos al objeto Printer se procede de igual forma que si estuviésemos dibujando en un formulario Form1. Si lo que queremos es un dibujo mas exacto (Dibujar fotolitos de circuitos impresos.1 mm. y el ancho real del papel es de 210 mm. y=150 del objeto Printer Parece en principio algo raro hablar de las coordenadas x e y del objeto Printer.1 mm. 150). 50. le decimos a nuestro programa que el papel tiene 2100 décimas de milímetro de ancho. Podríamos hacerla mayor (0.5 Esta instrucción dibuja una elipse centrada en el punto x=200. 150).ScaleWidth = 2100 : Printer. . que tiene unas medidas prefijadas. La misma hoja que aparecerá escrita una vez que le enviemos el texto (o los gráficos) que queremos imprimir. ) esta precisión de 0. El objeto Printer gestiona el envío de información a la impresora. debemos escribir el código VB necesario para escribirlo en el objeto Printer. . Para el trabajo ordinario de imprimir listados o dibujar gráficos tipo barras. tanto en tiempo de diseño como de ejecución.El Objeto Printer El objeto Printer le permite comunicarse con una impresora del sistema (inicialmente la impresora predeterminada).Circle (200. Es decir. . Centrémonos en lo mas habitual. no nos bastaría. debiendo llegar a una precisión del orden de LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 209 . 0. DIN A3. una impresora que tenga un papel DIN A4 cuyas medidas son 210 x 297 mm. lo mismo que si estuviésemos escribiendo en un formulario. y=150 del formulario Form1 Esta instrucción dibuja una elipse centrada en el punto x=200.01 mm. es mas que suficiente una precisión de 0. El driver de impresora “sabe” que ese es el tamaño de su papel. Para Visual Basic el objeto Printer es como otro objeto cualquiera. .Circle (200. Para ello vamos a indicarle mediante un par de sentencias las medidas de ese papel : ScaleWidth y ScaleHeight Si le decimos : Printer. tanto para imprimir textos como gráficos. Posiblemente porque el objeto Printer es un objeto que no podemos “ver”.ScaleHeight = 29700.1 mm.

Algunos valores de la propiedad pueden no tener efecto. Las impresoras en blanco y negro ignoran esta propiedad. o la constante vbPRCMColor imprimirá en color.CurrentX=0 a Printer. El objeto Printer almacenará toda la información sin pasarla a la impresora hasta que se le envíe la instrucción Printer.0. vea la documentación del fabricante del controlador concreto.. No disponible en tiempo de diseño.Copies = número Donde número debe ser una expresión numérica que especifique el número de copias que se van a imprimir.Una impresora tiene unos márgenes sobre los que no puede escribir. Le adelanto que no le va a ser fácil enterarse de qué márgenes deja sin imprimir. Si es 2. o varios valores distintos de la propiedad pueden tener todos el mismo efecto. Sintaxis Printer.01 mm. Sintaxis LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 210 .EndDoc o se le envíe un salto de página mediante la instrucción Printer. El objeto Printer. (puntos por pulgada) que nuestra impresora es capaz de dar. Las principales propiedades del objeto Printer son : Nota El efecto de las propiedades del objeto Printer depende del controlador suministrado por el fabricante de la impresora. Los valores fuera del rango aceptado pueden producir error. Sintaxis Printer. cuando decíamos que el papel tiene 210 mm.3 mm de cada lado no lo imprime.i.p. al igual que otros objetos de Visual Basic tiene sus propiedades y métodos. Este valor debe ser un entero.Scalewidth). Deberemos entonces poner las propiedades ScaleWidth y ScaleHeight del Printer de acuerdo con la superficie real de escritura de nuestra impresora. Le recomiendo que imprima una línea desde Printer. ya que la impresora no puede escribir en todo el ancho.ColorMode [= valor] Valor puede ser un número o una constante de VB. Para obtener más información. El valor por defecto es 1.CurrentX= (un número superior a Printer. Mida con un escalímetro el ancho real de la impresión. Copies Devuelve o establece un valor que determina el número de copias que se van a imprimir.NewPage. de ancho. Pero todo ello está condicionado por el número de p. CurrentX CurrentY Devuelven o establecen las coordenadas horizontal (CurrentX) o vertical (CurrentY) para un método gráfico o de impresión. Nota. Si es un 1 (o la constante vbPRCMMonochrome) imprimirá en blanco y negro (normalmente en escala de grises). No disponible en tiempo de diseño. pues los 2 . ColorMode Devuelve o establece un valor que determina si una impresora de color imprime en color o en blanco y negro. El valor predeterminado depende del controlador de la impresora y de la configuración actual de la impresora. Por lo tanto. en realidad ya estamos cometiendo un pequeño error.

Del borde izquierdo y termine a 10 mm del borde derecho. 0. En el primer caso. usando como unidad de medida la décima de milímetro. de la parte izquierda de la hoja. Las coordenadas se expresan en las unidades de medida definidas por las propiedades ScaleHeight y ScaleWidth. Para ello primero fijaremos el punto de inicio mediante CurrentX y a continuación usaremos el método Print : Printer.Print MiVariable con punto y coma ( .50) . Si se han introducido estas propiedades (como recomendábamos mas atrás). y el valor de la propiedad CurrentY es 0 en el borde superior. DeviceName Devuelve el nombre del dispositivo permitido por un controlador. comenzaremos a escribir cada fila de esa columna con un CurrentX de 300. 0.CurrentY = (lo que corresponda a esa fila) Printer.Para forzar las coordenadas del cursor de escritura del objeto Printer : Printer. El valor de la propiedad CurrentX es 0 en el borde izquierdo de un objeto. Point. CurrentY es el mismo que tenía antes de realizar ese método. la propiedad ScaleMode se pone automáticamente a User. que está a 30 mm. El método Print establece como CurrentX la coordenada correspondiente a la parte derecha de la última letra impresa.ScaleHeight = 2970) Haciéndolo de esta última forma.CurrentX = x Printer.50) Si queremos escribir datos en una columna. Como CurrentY depende de si ha terminado la sentencia Printer. cuando queramos dibujar una línea entre dos puntos de nuestro papel DIN A4 bastará con medir las coordenadas de inicio y final de línea. se dibujaría con la siguiente instrucción : Printer. unidades que supongo le serán mucho mas difícil de controlar que si Vd. Cuando se envía la instrucción EndDoc establece los valores de estas propiedades a 0.Print MiVariable ‘ donde MiVariable contiene el dato a escribir CurrentX y CurrentY se quedan con los valores establecidos por el último método gráfico o método Print usado. que comience a 20 mm. NewPage establece igualmente los valores 0.ScaleWidth = 2100. Cuando se está dibujando sobre el objeto Printer.CurrentXPosy = Printer.CurrentY =y Para conocer las coordenadas del cursor de escritura del objeto Printer Posx = Printer.CurrentY Comentarios Las coordenadas se miden a partir de la esquina superior izquierda del objeto. ScaleMode puede estar en Twips. En el segundo caso. .(2870. caracteres. los métodos gráficos Circle y Line establecen los siguientes valores para CurrentX y CurrentY : Circle El centro del objeto.. dice desde el principio que el papel de su impresora tiene unas medidas de 2100 por 2970 (Printer. Esta propiedad es solo de lectura LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 211 .CurrentX = 300 : Printer. Si no se establecen.. Por ejemplo.Line (200. Printer. Line El punto final de una línea..) o sin el. Pixeles. avanza automáticamente una línea. una línea a 5 mm del borde superior. eso sí.

Transparente. El valor predeterminado es 1. DrawWidth Devuelve o establece la anchura de línea de lo dibujado con los métodos gráficos. Si se establece 1 en DrawWidth.767 que representa la anchura de la línea en pixeles. es decir.punto. Sintaxis Printer. los valores de 1 a 4 en la propiedad DrawStyle producirán una línea continua (el valor de DrawStyle no se modifica). DrawStyle producirá los resultados mostrados en la tabla de esta propiedad. DrawStyle produce el efecto para cada valor descrito en la tabla anterior. Raya . Esta propiedad es solo de lectura LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 212 . Continuo interior. Rayas. Comentarios Puede incrementar el valor de esta propiedad para aumentar la anchura de la línea. HP LaserJet III es un nombre de dispositivo. tamaño es una expresión numérica comprendida entre 1 y 32.Sintaxis Printer. Sintaxis Printer. DrawMode Devuelve o establece un valor que determina el aspecto de la salida de un método gráfico. los valores de DrawStyle entre 1 y 4 producen una línea continua (el valor de la propiedad DrawStyle no cambia).DrawStyle [= número] El número especifica el estilo de línea : 0 1 2 3 4 5 6 Observaciones Si DrawWidth se define con un valor mayor que 1. un píxel de ancho.punto . Si DrawWidth se define como 1.DeviceName Cada controlador de impresora acepta uno o más dispositivos por ejemplo. Puntos. Si el valor de la propiedad DrawWidth es mayor que 1. DriverName Devuelve el nombre del controlador de un objeto Printer.punto.DrawWidth [= tamaño] (Predeterminado) Continuo. Raya . DrawStile Devuelve o establece un valor que determina el estilo de línea de la salida de métodos gráficos. Vea la Ayuda de VB para mayor detalle.

Sintaxis printer. la parte superior de ambas caras de la hoja están en el mismo borde de la hoja. Sintaxis Printer. No disponible en tiempo de diseño. tal como se describe a continuación Constante bPRDPSimplex vbPRDPHorizontal vbPRDPVertical 3 Valor 1 2 Descripción Impresión en una sola cara con la orientación actual. tal como se describe a continuación Valor 0 1 2 LSB Descripción Continuo. el DriverName de varias impresoras HewlettPackard es HPPCL5MS. Con impresión a doble cara horizontal. Véase el gráfico existente en la ayuda de VB para la propiedad Duplex FillColor Devuelve o establece el color usado para rellenar formas.Duplex [= valor] Donde valor es un valor o constante que especifica el tipo de impresión.0) El color predeterminado es el 0 (Negro). Impresión en dos caras con vuelta de página horizontal.Sintaxis Printer. FillColor también se usa para rellenar círculos y cuadros creados con los métodos gráficos Circle y Line.FillColor [ = valor] Donde valor es un valor o constante que determina el color de relleno. Duplex Devuelve o establece un valor que determina si las páginas se imprimen por los dos lados (si la impresora tiene esta característica).DriverName Cada controlador tiene un nombre único. Capítulo 1 Página 213 Visual Basic – Guía del Estudiante . Por ejemplo. Línea horizontal. El DriverName es normalmente el nombre de archivo del controlador sin la extensión. Con impresión a doble cara vertical. (Predeterminado) Transparente. El valor puede introducirse como RGB o con las constantes QB color ejemplos FillColor = QBColor(8) FillColor = RGB (255.0. FillStyle Devuelve o establece el modelo usado para rellenar dibujos (círculos y los cuadros creados con los métodos gráficos Circle y Line. Impresión en dos caras con vuelta de página vertical. la parte inferior de una página está en el mismo borde de la hoja que la parte superior de la página siguiente. Sintaxis Printer.FillStyle [= número] Donde número Un entero que especifica el estilo de relleno.

Font. Cuando la propiedad FillStyle se define con su valor predeterminado.Caption + " " + Printer.Caption = Label1. Diagonal hacia arriba. Este objeto Font tiene a su vez sus propiedades (Name. igualando la propiedad Name del objeto Font del Printer a la propiedad FontName del CommonDialog Printer. Cruzado. (Devuelve un número) Es solamente de lectura.Name = CD1.Name FontCount Devuelve el número de fuentes disponibles para el dispositivo de presentación actual o la impresora activa.Fontname numerodefuentes = Printer. Por ejemplo. y los dispositivos de presentación y de impresión. Size. Diagonal hacia abajo. Sintaxis Printer. Font Devuelve o establece el objeto Font (letra) del objeto Printer. 1 (Transparente). Diagonal Cruzada.Font. que devuelve el número de nombres de fuente disponibles para el objeto.FontCount Label1. Sintaxis FontName Devuelve el nombre de la fuente que está usando el objeto Printer Sintaxis nombredelafuente = Printer.FontName Podemos averiguar que fuente está usando el objeto Printer : Tipofuente = Printer. Bold.3 4 5 6 7 Línea vertical. estableceremos el siguiente código : For i = 1 To Printer.FontCount (El Objeto Printer admite esta propiedad como Font.Name o FontName indistintamente) Fonts Devuelve todos los nombres de fuente disponibles para el dispositivo de presentación actual o la impresora activa.. si queremos ver en Label1 todas las fuentes disponibles para el objeto Printer. el valor de FillColor se ignora. Italic . Las fuentes disponibles en Visual Basic varían de acuerdo con la configuración del sistema.Fonts(índice) La propiedad Fonts funciona de forma conjunta con la propiedad FontCount.Fonts(i) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 214 . Use las propiedades Fonts y FontCount para obtener información sobre las fuentes disponibles para pantalla o impresora. ) Podemos forzar la fuente a usar por el objeto Printer con un CommonDialog..

FontBold.FontTransparent = True / False La modificación de FontTransparent en tiempo de ejecución no afecta a los gráficos ni el texto ya LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 215 . Puede utilizar esta propiedad para dar al texto el tamaño que desee.Italic .FontUnderline [= lógico] ‘ p. Printer acepta FontBold ó Font. (El objeto Printer acepta tanto Font. cuando especifique un tamaño inferior a 8 puntos para una fuente TrueType. FontItalic ó Font. en puntos. FontTransparent Devuelve o establece un valor Booleano que determina si el texto y los gráficos de fondo de un objeto Printer. El valor predeterminado lo determina el sistema. FontStrikethru y FontUnderline.FontBold [= lógico] Printer. especifique el nuevo tamaño de la fuente en puntos. Sintaxis Printer.. se muestran en el espacio situado entre los caracteres.Next i FontSize Devuelve o establece el tamaño de la fuente a utilizar para el texto mostrado en un control o en una operación de dibujo o impresión en tiempo de ejecución.Bold. Printer.e Printer.Size como FontSize) FontBold. deberá modificar la propiedad FontName antes de establecer los atributos de tamaño y estilo con las propiedades FontSize. FontItalic. El entorno operativo Microsoft Windows utiliza una fuente distinta para las fuentes TrueType con un tamaño inferior a 8 puntos.. Nota Las fuentes disponibles en Visual Basic varían dependiendo de la configuración del sistema y de los dispositivos de presentación e impresión. primero deberá establecer el tamaño en puntos con la propiedad FontSize.FontBold = True escribiría con ‘ letra negrita Para el objeto Printer. luego especificar la propiedad FontName y después establecer de nuevo el tamaño con FontSize. Para cambiar este valor. En general. Aprovecha esta facilidad para cambiar de letra a lo largo de un documento. El valor máximo de FontSize es 2160 puntos. Tachada y Subrayada.FontItalic [= lógico] Printer. el establecimiento de estas propiedades no afecta al texto ya escrito. FontStrikethru y FontUnderline Devuelve o establece los estilos de fuente en los siguientes formatos: Negrita.. Sin embargo. FontItalic. Sintaxis Printer. Cursiva.FontStrikethru [= lógico] Printer. solamente para lo que se escriba después de cambiar la propiedad.FontSize = puntos Donde puntos es una expresión numérica que especifica el tamaño de fuente a utilizar. En las propiedades relacionadas con las fuentes sólo pueden establecerse valores para los que exista una fuente.

hDC Devuelve un controlador proporcionado por el entorno operativo Microsoft Windows para el contexto de dispositivo de un objeto. Si establece las propiedades Height y Width para un controlador de impresora que no admite su uso.Orientation = valor valor es un valor o constante que determina la orientación de la página. use la propiedad hDC cada vez que lo necesite. No disponible en tiempo de diseño.hDC Esta propiedad es un controlador de contexto de dispositivo del entorno operativo Windows. No están disponibles en tiempo de diseño. los valores de estas propiedades se utilizarán en lugar del de la propiedad PaperSize. ForeColor Devuelve o establece el color de escritura para impresoras en color. Sintaxis Printer. El cambio de color afecta solamente al texto que se envíe después de realizar el cambio.Height = número Printer. no se producirá ningún error. El entorno operativo Windows se encarga de la presentación del sistema asignando un contexto de dispositivo al objeto Printer. Si se establecen en tiempo de ejecución. así que no se debe almacenar en una variable. ¡¡¡ Es mas recomendable utilizar la propiedad PaperSize para establecer las dimensiones del papel. Se puede usar la propiedad hDC para referirse al controlador del contexto de dispositivo de un objeto. Así se obtiene un valor que se pasa en las llamadas al API de Windows. No disponibles en tiempo de diseño. En su lugar. 2 Los documentos se imprimen con el lado más largo arriba. Sintaxis Printer. Sintaxis Printer. !!! Orientation Devuelve o establece un valor que indica si los documentos se imprimen con orientación vertical u horizontal. Height Width Devuelven o establecen las dimensiones del objeto Printer.Width = número Donde número indica las dimensiones del papel configurado para el dispositivo de impresión.dibujados en un objeto Printer . Nota El valor de la propiedad hDC puede cambiar en tiempo de ejecución. según se describe a continuación : Constante vbPRORPortrait 1 vbPRORLandscape LSB Valor Descripción Los documentos se imprimen con el lado más corto arriba. Para el objeto Printer. estas propiedades se miden siempre en twips. y el tamaño del papel continuará siendo el mismo. Capítulo 1 Página 216 Visual Basic – Guía del Estudiante .

actual Visual Basic mantiene un contador de páginas impresas desde el inicio de la aplicación o desde la última vez que se utilizó la instrucción EndDoc en el objeto Printer. según se describe a continuación : Constante Valor Descripción vbPRBNUpper vbPRBNLower vbPRBNMiddle vbPRBNManual 4 vbPRBNEnvelope vbPRBNEnvManual vbPRBNAuto vbPRBNTractor vbPRBNSmallFmt vbPRBNLargeFmt vbPRBNLargeCapacity vbPRBNCassette 14 1 Utilizar papel de la bandeja superior. Nota La salida de los métodos gráficos que no quepa en la página actual no genera una página nueva. Consulte la documentación de la impresora para obtener descripciones más específicas de estas opciones. PaperSize Devuelve o establece un valor que indica el tamaño de papel para la impresora actual.Page Devuelve el número de página actual.PaperBin = valor valor es un valor o constante que especifica la bandeja predeterminada. El valor que se le dé a esta propiedad será el tamaño de ese papel “ficticio” que comentábamos mas atrás.Page ‘Variable contiene el número de la pág. No disponible en tiempo de diseño. sino que se recorta para ajustarla a la zona de impresión de la página. Con esta propiedad no se debe jugar alegremente. según se describe a continuación Constante Valor Descripción LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 217 . El valor predeterminado es el establecido en la configuración de la impresora en Windows.PaperSize = valor valor es un valor o constante que especifica el tamaño del papel. No disponible en tiempo de diseño. No todas las opciones están disponibles en todas las impresoras. Sintaxis Printer. 5 Utilizar sobres del alimentador de sobres. Sintaxis Variable = Printer. 6 Utilizar sobres del alimentador de sobres. 10 Utilizar papel de la bandeja de papel grande. 2 Utilizar papel de la bandeja inferior. 8 Utilizar papel del alimentador por tracción. 9 Utilizar papel del alimentador de papel pequeño. PaperBin Devuelve o establece un valor que indica la bandeja predeterminada para la alimentación de papel durante la impresión. Utilizar papel del cartucho de cassette adjunto. 3 Utilizar papel de la bandeja intermedia. Este contador comienza por uno y se incrementa en uno cada vez que: Se utiliza el método NewPage. Se utiliza el método Print y el texto a imprimir no cabe en la página actual. 11 Utilizar papel del alimentador de gran capacidad. Sintaxis Printer. 7 (Predeterminado) Utilizar papel de la bandeja predeterminada actual. pero esperar a la inserción manual. Esperar a la inserción manual de cada hoja.

11 x 17 .vbPRPSLetter vbPRPSLetterSmall vbPRPSTabloid vbPRPSLedger vbPRPSLegal vbPRPSStatement vbPRPSExecutive vbPRPSA3 vbPRPSA4 vbPRPSA4Small 10 vbPRPSA5 vbPRPSB4 bPRPSB5 vbPRPSFolio vbPRPSQuarto vbPRPS10x14 vbPRPS11x17 vbPRPSNote vbPRPSEnv9 vbPRPSEnv10 vbPRPSEnv11 vbPRPSEnv12 vbPRPSEnv14 vbPRPSCSheet 24 vbPRPSDSheet 25 vbPRPSESheet vbPRPSEnvDL vbPRPSEnvC3 vbPRPSEnvC4 vbPRPSEnvC5 vbPRPSEnvC6 vbPRPSEnvC65 32 vbPRPSEnvB4 vbPRPSEnvB5 vbPRPSEnvB6 vbPRPSEnvItaly 36 vbPRPSEnvMonarch vbPRPSEnvPersonal vbPRPSFanfoldUS vbPRPSFanfoldStdGerman vbPRPSFanfoldLglGerman vbPRPSUser 1 Carta. 3 5/8 x 6 ½ . 110 x 230 mm 37 Sobre monarca. 18 Nota. se establece automáticamente vbPRPSUser en PaperSize. 4 1/8 x 9 ½ . 176 x 250 mm 35 Sobre B6. 4 ½ x 10 3/8 . 8 ½ x 11 . 176 x 125 mm Sobre. 5 x 11 ½ . 8 ½ x 13 . 20 Sobre #10. 40 Doblado estándar alemán. 215 x 275 mm 16 10 x 14 . 162 x 229 mm 31 Sobre C6. 297 x 420 mm 9 A4. Hoja tamaño C Hoja tamaño D 26 Hoja tamaño E 27 Sobre DL. 250 x 354 mm 13 B5. 148 x 210 mm 12 B4. 38 Sobre. 6 Declaración. 229 x 324 mm 28 Sobre C5. PrintQuality LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 218 . 19 Sobre #9. 210 x 297 mm A4 pequeño. 114 x 162 mm Sobre C65. 17 11 x 17 . 5 Legal. 7 ½ x 10 ½ . como por ejemplo LPT1: o LPT2:. 324 x 458 mm 30 Sobre C4. 8 ½ x 13 . 2 Carta pequeña. 7 Ejecutivo. 17 x 11 . 4 Libro. 41 Doblado legal alemán. 15 Cuarto. 14 7/8 x 11 . 3 Tabloide. 22 Sobre #12. 21 Sobre #11. 114 x 229 mm 33 Sobre B4.UU. 3 7/8 x 7 ½ . 8 ½ x 14 . 210 x 297 mm 11 A5.Port El sistema operativo determina el nombre del puerto. 8 A3. 39 Doblado estándar EE. 4 ½ x 11 . 23 Sobre #14.. 5 ½ x 8 ½ . 8 ½ x 12 . 182 x 257 mm 14 Folio. 256 Definido por el usuario Al establecer las propiedades Height o Width de una impresora. Sintaxis puertousado = Printer. 3 7/8 x 8 7/8 . 8 ½ x 11 . 8 ½ x 11 . 110 x 220 mm 29 Sobre C3. Port Devuelve el nombre del puerto a través del cual se envía un documento a una impresora. 250 x 353 mm 34 Sobre B5.

ScaleLeft. Es decir. Si el papel es un DIN A4 (Medidas 210 x 297 mm) esa unidad de medida sería precisamente una décima de milímetro.Devuelve o establece un valor que indica la resolución de la impresora. Estas cuatro propiedades de escala se relacionan con la propiedad ScaleMode de la siguiente forma: Al establecer un valor en cualquier otra propiedad de escala. puede configurar un sistema de coordenadas completo. con coordenadas positivas y negativas. El valor predeterminado es 0. ScaleTop Devuelven o establecen las coordenadas horizontal (ScaleLeft) y vertical (ScaleTop) de los bordes izquierdo y superior de un objeto al utilizar métodos gráficos o al situar controles. según se describe a continuación : Constante vbPRPQDraft vbPRPQLow vbPRPQMedium -3 vbPRPQHigh Valor Descripción -1 Resolución borrador -2 Resolución baja Resolución media -4 Resolución alta Además de los valores negativos predefinidos. Sería una unidad de medida cualquiera. en ScaleMode se establece LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 219 . algunas opciones. Sintaxis Printer. como por ejemplo 300. No disponible en tiempo de diseño. NO su medida. o todas ellas. En ciertas impresoras. mediante estas propiedades. podemos decir. ! Devuelven o establecen el número de unidades de medida horizontal (ScaleWidth) y vertical (ScaleHeight) del interior del papel donde vamos a volcar la información del objeto Printer. Este valor va a determinar el número de unidades de medida que tiene el papel. ScaleWidth ¡ Estas propiedades ya se comentaron mas atrás. Es completamente necesario entender estas propiedades para poder manejar y dominar el objeto Printer.ScaleLeft = valor Printer.ScaleWidth = valor Donde valor es una expresión numérica que especifica la medida horizontal o vertical. con lo que esa unidad de medida ya no serían décimas de mm. que el papel tiene 2100 unidades de ancho y 2970 unidades de alto.PrintQuality = valor valor es un valor o una constante que especifica la resolución de la impresora. Podríamos haber elegido otros valores. pueden producir el mismo resultado. El efecto de estos valores varía según la impresora y el controlador.ScaleHeight = valor Printer. Sintaxis Printer. Sintaxis Printer. El valor predeterminado depende del controlador de la impresora y de su configuración actual. ScaleHeight. Con estas propiedades y las relacionadas ScaleHeight y ScaleWidth. pero el papel seguiría siendo DIN A4 y seguiría teniendo las mismas medidas reales. también puede indicarse en valor un número positivo de puntos por pulgada.ScaleTop = valor donde valor es una expresión numérica que especifica la coordenada horizontal o vertical.

emplee ScaleLeft y ScaleTop para que le coincida el punto central del papel con las coordenadas 0. Centímetro.1500 estaríamos diciendo que la coordenada Y absoluta de la parte superior del papel es . y en ScaleLeft y ScaleTop se establece 0.1050 estamos diciendo que la coordenada horizontal absoluta en la parte izquierda de la hoja es de -1050. los valores de CurrentX y CurrentY cambian para reflejar las nuevas coordenadas del punto actual. vertical = 240 twips por unidad). o al situar controles.Circle (0.ScaleTop = . Además. Por lo tanto. ScaleHeight y ScaleWidth cambian a la nueva unidad de medida. el círculo anterior se colocaría a una distancia de 2500 (2500 = 1000 + 1500) del borde superior del papel. Y la coordenada X de la parte derecha del papel será + 1050. si ejecutamos el método gráfico : Printer. coloque el “cursor” de escritura mediante las propiedades CurrentX y CurrentY TrackDefault Devuelve o establece un valor booleano que determina si el objeto Printer apunta siempre a la misma impresora.1500. con las medidas de los ejemplos anteriores (ScaleWidth = 2100. Resumiéndolo en palabras mas sencillas. Sintaxis Printer. No disponible en tiempo de diseño. Indica que una o más de las propiedades ScaleHeight. ScaleWidth. Si. la coordenada X absoluta del eje central del papel será entonces 0. Si el ancho del papel es de 2100. con el centro en el eje vertical de la hoja (Coordenada X=0) a una altura de 1000 (Coordenada Y=1000) de la parte superior del papel. Una vez mas recomiendo que controle la posición de los métodos gráficos y método Print fijando las unidades de medida mediante ScaleHeight. (Predeterminado) Twip (1440 twips por pulgada lógica. ScaleWidth. o si la impresora a la que apunta cambia cuando se modifica la impresora predeterminada en el Panel de control del sistema operativo. Pulgada. Milímetro. En ese caso.automáticamente 0.0 y así usaría coordenadas positivas y negativas) y cada vez que escriba o dibuje. Recomendación del autor de esta Guía del Estudiante. 567 twips por centímetro lógico). (Si le es práctico.ScaleMode = valor donde valor es un número entero que especifica la unidad de medida. Al establecer en ScaleMode un número mayor que 0. Punto (72 puntos por pulgada lógica). ScaleLeft y ScaleTop tienen valores personalizados. Carácter (horizontal = 120 twips por unidad. Píxel (la unidad mínima de la resolución del monitor o la impresora). Si hubiésemos puesto Printer.ScaleLeft = .1000). 300 dibujará un circulo de radio 300. ScaleHeight = 2970) ponemos Printer. según se describe a continuación 0 1 2 3 4 5 6 7 User. ScaleMode Devuelve o establece un valor que indica la unidad de medida de las coordenadas de un objeto al utilizar métodos gráficos.TrackDefault = lógico Capítulo 1 Página 220 Visual Basic – Guía del Estudiante . Sintaxis LSB Printer.

Donde lógico es una expresión booleana que determina la impresora a la que apunta el objeto Printer. Por ejemplo. Set Printer = X ' Sale del bucle. se envía una instrucción EndPage implícita al objeto Printer. El siguiente código comprueba todas las impresoras disponibles para saber la primera impresora cuya orientación de página sea vertical: Dim X As Printer For Each X In Printers If X. El objeto Printers (Colección de objetos Printer) La colección Printers le permite consultar las impresoras disponibles de forma que pueda especificar la impresora predeterminada de la aplicación.TwipsPerPixelY En general. El valor predeterminado es 0. en un factor de Zoom/100. No está disponible en tiempo de diseño.Orientation = vbPRORPortrait Then ' la define como predeterminada. Puede utilizar estas propiedades para convertir rápidamente las dimensiones sin cambiar el valor de la propiedad ScaleMode de los objetos. una página de tamaño carta impresa con Zoom establecido como 50 contiene tantos datos como una página de tamaño 17 por 22 pulgadas. porque el texto y los gráficos impresos se reducen a la mitad de su altura y anchura originales. según se describe a continuación. Exit For End If Next LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 221 .Zoom = numero Donde numero es una expresión numérica que evalúa en el porcentaje de ajuste de la salida impresa. True (Predeterminado) El objeto Printer cambia la impresora a la que apunta al modificar la impresora predeterminada en el Panel de control del sistema operativo. TwipsPerPixelY Devuelve el número de twips per pixel de un objeto medido horizontal (TwipsPerPixelX) o verticalmente (TwipsPerPixelY). Por ejemplo. Zoom Devuelve o establece el porcentaje en que se amplía o reduce el resultado impreso. Sintaxis Printer.TwipsPerPixelX Printer. las rutinas del API de Windows requieren las medidas en píxels. en relación con el tamaño aparente de la salida impresa. Al modificar el valor de la propiedad TrackDefault mientras se realiza un trabajo de impresión. que especifica que la página impresa aparece con su tamaño normal. se puede querer saber cual de las impresoras disponibles usa un controlador de impresoras determinado. False El objeto Printer continúa apuntando a la misma impresora cuando se modifica la impresora predeterminada en el Panel de control del sistema operativo. Sintaxis Printer. TwipsPerPixelX. Comentarios El valor de la propiedad Zoom ajusta el tamaño de la página impresa.

y). Sintaxis Printer.Usando la instrucción Set se designa una de las impresoras de la colección Printers como impresora predeterminada. color. final. primero se tiene que definir como impresora predeterminada de la aplicación. No acepta argumentos con nombre. No acepta argumentos con nombre. elipse o arco sobre un objeto. y2). KillDoc Termina inmediatamente el trabajo de impresión actual. KillDoc elimina el trabajo de impresión actual y la impresora deja de recibir datos.Line Step (x1.Circle Step (x. liberando el documento al dispositivo de impresión o a la cola.Step (x2. como Printers(3). inicio. Nota Si la colección Printers se usa para especificar una impresora concreta. aspecto Vea una explicación completa de este método en el capítulo 7 Métodos Gráficos. NewPage Termina la página actual y avanza a la página siguiente en el objeto Printer. Sintaxis Printer. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 222 . como impresora predeterminada de la aplicación. Line Dibuja líneas y rectángulos en un objeto. no se imprime la página en blanco adicional. color. puede que algunos o todos los datos se envíen a la impresora antes de que KillDoc pueda tener efecto.EndDoc Si EndDoc se invoca inmediatamente después del método NewPage. Si el Administrador de impresión no está controlando el trabajo de impresión (la impresión en segundo plano está desactivada). Sintaxis Printer. BF Vea este método mas ampliamente en el capítulo 7 Métodos Gráficos. radio. Para leer y escribir las propiedades de una impresora concreta. El ejemplo anterior designa la impresora identificada por la variable de objeto X. EndDoc Termina una operación de impresión enviada al objeto Printer. el controlador de la impresora inicializa la impresora en cuanto puede y termina el trabajo de impresión. Sintaxis Printer. y1) . En este caso. METODOS DEL OBJETO PRINTER Circle Dibuja un círculo.KillDoc Si el Administrador de impresión del sistema operativo controla el trabajo de impresión (el Administrador de impresión está ejecutándose y la impresión en segundo plano está activada). sólo se puede tener acceso a sus propiedades de modo lectura.

Print Textoaescribir).CurrentX y Printer.Sintaxis Printer. al principio de la zona de impresión. Nota. Cuando se le llama. . opecod Puede ver mas información acerca de este método en el capítulo 7 Métodos Gráficos Print Imprime texto en el objeto Printer.ICO o . x1. Los pasos de tabulación dependen de cada impresora.NewPage NewPage avanza a la página siguiente y restablece la posición de impresión en la esquina superior izquierda de la nueva página. . Puede introducir también Tabuladores : Tab(n) Se utiliza para situar el punto de inserción en un número de columna absoluto.EMF. Sintaxis Printer. anchura1. al usar Tab no controlamos del todo la posición de las columnas. En el argumento lista_salida puede poner un texto directamente (Printer. y2.Print “Hola”) o una variable (Printer.CurrentY para posicionar el “puntero” de escritura del Objeto Printer. donde n es el número de espacios a insertar. Al terminar de imprimir Cualquier carácter o tabulador. y lo que es peor. PaintPicture Presenta el contenido de un archivo gráfico (. Puede también introducir algunas funciones de cadena como la siguiente: Spc(n) Se utiliza para insertar caracteres espacio en la salida. excepto que terminemos el método Print con un punto y coma : Las instrucciones : Printer. Es mucho mas práctico (y seguro) usar Printer. NewPage incrementa la propiedad Page del objeto Printer en 1. Si se omite.El uso de los tabuladores puede traerle mas problemas que ventajas.Print lista_salida Donde lista_salida es una expresión o lista de expresiones a imprimir. . se imprimirá una línea en blanco. Por lo tanto..Print “¿Qué tal ?” generarán la siguiente salida por impresora : Hola ¿Qué tal ? LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 223 .BMP.PaintPicture imagen. el objeto Printer generará un Retorno de Carro y un Avance de Línea. altura1. Sintaxis Printer. donde n es el número de columna. x2. Utilice Tab sin argumentos para situar el punto de inserción en la línea siguiente.WMF. anchura2.DIB) en un objeto Printer. de la programación de la propia impresora.Print “Hola” Printer. altura2. y1. No acepta argumentos con nombre.

los datos Dato(1).Print “¿Qué tal ?” la salida por impresora sería : Hola ¿Qué tal ? Nota Debido a que el método Print imprime normalmente con caracteres de espaciado proporcional. Como alternativa. . puede utilizar en la impresión una fuente de anchura fija (como Courier) para hacer que cada carácter utilice sólo una columna. (o en un Formulario. Pixels. como unidad de medida en ambas coordenadas la centésima de mm. ocupa más de una columna de anchura fija.TextWidth (Str(Dato(I))) Printer. deberá asegurarse de que las columnas de las tablas se encuentren lo bastante lejos unas de otras. Método TextWidth Puede conocer la anchura que va a ocupar un texto en la impresora.Dato(N) que son números. o como siempre recomendaré... como inicio de escritura de esa cifra 5000 . Por ejemplo. como I. como hacemos casi siempre para poder sumarlos con facilidad. por ejemplo.Si pusiésemos Printer. deberemos calcular la longitud de cada cifra.CurrentY = K +(300 * I) Printer.ancho : Haríamos un bucle mas o menos como este : Dim Ancho as Long For I = 1 To N Ancho = Printer. La coordenada Y ‘será una constante K mas 3 mm Página 224 Capítulo 1 . Si queremos que las cifras queden alineadas en una columna cuya parte final sea 5000 (la parte final de esa columna quedará a 50 mm. Quiere escribirlos de tal forma que la parte derecha del número quede alineada. es mejor que no utilice Tab(n).TextWidth (Textoaescribir) Donde AnchodelTexto es una variable tipo Long que indicará el ancho (en las unidades de medida definidas para el objeto Printer . Es mucho mas práctico que usar. TextWidth devuelve la anchura de la línea más larga.Print Str(Dato(I)) LSB Visual Basic – Guía del Estudiante ‘Ancho será una variable Long ‘Imprimiremos N datos ‘Calculamos el ancho (para el Printer) de cada ‘dato.Twips. Printer. como W. sustituyéndolo por CurrentX.ScaleWidth = 21000 y Printer.. mm. una letra ancha. Si la cadena de texto cuya longitud de impresión queremos analizar contiene retornos de carro. es importante recordar que no hay relación entre el número de caracteres impresos y el número de columnas de anchura fija que tales caracteres ocupan. Lo restamos a 5000 para que queden ‘alineados por atrás.Ancho Printer. en un Picture) usando el Método TextWidth AnchodelTexto = Printer. las establecidas mediante ScaleWidth y ScaleHeight) y Textoaescribir es una variable tipo String que contiene el texto a escribir.ScaleHeight = 29700. Damos por hecho que el papel es un DIN A-4 (210 x 297 mm) por lo que estamos usando.Print “Hola ” . Mediante este método puede escribir columnas de datos. del margen izquierdo del papel). utilice las propiedades CurrentX y CurrentY. Para tener en cuenta los casos en el que se utilizan caracteres con una anchura mayor que la media. mientras que una letra estrecha. el Tabulador Tab(n) Si usa Tab(n) con una determinada impresora. Suponga que quiere escribir en una columna. y poner. mucho mejor que usando el Tab(n). ocupa menos.CurrentX = 5000 . Para controlar perfectamente el punto donde se escribirá el siguiente carácter. Supongamos que hemos establecido las Propiedades Printer. Como al desarrollar una aplicación nunca sabe sobre que impresora va a imprimir. puede verse con la desagradable sorpresa que en otra impresora no funciona de la misma forma. Dato(2).

Cuando se ejecuta PSet. Sintaxis Printer. debe poner siempre Printer. se centra el punto en las coordenadas especificadas. Si se omite. (x. las propiedades CurrentX y CurrentY toman el valor del punto especificado en los argumentos.TextWidth. Valores de simple precisión que indican las coordenadas horizontales (eje x) y verticales (eje y) del punto a establecer. Es muy útil sobre todo cuando utilizamos distintos tipos de letra dentro del mismo escrito. Dependerá del tipo de fuente y del tamaño de esa fuente que usemos en cada caso. El tamaño del punto dibujado depende del valor de la propiedad DrawWidth. Método PSet Asigna a un punto de un objeto Printer un color especificado. pero relativo a la altura. 8 LA FUNCION SHELL LA FUNCION COMMAND PARA PASAR PARAMETROS LA FUNCION DoEvents Cajas de mensaje (Mensaje Box) Cajas de entrada de datos (Input Box) El Objeto APP (La Aplicación) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 225 . y) Requeridos. No vamos a alargar la explicación dada la similitud con el anterior.PSet Step (x. color Step Opcional.Next I Observe que el ancho de una determinada cadena de caracteres no tiene porqué ser la misma para un Formulario que para el Printer. PSet establece un píxel al color especificado. Valor entero largo que indica el color RGB especificado para el punto. Método TextHeight Este método es idéntico al anterior.TextWidth. Vacíe un píxel con el método PSet especificando las coordenadas del píxel y utilizando el valor de la propiedad BackColor como argumento color. Cuando DrawWidth es mayor que 1. Palabra reservada que especifica que las coordenadas son relativas a la posición gráfica actual proporcionada por las propiedades CurrentX y CurrentY. No acepta argumentos con nombre. Form1. Cuando DrawWidth es 1. y). Este método nos permite separar adecuadamente las líneas de un escrito. color Opcional. Puede utilizar la función RGB o la función QBColor para especificar el color.Guía del Estudiante Cap. Por eso. La forma en que se dibuja el punto depende de los valores de las propiedades DrawMode y DrawStyle. Visual Basic . etc. se utiliza el valor de la propiedad ForeColor.

supongamos. También puede ser el nombre de un documento que se ha asociado con un programa ejecutable. La ventana se muestra como un icono. por ejemplo. devuelve la identificación de la tarea (ID) del programa iniciado. En Microsoft Windows. estiloDeVentana es el número correspondiente al estilo de la ventana en la cual se va a ejecutar el programa. Resultado: el programa MARCADOR. establecer una comunicación telefónica.LA FUNCION SHELL La función Shell se utiliza para ejecutar un programa ajeno a la aplicación que se está ejecutando. La ventana se maximiza con foco.EXE que funciona perfectamente y no queremos desaprovechar. La ventana vuelve al tamaño y posición más recientes. estiloDeVentana] ) Si la función Shell ejecuta con éxito el archivo nombrado.EXE 1234567 En nuestra aplicación Visual Basic introduciremos una línea invocando la función Shell seguida del nombre (y Path) del ejecutable y del parámetro que le vamos a introducir al ejecutable: Shell "C:\VB\MARCADOR. La ID de la tarea es un número exclusivo que identifica el programa en ejecución. Ponga en ese botón en su procedimiento click. . Este parámetro se le introduce. Sintaxis donde: Variable es identificador de la tarea (ID) rutaDeAcceso es el nombre del programa por Ejecutar (con su Path) y cualquier argumentos o conmutadores (switches) de línea de comando requeridos. ocurrirá un error. Imaginemos que ese programa tiene la posibilidad de introducirle el número telefónico que debe marcar como un parámetro. Por ejemplo: MARCADOR. llamado MARCADOR. La ventana se muestra como un icono con foco. si se omite estiloDeVentana. Veamos que dice la Ayuda de VB respecto a la Función Shell: Ejecuta un programa ejecutable.EXE llama al número 080 (Bomberos). La ventana recupera el foco y vuelve a su posición y tamaño original. La ventana activa actual permanece activa. el programa se inicia minimizado con enfoque.EXE 080" Mediante esta línea.Observe que esta aplicación inicia la calculadora de Windows Private Sub cmbCalculadora_Click() LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 226 . Si la función Shell no puede iniciar el programa nombrado. realice una aplicación con un botón (cmbCalculadora) y un label (label1). Variable = Shell ( rutaDeAcceso [. El argumento con nombre estiloDeVentana tiene estos valores: Constante vbHide vbNormalFocus vbMinimizedFocus vbMaximizedFocus vbNormalNoFocus vbMinimizedNoFocus Comentarios Valor 0 1 2 3 4 6 Descripción Se oculta la ventana y se pasa el foco a la ventana oculta. el siguiente código. y que esa comunicación telefónica nos la realiza un programa desarrollado en C++ . y una vez establecida la llamada podemos pasarle a ese Organismo datos o lo que nuestra aplicación haga. lo que hacemos es ejecutar el programa MARCADOR. Este número debe ser un Long. La ventana activa actual permanece activa. Imaginemos que tenemos una aplicación Visual Basic que necesita.EXE e introducirle como parámetro el número a marcar. Si desea conocer el ID de la tarea. añadiendo el número al nombre del programa ejecutable. puede incluir directorio o carpeta y unidad de disco.

sin ánimo de publicidad.Dim variable As Long variable = Shell("C:\windows\calc. ByVal dwProcessID As Long) As Long Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long. Utilice una línea con la siguiente expresión : Shell ("C:\windows\calc. un compresor de datos que.exe"). El programa a ejecutar puede ser un programa Windows caso anterior de la calculadora) o un programa DOS. Verá mas APIs mas adelante. lo que hay que hacer para poder detectar que se ha terminado de ejecutar el programa DOS y para cerrarlo. sin dar mayor importancia al ID de la tarea. siempre es necesario conocer cuando se ha terminado de ejecutar el programa iniciado mediante Shell. La mayoría de los programas DOS que se ejecutan con Shell no se cierran automáticamente. tanto la terminación del proceso DOS como su cierre. lpExitCode _ As Long) As Long Declaramos las constantes Public Const WM_CLOSE = &H10 Public Const STILL_ACTIVE = &H103 Public Const PROCESS_QUERY_INFORMATION = &H400 El Procedimiento podemos ponerlo en el Módulo anterior o en el formulario. El programa DOS elegido para este ejemplo es el popular ARJ. 1) label1. tampoco pasa nada. y adelantar un poco como se trabaja con ellas. La declaración de las Apis y Constantes (En la sección de Declaraciones de un Módulo) es la siguiente: Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As _ String. es uno de los mejores que existen. Pero trabaja solamente en DOS. para detectar que el proceso abierto para comprimir o descomprimir ha finalizado. sin grandes explicaciones. y proceder a cerrarlo. Por eso. Esto es un gran inconveniente de la función Shell. Esto significa que si podemos evitar el uso de Shell debe evitarse.Caption = Str(variable) End Sub Posiblemente lo único que le importe sea el ejecutar esa aplicación.exe". ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long. Esto quiere decir que no se puede esperar que un programa iniciado con Shell termine su ejecución antes de que se ejecuten las instrucciones que siguen a la función Shell en la aplicación. vamos a presentar. No las hemos explicado todavía. ByVal _ bInheritHandle As Long. 1 (Observe en las dos formas de ejecutar la función Shell. Nota La función Shell ejecuta otros programas de manera asíncrona. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 227 . Variará el tipo de declaración de las APIs: Public Sub ExecCmdNoFocus(ByVal CmdLine As String) (CmdLine es el parámetro que le vamos a pasar cuando invoque este procedimiento). Pero hay que controlar. Podemos usar para ello APIs.EXE. _ ByVal wMsg As Long. Se utiliza un Procedimiento que he llamado ExecCmdNoFocus. que la colocación de los paréntesis y la coma separadora es distinto. Excepto en contadas ocasiones. ByVal wParam As Long. Pero si es completamente necesario. Y no es ese el único problema. lParam As Any) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long.

False. En el procedimiento ExecCmdNoFocus se analiza si esa ventana está presente (prueba de que ARJ ya ha terminado. RetVal Sleep 100 'en este apartado comprueba si está abierta la ventana "Finalizado . podemos llamarle desde cualquier parte de la aplicación. 0&.EXE y a continuación debe indicársele el nombre del archivo ya comprimido. Debemos pasarle el parámetro CmdLine. a continuación a para que añada mas ficheros a ese archivo. Es difícil.'Este procedimiento inicia un proceso en DOS y espera a que termine 'Una vez terminado este proceso.Ext") NO se preocupe si no lo entiende ahora. y a continuación el nombre de ese fichero o ficheros a añadir : El parámetro CmdLine del procedimiento es todo lo que va entre paréntesis. 0&) End If Loop While RetVal = STILL_ACTIVE End Sub La ventana DOS del ARJ tiene el Caption Finalizado .ARJ cuando ya ha terminado el proceso. ExecCmdNoFocus ("C:\DirA\ARJ. pues antes de terminar tiene otro Caption).ARJ 'valor de retorno de PostMessage hProcess = OpenProcess(PROCESS_QUERY_INFORMATION. "Finalizado . el programa es ARJ. Para llamar a ese procedimiento hay que citarle por su nombre (ExecCmdNoFocus) que como lo hemos declarado Public en un Módulo. WM_CLOSE. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 228 .EXE a C:\DirB\Fichero1. _ vbMinimizedNoFocus)) Do GetExitCodeProcess hProcess.ARJ") If winHwnd <> 0 Then RetValls = PostMessage(winHwnd. que se mostrará minimizada y sin foco Declaramos las variables locales en ese procedimiento Dim hProcess As Long Dim RetVal As Long Dim winHwnd As Long Dim RetValls As Long 'handle del proceso donde se invoca la función Shell 'Valor donde la función GetExitCode coloca el resultado ' manipulador de la ventana que contenga el Caption ‘Finalizado . que será el programa que vamos a ejecutar con Shell y los parámetros adicionales que este programa necesite (En este caso. Shell(CmdLine. cierra la ventana.ARJ" winHwnd = FindWindow(vbNullString.

Usaremos para ello la función Command. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 229 .EXE. En el siguiente ejemplo.EXE. el D&D no es una función de VB. vamos con un ejemplo. Y Windows lo utiliza en su Explorador de Windows para pasar como parámetro a una aplicación el nombre del fichero que arrastremos hacia el icono que representa a esa aplicación. mediante el Drag & Drop de Windows. ¿Podemos hacer eso en una aplicación VB? La respuesta debe ser SI. Como estoy seguro que se ha liado. La aplicación ya compilada se llamará MARCADOR. cuando iniciamos la aplicación VB mediante la línea de comandos de Windows (línea Archivo | Ejecutar del Menú de Windows 3. sino comprobar que esto puede funcionar. Pero como comentábamos. VB /CMD cmdlineargs En las aplicaciones desarrolladas con Visual Basic y compiladas en un archivo .LA FUNCION COMMAND En el ejemplo anterior usábamos un ejecutable realizado en C++ para marcar un número telefónico que le introducíamos como parámetro.exe 1234567 o como ya sabemos. Todo el código necesario se lo metemos en el procedimiento Activate del formulario: Private Sub Form_Activate() FRMARCADORL1. cmdlineargs representa la información de argumento devuelta por la función Command. Para marcar un número debemos poner. El número a marcar se le pasará como parámetro tras el nombre de la aplicación. en la línea de Comando de Windows: Marcador.exe 1234567 Como no vamos a realizar llamada alguna.xx o línea Ejecutar de W95). Veamos con un par de ejemplos como se pueden usar estas dos funciones: Marcador Telefónico Esta aplicación debe marcar un número telefónico. la parte de la línea de comandos que sigue a /CMD se pasa al programa como un argumento de la línea de comandos. Hemos visto mas atrás como podemos hacer Drag & Drop en una aplicación VB. Command devuelve los argumentos que aparezcan en la línea de comandos tras el nombre de la aplicación.Caption = Command End Sub También podemos pasar parámetros a un ejecutable. sino de Windows. o desde otra aplicación utilizando la función Shell. nuestra pequeña aplicación tendrá solamente un Label llamado FRMARCADORL1 donde presentaremos el número a marcar. Veamos también en este caso lo que dice la Ayuda de VB: Command (Función) Devuelve parte del argumento de la línea de comandos utilizada para lanzar Microsoft Visual Basic o un programa ejecutable desarrollado con Visual Basic. puede usted cambiar el texto devuelto por Command eligiendo Opciones del proyecto en el menú Herramientas. introducirle el parámetro mediante una llamada con la función Shell desde otra aplicación: Shell Marcador. Esta función nos devuelve el parámetro introducido tras el nombre del ejecutable realizado en VB. Por ejemplo: MyApp cmdlineargs En la ventana Código. Cuando se inicia Visual Basic desde la línea de comandos.

RTF.RTF.Si Vd. Suelte el botón del ratón y su editor se ejecutará. Write. Observe que esta es la forma de trabajar de los procesadores de texto usados normalmente (Word. y ha preparado su aplicación para que tome el contenido de Command y entienda que tiene que abrir y cargar ese fichero.EXE cargará automáticamente ese fichero.RTF de forma que al arrancar lea directamente el fichero Carta. WordPerfect. le meterá como parámetro el nombre del fichero Carta. y además.EXE. basta con ir al Explorador de Windows. su aplicación Editor. hace un editor de textos (Editor. para ejecutar su programa y meterle como parámetro el nombre del fichero Carta. etc.EXE) que soporta un formato determinado (por ejemplo el RichTextFormat RTF). arrastrar el nombre de ese fichero y llevarlo al icono que representa a Editor. que imaginemos que le ha preparado un acceso directo.RTF (con su Path correspondiente) Si Ud.) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 230 . había previsto la captura del Command tal como se explicó mas atrás. abrir la carpeta que contenga Carta.

una vez terminada la comunicación. en caso de meterse en un bucle infinito.La Función DoEvents Cede el control de la ejecución al sistema operativo. Utilice esta función sobre todo. Imagínese que se corta la comunicación y Transmitido nunca llega a ser True. durante el tiempo en éste ha cedido el control. DoEvents devuelve 0 en el resto de las aplicaciones. EJEMPLO Para explicar la función DoEvents se ha preparado un pequeño ejercicio con un formulario principal (Form1) y dos formularios auxiliares. no use DoEvents si existe la posibilidad de que otras aplicaciones interactúen con el procedimiento. como la versión estándar de Visual Basic. Si partes de su código consumen demasiado tiempo de procesamiento. es posible que tenga que resetaear el ordenador. El control no se devuelve hasta que el sistema operativo haya terminado de procesar los eventos en cola y que (sólo para Microsoft Windows) se hayan enviado todas las teclas en la cola SendKeys. Esto podría causar resultados impredecibles. Do Until Transmitido = True Rem Si Transmitido no llega nunca a ser true. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 231 . Además. use periódicamente DoEvents para ceder el control al sistema operativo. La función DoEvents es una instrucción obligada en todos los bucles por condición para evitar que. nunca podrá salir del bucle DoEvents ‘Esta función devuelve el control al sistema operativo cada vez que se ejecuta ‘y puede comprobar si se han pulsado las teclas Ctrl-Alt-Sup Loop La función DoEvents devuelve también el número de formularios abiertos por una versión única de Visual Basic. pone la variable Transmitido a True. Este. para que éste pueda procesar otros eventos. El siguiente bucle se pone para esperar a que el programa envíe un mensaje a través del control de comunicaciones. de formas imprevistas. de manera que eventos como la entrada por el teclado o los clics del mouse (ratón) se puedan procesar sin grandes retrasos. Precaución Asegúrese de que el procedimiento que ha cedido el control con DoEvents no se ejecute de nuevo desde una parte diferente del código antes de que regrese la primera llamada a DoEvents. podamos salir de el aunque sea teniendo que pulsar las teclas Ctrl-Alt-Sup. cuando tenga bucles demasiado largos que puedan interrumpir la entrada de datos por teclado o ratón. estos últimos solamente a efectos de contar. Si no lleva esa línea DoEvents. También nos permite conocer el número de formularios abiertos en una aplicación. Sintaxis Sintaxis DoEvents Cede el control al sistema operativo variable=DoEvents variable contendrá un número indicando el número de formularios abiertos en este momento. mediante DoEvents el número de formularios abiertos.

Private Sub Command1_Click() Label1.Caption = DoEvents Label1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 232 .Se declara la variable PARAR como booleana en las declaraciones del Form1 El botón COMENZAR introduce un bucle que no pararía nunca. nunca podríamos entrar el Procedimiento Click de este botón. DoEvents N=0 End If Loop End Sub En el formulario Form1.BackColor = RGB(0. Al estar el programa haciendo el bucle continuamente. El botón ROJO tiene este código: Private Sub Command2_Click() PARAR = True Label1. 255.BackColor = RGB(255. También pone Label1 de color Verde. Lo mismo ocurriría con el botón ROJO. 255. al que previamente le hemos puesto la propiedad KeyPreview a True. 0) Do While PARAR = False N=N+1 If N = 1000 Then 'Cada vez que N=1000 ejecuta la función DoEvents. nunca se podría acceder al Procedimiento KeyPress del formulario.BackColor = RGB(255. 0) End Sub Si no hubiésemos puesto DoEvents en una parte del bucle del contador. 0) End Sub 'Aquí comprobamos los Formularios que tenemos 'abiertos en este momento. se le ha puesto este código en su procedimiento KeyPress: Private Sub Form_KeyPress(KeyAscii As Integer) PARAR = True Label1. pues el programa lo único que haría será dar vueltas en el bucle indefinidamente. 0.

tampoco podríamos salir del programa. puesto que el sistema operativo no podría comprobar que hemos hecho Click en este botón. Private Sub Command3_Click() End End Sub Realice esta pequeña práctica con la línea DoEvents del botón COMENZAR activada y desactivada (Con una comilla simple). cierra Form2.Show End Sub Private Sub Command7_Click() Form3. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 233 . FORM3. Prepárese para.Show End Sub Private Sub Command6_Click() Form2. lo único que hacen es mostrar u ocultar Form2 y Form3 a efectos de poder comprobar cuantos formularios tenemos abiertos.Hide End Sub Private Sub Command5_Click() Form3.Los botones FORM2. Private Sub Command4_Click() Form2. cierra Form3. pues de otra forma no la podrá detener. Observe que si no hubiésemos puesto DoEvents en el medio del bucle. detener la aplicación pulsando CtrPausa. en este último caso.Hide End Sub Por último SALI nos saca del programa.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 234 .

tienen una función clara.Visual Basic. Una caja de mensaje..El aviso es sí. y exige que se realice alguna gestión sobre ella antes de permitir que otra parte de la aplicación tome de nuevo el foco. La actuación que generalmente exige un formulario o ventana es ocultarse. En el procedimiento click de este menú ponga el siguiente código : Form2. Veamos la primera : La caja de Mensajes. la caja de mensaje será similar a esta: Debe darse cuenta de algunas cosas: En primer lugar el mensaje. El MessageBox y la ventana del CommonDialog son dos ejemplos de ventanas modales. Por defecto. Ventana modal (Este tema ha sido tomado parcialmente de las páginas de Mundo Visual .Show 1 El 1 detrás de la expresión Show indica que el formulario Form2 debe mostrarse de forma Modal. o pregunta para que el usuario tenga conocimiento de ella y actúe. El primero (Form1) puede ser el formulario donde se realizan todas las operaciones de la aplicación. aviso. El segundo (Form2) puede ser el típico formulario donde se presenta la información del fabricante de la aplicación. "Hola" que se escribe a continuación de la palabra MsgBox. cuyo código puede ser simplemente : Me. también debe darse cuenta del botón Aceptar que tiene el Focus de la ventana activa y que sólo hay ese botón. puede ser por ejemplo. El resultado es: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 235 . que muestra una información esperando que el usuario seleccione una de las respuestas posibles para que el programa la trate. la instrucción MsgBox "Hola". por eso.Presentación Modal de formularios. Podemos modificar estos parámetros para alcanzar nuestros objetivos. Ponga en este Form2 el típico botón de Aceptar. Lo dicho para un formulario puede aplicarse para otro tipo de ventanas. con la palabra Acerca de."Ejemplo" . Para ver esto. . cree una aplicación con dos formularios. 2 . lo que significa que no se podrá volver a operar con ningún elemento de Form1 hasta que se oculte o descargue el formulario Form2. que tiene por objetivo mostrar una información de interés. Hay 2 formas diferentes de mostrar información: 1 . MessageBox o MsgBox Las cajas de mensajes o MessageBox.El aviso con espera de respuesta. Cree un menú en el primer formulario con esa palabra y ponga este formulario como formulario inicial de la aplicación. que es la de mostrar una determinada información. al que se accede normalmente desde el menú.Hide Ejecute la aplicación y comprobará como se comporta un formulario mostrado como Modal. vamos a escribir ahora este código: MsgBox "Hola".. y por último el título de la ventana.) Se dice que un Formulario o cualquier tipo de ventana se presenta de forma Modal cuando un elemento de ese formulario o ventana toma el foco en el momento de mostrarse.

Como podemos apreciar en el código. VbInformation ó Note que es lo mismo insertar VbCritical o 16.". Con ella logramos introducir un salto de línea. VB retorno de carro y avance de línea) Vea mas adelante la aclaración de esta expresión. hemos escrito dos comas. Nada tan fácil como este código por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo. Supongo que se habrá percatado de que entre el mensaje y el título de la ventana. Mensaje de información. VbQuestion . "Ejemplo" El resultado es: ó ó 48 64 16 32 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 236 . Los iconos son: Estos iconos corresponden a los siguientes mensajes: Mensaje crítico. aunque con el mismo significado) Para mostrar el icono en cuestión o para que Visual Basic lo entienda. esto es porque entre las comas. Mensaje de pregunta. la caja de mensaje posee un título Ejemplo y el mensaje. "Ejemplo". VbCritical Mensaje de pregunta. El resultado es: Habrá observado en la expresión anterior que se ha utilizado vbCrLf (Visual Basic Carriage Return Line Feed. VbExcalamqtion ó Mensaje de información.xx dispone de otros diferentes. . debe ir un número que representará el icono a mostrar. pero es posible que deseemos escribir un mensaje en varias líneas con salto de párrafo. Existen cuatro iconos diferentes además de la posibilidad de no mostrar ninguno. En Windows 3. VbQuestion Mensaje exclamativo. Mensaje exclamativo.". (Sólo en W32. Vamos a ver un ejemplo añadiendo un icono al último ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo. es necesario escribir lo siguiente: Mensaje crítico.

Así por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.Ahora bien. VbQuestion + vbYesNo + vbDefaultButton2. Reintentar. "Ejemplo" El resultado es: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 237 . en este caso el Focus lo tiene el botón Sí. Para este propósito.". VbQuestion + vbYesNo . Por ejemplo. es posible que deseemos que el Focus lo adquiera otro un botón determinado. es posible que queramos mostrar algún otro botón que o bien no sea el de Aceptar o que además del botón de Aceptar haya más botones. tenemos los siguientes parámetros: Aceptar Aceptar y Cancelar Anular. pero es posible que deseemos que lo tenga el botón No por ejemplo. No y Cancelar Sí y No Reintentar y Cancelar Aplicación modal vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel ó vbYesNo vbRetryCancel vbApplicationModal ó ó ó 3 ó ó ó 0 1 2 4 5 0 (Es la caja de mensaje sin icono) La forma de hacer esto es sumar al parámetro del icono que queremos mostrar el valor de los botones que deseamos que aparezcan. Ignorar Sí. "Ejemplo" El resultado es: Aún así. Esto se consigue con los siguientes parámetros: Primer botón predeterminado vbDefaultButton1 ó 0 Segundo botón predeterminado vbDefaultButton2 ó 256 Tercer botón predeterminado vbDefaultButton3 ó 512 Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.".

ValorPredeterminado) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 238 . El mensaje que quiere que aparezca se realiza de forma casi idéntica al MessageBox. el siguiente código: Dim Resp As Integer Resp = MsgBox("Hola" & vbCrLf & "Esto es un ejemplo. Ahora bien. el usuario debe saber combinar los códigos. En caso de seleccionar como predeterminado un botón que no existe. La sentencia es: Val = InputBox (Mensaje. para elegir o seleccionar un evento o acción. sabiendo que un MsgBox posee la siguiente sintaxis principal: MsgBox Mensaje. "Ejemplo") If Resp = 6 Then MsgBox "Ha pulsado SI" Else MsgBox "Ha pulsado NO" End If Tiene el resultado siguiente: Si pulsamos el botón Sí obtendremos una acción. y si pulsamos el otro botón otra acción. si decidimos mostrar un mensaje esperando una respuesta.". Es importante que el usuario interactúe con la aplicación para ser el protagonista de esta. esto lo podemos conseguir mediante el siguiente código de respuestas: Aceptar vbOK ó 1 Cancelar vbCancel ó 2 Anular vbAbort ó 3 Reintentar vbRetry ó 4 Ignorar vbIgnore ó 5 Sí vbYes ó 6 No vbNo ó 7 Así por ejemplo. El InputBox nos permite sacar una caja donde el usuario pasará un parámetro. Visual Basic seleccionará el primero. (por ejemplo el tercero). Puede escribirse varias líneas de texto seguidas por la constante de Visual Basic vbCrLf o salto de línea o párrafo.Si no se señala el botón predeterminado. VbQuestion + vbYesNo + vbDefaultButton2. Titulo. Botones. Visual Basic seleccionará el primer botón. o queremos saber que botón ha pulsado el usuario. Título de la ventana InputBox El InputBox o caja de entrada es otra de las partes más utilizadas para la interacción del usuario con la aplicación. valor o dato para que el programa lo trate y lo ejecute. Ahora bien.

"Mundo Visual") MsgBox "Su nombre es: " & Val Obtendremos como resultado: Es importante determinar que si el usuario elige el botón Cancelar. "Ejemplo") MsgBox "Su nombre es: " & Val Tiene como resultado: (El usuario teclea el nombre .2ª línea del código anterior ) Ahora bien. Por ejemplo: Dim Val As String Val = InputBox("Deme su nombre". A continuación se muestra el MsgBox . Estos parámetros se ponen a continuación del ValorPredeterminado. Val ="". "Ejemplo". "Mundo Visual". La caja de entrada puede ser sin embargo más personalizada mediante dos parámetros como son la posición de la ventana de entrada de datos en la pantalla. Por ejemplo: Dim Val As String Val = InputBox("Deme su nombre". podemos determinar un texto predeterminado a la caja de entrada. es decir.y hace click en Aceptar. cadena string. que puede ser una cantidad. … etc. "Ejemplo".Val almacenará el texto escrito por el usuario. 1200. el programa devolverá una cadena de caracteres igual a 0.Mundo Visual . como por ejemplo: Dim Val As String Val = InputBox("Deme su nombre". 1400) Situará la ventana en el eje de las X a 1200 Twips (posición horizontal) y la Y a 1400 twips (posición vertical). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 239 .

com/visualbasic/ LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 240 .Reitero mi agradecimiento a Mundo Visual http://www.ciudadfutura.

El Objeto App
El objeto App representa a la aplicación. Es el objeto Visual Basic que contiene diversas informaciones acerca de la Aplicación. Alguna de estas informaciones se le pueden introducir al proyecto en tiempo de diseño, en el cuadro de Opciones. Para ello basta con ir, en la Barra de Menú de Visual Basic a Herramientas | Proyecto | Opciones y hacer click en Proyecto. Otra parte donde se introducen es en el cuadro de diálogo Opciones de EXE. Para ver este cuadro proceda de la misma forma que si fuese a crear un archivo .EXE de la Aplicación, Haga click en Archivo | Crear Archivo EXE de la Barra de Menú, y una vez que le aparezca el cuadro de diálogo para introducir el nombre, haga click en OPCIONES. Estas informaciones son las Propiedades del objeto App. Este objeto no tiene Métodos ni Eventos. Comments (Propiedad) Devuelve o establece una cadena que contiene comentarios sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.Comments Se establece esta propiedad en tiempo de diseño usando el cuadro Opciones de EXE. CompanyName (Propiedad) Devuelve o establece un valor de tipo String que contiene el nombre de la empresa o del creador de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.CompanyName

Se establece esta propiedad en tiempo de diseño usando el cuadro de Opciones de EXE. Visual Basic toma por defecto el nombre de la compañía con que se cargó VB. EXEName (Propiedad)

Devuelve el nombre raíz (sin la extensión) del archivo ejecutable que se está ejecutando actualmente. Si se utiliza en el entorno de desarrollo, devuelve el nombre del proyecto. Sintaxis MiVariable = App.EXEName

Esta propiedad se establece bien en el cuadro de Opciones, bien al guardar el archivo .EXE FileDescription (Propiedad) Devuelve o establece un valor de tipo String que contiene información de los archivo de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.FileDescription

Se establece esta propiedad en tiempo de diseño usando el cuadro Opciones de EXE.

HelpFile (Propiedad) Ya comentada mas atrás. Especifica el nombre (con su Path) del fichero de ayuda. Se introduce en tiempo de diseño en el cuadro de Opciones. Puede cambiarse en tiempo de ejecución. hInstance (Propiedad)
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 241

Devuelve el controlador de la instancia de la aplicación. Es un Long Sintaxis VariableLong = App.hInstance

Cuando se trabaja en un proyecto dentro del entorno de desarrollo de Visual Basic, la propiedad hInstance devuelve el controlador de la instancia de Visual Basic. El valor de esta propiedad lo pone directamente Windows. LegalCopyright (Propiedad) Devuelve o establece un valor de tipo String que contiene información de derechos de autor sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.LegalCopyright

Esta propiedad se establece en el cuadro de diálogo Opciones de EXE. LegalTrademarks (Propiedad) Devuelve o establece un valor de tipo String que contiene información de marca registrada sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.LegalTrademarks

Establezca esta propiedad en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. Major Minor (Propiedades) Devuelven o establecen el número mayor (menor) de la versión del proyecto. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.Major MiVariable = App.Minor

El valor de estas propiedades están dentro del rango 0 a 9999. Proporcionan información sobre la versión de la aplicación en ejecución. Se establecen en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. Revision (Propiedad) Devuelve o establece el número de revisión de la versión del proyecto. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.Revision

Mediante las propiedades Major, Minor y Revision obtenemos la versión del programa. Es muy util conocer la version del programa para saber si lo hay que actualizar. Por ejemplo, la instrucción: MiVariable = App.Major & “.” & App.Minor & “.” & App.Revision Puede devolver un dato parecido a este: MiVariable = 2.1.4 Así conocemos que la versión del programa es la 2.1.4. Estos datos de Major, Minor y Versión hay que introducirlos en el programa durante el tiempo de diseño. Se usa para ello la caja de Propiedades del Proyecto Path (Propiedad)
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 242

Especifica la ruta de acceso del archivo .VBP de proyecto cuando se ejecuta la aplicación desde el entorno de desarrollo o la ruta de acceso del archivo .EXE cuando se ejecuta la aplicación como un archivo ejecutable. Esta propiedad es sumamente útil. Cuando se realiza una aplicación, no es prudente obligar al usuario a meterla dentro de un determinado directorio impuesto por el programador. Si no es así, no sabremos en qué directorio está el ejecutable, y es muy conveniente saberlo, sobre todo cuando se utilizan ficheros auxiliares de inicialización, que deberían estar en el mismo directorio de la aplicación. Si queremos abrir el fichero MiAplicacion.Cfg que estará obligatoriamente en el mismo directorio de la aplicación (aunque no conocemos su nombre), solamente tenemos que poner la línea de código : Open App.Path & “\MiAplicacion.ICfg” For Input as # 1, sin importarnos cual es el nombre real de ese directorio. PrevInstance (Propiedad) Devuelve un valor booleano que indica si hay ya en ejecución una instancia anterior de una aplicación. Es muy utilo saber que hay una instancia del programa en ejecución para impedir que se vuelva a abrir otra. Sintaxis VariableBooleana = App.PrevInstance

Puede utilizar esta propiedad en un procedimiento de evento Load para determinar si el usuario ya está ejecutando una instancia de una aplicación. Dependiendo de la aplicación, puede ser conveniente que sólo haya una instancia de la misma en ejecución al mismo tiempo en el entorno operativo Microsoft Windows. ProductName (Propiedad) Devuelve o establece un valor de tipo String que contiene el nombre de producto de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.ProductName

Establezca esta propiedad en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. El valor de la propiedad Revision está dentro del rango 0 a 9999.Esta propiedad proporciona información sobre la versión de la aplicación en ejecución. Esta propiedad se establece en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. StartMode (Propiedad) Devuelve o establece un valor que determina si una aplicación se inicia como proyecto independiente o como servidor de automatización OLE. De sólo lectura en tiempo de ejecución. Sintaxis VariableLong =App.StartMode

Donde Valor es un número o una constante que determina la forma de inicio : Constante vbSModeStandalone vbSModeAutomation TaskVisible (Propiedad) Devuelve o establece un valor que determina si la aplicación aparece en la lista de tareas de Windows. Sintaxis VariableBooleana = App.TaskVisible Valor 0 1 Descripción (Predeterminado) La aplicación se inicia como proyecto independiente. La aplicación se inicia como servidor de automatización OLE.

Donde booleano puede tomar los valores True o False : True
LSB

(Predeterminado) La aplicación aparece en la lista de tareas de Windows.
Visual Basic – Guía del Estudiante Capítulo 1 Página 243

False

La aplicación no aparece en la lista de tareas de Windows.

La propiedad TaskVisible sólo puede establecerse a False en aplicaciones que no presenten interfaz, como servidores OLE que no contengan o presenten objetos Form. Mientras la aplicación disponga de interfaz gráfica, la propiedad TaskVisible se establece automáticamente a True. Title (Propiedad) Devuelve o establece el título de la aplicación que aparecen en la Lista de tareas de Microsoft Windows. Si se modifica en tiempo de ejecución, los cambios no se guardarán con la aplicación. Sintaxis App.Title = “Esto es lo que va a figurar en la barra de Titulo”

Valor será una expresión de cadena que especifica el título de la aplicación. La longitud máxima de valor es 40 caracteres. Esta propiedad está disponible en tiempo de diseño en el cuadro de diálogo del comando Crear EXE del menú Archivo. Todos estos datos figuran en el archivo de proyecto (.VBP). Puede verse editándolo con el Block de Notas de Windows, e incluso pueden modificarse estas propiedades directamente sobre ese archivo.

Visual Basic - Guía del Estudiante Cap. 9
INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI ) EL CONTROL RICH TEXT BOX INTERFACE DE DOCUMENTOS MULTIPLES. Lo que se va a explicar en este capítulo le será bastante familiar aunque nunca haya reparado en ello. Posiblemente haya utilizado un procesador de texto en el que está escribiendo una carta, y antes de terminar de escribir esa carta, comienza a escribir otro documento, y posiblemente otro, y tenga los tres documentos en la pantalla al mismo tiempo, bien en ventanas escalonadas, (cascada), bien en ventanas en forma de mosaico, o simplemente tapando unas a otras completamente. Los tres documentos están en su procesador de textos, y puede actuar sobre uno u otro simplemente eligiendo el deseado mediante el mecanismo que le proporciona su procesador de textos. Este sistema no es ni mas ni menos que una interface de documentos múltiples. En programación, a este tipo de aplicaciones las denominamos MDI Para crear una aplicación MDI debe hacerse mediante un Formulario Padre al que se le añaden tantos Formularios Hijo como documentos tengamos. Al formulario padre le denominamos Formulario
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 244

MDI, y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En esta Guía del Estudiante se usarán indistintamente una u otra denominación. La única diferencia entre un formulario normal y un formulario Hijo es que éste tiene la propiedad MDIChild a True. Para realizar una aplicación MDI, lo primero que hay que hacer es introducir en ella un formulario MDI. Para introducirlo, basta con hacer click en Insertar | Formulario MDI de la barra de menú. Solamente se puede tener un formulario MDI en una aplicación. Puede observar que una vez que ha introducido uno, la palabra Formulario MDI del submenú Insertar queda deshabilitada. Una vez que tiene un formulario MDI puede introducir tantos formularios hijo como desee. Para que un formulario sea formulario hijo basta con poner a True su propiedad MDIChild. En una aplicación MDI pueden coexistir formularios hijo y formularios normales. Propiedades de los formularios MDI Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente propiedades : AutoShowChildren. Muestra los formularios hijo nada mas cargarlos. Esta propiedad puede verse si se carga un formulario hijo mediante la sentencia : Load NombreFormularioHijo Si la propiedad AutoShowChildren está a True, el formulario cargado se verá inmediatamente. Si está a False, será necesario ejecutar la sentencia NombreFormularioHijo.Show para presentarlo. ActiveForm Mediante esta propiedad podemos conocer el formulario activo dentro de una aplicación de documentos múltiples. (El formulario activo es aquel que tiene el foco) MiVariable = ActiveForm.caption MiVariable contendrá el Caption (Barra de Titulo) del formulario activo. ActiveForm.Backcolor = RGB (255,0,0) pondrá el fondo del formulario activo de color rojo. ScrollBars Hace que el Formulario MDI (padre) muestre barras de Scroll para presentar en toda su extensión a un formulario hijo, cuando las dimensiones de áste superan las de aquel. Aparte de estas propiedades que diferencian un Formulario MDI de un Formulario normal, los Formularios MDI presentan otras particularidades. Inserción de Controles Solamente podrán introducirse en un formulario MDI aquellos controles que tengan la propiedad Align. (Picture, Data, DBGrid) y solo permiten que se presenten con alineación a uno de los lados del Formulario (Top, Bottom, Left o Right) El control Picture puede trabajar como contenedor de otros controles. Por lo tanto, para poder introducir cualquier control (TextBox, Label, CommandButton ...) será necesario introducir un control Picture, y sobre el, poner los controles que se necesiten. Línea de Menú. Cuando existe la línea de Menú en un Formulario MDI y en el Formulario Hijo que introduzcamos en él, la línea de menú del Formulario MDI se sustituye por la línea de menú del Formulario Hijo introducido. Barra de Título. La Barra de Título del Formulario MDI se conserva siempre. Pero si el Formulario Hijo insertado dentro de él está maximizado (ocupa toda la extensión del Formulario MDI), a la barra de título se le añadirá la barra de Título del Formulario Hijo entre paréntesis.
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 245

Para hacer que un Formulario sea un formulario hijo basta con ponerle su propiedad MDIChild a True. Puede preparar los formularios hijo uno a uno e introducirlos dentro del formulario MDI según las necesidades de la aplicación. Este sería el caso de una aplicación con varias pantallas, todas ellas colocadas sobre una pantalla fija (Formulario MDI) del que se aprovecha quizás alguna parte como parte común de toda la aplicación (Menú, Título, Barra de herramientas montada sobre un Picture, etc.) Puede también darse el caso de introducir un número indeterminado de ventanas iguales para realizar varias veces la misma función, pero sobre ventanas diferentes. (Caso del procesador de texto que tiene varias ventanas de texto, cada una con un documento. Lo que desconocemos a priori es el número de documentos que vamos a editar) Para el primer caso, será necesario crear cada una de las ventanas, e introducirlas y quitarlas según pida la aplicación. En segundo caso, bastará con crear un formulario hijo con todas las partes necesarias para su correcto funcionamiento, y luego, realizar tantas “fotocopias” de ese formulario como ventanas necesitemos. Lo que introducimos en la aplicación son precisamente esas “fotocopias”, pero no el original, que lo seguimos manteniendo intacto para volver a copiarlo si fuese necesario. A esas “fotocopias” de un formulario las llamamos Instancias. Al original le llamaremos Clase. En realidad una Clase es la definición de un objeto Visual Basic. Un objeto Visual Basic puede ser un Formulario, un control, un objeto de acceso a datos. La Instancia es la réplica de una clase. Puede ser la réplica de un Formulario, de un control o de otro objeto. La Instancia lleva las mismas Propiedades que la clase. Se dice que hereda las propiedades. (Excepto la propiedad Visible, que siempre, por defecto, aparece a False). Cuando se varía una propiedad de una Instancia, no se altera el valor de esa propiedad en la Clase ni en ninguna de las restantes Instancias. Después de toda esta teoría, ¿podemos saber como se crea una Clase de un formulario ? O dicho de manera mas coloquial, ¿Cómo se crea un Formulario para poder hacer varias “fotocopias” de él ? La respuesta es obligatoriamente mas sencilla que la teoría. Con el formulario vacío que tengamos en el proyecto (Insertemos un Formulario si fuese necesario) pongámosle todos los controles que deseemos. Le podemos poner un Menú y cambiar a nuestro antojo todas sus propiedades. Entre ellas, la propiedad MDIChild. Si vamos a introducir las Instancias de ese Formulario en un Formulario MDI esa propiedad debe estar a True, y por lo tanto sus Instancias saldrán igualmente con esa propiedad a True. Pongámosle un nombre y ya está creada la clase. Supongamos que ese nombre es FormularioHijo Para crear ahora Instancias de ese Formulario podemos hacerlo de dos formas : Declarar una variable tipo Objeto. No se asuste. Para declarar que una variable es un Formulario basta con declararla de la siguiente forma : Dim MiVentana As Form Esta variable debe declararla en sitio adecuado para su aplicación, y el ámbito de esa variable objeto será el mismo que para cualquier tipo de variable. (Vea Ambito de las Variables) La sentencia a utilizar para la declaración será Dim, Private, Public o Global tal como se explicó para las variables. Una vez declarada como variable puede hacerla igual a un objeto existente que servirá de modelo (Una Clase) que estará definida por un nombre: (P.e. FormularioHijo) Set MiVentana = New FormularioHjo Podemos hacer las dos operaciones a un tiempo : declarar y crear la copia : Dim MiVentana As New FormularioHijo Una vez creado la instancia del formulario debemos cargarlo en el Formulario Padre. Para cargarlo debemos emplear la sentencia Load MiVentana, con lo que quedará cargado en la memoria, pero,
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 246

dependiendo de como está la propiedad AutoShowChildren del Formulario Padre se mostrará o no se mostrará. Para que se muestre, independientemente de como esté esa propiedad, basta con ejecutar MiVentana.Show. En realidad mediante el método Show un formulario no solamente se muestra, sino que también se carga en la memoria si no estuviese previamente cargado. Por lo tanto podíamos habernos ahorrado la instrucción anterior para cargarlo Load MiVentana Es muy práctico poner un Caption distinto a cada formulario que se introduzca, caso de introducirse varios formularios hijo iguales. El Caption es una propiedad y por lo tanto todas las instancias heredan el Caption de la Clase. Sería prudente distinguir un formulario de otro mediante su Caption, es decir mediante su barra de título. Para ello podemos crear un contador en el mismo procedimiento en el que creamos una nueva instancia, y poner el Caption de cada nuevo Formulario siguiendo un orden numeral. Documento 1, Documento 2, Documento 3, etc. Ese procedimiento quedará de la siguiente forma : Static contador As Integer Dim MiVentana As New FormularioHijo MiVentana.Caption = “Documento “ & Str (contador) MiVentana.Show

Referencias a los Formularios. ActiveForm y Me
Si queremos nombrar un Formulario Hijo dentro de una aplicación MDI el primer problema con el que nos encontramos es que todos los formularios hijo (Instancias de la misma Clase) tienen el mismo nombre. Por lo tanto no podemos nombrarlas con ese nombre, ya que la aplicación no sabría a cual de ellas nos referimos. Si el código donde vamos a nombrar ese formulario está fuera de él (P.e. en el Formulario Padre) deberemos referirnos al formulario hijo mediante ActiveForm. ActiveForm nos va a indicar cual es el formulario que está actualmente activo. Un formulario está activo cuando estamos trabajando sobre él. En ese momento tiene el foco. Permanece activo desde que hacemos click con el ratón sobre cualquiera de sus partes, hasta que activamos otro formulario. Es sencillo reconocer cual es el formulario activo pues tiene su barra de título con el color vivo. Cada vez que hacemos una operación sobre una parte de un formulario éste se pondrá activo. Por ejemplo, si el formulario es un documento de texto, y contiene el texto en un RichTextBox de nombre RTB1, si queremos hacer una operación con el texto desde un botón colocado en el formulario padre (poner en negrita el texto seleccionado), haríamos lo siguiente : ActiveForm.RTB1.SelBold = True ya que siempre estaremos seguro de que el Formulario Activo es aquel en el que acabamos de seleccionar el texto. Si el botón donde hemos puesto el botón no es el formulario padre, sino el hijo, tenemos un problema similar. Su nombre será (con los ejemplos anteriores) MiVentana, y pueden existir varios formularios con ese nombre, tantos como documentos hayamos introducido. No podemos por tanto nombrarlo con su nombre, pues hay (o puede haber) varios. Tampoco lo podemos nombrar con ActiveForm, ya que esta propiedad corresponde al Formulario Padre. La solución es nombrarle mediante Me. Me siempre se refiere al formulario que contiene al procedimiento donde está esa palabra. Por lo tanto, si tenemos un botón en el formulario hijo con la instrucción : Me.RTB1.SelBold = True Me se refiere concretamente a ese formulario.

Colocación de los Formularios Hijo - Método ARRANGE
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 247

Mediante el método Arrange podemos distribuir los formularios hijo dentro del formulario padre. Pueden colocarse en cascada, mosaico horizontal, mosaico vertical o como iconos. Sintaxis NFMDI.Arrange distribución donde NFMDI = Nombre del Formulario MDI distribución puede tomar los siguientes valores o constantes : Constante vbCascade vbTileHorizontal vbTileVertical VbArrangeIcons Valor 0 1 2 3 Descripción Dispone todos los formularios MDI secundarios no minimizados en cascada. Dispone todos los formularios MDI secundarios no minimizados en mosaico horizontal. Dispone todos los formularios MDI secundarios no minimizados en mosaico vertical. Dispone los iconos de los formularios MDI minimizados.

Las ventanas o los iconos se pueden distribuir incluso si el objeto MDIForm está minimizado. Los resultados son visibles cuando el objeto MDIForm se maximiza.

Posición de los Formularios en el Eje Z - Método ZOrder
Cuando tenemos varios formularios hijo, unos ocultan a los otros. Mucho mas si los formularios están maximizados. Podemos colocar un formulario hijo en la parte frontal del montón de formularios (para que se vea completamente) o llevarle a la posición mas atrás mediante el Método ZOrder. Sintaxis NFH.ZOrder posición Donde NFH = Nombre del Formulario Hijo posición puede se 0 ó 1. Si es 0 (o si se omite) el formulario se coloca en primer plano. Si es 1 el formulario se coloca en el fondo del eje Z. ZOrder es un método que no solamente se puede emplear con formulario hijo, sino con cualquier instancia. Puede emplearlo también con cualquier control. Pero lea detenidamente la Ayuda de este método, ya que no todos los controles la admiten.

Mostrar los Formularios existentes mediante el Menú -- Propiedad WindowList
Al explicar el Editor de menús casi se pasó por alto una propiedad del menú : WindowList. Cuando se activa esta propiedad (Puede activarse para una sola palabra del menú. Si se pretende activar para mas de una dará un error), esa palabra que tiene activada la propiedad WindowList mostrará al hacer click sobre ella, en un menú desplegable, el Caption (Barra de Título) de todos los formularios hijo cargados en ese instante en la aplicación. Pueden estar incluso minimizados.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 248

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 249

EL CONTROL RICH TEXT BOX El control RichTextBox es una caja de texto con mas prestaciones que el TextBox. No está normalmente en la caja de herramientas, por lo que habrá que ir a Proyecto | Componentes y elegir Microsoft RichTextBox Control. El icono que presenta en la caja de herramientas es el siguiente :

Frente a la rigidez del TextBox, este control nos permite escribir un texto utilizando distintos tipos de fuentes en el mismo texto, e introducir mas de 65.536 caracteres, límite máximo del TextBox. Aparte de estas, tiene otras características respecto a la forma de guardar y leer el texto en un fichero, que le convierten en una herramienta muy útil para el diseño de aplicaciones en las que haya que introducir documentos de texto. El RichTextBox puede utilizar indistintamente formato de texto Ascii (que le llamaremos Texto Plano) o formato RTF (RichTextFormat, que llamaremos Texto enriquecido) El formato de Texto enriquecido es un formato de intercambio entre procesadores de texto. Vea al final del capítulo una explicación más detallada de este formato de texto. De momento basta con decir que permite poner tipos distintos de letras, de tamaños, de colores, introducir gráficos, y toda una serie de ventajas que le van a permitir realizar procesadores de texto casi tan perfectos como los editores comerciales mas conocidos. Esto nos permite por ejemplo, guardar estrictamente las letras que componen el texto (Propiedad Text de RichTextBox) o guardar el texto, con sus letras y todos los adornos que queramos ponerles (Tipos distintos de fuente, negrita, cursiva, …). Esto lo logramos con la propiedad TextRTF del RichTextBox. Cuando hablamos de guardar, nos estamos refiriendo lógicamente a guardarlo en un fichero en el disco, y también a guardarlo en el portapapeles. Si tenemos un RichTextBox de nombre RTB (así le llamaremos en todos los ejemplos) con un texto tal como Te creías muy listo Flanahan, pero tus vacas no pasarán por mis tierras La propiedad Text contendrá los siguiente RTB.Text = Te creías muy listo Flanahan, pero tus vacas no pasarán por mis tierras La propiedad TextRTF contiene toda la información, pero eso sí, en formato RTF RTB.TextRTF={\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswissMS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2Arial;}}{\colortbl\red0\green0\blue0;}\deflang1034\pard\li708\plain\f2\fs20 Te cre\'edas muy listo \plain\f2\fs20\b\i Flanahan\plain\f2\fs20 , pero tus \plain\f2\fs24 vacas\plain\f2\fs20 no pasar\'e1n por \plain\f2\fs20\ul mis tierras\plain\f2\fs20 \par \pard\plain\f0\fs17 \par } (Puede que el texto anterior tenga alguna diferencia sobre el real, debido a que hubo que introducirle algún retorno de carro para poder presentarlo) Veamos las propiedades de este control

Propiedades del RichTextBox
El RichTextBox tiene todas las propiedades del TextBox, y además otras que son las que le dan las características excepcionales a este control. Las tres siguientes propiedades son idénticas para ambos controles :

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 250

SelLenght

Devuelve o establece el número de caracteres seleccionados. Los caracteres seleccionados son aquellos que se ponen en vídeo inverso cuando arrastramos con el ratón.

SelStart Devuelve o establece el número del carácter de comienzo del texto seleccionado. SelText Devuelve o establece la cadena de caracteres seleccionados. Si no hay ningún carácter seleccionado devuelve la cadena “” (cadena vacía)

En el ejemplo, el texto seleccionado es ejemplo nos permitirá, texto que hemos seleccionado con el ratón. Las propiedades anteriores tomarán estos valores para ese texto seleccionado : SelLenght = 21 SelStart = 5 (Recuerde que el espacio también es un carácter) (La e de ejemplo es la sexta letra, pero empieza a contar por la 0)

SelText = ejemplo nos permitirá Recuerde que estas propiedades son tanto de lectura como de escritura. Es decir, puede seleccionar un texto con el ratón y analizar ese texto seleccionado, o seleccionar el texto dándole valores a estas propiedades. Las diferencias entre uno y otro control comienzan ahora. En un RichTextBox, con un texto seleccionado, podemos cambiar el tipo de letra, su tamaño, su color, etc.

Tipos y tamaño de las fuentes.
El RichTextBox tiene la propiedad Font, propiedad que podemos cambiar e tiempo de diseño o en tiempo de ejecución, y que se refiere a la globalidad del RTB. Debemos señalar que en el RTB, la propiedad Font es en sí un objeto más. Objeto que tiene sus propiedades (Name, Size, Bold, Italic, etc.) Esto ocurre con los controles modernos, dada la tendencia de VB de ser cada día más un lenguaje orientado a objetos. No ocurre lo mismo con otros controles ya conocidos (CommonDialog, por ejemplo) que deben mantenerse con la nomenclatura anterior por razones de compatibilidad con versiones anteriores de VB. Veamos esto en el siguiente ejemplo, en el que se modifica la propiedad Font de RTB con el CommonDialog CD1 RTB.Font.Name = CD1.FontName RTB.Font.Size = CD1.FontSize RTB.Font.Bold = False RTB.Font.Italic = False
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 251

Propiedades SelBold. Propiedades Text y TextRTF Las vimos al principio. de forma que pueden tener estas dos sintaxis: Escritura: RTB. RTB.SelUnderline = True pondrá en subrayado el texto seleccionado.SetBold = True pondrá el negrita el texto seleccionado.SelColor = &HFF Al igual que las otras propiedades.Text MiVariable contendrá todo el contenido de RTB en formato de texto plano La propiedad TextRTF es similar.SelFontSize = 10 Devuelve o establece el color del texto seleccionado. o si el cursor de escritura está al final del escrito.Name.SelColor = RGB (255.e.Text = “Siempre nos quedará París” Esta instrucción sustituye todo el contenido del RTB por el texto Siempre nos quedará París Lectura: MiVariable = RTB. La propiedad TextRTF contiene TODO el texto del RichTextBox en formato de texto enriquecido. la propiedad elegida permanecerá vigente para la escritura que se realice a partir de ese punto. ya que el RTB tiene la gran ventaja que puede usar varios tipos de letra y tamaños dentro de un mismo texto. ( RTB = Nombre del control RichTextBox ) Si el texto seleccionado está en la parte final del texto. SelUnderline Estas propiedades son del tipo Booleano (True/False) y nos permitirán poner el texto seleccionado en Negrita. si el texto seleccionado está al final del texto. (Fíjese que esta propiedad no lleva ningún punto intermedio) que cambia el tipo de letra en el texto que hayamos seleccionado. Estas propiedades son de lectura y escritura. La propiedad Text contiene TODO el texto del RichTextBox en formato de texto plano. P. Si la usamos como lectura: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 252 . lo que hará será cambiar el tipo de letra a partir de ese punto.SelColor = 255 RTB. Por ejemplo.0) RTB. RTB1. Cursiva. RTB. RTB1. Tachada y Subrayada respectivamente. Los ejemplos siguientes cambiarán el texto seleccionado a color rojo RTB. P.Name y en el CD1 ponemos FontName) Con la propiedad Font podemos escribir en el RTB usando la misma letra para todo el texto.SelItalic = True pondrá en cursiva el texto seleccionado. o si el cursor de escritura está al final del escrito y no se ha seleccionado ningún texto. y si no hemos seleccionado ningún texto. y el cursor de escritura se encuentra al final del texto escrito. pero con texto en formato enriquecido. SelStrikethru.(Observe que en el RTB ponemos Font. RTB.0. SelItalic. sino SelFontName. SelFontName SelFontSize SelColor Esta propiedad devuelve o establece el nombre de la fuente en el texto seleccionado.SelStrikethru = True pondrá en tachado el texto seleccionado. Para poder cambiar de letra no usaremos Font. Puede usar también varios colores.e. Para definir el color puede usarse cualquiera de los métodos explicados en un capítulo anterior.SelFontName = “Arial” Devuelve o establece el tamaño de la fuente en el texto seleccionado. Sin embargo verá que esta propiedad prácticamente no se va a usar. la propiedad elegida permanecerá vigente para la escritura que se realice a partir de ese punto. RTB.

o las del punto donde se encontrase el cursor. más los caracteres que definen el tipo de letra. Aquellas contenían TODO el texto del RichTextBox. cambiará el texto anterior por este. en formato RTF. Sintaxis de Lectura) MiVariable = RTB. etc. SelText Devuelve o establece el texto seleccionado en formato de texto plano. Estas. o si teníamos texto seleccionado. No está disponible en tiempo de diseño. MiVariable = RTB. Si TuVariable contuviese un texto en formato de texto plano.TextRTF MiVariable contendrá el texto. lo escribirá tal cual. SelRTF Devuelve o establece el texto seleccionado en formato . pero en este caso el texto reemplazado o devuelto mediante la propiedad SelRTF está en formato RTF. sustituirá el texto que tuviésemos seleccionado por el contenido de MiVariable. Propiedades SelText y SelRTF Es conveniente no confundirlas con las anteriores. Esta propiedad es equivalente a la propiedad SelText y funciona de forma idéntica. Lectura: Teniendo un trozo de texto seleccionado. Al igual que SelText es de lectura y escritura. y lo escribirá con todos los detalles de tipo de letra. etc. el contenido de RTB será justamente ese texto. escribirá ese texto en el lugar donde estuviese colocado el cursor. que contuviese el formato RTF. Si el contenido de MiVariable fuese un texto plano.SelText MiVariable tomará el valor del texto que estuviese seleccionado en formato de texto plano. tamaño. nos permite: Escritura: añadir texto (que se colocará en la posición en la que esté el curso) o cambiar el texto seleccionado por otro. con todas sus florituras de tipo de letra.RTF. Si la usamos como escritura: RTB. solo el texto que está seleccionado. escribirá ese texto. con el tipo y tamaño de letra que tenga en su propiedad Font. Esta propiedad devuelve una cadena de longitud cero ("") si no hay texto seleccionado en el control. La instrucción RTB. Si no hubiésemos seleccionado previamente ningún texto.SelText = “Siempre nos quedará París” Introducirá el texto anterior en la posición donde estuviera el cursor.SelRTF MiVariable contendrá el texto que estuviese seleccionado.TextRTF = TuVariable Si TuVariable contiene un texto en formato RTF. Al ser una propiedad de lectura y escritura. tamaño. tamaño. etc.. Sintaxis (Escritura) RTB. No está disponible en tiempo de diseño. usando las mismas propiedades para la letra que tuviese el texto seleccionado previamente.MiVariable = RTB. negrita. como vimos al principio. Alineación y márgenes del texto LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 253 .SelRTF = MiVariable Si el contenido de MiVariable está en formato RTF.

SelStart = 1 RTB. por lo tanto. Es aplicable todo lo que se dijo para SelIndent. Recuerde. y luego ejecutar la instrucción anterior. En realidad lo que se usa mucho es separar la primera línea del párrafo un poco más que el resto de las líneas.SelIndent = Val(TBSangria) Separa el párrafo correspondiente a la línea donde está en ese momento al cursor. La línea puede ser mas ancha que el ancho del RichTextBox. y otro margen desde el borde derecho hasta el final de la línea (Propiedad SelRightIndent). En este caso la línea no cabe en el RTB. (Que a partir de ahora la llamaremos Línea en curso) El espacio que separa ese párrafo del borde izquierdo del RichTextBox es un valor igual al que hayamos introducido en el TextBox TBSangría. ese punto será la referencia que utilice la propiedad SelRightIndent para determinar el punto a partir del cual creará el margen derecho. esta referida al margen derecho y aquella al margen izquierdo. También se puede poner una sangría a las líneas segunda y siguientes respecto a la primera línea del párrafo (Propiedad SelHangingIndent). Con la instrucción RTB. medido en las unidades de medida del formulario que contiene a RTB. La medida de estos márgenes y sangrías se realiza en las unidades de medida del formulario que contiene al RichTextBox.SelIndent = Val(TBSangria) Margen derecho. debemos seleccionar esos párrafos antes de ejecutar la instrucción anterior. expresada como siempre en las unidades de medida del formulario. Si queremos separar varios párrafos. Se refiere a la propiedad RightMargin. La sangría francesa consiste en separar la segunda línea y siguientes cierta medida a la derecha respecto a la primera línea. (Propiedad SelIndent).SelLength = Len(RTB. Para poner una separación desde el borde izquierdo de todas los párrafos del texto deberemos primero. seleccionar todo el texto. Algo así LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 254 . sangría que no se suele usar (a lo mejor se usa en Francia). Con la instrucción: RTB. Parece un poco largo la definición de esta propiedad. Este tipo de sangría es la sangría francesa.El RichTextBox permite crear un margen desde el borde izquierdo hasta el comienzo de la escritura. Margen izquierdo.RightMargin = Val(TBAncho) La instrucción anterior fija como distancia máxima que puede ocupar una línea de texto la cantidad introducida en TBAncho. Longitud máxima de la línea desde el borde izquierdo. Por supuesto. sólo hace la sangría con el párrafo que contiene la línea en curso. Esta propiedad es completamente equivalente a la anterior. RTB. También será la referencia derecha cuando centremos un texto o lo alineemos a la derecha. Lo verá mas adelante. Veamos un ejemplo comentado de estas propiedades. Esta propiedad marca la distancia desde el borde izquierdo del RichTextBox hasta el límite máximo utilizable por el texto. Este valor es el que se toma como fin de la zona utilizable por el texto. Esto podemos lograrlo combinando estas tres instrucciones: RTB.Text) RTB. pero puede visualizar la línea completa usando baraas de scroll horizontales (Vea propiedad ScrollBars más adelante) Sangría francesa. Esto puede conseguirse dando un valor negativo a la propiedad SelHangingIndent. o limitar el ancho de la línea (Propiedad RightMargin).SelRightIndent = Val(TBMargenDcho) Separamos el final del párrafo donde está la línea en curso una distancia igual al valor de TBMargenDcho. Usaremos la propiedad SelRightIndent.

basta con ejecutar la sentencia SelBullet = False LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 255 . no el borde lateral derecho del RTB.Esta es la primera línea de este texto donde se explica lo que es una sangría francesa en realidad desconozco si en Francia usan este tipo de sangría. dando un valor negativo a la propiedad SelHangingIndent. para poner una viñeta podemos poner RTB. BulletIndent. la propiedad SelBullet debe estar puesta a True. propiedad Booleana que si la hacemos True convertimos el párrafo donde está la línea en curso en una viñeta. ese párrafo será un párrafo normal. Por ejemplo. Pero para que esto resulte. Incluso podemos poner viñetas Una viñeta es un párrafo marcado con un punto en su comienzo. y que lleva una cierta sangría respecto al borde izquierdo del RichTextBox. separar la primera línea un poco respecto a las demás. Puede hacer lo que parece mas lógico. un control que nos permite realizar editores de textos muy potentes. siempre que esté bien fresquita. debe poner un valor al menos igual a la propiedad SelIndent. Viñetas El RichTextBox es. Para poner una viñeta es necesario jugar con dos propiedades: SelBullet. El centrado de una línea o párrafo se logra mediante la propiedad SelAlignment Puede tomar los valores 0 (alineado a la izquierda). En el ejemplo siguiente.SelAlignment = 1 RTB.SelAlignment = 0 RTB. hacemos una sangría solamente a la primera línea del párrafo donde está la línea en curso: RTB. Para quitarlo. como decíamos al principio.SelHangingIndent = -Val(TBSangriaEsp) (Observe el signo menos en la segunda línea) El valor de la sangría de la primera línea será el contenido en TBSangriaEsp Centrado. Si quiere alinear varios párrafos. RTB. insertará otro cada vez que pulsemos ENTER. Para que tenga efecto la propiedad BulletIndent. debe seleccionarlos antes de ejecutar la instrucción de alineamiento. Alineación a la izquierda o a la derecha.SelBullet = True RTB. 1 (a la derecha) ó 2 (centrado) Siempre se refiere a la línea en curso o al párrafo que contiene la línea en curso. propiedad a la que le pondremos un valor numérico igual a la separación que queremos poner en el texto de la viñeta.SelAlignment = 2 ‘alinea a la izquierda ‘alinea a la derecha ‘centra el texto En la alineación se tiene en cuenta la propiedad RightMargin. Si está en False. lo hará tomando como parte mas derecha del escrito el valor de la propiedad RightMargin. pero a mí me gusta más la sangría española.SelIndent = Val(TBSangriaEsp) RTB. es decir. Lo mismo le ocurre con el centrado. Esto se logra mediante la propiedad SelHangingIndent y afecta únicamente al párrafo donde se encuentra la línea en curso. No tendrá efecto alguno si SelBullet = False. si alinea a la derecha.BulletIndent = 500 Una vez puesta una viñeta en el RichTextBox.

dado que un usuario normal no está acostumbrado a realizar esa combinación para forzar una tabulación. cada uno de ellos se distingue por su índice. Tabulación del RichTextBox Si queremos crear un editor de texto de la categoría de cualquiera de los comerciales. basta con poner este código en el procedimiento GotFocus del RTB Private Sub RTB_GotFocus() Dim I As Integer ‘Con la siguiente línea se evita el error producido en aquellos controles que no tienen la ‘propiedad TabStop On Error Resume Next For I = 0 To Me. Como cualquier colección tendrá una propiedad. De esta forma. Existe una solución. Sin embargo esa posibilidad no es recomendable. Declaremos una variable tipo Objeto Control Private Sub RTB_GotFocus() Dim Pepe As Control On Error Resume Next 'De esta forma se evita el error producido en aquellos controles que no tienen la propiedad TabStop For Each Pepe In Controls Pepe. debemos poder tabular. También podemos leer el valor de SelBullet. La instrucción siguiente nos devuelve la separación de la viñeta donde tengamos el cursor. el foco se nos escapa hacia el siguiente control.Controls. La solución está en poner la propiedad TabStop de todos los controles a False. que es pulsar la combinación de las teclas Ctrl + Tab. Para poner la propiedad TabStop a False en todos los controles de la colección Controls del formulario. el objeto Controls.TabStop = False Next End Sub Nota. Este objeto es una colección. con el siguiente código: For Each Control In Controls LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 256 . cada vez que el RichTextBox toma el foco. Y este índice comienza por el 0 y termina por el n-1. al dar el tabulador ningún control se “querrá” quedar con el foco. En estas condiciones el resultado es que el cursor de escritura pasará a la siguiente tabulación. Devolverá Null. la propiedad Count que toma el valor igual al número de controles existentes en el formulario. Como cualquier cosa de VB formada por varios elementos.1 Controls(I). La propiedad BulletIndent devuelve 0 si la selección abarca múltiples párrafos con distintos ajustes de margen o si el párrafo no es una viñeta. True. y está formada por todos los controles del formulario. La selección abarca más de un párrafo y contiene una mezcla de estilos de viñeta y no viñeta.La propiedad BulletIndent es de lectura y escritura. Es decir. en su procedimiento GotFocus. La párrafos de la selección no tienen estilo de viñeta. Para ello vamos a explicar un nuevo objeto Visual Basic. y por lo tanto el foco seguirá en el RichTextBox. El primer problema es que si estamos escribiendo sobre el RichTextBox y pulsamos Tabulador. de forma que cada vez que pulsemos la tecla Tabulador el cursor de escritura se coloca al inicio del siguiente de esas marcas. según el orden de la propiedad TabIndex. Los párrafos de la selección tienen estilo de viñeta. siendo n = número de elementos de esa colección. Tabular significa crear unos hitos o marcas a una determinada distancia del borde izquierdo del papel. False.TabStop = False Next I End Sub Podemos hacerlo de otra forma. Si va a la información del RichTextBox podrá ver un ejemplo de esto.Count . Vamos a ver como se puede poner la propiedad TabStop a False en todos los controles del formulario.

SelFontSize RTB.SelTabs(3) = 4000 RTB.SelTabs(0) = 1000 RTB. Esta forma de escribir subíndices y superíndices se debe aplicar cada vez que queramos escribir uno de ellos..e. si queremos crear 5 tabulaciones RTB. Para ello. un subíndice. Si pretende darle valor a un tabulador mayor que el número de tabuladores real (por ejemplo. Dado que pueden existir varias tabulaciones.SelTabs(4) = 5000 Con estas líneas determinaríamos la posición de tabulación de los 5 tabuladores.Control. poner esa propiedad a 0. escribiría como subíndice o superíndice el resto del texto. en el procedimiento LostFocus del RTB pondremos el código anterior.SelTabs(5) = 5000) le dará un error.SelFontSize = TamIni LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 257 . obtendremos un superíndice. poniendo True en vez de False en la propiedad TabStop.e.SelTabCount = 5 Propiedad SelTabs Establece el valor numérico (separación desde el borde izquierdo) de las tabulaciones.SelCharOffset = 40 RTB. OTRAS PROPIEDADES Propiedad SelCharOffset Nos permite crear subíndices y superíndices.SelFontSize = TamIni .SetFocus Para restaurar los valores anteriores RTB. P. Antes de darle valor a la propiedad SelTabs deberemos haber creado los tabuladores mediante SelTabCount. si es negativo. deberemos distinguirlas entre ellas mediante un índice.SelTabs(1) = 2000 RTB. Programar las medidas de las tabulaciones. Recuerde que los valores de los tabuladores debe darlos en las unidades de medida del formulario. Si Número es positivo. Propiedad SelTabCount Establece el número de tabulaciones en un RTB. El índice para la primera tabulación es el 0 RTB. si pone en el caso anterior RTB.SelCharOffset = Número Donde Número indica la separación del superíndice o subíndice en Twips. Pero cuando salgamos del RichTextBox. e inmediatamente.4 RTB.SelTabs(2) = 3000 RTB. para poner un superíndice: TamIni = RTB. La sintaxis es: RTB.TabStop = False Next Control Milagros del Visual Basic: Así no funciona Ya funciona perfectamente el tabulador en el RichTextBox. ya que si no lo hacemos así. P. debemos volver a poner la propiedad TabStop de todos los controles a True.

RTB.SelCharOffset = 0 RTB.SetFocus

Propiedad SelProtected
Es una propiedad Booleana, que nos permite proteger contra cualquier cambio a una parte del texto (o todo el texto) que contiene el RTB. Para proteger una parte del texto basta con seleccionarla y a continuación ejecutar la instrucción RTB.SelProtected = True Una vez protegida una parte del texto, esa parte no se puede variar. Puede desprotegerse, volviendo a seleccionarla y ejecutando la instrucción:

Propiedad ScrollBars

RTB.SelProtected = False

Pone barras de desplazamiento al RichTextBox. Esta propiedad puede establecerse a 0 (None, ninguna), a 1 (Horizontal), 2 (Vertical) o 3 (Both, ambas). Cuando las barras de desplazamiento no son necesarias, bien porque hay pocas líneas, bien porque hay pocos caracteres por línea, las barras de desplazamiento están desactivadas. Es frecuente pensar que las barras de desplazamiento horizontal no funcionan. Y eso ocurre porque siempre se ven desactivadas. En realidad lo que pasa es que solamente se activan cuando la línea de texto es mas ancha que el ancho del RichTextBox. Puede ocurrir eso cuando la propiedad RightMargin tiene un valor superior a la anchura del control, circunstancia que nos permite escribir saliéndonos del control, y es en solamente en ese caso en el que se activa la barra de scroll horizontal. Las barras de desplazamiento pueden desactivarse mediante la propiedad DisableNoScroll.

Propiedad DisableNoScroll
Devuelve o establece un valor que determina si están desactivadas las barras de desplazamiento en el control RichTextBox. Sintaxis NombredelRichTextBox.DisableNoScroll = True / False

Si es False, las barras de desplazamiento aparecen normalmente. Si es True, las barras de desplazamiento aparecen atenuadas. Propiedad Appearance Plano o tridimensional, como en el resto de los controles. Propiedad AutoVerbMenu Propiedad Booleana que indica si se presenta un menú emergente cuando el usuario hace click con el botón derecho del ratón. El menú emergente muestra los comandos de Deshacer (Ctrl-Z) cortar (CtrlX), copiar (Ctrl-C), pegar (Ctrl-V) y Eliminar (Supr) Pero no es necesario escribir código en ninguna parte para que se realicen estas operaciones (Por una vez, VB nos regala unas operaciones. No es VB, es Windows directamente) Sintaxis NombredelRichTextBox.AutoVerbMenu = True / False Si esta propiedad está a True muestra el menú. False no lo muestra. Propiedad BorderStyle Sin borde o con borde (None o Fixed Single) Propiedad Enabled Propiedad Booleana. Activa o desactiva el RichTextBox FileName
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 258

Esta propiedad devuelve o establece el nombre del fichero .RTF cargado en el RichTextBox. Si ejecutamos la línea de código : RTB1.Filename =”C :\CursoVB\Mitexto.rtf” lo que ocurrirá es que nuestra aplicación cargará el fichero C :\CursoVB\Mitexto.rtf en el RichTextBox RTB1. Es decir, hace lo mismo que el Método LoadFile (Vea mas abajo). Sólo puede especificar los nombres de archivos de texto o archivos .RTF válidos para esta propiedad. Le recomendamos que para cargar un texto en un RTB use siempre el método LoadFile en vez de la propiedad Filename. Si lo que hacemos con esta propiedad es consultar el fichero cargado en el RTB : Variable = RTB1.Filename obtendremos en Variable el nombre (y Path) del fichero que tenemos cargado en el RTB HideSelection Devuelve o establece un valor que determina si el texto seleccionado aparece resaltado cuando el RichTextBox pierde el enfoque. Esto es justamente lo que ocurre cuando seleccionamos un trozo de texto (Por ejemplo para pasar ese texto a negrita) y hacemos click sobre otro control (Por ejemplo, sobre un botón de comando para cambiar a Negrita) Si tenemos esta propiedad a False el texto seleccionado sigue seleccionado. Si está a True, el texto se deselecciona. NOTA Le recomiendo que cuando tenga un control para cambiar el tipo de letra, hágalo sobre un control que no acepte el foco (Label, p.e.) Sintaxis NombreRTB.HideSelection = True / False Variable = NombreRTB.HideSelection para establecer la propiedad para leerla

Propiedad Locked Igual que le ocurre al TextBox, si ponemos esta propiedad a True impedimos que se pueda cambiar el texto existente en el RichTextBox mediante el teclado. MaxLength Esta propiedad marca el número máximo de caracteres que puede contener. Si se pone a 0 (Predeterminado) admite cualquier número de caracteres. MousePointer Igual que para el resto de los controles. Multiline Igual que para el TextBox. Si está a True (predeterminado) el RichTextBox puede contener varias líneas. Si está a False, una solo. OLEDragMode OLEDropMode Estas dos propiedades son similares a la DragMode de otros controles. Se verán con mas detalle al estudiar el Drag & Drop. METODOS DEL CONTROL RichTextBox El control RichTextBox cuenta con unos métodos especiales para abrir un fichero y guardar el texto que contiene un poco especiales. Estos métodos (SaveFile y LoadFile) se pueden usar solamente cuando queremos guardar o leer el texto en formato .RTF. Con ellos no es necesario abrir el fichero (con Open Nombrefichero .....) ni cerrarlo, pero siempre para guardar o leer texto en formato RTF. Podemos leer o guardar el texto de un RichTextBox como texto plano (Como los ficheros ASCII .TXT). Para ello debemos utilizar los métodos Open Nombrefichero For Input / Output vistos en el capítulo de ficheros.
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 259

METODO SaveFile Guarda el contenido de un control RichTextBox en un archivo. Sintaxis NombredelRTB.SaveFile(nombre_ruta, tipo_archivo) Donde nombre_ruta (Parámetro requerido) es una expresión de cadena que define la ruta de acceso y el nombre del archivo que va a recibir el contenido del control, y tipo_archivo es un entero o una constante que especifica el tipo de archivo cargado, como se describe a continuación : 0 1 rtfRTF rtfText El control RichTextBox guarda su contenido como un archivo .RTF. El control RichTextBox guarda su contenido como un archivo de texto.

El valor predeterminado es 0. Si no se pone este parámetro, toma el valor 0 por defecto. Ejemplo RTB1.SaveFile “C :\CursoVB\mitexto.rtf”, 0

Guarda el contenido del RichTextBox RTB1 en un fichero llamado mitexto.rtf que está en el directorio CursoVB, con formato RTF Aparte del método SaveFile, puede utilizar la función Print de Visual Basic y las propiedades TextRTF y SelRTF del control RichTextBox para escribir archivos .RTF. Por ejemplo, puede guardar el contenido de un control RichTextBox en un archivo .RTF de este modo: Open "mitexto.rtf" For Output As 1 Print #1, RichTextBox1.TextRTF Close #1 METODO LoadFile Carga un archivo .RTF o un archivo de texto en un control RichTextBox. Sintaxis NombreRTB.LoadFile nombre_ruta, tipo_archivo Donde nombre_ruta (Parámetro requerido) es una expresión de cadena que define la ruta de acceso y el nombre del archivo que se va a cargar en el control, y tipo_archivo es un entero o una constante que especifica el tipo de archivo cargado, como se describe a continuación 0 1 rtfRTF rtfText El archivo cargado debe ser un archivo .RTF válido. El control RichTextBox carga cualquier archivo de texto.

Al cargar un archivo con el método LoadFile, el contenido del archivo cargado reemplaza a todo el contenido del control RichTextBox. Esto hace que cambien los valores de las propiedades Text y rtfText. También puede usar la función Input de Visual Basic y las propiedades TextRTF y SelRTF del control RichTextBox para leer archivos .RTF. Por ejemplo, puede cargar el contenido de un archivo .RTF en el control RichTextBox de este modo: Open "C :\CursoVB\mitexto.rtf" For Input As 1 RichTextBox1.TextRTF = Input$(LOF(1), 1) Close #1

METODO Find Busca una cadena específica en el texto de un control RichTextBox. Sintaxis Variable = NombreRTB.Find (cadena, inicio, fin, opciones)
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 260

Donde : cadena (Necesario) inicio (Opcional)

fin

(Opcional)

Opciones (Opcional) Valor 1 Constante rtfWholeWord

Una expresión de cadena que desea buscar en el control. Un índice de caracteres de tipo Integer que determina dónde comienza la búsqueda. Cada carácter del control tiene un índice entero que lo identifica de forma única. El primer carácter de texto del control tiene un índice 0. Un índice de carácter de entero que determina dónde termina la búsqueda. Una o más valores o constantes utilizadas para especificar características opcionales, como se describe a continuación. Descripción

Determina si una coincidencia se basa en una palabra completa o en parte de una palabra. 4 rtfMatchCase Determina si una coincidencia se basa el uso de mayúsculas y minúsculas de la cadena especificada además del texto de la cadena. 8 rtfNoHighlight Determina si una coincidencia aparece resaltada en el control RichTextBox. Puede combinar múltiples opciones si utiliza el operador Or. Si se encuentra el texto buscado, el método Find resalta el texto especificado y devuelve un número con la posición del primer carácter resaltado. Si no se encuentra el texto especificado, el método Find devuelve –1. Si utiliza el método Find sin la opción rtfNoHighlight aunque la propiedad HideSelection sea True y el control RichTextBox no tenga el enfoque, el control seguirá resaltando el texto encontrado. Los usos posteriores del método Find sólo buscarán el texto resaltado hasta que se mueva el punto de inserción. El comportamiento de búsqueda del método Find varía según la combinación de valores especificados para los argumentos inicio y fin. Esta tabla describe los comportamientos posibles: Inicio Especificado Especificado Omitido Omitido Fin Especificado Omitido Especificado Omitido Comportamiento de búsqueda Busca desde la ubicación inicial especificada hasta la ubicación final especificada. Busca desde la ubicación inicial especificada hasta el final del texto del control. Busca desde el punto de inserción actual hasta la ubicación final especificada. Busca en la selección actual si el texto está seleccionado o en todo el contenido del control si no hay texto seleccionado.

METODO GetLineFromChar Devuelve el número de la línea que contiene una posición de carácter especificado en un control RichTextBox. Sintaxis Variable = NombreRTB.GetLineFromChar (pos_carácter)

Donde pos_carácter (Requerido) es un entero largo que especifica la posición del carácter cuya línea desea identificar. El índice del primer carácter del control RichTextBox es 0. Utilice el método GetLineFromChar para averiguar qué línea del texto de un control RichTextBox contiene una determinada posición de carácter. Es posible que necesite hacerlo porque puede variar el número de caracteres de cada línea, lo que hace muy difícil averiguar qué línea del texto contiene un determinado carácter, identificado por su posición en el texto. METODO SelPrint Envía texto con formato de un control RichTextBox a un dispositivo de impresión. Sintaxis
LSB

NombreRTB.SelPrint(hdc)
Capítulo 1 Página 261

Visual Basic – Guía del Estudiante

Donde hdc es el contexto de dispositivo del dispositivo que va a utilizar para imprimir el contenido del control. Si hay texto seleccionado en el control RichTextBox, el método SelPrint sólo enviará el texto seleccionado al dispositivo de destino. Si no hay texto seleccionado, se enviará el contenido completo del control RichTextBox al dispositivo. El método SelPrint no imprime texto desde el control RichTextBox. En su lugar, envía una copia del texto con formato a un dispositivo que pueda imprimirlo. Por ejemplo, puede enviar el texto al objeto Printer utilizando código como éste: RichTextBox1.SelPrint(Printer.hDC) Observe que la propiedad hDC del objeto Printer se utiliza para especificar el argumento de contexto de dispositivo del método SelPrint. Nota Si utiliza el objeto Printer como destino del texto desde el control RichTextBox, deberá inicializar en primer lugar el contexto de dispositivo del objeto Printer. Esto es necesario, ya que Visual Basic no conoce el hDC del Printer hasta que se imprime algo. La información de Microsoft recomienda imprimir una cadena de longitud cero. (Ejecutar la instrucción Printer.Print “”) Sin embargo esa no es buena solución ya que da un error de impresora. Vale mas forzar la posición del papel, aunque no hiciese falta Printer.Orientation = 1 Mediante SelPrint nos podemos ahorrar la tediosa programación del Printer, pero tiene también inconvenientes: No controlamos el cambio de página, si tenemos papel preimpreso es muy difícil ajustarlo, etc. METODO Span Selecciona texto en un control RichTextBox basándose en un conjunto de caracteres especificado. Sintaxis NombreRTB.Span juego_caracteres, hacia_adelante, negado donde : juego_caracteres (Requerido) Una expresión de cadena que especifica el juego de caracteres que se va a buscar al ampliar la selección, basándose en el valor de negado. hacia_adelante (Opcional) Una expresión booleana que determina en qué sentido se mueve el punto de inserción, como se describe mas adelante. Negado (Opcional) Una expresión booleana que determina si los caracteres de juego_caracteres definen el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como se describe mas adelante. Los valores para hacia_adelante son: True (Predeterminado) Selecciona texto desde el punto de inserción actual o desde el principio de la selección actual hacia delante, hacia el final del texto. False Selecciona texto desde el punto de inserción actual o el principio de la selección actual hacia atrás, hacia el principio del texto. Los valores para negado son: True Los caracteres incluidos en la selección son los que no aparecen en el argumento juego_caracteres. La selección se detiene en el primer carácter encontrado que aparece en el argumento juego_caracteres. False (Predeterminado) Los caracteres incluidos en la selección son los que aparecen en el argumento juego_caracteres. La selección se detiene en el primer carácter encontrado que no aparece en el argumento juego_caracteres.

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 262

El método Span se utiliza principalmente para seleccionar fácilmente una palabra o una frase en el control RichTextBox. Si el método Span no encuentra los caracteres especificados basándose en los valores de los argumentos, el punto de inserción o la selección actual permanece sin cambios. El método Span no devuelve datos. METODO Upto Mueve el punto de inserción hasta el primer carácter (sin incluirlo) que sea miembro del conjunto de caracteres especificado en un control RichTextBox. Sintaxis NombredelRTB.Upto (juego_caracteres, hacia_adelante, negado) Donde : juego_caracteres (Requerido) Una expresión de cadena que especifica el conjunto de caracteres que se va a buscar al mover el punto de inserción, basándose en el valor de negado. hacia_adelante (Opcional) Una expresión booleana que determina en qué sentido se mueve el punto de inserción, como se describe en Valores. negado (Opcional) Una expresión booleana que determina si los caracteres de juego_caracteres definen el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como se describe en Valores. Valores Los valores de hacia_adelante son: True False (Predeterminado) Mueve el punto de inserción hacia delante, hacia el final del texto. Mueve el punto de inserción hacia atrás, hacia el principio del texto.

Los valores para negado son: True Los caracteres no especificados en el argumento juego_caracteres se utilizan para mover el punto de inserción. False (Predeterminado) Los caracteres especificados en el argumento juego_caracteres se utilizan para mover el punto de inserción.

El Portapapeles y el RichTextBox
Imagínese que seleccionamos un texto en un RichTextBox y ese texto lo metemos al portapapeles. Dado que el texto está escrito en RTF, ¿Como nos lo guarda el Portapapeles ? La solución es que puede guardarlo en las dos versiones. En formato de texto plano (Guarda estrictamente los caracteres ASCII del texto seleccionado) o como texto enriquecido (RTF), guardando en este caso, además del texto limpio y puro, la información del tipo de letra, tamaño, color, etc. típicas del formato RTF. Para ello debemos indicarle al portapapeles en qué formato queremos guardarlo. La línea de código : Clipboard.SetText RTB1.SelRTF, vbCFRTF guarda en el portapapeles el texto seleccionado en ese momento, en formato RTF. La línea Clipboard.SetText RTB1.TextRTF, vbCFRTF guarda en el portapapeles todo el contenido del RichTextBox (llamado RTB1 en los ejemplos) en formato RTF Las líneas :

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 263

Clipboard.SetText RTB1.SelRTF, vbCFText Clipboard.SetText RTB1.TextRTF, vbCFText guardarán, respectivamente, el texto seleccionado y todo el texto de RTB1, en formato de texto plano Pero esta no es la única forma de introducir texto procedente del RichTextBox en el portapapeles. Podemos introducir el texto seleccionado con formato RTF de la forma : ClipBoard.SetText RTB1.SelRTF Y el texto plano con Clipboard.SetText RTB1.SelText

Para introducir TODO el texto del RTB en formato RTF Clipboard.SetText RTB1.TextRTF Para meter TODO el texto del RTB en texto plano Clipboard.SetText RTB1.Text APENDICE Constantes del control RichTextBox Constante Valor Descripción

Propiedad Appearance rtfFlat 0 Uniforme. Pinta sin efectos visuales. rtfThreeD 1 (Predeterminado). 3D. Pinta con efectos tridimensionales. Método Find rtfWholeWord rtfMatchCase rtfNoHighlight 2 4 8 Determina si una coincidencia se basa en una palabra completa o en parte de una palabra. Determina si una coincidencia se basa en el uso de mayúsculas y minúsculas de la cadena especificada además del texto de la cadena. Determina si una coincidencia aparece resaltada en el control RichTextBox.

Métodos LoadFile y SaveFile rtfRTF 0 (Predeterminado) RTF. El archivo cargado debe ser un archivo .RTF válido (método LoadFile) o el contenido del control se guarda en un archivo .RTF (método SaveFile). rtfText 1 Texto. El control RichTextBox carga cualquier archivo de texto (método LoadFile) o el contenido del control se guarda en un archivo de texto (método SaveFile). Propiedad MousePointer rtfDefault 0 (Predeterminado) La forma está determinada por el objeto. rtfArrow1 Flecha. rtfCross 2 Cruz (cursor en forma de cruz). rtfIbeam 3 Cursor en forma de I. rtfIcon 4 Icono (cuadrado pequeño dentro de un cuadrado). rtfSize 5 Tamaño (flecha de cuatro puntas que señala al norte, sur, este y oeste) rtfSizeNESW 6 Tamaño NE-SO (flecha de dos puntas que señala al nordeste y al sudoeste). rtfSizeNS 7 Tamaño N S (flecha de dos puntas que señala al norte y al sur). rtfSizeNWSE 8 Tamaño NO, SE. rtfSizeEW 9 Tamaño EO (flecha de dos puntas que señala al este y al oeste). rtfUpArrow 10 Flecha hacia arriba. rtfHourglass 11 Reloj de arena (espere). rtfNoDrop 12 No colocar.
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 264

rtfArrowHourglass rtfArrowQuestion rtfSizeAll 15 rtfCustom 99

13 Flecha y reloj de arena. 14 Flecha y signo de interrogación. Ajustar todo. Icono personalizado especificado por la propiedad MouseIcon.

Propiedad Selalignment rtfLeft 0 (Predeterminado) Izquierda. El párrafo se alinea a lo largo del margen izquierdo. rtfRight 1 Derecha. El párrafo se alinea a lo largo del margen derecho. rtfCenter 2 Centro. El párrafo se centra entre los márgenes izquierdo y derecho. Propiedad Scrollbars rtfNone 0 rtfHorizontal 1 rtfVertical 2 rtfBoth 3 El FORMATO RTF Cuando se edita un texto mediante un procesador de textos, el fichero resultante se guarda don un formato distinto para cada procesador. De esta forma, un texto editado en WP no es compatible con el P.T. AmiPro, con Word o con cualquier otro. Los fabricantes de estos procesadores de textos han tenido que incluir una herramienta capaz de convertir un formato a otro para poder alcanzar la compatibilidad entre ellos que el mercado exigía. El Formato de Texto Enriquecido pretende ser un nexo de unión entre todos los procesadores de texto, para poder intercambiar ficheros editados en uno u otro. De hecho, las últimas versiones de los mas importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato. (WP, Word) Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito como los tipos de letra, tamaño, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto escrito en Word, guardado en RTF y en ASCII : Texto1 Este texto está escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamaño de las letras a tamaño mas grande, mas pequeño, etc. Fin Texto 1 El mismo texto en ASCII puro : Texto1 Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamaño de las letras a tamaño mas grande, mas pequeño, etc. Fin Texto 1 Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las líneas para poder mostrarlas en una hoja, ya que RTF utiliza líneas sin retornos de carro. Se han seccionado las líneas terminándolas con un guión bajo y comenzando en la línea siguiente también con un guión bajo. {\rtf1\ansi \deff5\deflang1033{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial;}}_ _{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;_ _\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 265

(Predeterminado) Ninguna. Sólo barra de desplazamiento horizontal. Sólo barra de desplazamiento vertical. Barras de desplazamiento horizontal y vertical.

\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\_ _green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\_ blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue_ _192;}{\stylesheet{\widctlpar \f5\fs20\lang1034 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}_ _}{\info{\author LUIS SUAREZ BERNALDO}{\operator LUIS SUAREZ BERNALDO}_ _{\creatim\yr1997\mo3\dy9\hr11\min8}{\revtim\yr1997\mo3\dy9\hr11\min9}_ _{\version1}{\edmins1}{\nofpages1} {\nofwords38}{\nofchars220}{\*\company }{\vern57431}}\margl1701\margr1701\_ _margt1417\margb1417 \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\formshade_ _ \fet0\sectd \linex0\headery709\footery709\colsx709\endnhere {\*\pnseclvl1 \pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstar_ _t1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\_ _pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5 \pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcl_ _tr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\_ _pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pn_ _start1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{_ _\pntxtb (}{\pntxta )}}\pard\plain \qj\widctlpar \f5\fs20\lang1034 Texto1 \par \par Este texto est\'e1 escrito en Word. Observe que podemos poner letra _ _{\b negrita}, letra {\i cursiva}, letra {\ul subrayada}. Podemos cambiar_ _ el color de las letras, {\cf6 rojo}, {\cf4 verde}, {\cf2 azul}. Podemos _ _cambiar el tama\'f1o de las letras a { \fs24 tama\'f1o mas grande}, {\fs16 mas peque\'f1o}, etc. \par \par \par Fin Texto 1 \par \pard \widctlpar \par } Como puede observar, el RTF incluye el texto escrito casi en ASCII, pero añadiendo una serie de datos respecto al tipo de letra, codifica los acentos, las eñes, y hasta incluye, tomándolo del ordenador, el nombre del operador que lo ha escrito. Estas informaciones también se guardan cuando se archiva un texto en el formato propio del procesador de textos, pero lo hace en binario, por lo que no lo podemos visualizar. El formato RTF, dentro de que mete toda esa información adicional, lo archiva con caracteres ASCII. MUY IMPORTANTE Observe que el fichero .RTF comienza por {\rtf Cuando tenga que importar un texto hacia un RichTextBox, puede que ese texto esté en formato RTF o como Texto Plano (Fichero ASCII puro) Para saber si el texto está en RTF analice los Cinco primeros caracteres del texto a importar. Si son {\rtf es que está en presencia de un texto RTF. Para saber si un fichero contiene texto enriquecido, basta con abrirlo como un fichero secuencial, (recuerde que un fichero .RTF tiene solamente caracteres ASCII) y leer los cinco primeros caracteres.

Ejercicio Propuesto. Conlos conocimientos de los Documentos de Interfaces Multiples, y los del RichTextBox que ha adquirido en este capítulo, y los conocimientos del menú y los ficheros que ya tiene de los capítulos anteriores, ya está en condiciones de realizar un editor de textos, casi tan bueno como el Word. Debe ponerle las funciones típicas de cortar, copiar y pegar, documento nuevo,

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 266

cerrar, guardar, guardar como, y cada vez que cierra un documento debe saber si ha habido cambios para proponer que se guarden.

Visual Basic - Guía del Estudiante Cap. 10 Procedimientos y funciones en VB
CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS - EL OBJETO ERROR
LA AYUDA DE WINDOWS

Procedimientos
Un Procedimiento en Visual Basic es un trozo de código que realiza una determinada tarea. Un procedimiento es el código que asociamos a un evento de un control (CommandButton_Click, Form_Load, ...). Un control puede tener por lo tanto, muchos procedimientos asociados. Uno a cada uno de sus eventos. Si queremos realizar una determinada tarea en un programa, y esta tarea se repite muchas veces en ese programa, podemos, por ejemplo, repetir el código tantas veces como sea necesario en los puntos del programa que así lo pidan. Esto nos llevaría a escribir líneas y líneas repetidas en nuestras aplicaciones, con el consiguiente incremento de trabajo y del volumen de la aplicación. Podemos hacer otra cosa mas práctica y elegante. Escribir ese código una sola vez, creando con él un Procedimiento. Este Procedimiento tendrá un nombre, y cada vez que queramos que se ejecute ese código bastará con nombrar por ese nombre al Procedimiento. Un procedimiento puede insertarse en un Módulo o en Formulario. Para crear un Procedimiento basta con hacer click en la Barra de Menú de VB en Insertar | Procedimiento. Observará que la palabra Procedimiento del Menú desplegable está deshabilitada si no está abierta ninguna ventana de código.
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 267

Para habilitarla, abra la ventana de código del Formulario o Módulo donde quiere insertar el nuevo Procedimiento. Una vez hecho Click en Insertar | Procedimiento le aparecerá esta ventana :

En esta ventana debe teclear el nombre que quiere dar al Procedimiento. En tipo debe elegir la opción Procedimiento (Veremos mas adelante la Función y en otro capítulo las opciones Propiedad y Evento) y en el Ambito debe elegir Public o Private dependiendo del ámbito que quiera darle : Public. Se podrá acceder a él desde cualquier Formulario o Módulo del programa. Dependiendo de donde se haya insertado el Procedimiento (Formulario o Módulo), debe citarse de la siguiente forma : Si se ha insertado en un Módulo, puede citarse solamente por su nombre. Puede citarse también por el nombre del módulo seguido por el nombre del procedimiento, separando ambos por un punto. Si el procedimiento tiene por nombre NombreProcedimiento y se ha insertado en el Módulo1 puede citarse de las dos formas siguientes en cualquier parte del programa: NombreProcedimiento Modulo1.NombreProcedimiento Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre. Desde otro Formulario o Módulo, hay que citarlo mediante el nombre del Formulario donde está insertado, seguido del nombre del procedimiento, separados por un punto. Private. Si elige este ámbito, sólo se podrá acceder a ese Procedimiento desde el Formulario o Módulo donde se haya insertado. La caja de opción (Check) que pone Todas las variables locales como estáticas nos va a poner todas las variables declaradas dentro del procedimiento como estáticas (No ponen a cero o nulo su valor cuando salimos y volvemos a entrar en ese procedimiento). Puede ahorrarnos un poco de código. El código de los Procedimientos se guarda en el General del Formulario o Módulo donde se han insertado :

LSB

Visual Basic – Guía del Estudiante

Capítulo 1

Página 268

inicie este procedimiento con una instrucción que anule la condición de tratamiento de errores: Public Sub Calcula_Dietas() LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 269 . fpublico Muchos programadores anteponen la palabra Call Call fpublico No hace falta poner Call. Por ejemplo: Private Sub Boton1_Click() On Error GoTo RutErr Lineas de código de este procedimiento ‘Llamada al Procedimiento Calcula_Dietas Calcula_Dietas Mas líneas de código de este procedimiento RutErr: End Sub Si al ejecutarse el procedimiento Calcula_Dietas ocurre un error. el programa salta a ejecutar la línea RutErr del procedimiento Boton1_Click. siempre se enteran mejor de que están llamando a un procedimiento. se lleva a ese procedimiento la condición de tratamiento de errores que existe en el procedimiento desde el que se llamó. Me parece muy bien. y que se pare la ejecución del programa en la línea del procedimiento Calcula_Dietas en la que se produjo el error. Para evitar que suceda eso. y creo que es una buena razón. Algunos programadores me dicen que al poner Call. al detectarse ese error interceptable.Para llamar a un procedimiento desde cualquier parte del código basta con escribir en una línea el nombre del procedimiento. Esto puede producirse serios problemas a la hora de depurar su programa. Cuando se llama a un procedimiento. Verá que con las funciones es distinto. Los datos que se puedan generar en un procedimiento debe extraerlos de ese procedimiento mediante variables. aunque Visual Basic lo admite. Pero no existe otra razón para ello.

. Si se declara Privada. solamente en el Formulario o Módulo donde se haya insertado. Variable2) End Function LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 270 . Ens Sub Funciones Una función es una forma especial de realizar un procedimiento. Esta variable no hace falta declararla. Parámetros de una Función Se dijo anteriormente que a una Función se le pasan uno o varios parámetros con los que va a realizar alguna operación. Imaginemos que lo que va a hacer la función de este ejemplo es tomar una cadena de caracteres (Variable1) y obtener de ella otra cadena con los caracteres iniciales de la primera. Este resultado se le introduce en una variable que tiene el mismo nombre que la función. ByVal Variable2 as Integer) End Function La función MiFuncion sabe que debe recibir dos parámetros. ByVal Variable2 as Integer) As String MiFuncion =Left (Variable1. No tienen porqué coincidir con los nombres que tengan las variables que contienen esos valores en otras partes del programa. tantos caracteres como nos indique la segunda variable (Variable2) Si. ya que la declaración de la función lleva implícito que exista una variable con ese nombre. En realidad es un procedimiento al que le pasamos una o varios parámetros con los que realizará una operación (cualquier operación. La forma de obtener los datos de la función es llamar directamente a esa función.) y cómo se le van a pasar (ByVal. y que el primero será una cadena de caracteres y el segundo un integer. Este resultado puede leerse desde otra parte de la aplicación en una variable que tienen el mismo nombre que la función. . ByRef. le pasásemos los valores : Variable1 = Guía del Estudiante Variable2 = 14 Obtendríamos como resultado la cadena Guía del Estud Ya se habrá dado cuenta de que debemos emplear Left para obtener los caracteres iniciales de una cadena. El ámbito de una Función es el mismo que el un Procedimiento. Integer. de que tipo son (String. Nuestra función quedará de la forma : Public Function MiFuncion(ByVal Variable1 as String. ParamArray). pero marcando el botón de opción Tipo Función en la caja de diálogo de la figura anterior. hay que decirle el nombre de los parámetros que se le van a pasar. no tiene porqué ser matemática) y obtendrá un resultado de esos parámetros. por ejemplo. Los nombres Variable1 y Variable2 son los nombres que usa la Función internamente..On Error Goto 0 ……………. Boolean. Para llamar a una Función son válidos igualmente los criterios expuestos para los Procedimientos en cuanto a la sentencia Call. Una función siempre da un resultado. como verá un poco más adelante. Para insertar una Función se procede de igual forma que para un Procedimiento. Esto hay que introducírselo en la propia declaración Public Function MiFuncion(ByVal Variable1 as String. Si se declara Pública puede usarse en toda la aplicación. Al declarar la Función.

caso del ejemplo anterior.) Donde MiFuncion es una variable que se ve en todo el ámbito de la función. basta con citarla por su nombre y ponerle los parámetros necesarios.Text. y un Label (Label1) donde va a ver el resultado. Val(Text2. Visual Basic le invitará a introducir los parámetros citándole su nombre. Inserte una función (MiFuncion) en ese formulario : Private Sub Command1_Click() Label1. Ponga un Botón de comando (Command1) donde llamará a la función. sumándole 2. Variable2) End Function Puede pensar que para hacer esta cosa tan elemental no merece la pena hacer una función. En MultiplicaA le introducimos los datos Por Valor y en MultiplicaB por Referencia. ByVal Variable1 as String.Text. ponga un TextBox (Text1) donde va a introducir la cadena original. MultiplicaA y MultiplicaB. Pero dentro de la función vamos a cambiar uno de esos números. ese cambio se mantiene fuera de la función. Al final del procedimiento click de cada uno de ellos presentamos las dos variables que se pasan a la función en sendos Label. Efectivamente. Esto quiere significa que le estamos diciendo a la función que su resultado es un String. Val(Text2. y sobre todo. Pongamos un Botón de Comando para multiplicarlo con MultiplicaA y otro con MultiplicaB.Text)) End Sub Public Function MiFuncion(ByVal Variable1 As String. Cuando esté tecleando el código. Insertemos dos funciones. (En nuestro ejemplo. 14) y Label1 tomará como Caption la cadena Guía del Estud Pruebe esto con una pequeña aplicación. Si se pasa por referencia (ByRef). otro TextBox donde va a introducir el número de caracteres a tomar. Cuando LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 271 . Bastaría con poner en el botón Command1_Click el siguiente código : Label1. ese cambio no se manifiesta fuera de ella.Caption = Left(Text1. una función debe introducirse cuando vaya a realizar un código un poco mas complejo. y la función cambia el valor de esa variable. Hemos visto que los parámetros de la función pueden pasarse Por Valor (ByVal). ByVal X2 As Integer) As Integer x1 = x1 + 2 MultiplicaA = x1 * x2 End Function Public Function MultiplicaB(ByRef X1 As Integer. Para llamar a la función.Text)) y funcionaría igual. ByVal Variable2 As Integer) As String MiFuncion = Left(Variable1.(Observe que hemos añadido la expresión As String al final de la declaración. ¿Cuál es la diferencia ? La diferencia es que si le pasa un valor por valor (ByVal) ese valor. En un formulario.Caption = MiFuncion(Text1. Veamos esto de una forma muy sencilla : Vamos a hacer una función que multiplica dos números. Una vez realizada la operación presentamos el valor de los dos factores en dos Label a ver si ha cambiado. Public Function MultiplicaA(ByVal X1 As Integer. y Por Referencia (ByRef). aunque lo cambie la función internamente. Lógicamente. ByRef X2 As Integer) As Integer x1 = x1 + 2 MultiplicaB = x1 * x2 End Function Las dos funciones son idénticas. excepto en la forma de pasarle los parámetros. ByVal Variable2 as Integer En cualquier parte del programa podemos poner : Label1.Caption = MiFuncion (Guía del Estudiante. cuando se va a repetir en muchos procedimientos.

VB nos dará un error. Si no se hace así. 6. se pone en Label2 el valor pepe + 2 (se mantienen el cambio realizado en la función MultiplicaB x1 = x1 + 2 No queda ahí la cosa. 3. En MultiplicaB cambia al valor pepe+2 Private Sub Command1_Click() Dim pepe As Integer Dim juan As Integer pepe = Val(Text1) juan = Val(Text2) Label1 = MultiplicaA(pepe. Para pode pasar un número indeterminado de parámetros se los pasamos como PamArray : Public Sub sumacifras(ParamArray cifra()) Dim I As Integer Dim suma As Integer For I = LBound(cifra) To UBound(cifra) suma = suma + CInt(cifra(I)) Next I Label1. se le pueden pasar como Optional. juan) Label2 = pepe Label3 = juan End Sub Tras esto. juan) Label2 = pepe Label3 = juan End Sub Tras esto. No es para tanto. Cuando uno o varios de los parámetros que se pasan a una función son opcionales. Las condiciones para los parámetros opcionales es que ocupen los últimos lugares y que sean del tipo Variant LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 272 .se usa MultiplicaA el valor de X1 (pepe en el CommandButton) se mantiene. Vamos a ver que sucede cuando queremos realizar una suma. La suma de los importes de varios productos de un ticket de compra. es necesario pasárselos todos. Pero puede que algún parámetro no exista siempre. 7. por lo tanto no sabemos a priori cuantos parámetros le tenemos que pasar.Caption = suma End Sub Private Sub Command2_Click() sumacifras 1. Un valor puede pasarse también por ParamArray. se pone en Lable2 el valor pepe Private Sub Command2_Click() Dim pepe As Integer Dim juan As Integer pepe = Val(Text1) juan = Val(Text2) Label1 = MultiplicaB(pepe. Se pueden pasar uno o mas parámetros como Optional. 4. En principio parece que esto ya es para nota. 5. 8 End Sub Este código nos suma las cifras 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 La variable que se pasa con ParamArray debe ser Variant Existe otra forma de pasar parámetros : Optional Cuando se declara una función con un determinado número de parámetros. En principio no sabemos cuantos productos va a comprar un cliente. 2.

TB2 y TB3. TB2 End If End Sub Salir de una función La forma natural de salir de una función es cuando se ejecuta todo su código. si se cumple una determinada condición.Text = NOMBRE & " " & APE1 Else TB4. se puede salir de la función mediante la sentencia Exit Function LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 273 .Text = NOMBRE & " " & APE1 & " " & APE2 End If End Function Los parámetros los tomamos de tres TextBox (TB1. Usamos para ello IsMissing If IsMissing (APE2) Then TB4. siendo este último el que es opcional. TB3 Else SUMANOMBRES TB1. El segundo apellido se lo pasamos como Opcional. Optional APE2 _ As Variant) ‘ Debemos detectar si se le ha pasado el parámetro opcional. En un botón de comando ponemos este código : Private Sub Command1_Click() If TB3 <> "" Then SUMANOMBRES TB1. APE1 As String. TB2. Por ejemplo. Al final siempre tiene la sentencia End Function Se puede salir de una función antes de que termine.Hagamos un ejemplo en el que vamos a poner en un TextBox (TB4) el nombre y apellidos de una persona. La declaración de la función será : Public Function SUMANOMBRES(NOMBRE As String.

Mucho antes de terminarlo ya habremos tenido la sorpresa de que Visual Basic ha detectado un error y detiene la ejecución del programa. El programa puede funcionar correctamente si. errores de sintaxis. etc. Afortunadamente el sistema operativo está muy protegido. también hay errores no catalogados y aplicables solamente al programador. sino porque el propio error deja sin trabajar a Visual Basic o incluso al sistema operativo. acaba de producir un error No Interceptable. pero no por ello dejan de ocurrir estos errores. y en el momento de ejecutarla no tenemos metido un disquete en la unidad A:? O piense lo que ocurriría si tenemos un disquete en A:. la siguiente línea de programa: Open A:\MiFicher. Son errores no interceptables. lo normal es que no funcione bien. End If que nos faltaban. Cuando terminamos un programa. ficheros que ya estaban abiertos. Un bucle infinito es una secuencia de instrucciones tal como: Do While n < 2000 n=n+1 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 274 . es momento de pararnos en una de las cosas que un programador nunca debe olvidar: Un programa no solo debe funcionar. Los errores interceptables son aquellos que Visual Basic conoce. Es un error de código. olvidarse de algo tan fundamental como la calidad del programa.Txt. esta línea no nos puede dar error de sintaxis. Denominamos Corrección de errores al proceso de la programación en la que se analizan y corrigen los errores existentes en el código o en el funcionamiento del programa.Txt For Input as #1 Habrá notado el error de bulto consistente en que A:\MiFicher. Los dos errores anteriores son de este tipo. o el típico If sin End If seguro que se los ha encontrado repetidas veces y no vamos a ahondar mas en ellos. sino que debe funcionar bien. pero no existe en él el fichero MiFicher. Existen dos tipos de errores de ejecución: Errores Interceptables y Errores que no se pueden interceptar. tenemos un disco en la unidad A: y éste contiene un fichero llamado MiFicher.. No porque no los conozca. No existe ningún error de sintaxis. Y el programa parece que ya puede funcionar hasta el final. El programa debe entrar entonces en la fase de corrección de errores y optimización.CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS EL OBJETO ERROR Una vez que conocemos gran parte del Visual Basic. Pero. Visual Basic nos dará el mensaje de error “Error de Sintaxis” nada mas terminar de escribir la línea. ¿Que ocurre cuando estamos ejecutando el programa que contiene esa línea. Piense en un bucle infinito. en el momento de la ejecución de esa línea. Sin embargo no puede funcionar si no tenemos metido el disquete. Parece que esta afirmación carece de sentido o que al menos es una afirmación gratuita. ¿Recuerda la frase “El programa xxx ha causado un error de protección general en el Módulo.Txt” For Input as #1 Al estar escrita correctamente. Iremos corrigiendo los errores elementales que van apareciendo.. Podemos por tanto dividir los errores en errores de código y errores de funcionamiento.. o si este no tiene el mencionado fichero. Sin embargo es un defecto muy común entre programadores noveles. quizás por la alegría que da el trabajo terminado. y perder por ello la alegría que da el trabajo bien hecho. por ejemplo. No solamente existen estos errores. y que seguramente habremos hecho alguna aplicación. “ Bueno. Errores como este. Se corrige el error sintáctico en el momento y el problema queda resuelto.Txt.. aquellos que Visual Basic no puede detectar. esta vez ya bien escrita: Open “A:\MiFicher. Este tipo de error se detecta generalmente al ejecutar el código. En este caso.Txt debe ir entre comillas dobles. Corrección de Errores. Pero volvamos a la línea de código anterior. En cualquiera de estos dos últimos casos se produce un Error de Ejecución.

pero en este caso será el propio programador quien se tenga que dar cuenta de él.If n = 1000 then n = 0 Loop Podrá advertir que este bucle no se termina nunca. Number. Vemos por tanto que VB solamente nos ayudará en los errores de sintaxis. ya que VB no puede ayudarnos debido a que el código. ni lo detecta VB ni produce una caída del sistema operativo.HelpContext LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 275 . Para conocerlos. durante el tiempo de diseño. LastDLLError. Sin embargo es un error. Propiedad HelpContext Devuelve o establece el identificador de contexto de un tema para un archivo de Ayuda de Microsoft Windows. Errores Interceptables. Este tipo de error. Sintaxis Err. Por ejemplo. Sintaxis Variable = Err. Veamos lo que dice la ayuda de VB para este tema: Los errores interceptables pueden producirse cuando está ejecutando una aplicación.HelpContext [= id_contexto] Variable = Err. y los errores interceptables en tiempo de ejecución. línea a línea. Source Propiedad Description Devuelve o establece una cadena descriptiva asociada a un error. tanto en el entorno de Visual Basic como en modo autónomo. Pero puede ser también el programador quien genere el error. más normal de lo que parece. está perfectamente escrito. HelpFile. HelpContext. El Objeto Error tiene Propiedades y Métodos. El Objeto Error Objeto Error Contiene información sobre errores en tiempo de ejecución. Las propiedades del objeto Error las establece quien genera el error. ya que n no podrá alcanzar nunca el valor 2000 ya que cada vez que llega a 1000 le cambiamos su valor a 0.Description = Cadena descriptiva del error Veremos un ejemplo mas adelante.Description Err. VB dispone de un objeto que vamos a ver a continuación. Algunos de estos errores pueden ocurrir también en tiempo de diseño o en durante la compilación. Lo veremos mas adelante Al objeto Error se le designa por Err Las propiedades del Objeto Error son: Description. si el error se genera durante la ejecución. Un error interceptable es. como decíamos anteriormente. un error que Visual Basic conoce. será VB quien genera las propiedades del objeto Error.

Si la propiedad HelpContext contiene un identificador de contexto válido para el archivo especificado.HelpFile = “C:\MiCarpeta\MiFicherodeAyuda. Propiedad LastDLLError Devuelve un código de error de sistema producido por una llamada a una biblioteca de vínculos dinámicos (DLL). También nos permite establecer el número de error. La siguiente línea es operativamente igual a la anterior: Variable = Err Source Devuelve o establece el nombre del objeto o aplicación que ha generado el error originariamente. se le llama automáticamente cuando el usuario presiona el botón Ayuda (o la tecla F1) del cuadro de diálogo del mensaje de error. Sintaxis Variable = Err. El Objeto Error tiene solamente dos métodos: Método Clear Borra los valores de todas las propiedades del objeto Err. Propiedad Number Esta es la propiedad mas importante del Objeto Error. Por ello es la propiedad predeterminada. Sintaxis Err. Permite conocer el número del error producido. Esto ocurre cuando falla la ejecución de una función API. aparecerá el archivo de Ayuda completo.HelpFile Cuando se especifica un archivo de Ayuda de Microsoft Windows en HelpFile. no es necesario poner Number. Sintaxis Err. cuando nos interesa provocar un error mediante código.Number Al ser la propiedad predeterminada.Source = expresión_cadena Vea en la ayuda de VB la explicación (muy ilustrativa) de esta propiedad. Propiedad HelpFile Devuelve o establece la ruta completa del archivo de Ayuda de Microsoft Windows que debe mostrarse al producirse el error.Clear LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 276 .Source Err. con el método Raise ¡¡¡ Number es una variable tipo Long !!! Sintaxis Variable = Err.Esta propiedad y la siguiente le permiten presentar automáticamente la ayuda cuando se produce un error.Hlp” También puede leer el valor de esta propiedad: Variable = Err. se mostrará automáticamente el tema correspondiente. Si no se especifica nada en HelpFile.

Podemos llamarla mediante la sentencia GoTo. Sintaxis Err. Una Rutina es un trozo de código escrito en un procedimiento. Pero veamos previamente lo que es en Visual Basic una Rutina. se usaba esta denominación. Todos los argumentos son opcionales. Decíamos al principio del Objeto Error que sus propiedades las establece quien las generó. debemos usar ese nombre. quitando el carácter dos puntos final. ContextoAyuda Opcional. hacemos que no pase: Private Sub Command1_Click() If Text1 = "Text1" Then GoTo Rutina Else MsgBox "No pasa por la Rutina" LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 277 . Entero de tipo Long que identifica la naturaleza del error. desaparecen todas las propiedades del Objeto Error. Vamos a ver ahora como usarla. En otros lenguajes se llama así. ContextAyuda) Los argumentos de Raise se describen a continuación. que tiene un nombre. Número Requerido. Si el TextBox (Text1) mantiene su texto original (Text1) hacemos que el programa pase por la rutina.Raise(Número. Descripción Opcional. Y vea que se pueden establecer sus propiedades. Origen. Si lo hemos variado. Expresión de cadena que describe el error. y si los valores de las propiedades del objeto Err no se han borrado. Método Raise Genera un error en tiempo de ejecución. incluso en Q-Basic. si utiliza Raise sin especificar algunos argumentos. tales valores se conservarán para el error actual. Con el Método Raise se genera un error. ArchivoAyuda. Es un botón de comando. y un TextBox. excepto Número. Origen Opcional. Descripción. Exit Property Cualquier instrucción On Error De aquí se desprende que un error no “sale” del procedimiento en el que se generó. Para salir de un procedimiento el programa debe pasar necesariamente por una instrucción Exit Sub. Identificador de contexto que especifica el tema del archivo indicado en ArchivoAyuda que contiene la información de ayuda del error. Para citarla. Se accede directamente a la rutina cuando citamos su nombre en el código del procedimiento donde está la Rutina. No se extrañe si alguien le llama Label o Etiqueta.Puede utilizar Clear para borrar explícitamente el objeto Err una vez que se ha tratado un error. para no confundirla con el control. En ese momento. Ruta del archivo de Ayuda de Microsoft Windows en el que se encuentra la información sobre el error. ArchivoAyuda Opcional. El nombre de la Rutina puede ser cualquiera. Expresión de cadena que indica el objeto o aplicación que ha generado originariamente el error. donde no existían los controles Visual Basic llamados etiquetas. Veamos un pequeño ejemplo. En Visual Basic no podemos usarla. Control de los errores Ya sabemos que herramienta usa Visual Basic para detectar errores. Visual Basic llama al método Clear automáticamente siempre que se ejecuta alguna de las instrucciones siguientes: Cualquier tipo de instrucción Resume Exit Sub. y debe terminar con el carácter dos puntos (:) Por ejemplo: RutinaErrores: El nombre de la rutina debe ocupar él solo una línea. Exit Function. Sin embargo.

puede ocurrir que la unidad no tenga metido el disco. con la instrucción On error GoTo. Cuidado con GoTo Hay un dicho entre los programadores de Visual Basic. usaremos la instrucción On Error GoTo Importante. si en una línea le decimos al programa que vaya a leer un fichero de la unidad A:. el programa sabe que nada mas producirse un error. debe ir a la rutina señalada. Veamos el ejemplo anterior. Instrucción On Error GoTo Activa una rutina de tratamiento de errores y especifica la ubicación de la misma en un procedimiento. Observe el Exit Sub que tiene en la línea inmediatamente anterior a la Rutina. Para evitar que pase por ella.Else . LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 278 . el programa pasará por la rutina una vez ejecutada la sentencia condicional If . pero dicen que de estos últimos hay muy pocos.Raise 53 ‘En la línea anterior generamos “artificialmente” el error 53 MsgBox "No pasa por la Rutina" Exit Sub End If Rutina: MsgBox "Sí pasó por la Rutina" End Sub Cuando insertamos la línea On Error GoTo Rutina. bien porque hayamos dirigido allí la ejecución del programa (mediante GoTo) o bien porque el programa pase por la rutina al ejecutarse.End If Exit Sub Rutina: MsgBox "Sí pasó por la Rutina" End Sub La rutina es en realidad un trozo de código del procedimiento que se ejecutará. ponemos ese Exit Sub que hará que el programa salga del procedimiento sin llegar al final. O que lo tenga metido pero que no exista el fichero en ese disco. En el ejemplo anterior. igual que si se tratase de cualquier otra parte del programa. Para que pase por una rutina. al darse la condición de que ha ocurrido un error.End If. Así por ejemplo. En esa rutina tomaremos las medidas adecuadas para que se subsane el error producido. Los que nunca usan GoTo. También puede utilizarse para desactivar una rutina de tratamiento de errores. Los programadores se dividen en tres grupos. la condición para que pasase por la rutina era que se cumpliese una determinada condición en Text1. Los que usan GoTo sin saber usarla y los que usan GoTo sabiendo usarla. Private Sub Command1_Click() On Error Resume Next ‘Con la línea anterior le decimos que se olvide del error y siga en la línea siguiente ‘a la que provocó el error If Text1 = "Text1" Then GoTo Rutina Else On Error GoTo 0 ‘La línea anterior desactiva el tratamiento de errores generado en la línea segunda (On ‘Error Resume Next). Sintaxis On Error GoTo Rutina On Error Resume Next On Error GoTo 0 ‘Va a la Rutina especificada ‘Pasa del error y continúa en la línea siguiente a ‘la que provocó el error ‘Desactiva todo el tratamiento de errores que ‘haya activado en el procedimiento actual. Si no lo ponemos. Pruebe a quitar y poner esta línea (On error GoTo 0) Err.

Numbber = 0). Resume Rutina La ejecución continúa en la rutina citada en la instrucción. sino de una utilización incorrecta del programa.Txt" For Input As #1 Line Input #1. En este caso. Es así ya que la Instrucción Resume hace desaparecer el error mediante código (Pone Err. Si el error se ha producido en un procedimiento llamado. Hagamos un ejemplo donde al pulsar un botón (Command2) se busca el fichero Mificher.La rutina de corrección de errores debe contemplar cada uno de esos dos casos. Puede ocurrir que el error no se haya producido en el mismo procedimiento que contiene la rutina de tratamiento de errores. Pero en programación hay que prever estas eventualidades. y que contuviese un fichero llamado Mificher. La Instrucción Resume puede tener las siguientes sintaxis: Sintaxis Resume [0] Resume Next Resume Rutina Resume [0] Si el error se ha producido en el procedimiento que contiene el controlador de errores. La rutina debe encontrarse en el mismo procedimiento que el controlador de errores. No se ha encontrado el archivo En realidad estos errores no son de programa. la ejecución continúa en la instrucción del procedimiento que contiene la rutina de tratamiento de errores (o la instrucción On Error Resume Next) inmediatamente posterior a aquélla desde la que se llamó a otro procedimiento. Resume Next Si el error se ha producido en el procedimiento que contiene el controlador de errores.Caption = Variable Close #1 End Sub Si no está metido el disco en la unidad A nos dará el siguiente error: Se ha producido el Error ‘71’ de tiempo de ejecución. de la que decíamos que “pasaba” del error y continúa en la línea siguiente a la que provocó el error. Variable label1. Ya que conocemos las instrucciones On Error GoTo y Resume. la ejecución continúa con la instrucción inmediatamente posterior a la que lo causó. veamos en el ejemplo anterior como resolvemos el problema de que no exista disco en la unidad A: o que en el disco no exista el fichero buscado: EJEMPLO LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 279 . El disco no está listo Si estuviese metido el disco. daría este error: Se ha producido el Error ‘53’ de tiempo de ejecución. ya que debería estar metido el disco.Txt.Txt en el disco A: y el contenido de ese fichero se coloca en Label1 Private Sub Command2_Click() Dim Variable As String Open "A:\Mificher. la ejecución continúa con la instrucción que lo causó. pero no tuviera un fichero llamado Mificher. la ejecución continúa en la instrucción del procedimiento que contiene la rutina de tratamiento de errores desde la que se llamó a otro procedimiento.Txt. sino en otro al que se le ha llamado desde este. Si le añadimos Next el programa sigue ejecutándose en la línea siguiente a la que generó el error. Y lo lógico sería poner un aviso diciéndole al usuario que la unidad A: no está preparada (caso 1) o que el disco no contiene el fichero buscado (caso 2) Instrucción Resume Hemos visto en el apartado anterior la sentencia On Error Resume Next. y actuar de forma distinta en uno y en otro.

Un programa perfecto es aquel que contempla todas las posibilidades de error y les da solución a todas. ) y una rutina de corrección.Caption = Variable Close #1 RutinaErrores: If Err. El trabajo es grande. El Objeto Debug Es momento ahora de hablar de la ventana de depuración.Print MiVariable Veremos en el ejemplo de este capítulo una aplicación de la ventana de depuración que le dejará claras las ideas. por ejemplo el valor de una variable en un determinado momento: Debug. Variable Label1.Txt" For Input As #1 Line Input #1. que se llama precisamente Objeto Debug: Este objeto no tiene propiedades y tiene solamente un método: el Método Print En esta ventana podemos presentar otro tipo de datos. Como hemos ‘intercalado un MsgBox.Print Err o simplemente Hemos visto la forma de detectar un error y tomar las medidas oportunas para que el programa siga funcionando. en otras que repita un procedimiento. basta con insertar esta línea de código en la Rutina de Error: Debug. Introduzca uno" Resume ‘Al poner Resume (sin mas) el programa seguirá ejecutándose ‘en la misma línea que provocó el error. Basta con Err MsgBox "La Unidad A no tiene ningún disco. que lleva implícita una espera a que se ‘le haga click en su botón. En esta ventana se presenta lo que escribamos en un objeto preparado para ayudarnos en la corrección de errores.Number Debug. ya ‘puede tener un disco para que no se repita el error. que un programa debería tener en cada procedimiento una llamada a la detección de errores (On error GoTo .Txt. Si queremos que cuando se produzca un error se nos presente en esa ventana.Activemos la detección de errores e introduzcamos una rutina que detecte el error ocurrido y que haga lo que tenga que hacer en cada caso: Private Sub Command2_Click() On Error GoTo RutinaErrores Dim Variable As String Open "A:\Mificher.. pero se presenta haciendo click en Ver | Ventana de Depuración de la barra de menú de Visual Basic. End If If Err = 53 Then ‘Aquí hemos puesto solamente Err MsgBox "El disco A no tiene ningún fichero llamado Mificher.. Es la ventana de Debug. No está presente normalmente en la pantalla. durante esa espera el usuario puede ‘cambiar el disco y al reiniciarse el programa en esa línea. La recompensa también. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 280 .Number. Esta ventana permite que Visual Basic se comunique con nosotros en tiempo de ejecución. En otros casos nos interesará que el programa “pase” del error.Print Err. Aquí lo hemos hecho solicitándole una operación al usuario.Number = 71 Then ‘No hace falta poner Err.. Ponga el disco correcto" Resume End If End Sub Ventana de Depuración. Esto quiere decir. El programador deberá ver en cada caso la respuesta que debe dar el programa a un determinado error..

Pero un error muy común entre programadores es autocomprobar sus errores. Una persona que nunca haya trabajado con el programa. Le recomiendo que esa labor la realice un compañero. La persona que realizó el programa sabe perfectamente lo que debe hacer. lo que le cuesta trabajo es no cometerlos. le cuesta mucho trabajo cometer errores. Y aún queriendo. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 281 . Realiza un programa y comienza a ejecutarlo intentando descubrir los errores en los que puede caer.

Podemos cambiar el color de las letras.Hlp. este capítulo no se ha actualizado. verde. Cuando se edita un texto mediante un procesador de textos.Exe para Windows 98 y Windows NT4. se sigue incluyendo este tema. las últimas versiones de los mas importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato. un texto editado en WP no es compatible con el P.exe (que es más antiguo) le diga que no se trata de un fichero de ayuda. Ese es el programa WinHelp. actualmente se está usando más el formato . un programa que funciona en Windows.Hlp. saltos de carro. tamaño. Por lo tanto no se extrañe que una ayuda que le abre perfectamente el WinHlp32.EXE (Help Compiler) que puede adaptar el fichero . rojo. usando para ello los recursos que brida Windows. Veamos un ejemplo comparativo del mismo texto escrito en Word. El Formato de Texto Enriquecido pretende ser un nexo de unión entre todos los procesadores de texto. Fin Texto 1 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 282 . Los fabricantes de estos procesadores de textos han tenido que incluir una herramienta capaz de convertir un formato a otro para poder alcanzar la compatibilidad entre ellos que el mercado exigía. el fichero resultante se guarda don un formato distinto para cada procesador.LA AYUDA DE WINDOWS NOTA sobre las ayudas de los programas Windows Hasta ahora era normal presentar las ayudas en el formato cásico de fichero . léase este capítulo) Pese a todo. Formato de Texto Enriquecido. Las razones son bastante obvias. en castellano. Windows dispone de otra utilidad. letra cursiva. Antes de comenzar a explicar como se realiza una ayuda Windows vamos a comentar el formato de archivos RTF. Observe que podemos poner letra negrita. ya que el formato Hlp sigue siendo actual. Como en todas las aplicaciones de Microsoft (MS) tienen compatibilidad hacia arriba. con Word o con cualquier otro. Este formato posiblemente le sea familiar debido a que el control RichTextBox puede guardar y leer ficheros en ese formato. Podemos cambiar el tamaño de las letras a tamaño mas grande. y para el que es aplicable todo lo descrito aque de los fichero . y cuando se habla del HC. dado el auge que ha tomado el formato Html (sobre todo desde que Microsoft lo incluyó como una parte más de Windows).Hpj. para poder intercambiar ficheros editados en uno u otro. y el trabajo a desarrollar para igualar la presentación de Windows sería laborioso.Exe para las versiones de 16 bits y las primeras versiones de Windows 95. La edición de un fichero Html es mucho mas sencilla que la de un Hlp (Y si no se lo cree. Solución : utilizar los recursos de Windows. donde se presentan distintos ficheros según las necesidades del usuario.Html que el . Toda aplicación bien terminada debe tener una ayuda. Sin embargo esta forma de presentar la ayuda nunca llegará a ser tan completa como la que brinda Windows.EXE Lo vamos viendo todo paso a paso. y el WinHlp32. Cualquier aplicación realizada en Visual Basic puede tenerla. Las siglas RTF vienen precisamente de Rich Text Format. guardado en RTF y en ASCII : Texto1 Este texto está escrito en Word.T. si la pretende abrir con el WinHelp. De hecho. Word) Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito como los tipos de letra.RTF donde escribirá la ayuda. letra subrayada. Eso sí. La presentación de la ayuda podría hacerse mediante un formulario.Exe deberíamos estar hablando del HelpWorkShop (HWC. a un formato capaz de ser interpretado por el WINHELP. Sin embargo. AmiPro.Exe.Exe). etc. etc. El recurso de Windows es un programa capaz de presentar ficheros de ayuda. (WP. De esta forma. Estos ficheros son un poco especiales y solamente se pueden presentar mediante ese presentador de ficheros de ayuda. azul. mas pequeño. el programa HC.

\red128\green0\blue128.\red128\green128\blue0. {\rtf1\ansi \deff5\deflang1033{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial.\red0\green0\blue128. letra {\ul subrayada}. Pensemos ante todo a que personas va dirigida la aplicación.}{\*\cs10 \additive Default Paragraph Font. mas pequeño. En este formato hubo que seccionar las líneas para poder mostrarlas en una hoja.\red128\green0\_ blue0. La utilidad que tiene Windows para presentar las ayudas utiliza precisamente este formato RTF.\red0\green0\blue255. lo archiva con caracteres ASCII. verde. por lo que no lo podemos visualizar. el RTF incluye el texto escrito casi en ASCII. letra subrayada. Observe que podemos poner letra negrita.}}{\*\pnseclvl2\pnucltr\pnstar_ _t1\pnindent720\pnhang{\pntxta . Antes de decidirnos a escribir el fichero de ayuda debemos pensar muy bien lo que vamos a poner en él. rojo. etc.}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5 \pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcl_ _tr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\_ _pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pn_ _start1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{_ _\pntxtb (}{\pntxta )}}\pard\plain \qj\widctlpar \f5\fs20\lang1034 Texto1 \par \par Este texto est\'e1 escrito en Word. (Word. ya que RTF utiliza líneas sin retornos de carro.\red0\_ _green128\blue128. el nombre del operador que lo ha escrito. Podemos cambiar el tamaño de las letras a tamaño mas grande. Se han seccionado las líneas terminándolas con un guión bajo y comenzando en la línea siguiente también con un guión bajo.El mismo texto en ASCII puro : Texto1 Este texto est escrito en Word. pero lo hace en binario. Por ello. WP6 y otros) Los ejemplos de estos apuntes se han realizado en Word. debemos disponer de un procesador de textos que pueda guardar el texto escrito en este formato.\red0\green128\blue0. \par \par \par Fin Texto 1 \par \pard \widctlpar \par } Como puede observar. azul. dentro de que mete toda esa información adicional. Observe que podemos poner letra _ _{\b negrita}.\red255\green0\blue255. \red255\green255\blue0. letra cursiva.\red192\green192\blue_ _192. Podemos _ _cambiar el tama\'f1o de las letras a { \fs24 tama\'f1o mas grande}. Estas informaciones también se guardan cuando se archiva un texto en el formato propio del procesador de textos.}}_ _{\colortbl. Podemos cambiar_ _ el color de las letras. y hasta incluye.\red255\green0\blue0. El formato RTF. {\cf4 verde}.\red0\green0\blue0. {\cf6 rojo}. pero añadiendo una serie de datos respecto al tipo de letra. codifica los acentos. etc. letra {\i cursiva}. Podemos cambiar el color de las letras.}{\stylesheet{\widctlpar \f5\fs20\lang1034 \snext0 Normal. las eñes.\red255\green255\blue255. sus posibles conocimientos de informática LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 283 . tomándolo del ordenador.\red128\green128\blue128. {\cf2 azul}._ _\red0\green255\blue0.\red0\green255\blue255.}_ _}{\info{\author LUIS SUAREZ BERNALDO}{\operator LUIS SUAREZ BERNALDO}_ _{\creatim\yr1997\mo3\dy9\hr11\min8}{\revtim\yr1997\mo3\dy9\hr11\min9}_ _{\version1}{\edmins1}{\nofpages1} {\nofwords38}{\nofchars220}{\*\company }{\vern57431}}\margl1701\margr1701\_ _margt1417\margb1417 \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\formshade_ _ \fet0\sectd \linex0\headery709\footery709\colsx709\endnhere {\*\pnseclvl1 \pnucrm\pnstart1\pnindent720\pnhang{\pntxta . WP5. {\fs16 mas peque\'f1o}.}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\_ _pnhang{\pntxta . Fin Texto 1 Y ahora el mismo texto en formato RTF.

. de momento.HLP haciendo click sobre el cuadrado con tres puntos (.HPJ y extensión .y de otros temas que estarán relacionados con la aplicación. Puede editarlo con el EDIT de MS-DOS o con el Block de Notas de Windows.HPJ será el que tenga el fichero de ayuda (Que se obtendrá de la compilación y tendrá por extensión .HLP. es medida siempre prudente llevarse el compilador de ayudas HC.) que está a la derecha del TextBox de Archivo de Ayuda. donde guardamos el fichero de ayuda con el nombre AYUDA1. Para acceder a la ayuda. Nuestras aplicaciones deben sacar la ayuda pulsando F1. Para ello utilizamos el compilador HC. Lo podrán hacer mediante otros procedimientos. El programa HC..HPJ La compilación no suele dar problemas sobre todo en un fichero de ayuda tan simple de una única página.EXE al directorio donde tengamos el fichero . (FICHAYUD. se meterá en el mismo directorio donde está el fichero de ayuda.. en cualquier directorio.EXE.RTF y el . Vaya a la pestaña de Proyecto y busque el directorio y nombre del fichero .EXE.. Windows ofrece la posibilidad de pulsar F1 . que debe tener extensión . Comencemos por lo mas sencillo. Es decir...HPJ.RTF Este fichero estará editado en ASCII puro. \VB\HC (en MS-DOS) y tecleemos HC C:\DIRAYUDA\ FICHAYUD.EXE hay que suministrarle la información para que pueda trabajar. planifiquemos la ayuda antes de comenzar a hacerla.. Imaginemos que lo vamos a llamar FICHAYUD. una ayuda de una única página. Movámoslo al C :\DIRAYUDA Vayamos a nuestra aplicación VB y abramos el menú de Herramientas | Opciones para sacar el cuadro de Opciones. Al compilar. Imaginemos que lo creamos y es el C :\DIRAYUDA.HLP) Tendrá. \VB\HC Pero al compilador HC.HLP en nuestro caso) que lo dejará en el directorio donde estuviera el programa HC. (Posiblemente el C :\VB\HC) Debe moverlo a otro directorio donde no estorbe y lo podamos localizar sin problemas. Se le abrirá un CommonDialog para buscarlo. dos líneas. Cree si es necesario un directorio exclusivo para la ayuda.RTF Este archivo no lo puede utilizar directamente el programa WINHELP. (C :\DIRAYUDA) El nombre que decida para este fichero con extensión . por lo que tendrá que ir al DOS y ejecutarlo. Este compilador no es una herramienta Windows. Esa información se la damos en un fichero que le pasaremos como parámetro..HPJ y como se dijo. obtenemos un fichero con el mismo nombre que el fichero .EXE. Hay que compilarlo....RTF Vayamos al directorio C :\ . NOTA : Para evitar liarse con los directorios. Escriba el texto de ayuda con Word y guárdelo en formato RTF. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 284 .EXE se encuentra en el directorio C :\ . [FILES] AYUDA1. pero preferentemente en uno que no se mezcle con otros ficheros para poder localizarlo mejor.HPJ y que meteremos en el mismo directorio donde tengamos el fichero de ayuda AYUDA1.

..Lectura de datos --------------salto de página manual ......... -------------salto de página manual . .....EXE y este programa presentó el fichero de ayuda asociado con el proyecto. ..... .. Puede de esta forma recorrer todo el fichero de ayuda... Y si supera en vertical las dimensiones de la ventana....Introducción de datos 4 . pongamos en esta primera página el índice de temas. Volvamos al editor Word y abramos el fichero que habíamos creado de una página.... aparecen barras de scroll verticales. y añádale mas páginas introduciendo avances de página manuales (Se introducen con Control + Intro) Imaginemos que tenemos esta configuración del fichero : INDICE 1 ..... Pulse F1.. Si lo hacemos así.. . Sin embargo este procedimiento no sería el mas indicado para una información de ayuda extensa.. Deberemos poner varias páginas.. .- Introducción a la Aplicación Esta aplicación está realizada para .. Observe que el texto se adapta a las dimensiones de la ventana.......Introducción a la aplicación 2 .... Ya veremos como acceder a cada una de las páginas haciendo click sobre la línea del índice que contiene el título del tema deseado..- Acceso a la Base de Datos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 285 . ¡SORPRESA ! Tenemos en pantalla la ventana de ayuda de Windows con el fichero que habíamos escrito.. . Si aparece siempre la página 1... al pulsar F1 siempre aparecerá la página 1.....Acceso a la Base de Datos 3 . . ... y en las páginas sucesivas cada uno de los temas.. Tal y como lo hace con cualquier aplicación Windows. F1 ha invocado a WINHELP..Haga click en Aceptar y ejecute la aplicación.. ...

una vez en la página 1. . . ... que nos estará mostrando el índice...... ..- Introducción de datos Para introducir datos . justamente al lado de Introducción a la Aplicación . ... ...salto de página manual ...Acceso a la Base de Datos 3 ... ... . ........ . ...- Lectura de datos Para leer los datos ..# Introducción a la Aplicación Esta aplicación está realizada para . No es suficiente esto...........Introducción de datos 4 . .. --------------------salto de página manual ----------------------- # Introducción Visual Basic – Guía del Estudiante Capítulo 1 Página 286 LSB . .. .... -------------salto de página manual .. una vez que tenga el fichero de ayuda terminado.. ..... solamente nos mostrará la página 1. . poder acceder a cada una de las páginas haciendo click sobre la línea del índice que contiene el tema de interés. sitúese con el cursor al comienzo del título de la primera página (después del índice). .... Al final obtendrá este resultado : INDICE 1 .. ...... pulsando F1. Haga click sobre Aceptar.. . . .. .. .. . es decir. . .Para abrir la Base de datos .. .. .... ..... .. Para introducir un identificador en una página.. ... Debemos hacer algo para. . . no pueden existir dos páginas con el mismo identificador... . .... . Le aparecerá en la parte inferior de la pantalla un cuadro para introducir el identificador de esa página.... . ... Inserte en ese punto una Nota al pié (Abra el Menú Insertar | Nota al Pié del Word) Le aparecerá esta ventana : Introduzca una almohadilla (#) en el TextBox Marca personal.. Este identificador debe ser único..... . Para ello debemos poner un identificador a cada una de las páginas.. .EXE . . .......Introducción a la aplicación 2 .. Ya tenemos hecho un fichero de ayuda con varias páginas. . -------------salto de página manual .. Repita el proceso para todas las páginas insertándoles una Nota al pié a cada una.....Lectura de datos .. ya que WINHELP.

. .salto de página manual . ¿Qué podemos hacer para asociar estos identificadores a las líneas correspondientes del índice ? Muy sencillo. . . A LA IZQUIERDA Todas las notas al pie Introducción Acceso # Meterdatos # Leerdatos # # (Observe que estamos simulando la ventana de Word. Le aparecerá el cuadro de diálogo..entienda que estamos simulando lo que Vd. .. dependiendo de como las tenga dispuestas). ... .. . . . . . . ..# Acceso a la Base de Datos Para abrir la Base de datos ... ... .. . . Seleccione todas las líneas que quiere asociar a cada uno de los identificadores (Una a una o todas a la vez. . ..... . . . . . . . . ..... Donde ve . y es el siguiente paso que debe hacer : Volvamos a la primera página del documento Word.Introducción de datos 4 .# Introducción de datos Para introducir datos . y en ese momento el puntero se convierte en una mano. ... EN ESTA PARTE DE LA PAGINA VERA UNA SEPARACION QUE PONE..... Acceso Meterdatos # Leerdatos # # LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 287 ... En nuestra aplicación ocurrirá lo mismo... y vaya al menú Formato | Fuentes .Lectura de datos Habrá observado en las aplicaciones Windows que para seleccionar un tema hay que poner el puntero del ratón sobre la línea deseada.Introducción a la aplicación 2 .... Vaya al TextBox Subrayado de ese cuadro de diálogo y elija Doble... . . ve en la ventana real) En la parte inferior puede ver los identificadores que se han asociado a cada página.salto de página manual . que está en color verde.. .. -------------------# Lectura de datos salto de página manual ----------------------- Para leer los datos .Acceso a la Base de Datos 3 . INDICE 1 ... .... donde tenemos el índice. ...

Cuando termine. Al hacer click el puntero de escritura se coloca en ese punto.Al ponerles doble subrayado.HLP y le sugiero que lo pruebe. vaya al menú Herramientas | Opciones y sobre la pestaña Ver seleccione Texto oculto. Tiene que escribir a continuación de cada línea el nombre del identificador que corresponda. ¡ Ya tenemos una ayuda de varias páginas ! Ventanas Emergentes Es posible que dentro de la información presentada en cualquiera de las páginas anteriores. Habrá observado en las ayudas de Windows que algunas frases dentro de las páginas de ayuda están en verde. guarde el documento en formato RTF y compílelo de la forma explicada mas atrás. pues el compilador comprueba que todos los identificadores se corresponden en el índice y en las páginas. Pulse F1 y le saldrá la página con el índice y las líneas del índice en verde. Verá también todos los caracteres de control del documento. volvamos al documento Word. Para escribir un texto invisible en Word hay que pulsar las teclas Control + Mayúsculas + O. indicándole que hay párrafos ocultos. exista una palabra o frase que quisiera explicar con mas detalles. Pero lógicamente no querrá que se vea en la pantalla de ayuda. le aparecerán en la ayuda de color verde. mejor dicho una observación. y al acercar el puntero del ratón a ellas se convierte en una mano. y el puntero se le transformará en una mano cuando lo ponga encima de una de esas líneas. Si lo prefiere. Proceda de igual forma con todas las líneas del índice. Por lo tanto debe hacerlo invisible. INDICE LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 288 . Para ello tiene que llevar el puntero del ratón justamente al final de cada una de las líneas. moviéndolo al directorio C :\DIRAYUDA y ejecutando la aplicación. No verá lo que escribe pues para eso está escribiendo con texto invisible. Pero todavía queda asociarlas a cada uno de los identificadores. Si lo ha hecho todo perfectamente. ha detectado los textos ocultos que contiene el fichero. También le dará un error. Si le falta algún pie de página o un salto de carro manual le dará error. al seleccionar una y otra línea le aparecerá la página correspondiente. Para poder hacer lo mismo en nuestra ayuda. Posiblemente ahora le salgan errores de compilación. Ni caso. Pulse las tres al mismo tiempo y a continuación escriba el nombre del identificador que corresponda. Es lógico. Puede visualizarlo mediante el botón del editor Word. Le habrá creado el archivo .

. Podemos usar la tecla F1 para acceder al índice de la ayuda de una aplicación y movernos a lo largo de la ayuda seleccionando una u otra información. . Ejecute la aplicación y compruebe como vamos avanzando en el tema de las ayudas de Windows. Ha llegado el momento de sacarle partido a esa propiedad.. .. al hacer click sobre una de estas palabras se abra.. vaya a las palabras o frases que quiere explicar con el texto de esas páginas. .. Este número se aplica para determinar la ayuda interactiva asociada a este control... Pretendemos que... Una vez terminado de introducir todas las nuevas páginas.. ....... selecciónelas y deles el atributo de subrayado simple (Hágalo de forma similar a cuando hizo lo del subrayado doble... .... ...... . ....# Introducción de datos Para introducir datos .. otra ventana con la explicación de lo que es esa palabra concreta. ...... .. ... Añádalas de la misma forma insertándoles un pie de página y el identificador deseado.. . Si repasamos las propiedades de los controles. dentro de la ventana de ayuda. Observe unas palabras que están subrayadas. .... .. introducir y leer..Acceso a la Base de Datos 3 ... En aquel momento decíamos que esa propiedad que establece un número de contexto asociado para este control. ... . . debemos introducir esas informaciones a base de introducir nuevas páginas en el documento Word donde editamos el fichero de ayuda. .... Introducción Acceso # Meterdatos # Leerdatos # # LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 289 ... Guarde el documento Word y vuelva a compilar como anteriormente. . . . . A veces resulta práctico seleccionar directamente la ayuda correspondiente a la función de un control. una Base de Datos.Introducción de datos 4 .Introducción a la aplicación 2 . queremos explicar con mas detalle lo que es una aplicación.Lectura de datos .... .... Puestos en nuestro caso... .... Imagínese que esas palabras tienen un significado que queremos explicar con mayor detalle.. . .# Introducción a la Aplicación Esta aplicación está realizada para ... -------------------# Lectura de datos salto de página manual --------------------------------------------- Para leer los datos .... ......salto de página manual # Acceso a la Base de Datos Para abrir la Base de datos .... Cuando ese control tenga el foco.. de la misma forma que se explicó mas atrás. Recuerde que el identificador debe ser único.. .. .. .. .. . al pulsar F1 saldrá como página por defecto la página asociada mediante la propiedad HelpContextID. Para poder hacer esto.. ..... seguro que se acuerda de la propiedad HelpContextID que tenían la mayoría de los controles VB.salto de página manual .. . .. pero esta vez SIMPLE) Introduzca inmediatamente después de la palabra o frase un texto oculto con el nombre del identificador seleccionado para la página deseada en esa palabra.salto de página manual .. . . ..1 ....... . ... . Por lo tanto. . .... asociaremos una de las páginas del documento Word anterior al número que figura en la propiedad HelpContextID.. .

Esto complicaría su fichero de ayuda original. y el usuario pulsa F1. pues el que lleva el índice debe ser el primero que figure en la lista. Puede editar estas pequeñas ayudas en otro documento Word. Esto lo podemos hacer mediante la función SHELL SHELL “WINHELP.Para establecer esta relación vayamos al fichero con extensión . con la intención de ir a ver cualquier cosa no relacionada con el control que tiene actualmente el foco. siempre tiene el foco algún control. Si ese control que ahora mismo tiene el foco tiene activado el HelpContextID. siempre podrá ir al índice haciendo click en el botón CONTENIDO de la ventana de ayuda. solamente dos líneas. El fichero FICHAYUD.HPJ que servía para introducir los datos al Help Compiler. Colóquelo tras el fichero anterior.HLP “. de la misma forma que se ha descrito. En cualquier caso.HPJ y tenía por el momento. y darle un determinado nombre (AYUDA2. se verá sorprendido con que aparece una información que nada tiene que ver con la esperada (índice). 1 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 290 . y separado por un espacio o un tabulador. ya que en una aplicación. Puede que las ayudas que quiera aportar a cada uno de los controles sea muy breve.EXE C:\DIRAYUDA\FICHAYUD. Tiene solución. caso por ejemplo de la que puede introducir en los TextBox para indicar al usuario lo que se va a hacer con el dato concreto que se va a meter en ese TextBox.RTF En estas dos líneas le introducíamos el nombre del fichero de ayuda [FILE]. Debe añadir la relación entre los nombres de identificador que haya puesto en ese nuevo fichero y los números de contexto de cada control. incluya en el menú (palabra Ayuda) o en un control Image con el símbolo ? una llamada al programa WINHELP. cuando un control que tiene en su propiedad HelpContextID el número 3 tiene el foco. al que debería introducir muchas páginas nuevas. Vuelva a compilar la ayuda y ejecute la aplicación. En nuestro caso se llamaba FICHAYUD.EXE. 3 y 4 a sus propiedades HelpContextID. Añada a su aplicación 4 TextBox y asígneles los valores 1.RTF para nuestro ejemplo) y añadirlo como otro fichero en la lista [FILES]. el número de contexto : [MAP] Identificador1 Identificador2 Identificador3 Identificador4 1 2 3 4 En este caso.HPJ queda de momento con la siguiente forma : [FILES] AYUDA1. Se escribirá el nombre del identificador de página. pero en principio no está bien que le aparezca en pantalla una información no esperada.RTF AYUDA2.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 1 2 3 4 Este procedimiento de acudir rápidamente a la ayuda de un determinado control puede que no sea el ideal. Lo mismo ocurrirá con el resto de los identificadores. pasándole como parámetro el nombre del fichero de ayuda. [FILES] AYUDA1. 2. al pulsar F1 aparecerá como página por defecto la correspondiente a la explicación con identificador nombre Identificador3. Y que esas ayudas breves sean muy numerosas y tal vez cambiantes de un usuario a otro. Vaya pasando el foco de uno a otro TextBox y comprobándolo. Añadamos ahora en otro apartado [MAP] la relación entre los identificadores de página y los números de contexto de la propiedad HelpContextID de cada uno de los controles que la tengan activada (valor distinto a 0).

Vayamos al documento Word. introducirlo a la izquierda con texto a su derecha o a la derecha con texto a su izquierda. Este método se denomina de referencia a un gráfico. No se olvide del 1 final.ShowHelp. La propiedad HelpCommand de este CommonDialog debe estar puesta a 3 para que comience mostrando el índice de la ayuda. Se supone que el gráfico está en un fichero llamado GRAFICO1.BMP en el directorio C:\DIRAYUDA. Recomendable cuando el gráfico es grande. inserte el gráfico en el texto Word y proceda como siempre.Introducirlo directamente desde un fichero . Para introducirlo por el segundo método.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 1 2 3 4 El dato introducido en la línea COPYRIGHT sale en el menú de la pantalla de ayuda. en vez de acudir a la función Shell para ejecutar el WINHELP.bmp}Le colocará este gráfico en medio de la ventana de ayuda.(Vea función Shell. Esta opción es recomendable si el gráfico es muy pequeño. Las correspondientes al apartado [OPTIONS]. Introduzca un CommonDialog en su aplicación y ponga en su propiedad HelpFile el nombre del fichero de ayuda.BMP ó .) Titulo de la ventana de Ayuda Habrá observado que la ventana de ayuda tiene. . Vea con mas detalles las propiedades del CommonDialog. y este texto a la derecha del gráfico.EXE. Si necesita introducir un gráfico en la ventana de ayudas puede hacerlo de dos formas : . y puede llevar la información de la barra de título y el CopyRight.RTF AYUDA2.WMF (Metarchivo). tiene tres posibilidades : Introducir el gráfico en el centro de la ventana de ayuda.bmp}Le colocará este gráfico a la izquierda de la ventana de ayuda. Gráficos en la ventana de Ayuda. ejecute CommonDialog. en Ayuda | Versión. En estas condiciones.HPJ. pues le permite presentar otras funciones de la ayuda de Windows (Ayuda de la Ayuda. Para introducirlo por el primer procedimiento. Si deseamos personalizarlo y poner el nombre de nuestra aplicación.Introducirlo en el fichero Word. Puede poner también un 4) También puede utilizar para este fin el CommonDialog. o {bml c:\dirayuda\grafico1. en la barra de título el siguiente texto : Ayuda de Windows. Estos dos parámetros se introducen de la siguiente forma : [OPTIONS] TITLE= Nuestra Aplicación VB . pues si no lo pone la ayuda le saldrá minimizada. y este texto inmediatamente debajo del gráfico. Este apartado debe ir en primer lugar del fichero.Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1. etc. basta con añadir un par de líneas al fichero FICHAYUD. y en el sitio donde desee introducir el gráfico inserte la(s) línea(s) : {bmc c:\dirayuda\grafico1. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 291 .

cuando el usuario busca una de las siguientes palabras : Tablas. con texto invisible. Salve el fichero RTF y vuelva a compilar. Se han resaltado en negrita las tres opciones. Proceda a introducir el nombre en la parte de abajo de la pantalla de Word Palabras Clave La Ayuda de Windows nos permite accede a una página usando como criterio de búsqueda ciertas palabras que ponemos como clave. ponga introduzca las palabras clave para cada una de ellas. las referencias a los gráficos del tipo {bmc c:\dirayuda\grafico1. donde pone el nombre de la nota al pie. en cualquiera de los dos casos. (Y no es que el Ordenador no tenga RAM suficiente) Historial La Ayuda de Windows nos permite recordar todas las páginas sobre las que se hizo una consulta.bmp}Le colocará este gráfico a la derecha de la ventana de ayuda. Leer y Visualizar Volvamos al editor Word. volver al índice . Para poner el nombre a la página. Ese nombre es distinto del identificador de página. Base. a las dos páginas nombradas y al lado de las notas al pié anteriores.o {bmr c:\dirayuda\grafico1. Con un gráfico de 470 Ks. Para obtener la ventana de historial. si queremos que aparezca nuestra página de ejemplo que habla de Acceso a la Base de Datos. ya que el compilador (HC. Por ejemplo. aunque no hay ningún problema porque sea el mismo. para poder realizar una nueva lectura de los mismos si fuese necesario. que mediante un subrayado simple les introducíamos un enlace a una ventana emergente. y haciendo click sobre el gráfico sacará la página correspondiente. Observará que el botón Búsqueda de la ventana de ayuda está habilitado. volver al índice. usado en la preparación de estos apuntes fue incapaz de compilarlo. deberemos poner. y me da la impresión de que no utiliza mas que los primeros 640 Ks. basta con hacer click en la barra de menú de la ventana de Ayuda en Opciones | Mostrar Ventana de Historial. nos sacará una ventana emergente. Esto puede ser muy útil. En este caso el símbolo a introducir en la Marca personal es el $. Si le ponemos el atributo de subrayado simple. introduzca otra. separadas con una coma. y este texto a la izquierda del gráfico... Pero para que se pueda mostrar el historial. esta con la Marca personal K. vaya al comienzo de cada página e introduzca una nota al pié de la misma forma que cuando ponía el identificador.. lo mismo podemos hacer con la referencia a un gráfico. Ponga como nombre de la página una palabra que identifique esa página de una forma única. con lo que sabemos deberíamos ir al índice y desde allí acceder a la página 1. Debe tener cuidado al introducir gráficos. o con cualquier palabra o frase de una página. dando error de memoria insuficiente. y a la de Lectura de Datos cuando busque Obtener. bien las del índice. En la parte inferior de la pantalla. a las que con un subrayado doble les introducíamos un enlace a una página. de memoria. Recuerde la llaves donde se encierra la posición y el nombre (y path) del gráfico. es necesario darle un nombre a las páginas.EXE) trabaja en DOS. Usar los Gráficos de la Ayuda como enlaces a páginas Lo mismo que hacíamos con las palabras. (Vea un poco mas arriba. a continuación de la referencia al gráfico. leerla. Ejecute la aplicación y saque la Ayuda.bmp} ) Si seleccionamos esa referencia y le ponemos el atributo de doble subrayado. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 292 . acceder a la página 2. Registro. al acercar el puntero del ratón a ese gráfico (en la ayuda) nos mostrará una mano. el indicador de página que especifique la página o ventana emergente que queremos mostrar. Haga click en este botón y verá que esas palabras ya figuran en la lista. Páginas en secuencia Si tenemos una ayuda muy larga y la queremos leer toda. Eso sí. y será ese nombre el que figure en la ventana de historial. leerla. pues tenemos muy accesible los temas que hemos consultado.

aunque el valor numérico de una de ellas sea superior a otra que comience por 2. y acceder secuencialmente a cada una de las páginas. Sangría y Espacio y Presentación..HPJ que se denomina [CONFIG] y le introduciremos en esta sección la expresión BrowseButtons() El fichero FICHAYUD. Esto se consigue añadiendo una nueva sección al archivo . comenzando por la izquierda. Es decir.Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1. Las líneas que hubiera seleccionado se le conservarán como Encabezado de página. Esas líneas son el Encabezado de página. active la casilla Conservar con el Siguiente.RTF AYUDA2. Para conseguir esto en nuestra ayuda deberemos escribir las líneas que queramos que se conserven como encabezado de página al principio de cada página. Pero el orden de aparición será según el código ASCII de los caracteres que formen ese código. Por lo tanto puede ocurrirle la paradoja de que aparezca primero la página 100 que la 65. si los códigos están formados por números aparecerán primero todas las páginas que comiencen por 1.HPJ quedará de la siguiente forma : [OPTIONS] TITLE= Nuestra Aplicación VB . en este caso con la marca personal + (signo mas). podemos asignar a cada una de las páginas un código de secuencia. 4.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 [CONFIG] BrowseButtons() Encabezado de páginas Habrá observado en la ayuda de Visual basic que una o dos líneas en la parte superior de la ventana de ayuda se conservan allí continuamente aunque nos desplacemos hacia abajo mediante los cursores de desplazamiento.Para evitar este proceso. que podrá estar formado por caracteres alfanuméricos. También deberemos indicarle al WinHelp que deseamos sacar los botones (<<) y (>>) para desplazarnos por las páginas.. seleccionarlas con el cursor del ratón y abrir el menú Formato | Párrafo (Se supone que está utilizando el procesador de texto Microsoft Word) donde le aparecerá un cuadro de diálogo con dos solapas. Este código de secuencia será el que marque el orden de aparición de las páginas. 1 2 3 4 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 293 . Para asignar este código de secuencia deberemos introducir otra nota al pié para cada página. 3. . Elija Presentación y dentro de esta solapa.

donde introduciremos el nombre de la nueva ventana. PosiciónY. Para ello volvamos a nuestro fichero . Cuando tenemos seleccionada la ayuda de un control.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 [CONFIG] BrowseButtons() [WINDOWS] Ventana2 = “Titulo de esta Ventana”. y. Esta segunda ventana se comporta de manera idéntica a la primera.HPJ quedará de la siguiente forma. DimensiónY) 1 2 3 4 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 294 . El ejemplo que tenemos mas a mano es el de la Ayuda de Visual Basic. se pueden observar al menos dos palabras que nos llevan a una segunda ventana : Propiedades y Eventos. entre paréntesis. (PosiciónX.RTF AYUDA2. Cuando elegimos una de estas informaciones aparece una segunda ventana que nos muestra la información pedida. DimensiónY) Ventana3 = “Titulo de esta Ventana”.HPJ y le añadiremos un nuevo apartado : WINDOWS. El fichero .Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1. el título de la misma (El título que aparecerá en su parte superior). Para poder presentar esta segunda ventana es necesario primero definirla. DimensiónX. su posición y dimensiones. PosiciónY.VENTANAS MULTIPLES Con frecuencia es útil emplear varias ventanas para mostrar la información de una aplicación. (PosiciónX. DimensiónX. sin perder la información que tenemos en la primera ventana. tras introducirle dos nuevas ventanas : [OPTIONS] TITLE= Nuestra Aplicación VB . en cuanto a llamadas a otras páginas o a menús emergentes.

se añadirá tras el identificador de la página que queremos enviar a la nueva ventana el símbolo > y a continuación el nombre de la ventana. \ VB\HC. HCW.. podemos obtener el nombre del fichero de ayuda de una aplicación consultando el valor de esa propiedad del Objeto App. En el ejemplo siguiente introducimos el nombre del fichero de ayuda en el Label1 Label1. la ruta de acceso de su archivo ejecutable y los archivos de Ayuda. Para ello basta con imponer el nombre (con su Path) del nuevo fichero de ayuda : App.EXE.0). Es que el fichero RTF creado por W97 es distinto del creado por W95. No tiene ni Eventos ni Métodos.HPJ y acepta los ficheros . se puede cambiar en tiempo de ejecución el fichero de ayuda. No se preocupe. Usa el mismo fichero .EXE le sale un error. Este objeto tiene solamente propiedades. en vez de a la ventana principal. propiedad que es de lectura y escritura. compilador que tiene además la ventaja de que trabaja en Windows.hlp" (Vea un poco mas adelante mas información sobre el Objeto App) Otros Compiladores de Ayuda (HCP. Si Ud. Una de sus propiedades es HelpFile. El objeto App no es ni mas ni menos que un conjunto de datos acerca de la aplicación) Determina o especifica información sobre el título de la aplicación. Piense lo útil que puede resultar esto para cambiar el idioma de la ayuda de una aplicación. El Objeto App Introducimos aquí un nuevo objeto Visual Basic..EXE.RTF creados con las versiones primeras del Word. Tampoco vale. lo cual. Es decir. No lo intente con el HCP.EXE que habitualmente se encuentra en el directorio C :\ . Este compilador trabaja perfectamente con ficheros . realiza los ficheros .EXE. no habrá tenido ningún problema con lo descrito anteriormente.RTF con el Word para Windows95 (Word 6. .Para llevar la información a una de estas ventanas. \ nuevaayuda.... El objeto App es un objeto global al que se accede con la palabra clave App.. \ .. Si tiene Word de office97 (W97) habrá observado que al compilar la ayuda con el HC. . . Busque por Internet un fichero llamado HCW. (No se líe..EXE.) En este capítulo hemos citado como compilador del fichero de ayuda al programa HC.. y si está ejecutándose una instancia anterior de la aplicación. aparte de dar una idea de como se trabajan los temas de compatibilidad entre procesadores que deberían ser compatibles.HelpFile = "C:\ .HelpFile Como la propiedad HelpFile también es de escritura.. .RTF creados con W95 y W97 El aspecto de este compilador de ayudas es el siguiente : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 295 . nos obliga a buscar otro compilador de ayudas.caption= App.

Guía del Estudiante Cap. que como se dijo hay bastantes y (creo que) shareware. Lo importante es que todo lo dicho respecto a la edición de los ficheros :RTF y . Es comprensible no intentar examinar uno a uno en esta Guía del Estudiante. No vamos a explicar cada uno de los compiladores que podamos encontrar. 11 LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 296 .HPJ. Visual Basic .HPJ sigue siendo válida para estos compiladores. Existen algunos compiladores que también crean el fichero .Aparte de este compilador. existen otros que funcionan de forma similar.

herramienta de Microsoft para administrar los datos en bases de datos Access.x y Paradox5. Este pobre funcionamiento de DAO con ODBC llevó a Microsoft a crear otro tipo de acceso a datos: el RDO (Remote Data Objet). y en RDO nos referimos al nombre de la conexión ODBC (Connection) refiriéndonos al nombre de una conexión ODBC ya establecida. en un objeto DAO hablamos del nombre de la base de datos. interface a través de la cual puede acceder a sus datos cualquier aplicación. Excel3. Excel4. dBaseIV .x Esto lo logra mediante el Motor de Bases de Datos Jet. y es necesario establecer una conexión ODBC en Windows. Tiene un nombre que mas parece de una materia de ingeniería aeronáutica. y si queremos cambiar mañana la base de datos sobre la que vamos a trabajar. imprescindible. disponen de una forma de acceso común a todas : ODBC Lo de ODBC (Open Data Base Conectivity) es un mecanismo de conexión entre bases de datos abiertas. (Lo de facilidad de acceso a una base de datos Access viene implícito en la política de Microsoft de facilitar la compatibilidad entre sus aplicaciones) Pero esto se quedaría muy corto si solamente se pudiese conectar con las bases de datos citadas. Este método tiene la gran ventaja de que podemos establecer hoy una conexión con una base determinada.0. refiriéndonos al nombre del fichero que contiene los datos (C:\Mis Documentos\MiBase.Mdb).5. pero que en vez de atacar directamente a la base de datos como lo hace DAO. Excel5. no podemos decir lo mismo con la 2. LotusWk4. Foxpro3. Informix. Sin embargo hay algo que falta. SQL Server. Paradox3. Es lógico. Estas bases de datos. dBase 5. procedimiento previsto pero que no funcionaba. que es lo que da ergonomía y elegancia a una aplicación. FoxPro2. LotusWK1. y los objetos de acceso a datos RDO.BASES DE DATOS EN VISUAL BASIC (1) A modo de introducción Todo lo visto hasta ahora en este libro es el Visual Basic elemental que debe conocer necesariamente para realizar una aplicación. No se puede concebir un sistema de desarrollo que no pueda acceder a bases como Oracle. Lo de introducir y mostrar datos son las materias que va a ver en los capítulos siguientes. Lo veremos mas adelante.x. Así por ejemplo. Esto consiste en objetos parecidos a los DAO. Y es la forma más sencilla y rápida de acceder a una base de datos Access instalada en el propio disco duro o en un disco de red de área local rápida. E esta forma de acceder a las bases de datos se le llama Acceso mediante objetos DAO. Paradox4. Lo explicado hasta ahora. Lo de abiertas significa que tienen esa interface de acceso común.5. El conocimiento de bases de datos es necesario. aparte de tener su propia interface para acceso a datos. Esto podemos decirlo con la versión DAO 3. que apunta a una base de datos que es donde vamos a leer o escribir. Así no es necesario realizar ningún cambio a nuestro código LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 297 . Una aplicación se hace normalmente para presentar datos. Los objetos DAO pueden acceder también a bases de datos a través de ODBC. y es en eso donde tendrá que aplicar todo lo que lleva aprendido hasta ahora. El 90 % de las aplicaciones que va a realizar van a llevar una base de datos. dBaseIII. datos que habrá que introducir y mostrar de forma conveniente. Se observa con mucha frecuencia que el alumno tiene una prisa desmesurada por llegar a los temas que tratan las bases de datos. Excel7. pero no olvide lo de mostrarlos de forma conveniente.x. Lo de DAO viene de Data Access Objet. etc. lo hacen a través de una conexión ODBC previamente establecida en Windows. Visual Basic nos permite trabajar directamente con distintas bases de datos (ACCESS. Esta interface utiliza el lenguaje SQL. LotusWK3. pero en realidad no es mas que un conjunto de programas que se cargan en el disco duro cuando instala Access o Visual Basic. dejando un poco de lado la interface necesaria para su introducción y presentación. basta con cambiar esa conexión apuntando hacia otra base de datos.

Por ejemplo. Por eso. por ejemplo. Piense en la facilidad para distribuir una aplicación que tenga una base de datos Access cuyos campos puedan tener un tamaño definido por el propio usuario. Lo veremos mas adelante. y luego aplicaremos nuestros conocimientos a ADO. Y primero hay que aprender DAO. Existen multitud de libros que tratan el tema. Es una pena que no se pueda trabajar con la misma terminología y con todas las prestaciones que tiene DAO a través de ODBC. Una aplicación Cliente – Servidor lo que hace es montar un programa en el servidor. al cual le pedimos desde nuestra aplicación el dato deseado. pero en esto hay opiniones para todos. Pero eso no implica que no haya que ir paso a paso. pero lo hace localmente en el servidor. Una vez que lo ha encontrado. Con RDO no podemos crear esa base de datos. y podemos hacerlo (al igual que con DAO) a una base que esté en el mismo disco duro que la aplicación. Es un tema que se sale necesariamente de este curso debido a su extensión. sonde en DAO ponemos OpenRecordset. ya que trabaja una aplicación Cliente – Servidor. con lo que bajamos el tráfico por la red de forma muy importante. Si creamos un acceso a datos (recordset) con DAO. Puede ser un poco más lenta que DAO. De esta forma es posible seguir utilizando los viejos métodos aprendidos para DAO (Y lo que es mejor. la Guía del Estudiante dedica un nuevo capítulo y un amplio ejemplo a ADO. en RDO debemos poner OpenResultset. De hecho. En este punto ponía hace dos años que eso lo va a determinar el mercado. Adelanto de términos. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 298 . que apunta a una base de datos ya creada. RDO trabaja sobre una conexión ya instalada. Hoy (Nov. sin verter todos los datos a la red de área local. y esa fue la razón de implementar en los objetos DAO 3. Bastaría poner una herramienta en la propia aplicación donde el usuario introdujese los tamaños de los campos tipo texto. Pero RDO no tiene las prestaciones que tiene DAO para trabajar con bases de datos Access. que en este caso. Esto puede hacerlo con DAO puesto que nos permite crear bases de datos Access. Nadie puede pretender que Visual Basic cree una base de datos de esa marca. pero no lo podemos hacer mediante RDO. Existe otro mas.2002) se puede decir que ADO ha sustituido en todas las aplicaciones nuevas a RDO. pues en ADO sí coincide el código. Lo veremos mas adelante pero no con una gran profundidad.Un error bastante general con los objetos RDO es pensar (seguramente por aquello de Remote Data Objet) que solamente pueden trabajar con una base de datos que esté en otro ordenador. ADO es una maravilla. ODBCDirect nos permite trabajar con los mismos objetos DAO pero a través de una conexión ODBC. RDO pierde grandes facilidades que aporta DAO para este tipo de bases de datos. Sin embargo. al cual estaremos unidos por cualquier forma de conexión. con RDO podemos entrar en una base de datos Oracle. dado que puede darse el caso de tener que ver toda la base de datos para extraer de ella solamente un dato. reutilizar el código ya escrito en anteriores aplicaciones) a través de una conexión ODBC. el tráfico de datos por la red es muy grande. muy reciente denominado ADO. Aprendamos pues DAO. nos pasa a través de la red el dato solicitado. No tiene nada que ver. Pero no debemos pensar que aquí se acaban los métodos de acceso a datos. ADO quiere sustituir a DAO y RDO.5 la conexión ODBCDirect. Esto mismo pensó Microsoft. Esto es obvio. Ese programa posiblemente tenga que ver toda la base de datos para encontrar el dato que nos interesa. con ADO sí podemos crear una base de datos Access. y ha dejado a DAO solamente el mercado de las pequeñas aplicaciones domésticas. o una que esté en un servidor unido a través de una Red de Area Local. RDO significa solamente que accedemos a los datos a través de ODBC. Aplicaciones Cliente servidor Piense en una base de datos instalada en una red no muy rápida. funciona. La gran ventaja de ADO es que en aquellas aplicaciones que leen una base situada en un servidor. ocupa menos la red de área local. Pero ahora todo lo que aprenda de DAO le va a servir para ADO. RDO utiliza una terminología ligeramente distinta de DAO. para adaptar la base de datos a sus necesidades.

No se preocupe de los que acaba de leer. De cualquier forma. En el formulario tiene el aspecto de una barra deslizante : Decíamos que el control Data sirve de enlace entre la base de datos y los controles que pueden presentar datos. Tabla2 y Tabla3) Cada tabla es en sí una base de datos en el sentido estricto. Nada mas lejos de la realidad. Veamos como se enlaza un control data a una base de datos. y para los que han suspendido la asignatura de base de datos Access. y sirve de enlace entre la base de datos y los controles que son habilitados para presentar los datos de esa base.Mdb) varias Tablas (P. Los dos más sencillos son el control Label y el control TextBox Un control Label puede presentar un dato. Se supone que el alumno conoce la estructura de una base Access. al ser el TextBox un control bidireccional. no solamente podremos presentar datos de la BD. basta que enlacemos la base de datos al control data. pero puede hacerse. en lo que queda de capítulo vamos a trabajar con bases de datos SIN escribir una sola línea de código. Estos controles a los que nos referimos son los llamados Controles Enlazados a Datos. sino que los podemos introducir. Existen controles similares para RDO y para ADO. Utiliza el motor de bases de datos Jet para el acceso a los datos. al menos algunos de ellos. vedado al resto de los mortales. Pero no corramos y centrémonos sobre DAO y nuestro motor Jet DAO . y que son viejos conocidos nuestros. Y para demostrarlo.e. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 299 . y que enlacemos luego el control Label con el control Data. Si hacemos lo mismo con el TextBox. Tabla1.e. El control Data nos permite acceder de una forma sencilla a cualquier base de datos de estos tipos. No digo que sea lo mejor. Al contrario que los controles similares RDO y ADO. Con las explicaciones anteriores parece que esto de las bases de datos debe ser cosa de gurús informáticos. C:\MiCarpeta\MiBase. BD con la que vamos a iniciar este estudio. Esto se logra mediante controles OCX creados por Microsoft. y fijarle las propiedades apropiadas para que trabaje sobre uno u otro tipo de base de datos. El Control Data El control Data puede tomarse directamente de la caja de herramientas. citar solamente que una base de datos Access contiene dentro de un fichero (P. Si queremos que ese dato sea un campo de una tabla de una base de datos. Y para DAO el control que organiza el trabajo al Motor Jet es el Control Data. (filas) que guardan la información en varios Campos. Comenzaremos el estudio de bases de datos con los objetos DAO. este está siempre en la caja de herramientas. Tiene un número indeterminado de registros.Acceso a bases de datos mediante el Control Data Para acceder a estas Bases de Datos basta con introducir un control Data en el formulario. que controlan directamente a ese conjunto de programas que habíamos dado en llamar Motor de bases de Datos Jet o a los programas similares de RDO o ADO.

Pero le falta todavía por saber en que tabla dentro de esa BD los tiene que leer. ya puede saber cuantas tablas tiene y los nombres de estas tablas. veremos que tiene unas propiedades que cuando lo estudiamos. Ya tenemos enlazado el control Data a la base de datos. (Ya veremos que es cada uno de ellos) Y ya tenemos casi todas las propiedades del control Data cubiertas. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 300 . Podemos desplegar la lista. Si desplegamos las propiedades del TextBox por ejemplo. Se elige uno. En la figura puede ver que la propiedad DataSource puede desplegarse. Dado que el control Data ya sabe en que base de datos debe leer los datos (Ya tiene puesta la propiedad DataBaseName). Con esto. que por defecto le va a poner Dynaset. y ese nombre (Dirección completa de la carpeta y nombre del fichero) es lo que debemos poner al control Data en su propiedad DataBaseName. las habíamos pasado un poco por alto: DataSource y DataField. Authors Con esto ya podría trabajar. A continuación debemos señalarle qué campo queremos que nos presente. el control data ya sabe donde tiene que ir a leer los datos. el tipo de recordset que debe crear. que tiene por extensión Mdb es la base de datos. pero le faltan aún ciertos detalles. Casi todas las propiedades. Las demás son las típicas de todos los controles. Eso es aún más sencillo. con el motor Jet o a través del citado ODBCDirect. Para elegir esta propiedad basta con desplegar la lista de las tablas haciendo click en la flecha de la línea de la propiedad RecordSource. Table) Esto se lo indicamos en la propiedad RecordsetType. mostrando en este caso el nombre del único control Data que tenemos en el formulario: Data1 Si tuviésemos mas controles Data. Elegimos uno y ejecutamos la aplicación.. En nuestro ejemplo. aparecerían los nombres de todos ellos. Esa propiedad es DefaultType y nos permite elegir entre usar el motor de base de datos Jet (Poniendo a esta propiedad el valor 2 o dbUseJet) o usar ODBCDirect (Poniéndole el valor 1 ó dbUseODBC) El valor por defecto es usar el motor Jet y así trabajaremos en principio.El fichero. Por ejemplo. porque hay una que se ha introducido en la versión 6 de VB para permitir las dos formas de atacar a la base de datos. (Dynaset. Elija la tabla deseada. donde podemos ver los campos de la tabla elegida para la propiedad RecordSource del control Data. Snapshot. Falta ahora enlazar una etiqueta y un TextBox al control Data para tener el enlace completo. El nombre de la tabla se lo indicamos al control Data en la propiedad RecordSource.

que serán explicados en profundidad en su momento. El control Data se sitúa después en el registro requerido y pasa los datos del registro actual a los controles enlazados donde son presentados. Todo ello sin escribir una línea de código tal y como habíamos prometido. Visual Basic usa las propiedades del control Data para abrir la base de datos seleccionada. TextBox. Controles enlazados Son los controles que pueden presentar directamente datos de uno o varios campos de una Base de Datos. Image. (Representación en el código de una tabla base que puede utilizarse para agregar. pero el “puntero” de la base de datos apunta a un único registro en cada momento. los controles enlazados con datos de un formulario no pueden tener acceso automáticamente a los datos. Objeto Recordset (conjunto de registros) Es un conjunto lógico de registros. El control Data proporciona acceso a datos almacenados en bases de datos usando uno de los tres tipos de objetos Recordset. Se irán haciendo avances de estos términos. La mayoría de las operaciones de acceso a datos se pueden realizar usando el control Data sin escribir ningún código. ListBox y ComboBox también son controles enlazados con datos y pueden asociarse a un único campo de un Recordset administrado por un control Data. En el tema de Bases de Datos se emplean términos no conocidos aún. Los tres tipos de objetos Recordset son Dynaset. Avance de términos. Ese registro al que apunta el puntero se llama registro actual. no permitiendo modificarlos) y Table. Esto significa que se pueden modificar los datos de una base de datos simplemente cambiando los datos en los controles enlazados que lo permitan. podemos ver todo el contenido de la Base de datos moviéndonos a lo largo de ella mediante las flechas de cursor del control Data. Se irán viendo a lo largo del curso. modificar o eliminar registros de una sola tabla). abrir un objeto Database y crear un objeto Recordset. El control Data realiza todas las operaciones sobre el registro actual. Los controles enlazados con un control Data presentan de forma automática los datos de uno o más campos del registro actual o. Los controles DBList. de un conjunto de registros a ambos lados del registro actual. Avance de términos Registro Actual. Siempre podremos conocer el Recordset usado por el control Data leyendo esa propiedad LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 301 . Las propiedades Database y Recordset del control Data hacen referencia a los objetos Database y Recordset recién creados que pueden ser manipulados por el control Data. Los controles enlazados solamente pueden tener acceso a un control Data si este está en el mismo Formulario. Una vez iniciada la aplicación. en algunos casos.Podemos observar que ya funciona. Entremos ahora en un estudio un poco más avanzado del control Data. Un registro es un conjunto completo de campos. pero no queda otro remedio mas que comenzar a utilizarlos. Si el control Data recibe instrucciones de moverse a un registro diferente. todos los controles enlazados pasan automáticamente los cambios al control Data para ser guardados en la base de datos. Los controles CheckBox. (Permite la lectura y escritura de un registro) Snapshot (Realiza una lectura instantánea de los registros. y moviendo el puntero de la base de datos. El control Data le permite ir de registro en registro y presentar y manipular los datos de los en controles enlazados. Si ponemos tantos TextBox como campos tiene la tabla elegida. cambiando el registro actual. DBCombo y DBGrid tienen la posibilidad de presentar un conjunto de registros cuando se asocian con un control Data. Label. Picture. es decir. Una base puede tener muchos registros. Sin un control Data.

en una base que estuviera compartida por varios usuarios a través de una Red de Area Local (RAL) un usuario leería todos los datos en el mismo momento de la creación del Recordset por el control Data. Lo mismo ocurre con el objeto Recordset. Estos objetos de acceso a datos son idénticos a los creados mediante código. De esta forma. Como resultado.VariableTipoRecordset =Data1. moviéndose de registro en registro o al principio o al final del Recordset. Ocupar mas memoria RAM en cada uno de los PCs de los usuarios. y cuando se le pide otra operación (p. Cuando se crea un Recordset mediante un control Data. llevaría esos datos a su memoria RAM y no volvería a estorbar en la base de datos (cuando un usuario de una RAL lee un dato en una BD.Recordset El objeto Database creado por un control Data no se cierra aunque se cambie la propiedad DatabaseName del control Data. No se puede mover el enfoque al control Data. bloquea esta BD mientras dura su lectura y no pueden acceder a ella otros usuarios) Si el Recordset se crea por código. El control Data puede manipularse con el mouse. el usuario no necesita manipular el control Data y no es necesario invocar el método MoveLast en el código para conocer el número total de registros. Solamente podemos cerrarlos utilizando el método Close : Data1. Todo ello a un precio. y tienen las mismas propiedades y métodos. los datos del conjunto de registros) se guardan en la memoria local. Observación muy importante El control Data crea un objeto Database y un objeto Recordset automáticamente.Database. exige al menos una explicación. tomado casi literalmente de la información de Microsoft.Close LSB Visual Basic – Guía del Estudiante Data1. Se deben poblar desde el código.Database Data1.Recordset Y si tenemos otro control Data en la aplicación (Puede estar en otro formulario) siempre podemos hacer que el recordset de este segundo control Data sea igual al del primero Set Data2. se lee solamente un registro (la base se bloquea en el momento de la lectura e inmediatamente se libera). El control Data no permite que el usuario se pase de los límites del Recordset usando el mouse. los marcadores (y en los objetos Recordset de tipo snapshot. El párrafo anterior.e. Los objetos Recordset creados en el código pero que no se asignan a un control Data no son poblados automáticamente por el motor Jet.Recordset = VariableTipoRecordset (Obviamente el ámbito de VariableTipoRecordset debe permitir que se vea en los formularios donde está Data1 y Data2 Cuando se usa un control Data para crear un objeto Recordset o cuando se crea un objeto Recordset en el código y se asigna al control Data. Podemos referirnos a ellos usando el nombre del control Data seguido del nombre del objeto (Database o Recordset). Por ejemplo : Data1.Close Capítulo 1 Página 302 . Los bloqueos de página usados para crear el Recordset se liberan más rápidamente. que avance un registro) vuelve a bloquear la BD. En principio el leer el Recordset de una vez parece que tiene ventajas en aquellas instalaciones que tienen una base de datos compartida. Esta limitación hace en algún caso que no sea posible utilizar un control Data por falta de memoria RAM en los puestos de usuario. se leen inmediatamente todos los registros que forman parte de ese Recordset (Recuerde que un Recordset es un conjunto de registros). el motor de base de datos Jet de Microsoft puebla automáticamente el objeto Recordset. lee ese registro y la desbloquea. haciendo posible que otros objetos Recordset accedan a los mismos datos.Recordset.

Consultas almacenadas Otra opción importante cuando se usa el control Data es la posibilidad de presentar una consulta realizada previamente en Access. el método MoveNext de un objeto Recordset mueve el registro actual al siguiente registro del Recordset. Table) Si no se indica el tipo a crear. se crea un Recordset de tipo Dynaset. Objetos para acceso a datos Los objetos para acceso a datos Database y Recordset creados por el control Data tienen cada uno sus propiedades y métodos propios y se pueden escribir procedimientos que usen estas propiedades y métodos para manipular los datos. Snapshot. se podría usar el siguiente código: Data1.MoveNext El control Data puede crear cualquiera de los tres tipos de objetos Recordset (Dynaset. Si se ha creado previamente una consulta. SI se puede crear un nuevo objeto Recordset y asignarlo a la propiedad Recordset del control Data. no tendría sentido poner un control data sin enlazarlo a otros controles para que estos nos sirvan de elementos de presentación y captura de datos. Esto quiere decir que sólo el control Data puede crear objetos Database y Recordset. Puede por lo tanto presentar solamente los campos que necesite en su aplicación. el control Data nos mostrará esa consulta como si se tratase de una tabla más de la base de datos. el método CompactDatabase y otros métodos que veremos mas adelante. Por ejemplo. Por ejemplo. Para seleccionar un tipo específico de Recordset. establezca la propiedad RecordsetType del control Data a: Tipo de Recordset Table Dynaset Snapshot Valor 0 1 2 Constante control Data vbRSTypeTable vbRSTypeDynaset vbRSTypeSnapshot Constante OpenRecordset dbOpenTable dbOpenDynaset dbOpenSnapshot Diferencias entre la Edición Standard y la Edición Profesional de Visual Basic En cuanto al acceso a datos. o cuando tenemos que hacer una operación con la Base de Datos que exija que esté cerrada. la diferencia principal entre las ediciones Estándar y la Profesional de Visual Basic es la capacidad de crear nuevos objetos para acceso a datos. En la edición Estándar NO se pueden declarar en el código (con la palabra clave Dim) variables como objetos para acceso a datos. En la edición Profesional y Empresarial de Visual Basic. Las constantes usadas para requerir un tipo específico de Recordset cuando se usa un control Data son diferentes de las constantes usadas para determinar el tipo de Recordset creado o que se va crear usando el método OpenRecordset. Efectivamente. Nota. ¡Esta diferencia ha llevado a la locura a muchos alumnos y programadores usando la versión de su casa y la de su empresa o centro escolar ! En la pequeña aplicación realizada al comienzo de este tema ha visto que los controles enlazados a datos permiten visualizar e introducir datos en la base de datos a través del control Data.Recordset. Para invocar este método. tomados de una tabla (o de varias tablas si ha establecido las relaciones oportunas) y de esta forma su aplicación va a LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 303 . Veremos mas adelante en este capítulo los controles enlazados a datos. al desplegar la lista de tablas para cubrir la propiedad RecordSource.Esta observación debe ser tenida muy en cuenta sobre todo cuando el control Data abre la Base de Datos de forma exclusiva.

Si en vez del nombre de la tabla ponemos una consulta SQL. Si está en una red de área local no hace falta tener muchos registros para comprobar que se ralentiza la aplicación. la ocupación de esta red es mucho menor si el recordset se crea con la consulta de Access. comprobar si son iguales a los expresados en la sentencia SQL y en caso afirmativo pasarlos al recordset creado. la cosa también funciona: Con una Tabla Data1. si la base de datos está en el mismo ordenador que la aplicación.RecordSource = “Select * From Autores Where Apellidos = ‘Cervantes Saavedra’” Esta consulta obtiene de la tabla Autores. sino el número de los registros que los contienen). Si lo que hace es una consulta SQL. Es mucho más rápida una consulta utilizando una consulta ya creada en Access que introduciendo la consulta en SQL. se debe obtener la información registro a registro según las condiciones establecidas en la cláusula SQL. Esta propiedad permite situar un control Data en un formulario MDI sin requerir un control Picture que lo contenga. Esto no puede hacerse si la consulta contiene parámetros. el motor de bases de datos se limita a recorrer esa “tabla nueva”. éste iría directamente a los registros que gozan de tan ilustres apellidos. esto empieza a ser importante cuando trate tablas con muchos registros. pero para averiguar el número de registros que tienen esos apellidos deberá recorrerlos todos. evitando de esta forma tener que leer el contenido del campo Apellidos del resto de los registros.trabajar más rápido que si tuviese que seleccionar esos campos mediante una instrucción SQL Para presentar una consulta. solamente los registros en los que el campo Apellidos sea igual a “Cervantes Saavedra” Funciona.RecordSource = “Autores” Con una consulta SQL Data1. Si se hubiera creado una consulta previamente en Access. el control data leería esos números e iría a los registros indicados en esos números. Propiedades del control Data Align El control Data puede programarse para que se ajuste automáticamente a la parte superior o inferior de su formulario primario usando la propiedad Align. y pusiésemos el nombre de la consulta en la propiedad RecordSource del control Data. La razón es muy sencilla. ir a ese registro y tomar el dato que contiene. Estamos hablando de una consulta SQL establecida en el control Data. Esto le ocurre cuando la consulta se ha creado partiendo de los datos de otra consulta. Esta segunda opción tarda logicamente más. el control Data ajusta su tamaño horizontal al de su formulario primario cuando el tamaño de éste cambia. Hasta ahora habíamos puesto en esa propiedad el nombre de una tabla o de una consulta ya hecha en Access. En cualquier caso. Al crear una consulta es Access quien crea una especie de “tabla nueva” en la propia base de datos. Esta tabla nueva no contiene datos. Y si está leyendo la base de datos a través de una red de área local. De cualquier forma. tomar el número del registro que debe presentar. Por lo tanto. ¿Dónde? Justamente en la propiedad RecordSource del control data. ponga el nombre de la consulta). ya que Access habría hecho una tabla con los números de los registros que cumplen esa condición (esa tabla no contiene los datos. Appearance Flat y 3-D Backcolor Color de fondo de la parte intermedia del control LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 304 . sino referencias a registros de una tabla. establezca la propiedad RecordSource del control Data al nombre de esa consulta (En vez de poner el nombre de una tabla.

haciendo click en esta propiedad en la caja de propiedades.Database El objeto Database creado por el control Data se basa en las propiedades DatabaseName. Puede utilizar cualquier método de un objeto Database con la propiedad Database de un control Data. podemos sacar un cuadro de diálogo haciendo click de nuevo en los tres puntos que aparecen a la derecha de la propiedad. Tiene las opciones MoveFirst (se mueve al primer registro) o BOF (se queda donde está) La propiedad EOFAction establece el comportamiento del control Data cuando se sobrepasa el último registro. no puede abrir una base de datos y pasar el objeto Database recién creado a la propiedad Database del control Data. Admite todas las bases enumeradas al principio de este capítulo. como Close y Execute. Este registro será el -1. En esta propiedad debemos indicarle al control Data el tipo de base de datos a la que va a conectarse. ReadOnly y Connect del control. En esos casos se produce el BOF y EOF respectivamente. NOTA. Exclusive. DragMode . Sintaxis Variable = nombredelcontroldata. Este registro será también el -1. BOF (Begin Of File). Connect Muy Importante. DragIcon. o que introduzca un nuevo registro (AddNew) Caption El nombre que figurará en la parte intermedia del control. El cuadro de diálogo seleccionará directamente las extensiones de los ficheros de bases de datos acordes con el tipo de base de datos seleccionada en la propiedad Connect. Podemos indicarle que se mueva al último registro (MoveLast). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 305 . La propiedad BOFAction permite seleccionar el comportamiento del Data cuando nos hemos pasado de registros por abajo. Para facilitar la búsqueda de la base de datos. a su vez. DefaultType Devuelve o establece un valor que indica el tipo del origen de datos (Motor Jet u ODBCDirect) que se usan en el control Data. También puede examinar la estructura interna de la Database empleando su colección TableDefs y. Aunque puede crear un objeto Recordset y pasarlo a la propiedad Recordset de un control Data.Administración de BOF/EOF Las propiedades BOFAction y EOFAction establecen el comportamiento del control Data cuando llega al principio o final de los registros. que se quede donde está (EOF). EOF (End Of File) Se produce la condición EOF cuando el control Data se posiciona en el registro inmediatamente posterior al último. las colecciones Fields e Indexes de objetos TableDef individuales. Los objetos Database tienen propiedades y métodos que puede utilizar para administrar los datos. Enabled Igual que todos los controles. Database (Solo en ejecución) Esta propiedad es sólo de lectura. DatabaseName En esta propiedad se le indica el nombre (Con su Path) de la base de datos a la que debe conectarse. Devuelve una referencia a un objeto Database subyacente de un control Data. Se produce el BOF cuando el control Data se posiciona sobre el registro inmediatamente anterior al primero (No es un juego de palabras).

Font. No se pueden realizar cambios en registros del Recordset. pero no puede leer los registros existentes. Establece un valor que determina si se muestra un control que puede alinearse cuando un objeto activo del formulario muestra una o más barras de herramientas. para su Capítulo 1 Página 306 LSB Visual Basic – Guía del Estudiante . Cuando se utilizan controles Data con una instrucción SQL en la propiedad RecordSource. MousePointer.EditMode Variable tomará uno de los siguientes valores : dbEditNone dbEditInProgress No se está realizando ninguna operación de modificación. envía la instrucción SQL a una base de datos ODBC. otros usuarios no pueden realizar cambios en registros del Recordset. Name. En un entorno multiusuario.DefaultType = 1 Puede tomar los valores 1 (Usa ODBCDirect) y 2 (Usa el Motor Jet) Pueden usarse también las constantes dbUseODBC o dbUseJet respectivamente EditMode Solo lectura en tiempo de ejecución. otros usuarios no pueden leer registros (sólo Recordset de tipo tabla). Puede tomar los siguientes valores o nombres de constantes (estos nombres solo si los introduce en tiempo de ejecución) 1 2 4 8 16 32 64 dbDenyWrite dbDenyRead dbReadOnly dbAppendOnly dbInconsistent dbConsistent dbSQLPassThrough En un entorno multiusuario. Puede ponerse en el cuadro de propiedades o en tiempo de ejecución. como SQL Server o Oracle. Puede agregar nuevos registros al Recordset. Sintaxis Variable = NombreDelControlData. ForeColor. Options Devuelve o establece un valor que especifica una o más características del objeto Recordset de la propiedad Recordset del control Data. dbEditAdd Se ha invocado el método AddNew y el registro actual del búfer de copia es un registro nuevo que aún no se ha guardado en la base de datos. La propiedad EditMode es especialmente útil cuando se desea partir de la funcionalidad predeterminada de un control Data. igual que el resto de los controles. Las actualizaciones pueden aplicarse a todos los campos del Recordset. Se ha invocado el método Edit y el registro actual se encuentra en el búfer de copia. Exclusive Devuelve o establece un valor (True / False) que indica si la base de datos está abierta para acceso de un único usuario o de múltiples usuarios. Puede comprobar el valor de la propiedad EditMode y el del parámetro acción del procedimiento del evento Validate para determinar si se debe invocar el método Update. Index. aunque infrinjan la condición de unión. Devuelve un valor que indica el estado de modificación del registro actual. o cuando no se utiliza un control Data en Visual Basic Edición profesional. Height. No está disponible en tiempo de ejecución. Left. MouseIcon. También puede comprobar si el valor de la propiedad LockEdits es True y el de EditMode es dbEditInProgress para determinar si la página de datos actual se encuentra bloqueada. Negotiate Propiedad característica de los controles que tienen la propiedad Align. (Predeterminado) Las actualizaciones sólo se aplican a los campos que no infringen la condición de unión.Sintaxis NombreDelControlData.

ReadOnly Devuelve o establece un valor que determina si la Database del control está abierta para acceso de sólo lectura. Ese será el Recordset del control Data. RecordSource. un conjunto de registros. Los valores o nombre de la constante que puede adoptar son los siguientes: 0 1 2 vbRSTypeTable vbRSTypeDynaset vbRSTypeSnapshot Un Recordset de tipo tabla. propiedades que son en todo aplicables al Recordset del control Data. Por ejemplo. RecordsetType Devuelve o establece un valor que indica el tipo de objeto Recordset que desea que cree el control Data. basta con sumar sus valores. También puede establecer más de un valor para esta propiedad.Options And dbReadOnly Then. (Dynaset) Recordset Devuelve o establece un objeto Recordset definido por las propiedades de un control Data o por un objeto Recordset existente. se crea un Recordset automáticamente basándose en dichas propiedades. Un Recordset de tipo instantánea. para averiguar si el Recordset está abierto para acceso de sólo lectura. Genera un error interceptable si otro usuario está cambiando datos que usted edita. para establecer dbReadOnly y dbInconsistent puede utilizar este código: Data1. Si las propiedades Connect. Si no especifica un RecordsetType antes de que el control Data cree el Recordset. El Recordset es como se adelantó. deberá utilizar el método Refresh para que el cambio sea efectivo. Veremos mas adelante las propiedades de un objeto Recordset. podría usar este código: If Data1. Exclusive. Si cambia la propiedad Options en tiempo de ejecución. Pero también puede crearse previamente un Recordset mediante la instrucción OpenRecordset y forzar que el Recordset del control Data sea justamente ese mediante la instrucción Set Data1. Para establecer mas de un valor de los descritos..Options = dbAppendOnly + dbInconsistent Para determinar si la propiedad contiene un valor específico. ReadOnly y RecordsetType establecidas para el control Data son válidas. combinando opciones sumando valores entre sí. El único método de movimiento permitido es MoveNext.. DatabaseName. Options. (Predeterminado) Un Recordset de tipo hoja de respuestas dinámica. puede utilizar el operador And.Recordset = MiRecordset LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 307 .256 dbForwardOnly 512 dbSeeChanges procesamiento. El Recordset es un desplazamiento sólo hacia adelante. Por ejemplo. se creará un Recordset de tipo hoja de respuestas dinámica. Esta opción no puede utilizarse en objetos Recordset manipulados con el control Data.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 308 .Recordset. de las que componen la base de datos especificada en la propiedad DatabaseName.Recordset.MoveNext). Puede introducirse en tiempo de ejecución mediante código con la siguiente expresión : NombreDelControlData.Sea cual fuera la forma de crearlo. (Data1. todos los campos de esa tabla serán visibles a los controles enlazados adjuntos a este control Data. Asegúrese de que cada control enlazado tiene un valor válido para su propiedad DataField.Recordset. los datos se devolverán sin ningún orden concreto.RecordSource = “NombredelaTabla Donde NombredelaTabla es una expresión de cadena que especifica el nombre de una Tabla o una Consulta. añadir un registro (Data1. (el caso mas usado) o introducirse como código.Delete) Si se cambia alguna de las propiedades citadas al principio que cambien el Recordset. Para ello basta con utilizar el Método Refresh. Ni que decir tiene que para poder introducirla de esta forma es necesario fijar previamente la propiedad DatabaseName. Esta instrucción puede incluir una cláusula ORDER BY para cambiar el orden de los registros devueltos por el Recordset creado por el control Data o una cláusula WHERE para filtrar los registros. Si establece la propiedad RecordSource como el nombre de una consulta existente en la base de datos. guardar los cambios en la Base de Datos (Data1. Esto puede invalidar los valores de DataField de controles enlazados y producir un error interceptable. avanzar un registro (Data1. Observe que en la lista desplegada figuran los nombres de las tablas y de las consultas que tiene la Base de Datos elegida en la propiedad DatabaseName.Recordset.MovePrevious) ir al último (Data1.AddNew). En los dos primeros casos. utiliza Refresh. Si establece la propiedad RecordSource como el nombre de una tabla existente en la base de datos. los datos se devolverán sin ningún orden concreto. Esta propiedad puede fijarse en el cuadro de propiedades del control data. deberá utilizar el método Refresh para activar el cambio.Refresh) RecordSource Devuelve o establece la tabla. Después de cambiar el valor de la propiedad RecordSource en tiempo de ejecución.MoveLast).Update). Si establece la propiedad RecordSource como una instrucción SQL que devuelve registros. a partir del momento en que el Data tenga su Recordset podemos referirnos a él. el Recordset identificará el nuevo objeto. al anterior (Data1.Recordset. o borrar el registro actual (Data1.MoveFirst). lo normal es introducir el nombre de una tabla o una consulta de las existentes en la base de datos especificada en la propiedad DatabaseName. el objeto QueryDef (Consulta) o la instrucción SQL subyacente para un control Data. Si no establece la propiedad Index. es necesario volver a crearlo. nombres que se pueden elegir desplegando la lista que se obtiene haciendo click sobre la flecha que aparece al lado de la casilla de esta propiedad. todos los campos devueltos por la consulta serán visibles a los controles enlazados adjuntos al control Data. La propiedad RecordSource especifica el origen de los recursos accesibles a través de controles enlazados del formulario.Recordset. a continuación. o una consulta SQL válida que utiliza sintaxis apropiada para la base de datos especificada en la propiedad DataBaseName. todos los campos devueltos por la consulta a SQL serán visibles a los controles enlazados adjuntos al control Data. Si cambia el valor de la propiedad RecordSource de un control Data y. El orden de los registros recuperados lo establece la consulta Si en la consulta no se ha especificado un orden.Recordset. Nota. El orden de los registros recuperados lo establece el objeto Index que selecciona mediante la propiedad Index del Recordset. por ejemplo para ir al primer registro (Data1.

Recordsets o Workspaces. p. la actualización puede no tener lugar. igual que el resto de los controles.) o usando las flechas del control data. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 309 . por ejemplo cuando un usuario modifica los datos y luego decide cancelar los cambios. Visible.Refresh Puede utilizar el método Refresh sobre un control Data para abrir o reabrir la base de datos (si han variado las propiedades DatabaseName. Move y ZOrder que son idénticos a los del resto de controles) Método Refresh De momento es aplicable al control Data. debido a que la operación vulnere las restricciones de integridad referencial. El método Refresh también se utiliza para cerrar y volver a generar el objeto Recordset o las estructuras de datos creadas por un control Data.Recordset. Width. METODOS DEL CONTROL DATA (Se explican aquí los métodos que inciden directamente en el tratamiento de bases de datos. Sin embargo hay circunstancias en las que no es apropiado hacer esto. excepto en que no se produce ningún evento ni introduce en la Base de Datos los posibles valores que se hubiesen cambiado en los controles enlazados. El método Refresh no puede utilizarse con colecciones que no sean persistentes.UpdateControls Utilice este método para restablecer en los controles enlazados sus valores originales. bien mediante código (Data1. Sintaxis NombredelcontrolData. o a que el usuario no cuente con el permiso adecuado para la operación. Los cambios introducidos en los controles enlazados a datos se pasan a la base de datos al cambiar el registro actual. o que la página que contiene el registro esté bloqueada. ReadOnly. Método UpdateControls Actualiza los datos presentes en los controles enlazados a datos vinculados al control Data.MoveNext. como Databases. WhatThisHelpID.UpdateRecord Puede utilizar este método para guardar el contenido actual de los controles enlazados en la base de datos. No se comentan los métodos Drag. En cualquiera de estas circunstancias. se producirá un error interceptable. Sintaxis Nombredelcontroldata. Este método no desencadena el evento Validate. Mediante el método UpdateRecord introducimos los cambios en la BD. Sintaxis NombredelcontrolData. Exclusive o Connect) y volver a generar el objeto Recordset indicado por la propiedad Recordset del control.Las Propiedades Tag. Mediante este método actualizamos el contenido del recordset del Data y por lo tanto los datos presentados a través de los controles enlazados. En algunos casos. o que la base de datos u objeto Recordset no sean actualizables. Imagínese que el control data accede a una base de datos compartida. Método UpdateRecord Guarda en la base de datos los valores actuales de los controles enlazados. o cambiando el registro actual en un DBGrid.e. Este método produce el mismo efecto que hacer actual de nuevo al registro actual. Top. Actualiza los datos del recordset del control data. Veremos que también es aplicable a otros objetos de acceso a datos (QueryDef).

CommonDialog1. antes del método Update (excepto cuando los datos se guardan con el método UpdateRecord). Validate Se produce antes de que un registro diferente se convierta en el registro actual. Este evento se puede usar para realizar cálculos basándose en los datos del registro actual o para cambiar el formulario en respuesta a los datos del registro actual. Private Sub Objeto_Reposition() Donde objeto = Nombre del control Data Cuando se carga un control Data. como FindFirst. moviéndose de registro en registro o si se usa uno de los métodos Move del objeto Recordset asociado al control data. se produce el evento Reposition después de que cada registro se convierta en el actual. Cuando un usuario haga clic en uno de los botones del control Data. En ese caso no se producirá ningún interceptable ya que no se ejecuta ningún código escrito. los métodos Find. Private Sub Data1_Error (DataError As Integer. provocando el evento Reposition. El control data carga los datos durante la carga del formulario que lo contiene. El procedimiento Error del control Data se ejecuta cada vez que ocurre un error por una maniobra de este tipo. y pasa el código de error como parámetro. Este control tiene su Recordset. Unload o la operación Close. El primer registro de su objeto Recordset se convierte en el registro actual. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 310 . FindNext. idénticos a los de un Recordset creado por código. MovePrevious. Lo explicamos. Imagínese que no existe esa base de datos en el disco. Este ejemplo presenta un cuadro de diálogo Abrir si no se ha podido encontrar la base de datos especificada en la propiedad DataBaseName del control Data después de haber terminado el evento Form_Load. o cualquier otra propiedad o método que cambie el registro el actual. Response As Integer) Select Case DataError 'Si no se ha encontrado el archivo de base de datos se produce el error 3024 Case 3024 'Presentar un cuadro de diálogo Abrir. Tampoco se ejecuta ningún código escrito cuando el usuario hace click en uno de los botones del control data.Estos son los métodos del Control Data. Analizando el código de error podemos escribir código en este procedimiento para paliar el error. MoveFirst.ShowOpen End Select End Sub Reposition Se produce después de que un registro se convierte en el registro actual. y el Recordset del control Data tiene sus métodos. y de los métodos Delete. EVENTOS DEL CONTROL DATA Error Se produce solamente como resultado de un error de acceso a datos que tiene lugar cuando no está ejecutando código Visual Basic. La ayuda de VB tiene un buen ejemplo del uso de este procedimiento. abriendo la base indicada en su propiedad DataBaseName. como MoveNext.

Método MoveFirst. Vea la ayuda de Visual Basic para mayor detalle de este evento. como se describe mas adelante guardar = una expresión booleana que especifica si los datos asociados han cambiado.Private Sub objeto_Validate ([ índice As Integer. Crea y administra los objetos Database y Recordset para su uso por parte de los controles enlazados. El formulario se va a descargar.] acción As Integer. Los datos asociados no han cambiado. Método Find. Los valores de guardar son: True False Los datos asociados han cambiado. DBCombo Se utiliza para obtener una combinación enlazada formada por un cuadro de lista y un cuadro de texto. El control Data establece un enlace entre la base de datos y los controles enlazados para la manipulación de los datos. Método AddNew. Método MoveNext. El evento Validate se usa para realizar las últimas comprobaciones sobre los registros que se van a escribir en la base de datos. como se describe mas adelante. Requerido para su uso con todos los demás controles enlazados. Los controles enlazados a datos permiten crear aplicaciones con acceso a datos con muy poco código. La lista puede llenarse automáticamente a partir de un control Data. o incluso ninguno. Acción puede tomar estos valores : 0 1 2 3 4 5 6 7 8 9 10 11 vbDataActionCancel vbDataActionMoveFirst vbDataActionMovePrevious vbDataActionMoveNext vbDataActionMoveLast vbDataActionAddNew vbDataActionUpdate vbDataActionDelete vbDataActionFind vbDataActionBookmark vbDataActionClose vbDataActionUnload Cancela la operación cuando se sale del procedimiento Sub. Método Close. El LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 311 . guardar As Integer) objeto = Nombre del control Data índice = Indice del control Data dentro de una matriz de controles (Si ha lugar) acción = Un entero que indica la operación que ha producido el evento. Existen en Visual Basic trece controles enlazados a datos. se utiliza para tener acceso a los datos de las bases a través de controles enlazados de un formulario. La propiedad Bookmark no ha sido definida. Método MovePrevious. CONTROLES ENLAZADOS A DATOS Los controles enlazados a datos son aquellos que pueden presentar datos de una base de datos. que es la propiedad donde se debe poner el nombre del control Data asociado a ellos. Para utilizar cualquiera de estos controles enlazados conectables a datos debe incluir uno o más controles Data en un formulario. Método MoveLast. además del control Data : Data Ya comentado. Operación Update (no UpdateRecord). Método Delete. Los controles asociados a datos tienen todos la propiedad DataSource. El control Data que sirve de enlace entre la Base de Datos y los controles enlazados debe estar obligatoriamente en el mismo formulario que los controles. a través de un control Data.

TextBox Se utiliza para almacenar texto que el usuario puede introducir o modificar. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario específico. CheckBox Se utiliza para crear un cuadro que el usuario puede elegir de forma sencilla para indicar si algo es verdadero o falso. no podemos variar el contenido de ningún registro. o para mostrar varias opciones entre las que el usuario pueda elegir más de una. El usuario puede elegir un elemento de la lista o introducir un valor en el cuadro de texto. Las imágenes mostradas en un control Image utilizan menos recursos que las de los controles PictureBox. ComboBox Se utiliza para obtener una combinación de un cuadro de lista y un cuadro de texto. pero con algunas ventajas y otros inconveniente. El hecho de colocarse sobre un determinado registro de la cuadrícula. La lista se rellena con el método AddItem. El DBGrid se rellena automáticamente con todos los registros. Puede usarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario específico. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo booleano o de bit específico. El usuario puede elegir un elemento de la cuadrícula para variar el valor en ese campo y registro o introducir un nuevo registro. La lista se rellena con el método AddItem. Puede utilizarse para ofrecer acceso de sólo lectura a un campo de texto específico. MSFlexGrid Es un control enlazado a datos de reciente incorporación. Puede usarse para proporcionar acceso de lectura / escritura a un campo de texto específico seleccionado en la lista. DBList Se usa para mostrar una lista generada a partir de un control Data en la que el usuario puede elegir un elemento. Las propiedades comunes a todos ellos son : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 312 . PROPIEDADES RELACIONADAS CON DATOS COMUNES A ESTOS CONTROLES Los controles enlazados a datos tienen unas propiedades para el acceso a datos basadas en el enlace con la base de datos a través del control Data. DBGrid Se utiliza para mostrar a la vez todos los registros del recordset del control Data. Image Se utiliza para mostrar una imagen gráfica de un mapa de bits. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto específico seleccionado en la lista. En este caso. y puede proporcionar acceso de lectura / escritura a un campo de texto específico seleccionado en ella. un icono o un metaarchivo en un formulario. Label Se usa para el texto que el usuario no debe modificar. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto específico. y muestra todos los campos del recordset de control Data. el MSFlexGrid solamente permite leer datos. Consulte el control DBList PictureBox Se usa para mostrar una imagen gráfica de un mapa de bits. estando asociado a un control Data. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto seleccionado en la lista.usuario puede elegir un elemento de la lista o introducir un valor en el cuadro de texto. La lista puede rellenarse automáticamente desde un control Data. Apareció con la versión 5 de VB y es un control parecido al DBGrid. fuerza a ese registro a convertirse en el registro actual del control Data al que está asociado. Tampoco se mueve el registro actual del control Data cuando seleccionamos otra fila del MSFlexGrid. un icono o un metaarchivo en un formulario. Consulte el control DBCombo ListBox Se utiliza para mostrar una lista en la cual el usuario puede elegir un elemento. formando una cuadrícula con filas y columnas.

cada vez que la base de datos se sitúa sobre el registro correspondiente a uno de los elementos que está en el ListBox o ComboBox. Esta propiedad no la tiene el DBGrid ni el MSFlexGrid debido a que presentan todos los campos de la Tabla de la base de datos seleccionada en el control Data. Lo que ocurre con el Label es que su propiedad Caption no se puede introducir directamente por teclado. éste cambia su ListIndex para seleccionar el elemento correspondiente al registro actual del control Data. el Label permite presentar los datos e introducirlos en la base a través del control Data. Esto puede ser una ventaja (no hay posibilidad de introducirlo accidentalmente) y un inconveniente. Una vez introducidos todos los elementos de ese campo que nos interesen.DataSource Fuente de datos. La lista no se puede cargar directamente desde la base de datos. en lo referente al enlace a datos. al poder ser origen (a través del formulario que lo contiene) y destino de un enlace DDE. Es el nombre del control Data que lo enlaza con la B. Control Label Posiblemente el control Label es el control más sencillo para mostrar el contenido de un campo de una base de datos. Tiene las propiedades DataSource y DataField en lo relativo a acceso a datos. Vamos a estudiar cada uno de los controles enlazados a datos con un poco mas de detalle. El texto de la propiedad Caption de este Label se introduce en el ListBox o ComboBox mediante el método AddItem. solamente tiene las propiedades mencionadas de DataSource y DataField. Controles ListBox y ComboBox Estos controles tienen una característica especial respecto a su comportamiento con el enlace a la base de datos. Control TextBox Todo lo dicho del control Label es aplicable al TextBox. Como todos los controles enlazados a datos. El control Label. con la particularidad de que el ListIndex de este ListBox irá a posicionarse sobre el elemento de la BD correspondiente al registro actual del Control Data. los campos que se pueden mostrar en los controles enlazados a datos son justamente. sino a través de un control intermedio. El ListBox puede contener elementos correspondientes a la base de datos y otros ajenos. Tienen las propiedades DataSource y DataField en lo relativo a acceso a datos. El control Label. DataField Es el nombre del campo. que se va a presentar en el control enlazado a datos. los del ese Recordset al que se le ha forzado. Esta Tabla se determina mediante la propiedad RecordSource del control Data. y deberá cambiarse por código. al tener que escribir código para hacerlo. Control CheckBox El control CheckBox permite presentar e introducir datos de tipo Booleano. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 313 . donde presentaremos un campo de la base de datos. Este control Data es el que determina la Tabla donde están los campos con los datos.D. dentro de la Tabla de la base de datos. por ejemplo un Label. De esta forma podemos introducir datos o cambiar los existentes en la base de datos. esto nos puede resolver muchos problemas de introdución de distintos datos de otras aplicaciones que no tengan acceso directo a una base de datos. Puede emplearse esta característica del ListBox para seleccionar un elemento entre varios elementos tomados de la BD y otros introducidos por otro procedimiento. Si se le ha forzado al control Data la propiedad Recordset. que además presenta la particularidad de que en este control sí se puede escribir directamente desde el teclado.

WMF) Para introducir un gráfico en una BD es mas práctico introducirlo mediante un control Data y un control Picture o Image que creando por código un Recordset. los archivos de icono. No lo podremos hacer con un Recordset creado mediante código. extensión . etc. al permanecer todos los registros de esa tabla en memoria. El campo de este segundo control Data se lo indicaremos en la propiedad DataField.D. le llamamos Tabla B. (Esto se vuelve a explicar mas abajo. creando un Recordset mediante código. Cuando creamos un objeto Recordset mediante la instrucción : (se verá mas adelante) Set Mirecordset = MiDataBase. y el tipo de imágenes que se pueden introducir son los mapas de bits (Archivos con extensión . Cada vez que seleccionemos un registro. La tabla a la que enlazamos el DBList mediante la propiedad DataSource. Otros controles (Label. solamente metemos los datos del campo1 y campo2. Uno para rellenar la lista. podremos presentar sus valores en el control DBGrid. Sin embargo el control DBGrid.) que solamente presentan un dato (un campo de un registro) pueden trabajar sin necesidad de un control data. utilizando los datos del campo elegido en la propiedad ListField. El campo que contenga una imagen en una BD debe ser tipo Objeto OLE (Binario Largo en versiones anteriores de Access). El comportamiento de estos dos controles es el siguiente: Mediante el enlace a través de la propiedad RowSource se rellena la lista. Picture. Mediante el control Data. El campo de esa tabla B que vamos a variar será el campo indicado en la propiedad DataField. al presentar todos los datos de la base de datos necesita un control Data.0 Estos controles tienen dos enlaces a controles data. En realidad deberíamos decir que es el único método práctico de introducir / sacar imágenes de una Base de Datos Control DBGrid Es posiblemente el control que más se use para presentar y modificar datos de una B. que introduciremos en la propiedad ListField. y otro enlace a otro control Data. de todos los campos que pueda tener la tabla llamada Mitabla.Openrecordset (“Select campo1. que se lo debemos indicar en la propiedad RowSource. Imaginemos que la tabla a la que nos conectamos con estas propiedades es la Tabla A. El registro de la tabla B donde vamos a meter el dato será el registro actual de ese control data. campo2 from Mitabla”) lo que estamos haciendo es seleccionar. Cuando creamos un Recordset mediante un control Data. Por eso. Veamos porqué. se puede introducir la imagen presente en uno de estos controles en la Base de Datos. (Extensión . acompañado del nombre del campo con el que la va a rellenar. TextBox. que se lo debemos indicar en la propiedad DataSource. Con este invento vamos a pasar un dato desde la tabla A a la tabla B. El dato que vamos a pasar está en la tabla A en el campo señalado en la propiedad BoundColumn del DBList. El control DBGrid presenta todos los registros y todos los campos de la Base de Datos. (el registro actual) y de ese registro. que solamente mantiene un LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 314 . es ese registro solamente el que se mantiene en la memoria del ordenador. (Metafiles. (Lo veremos un poco mas adelante). necesita obligatoriamente un control Data para poder presentar datos. El registro de la tabla A de donde cogemos el dato será el seleccionado en el DBList. los denominados campo1 y campo2. se meten en la memoria TODOS los registros de la tabla especificada en el control data.BMP).ICO) y los metaarchivos.Controles DBList y DBCombo Para agregar estos controles debe insertar el OCX Microsoft Data Bound List Controls 6. pero para entenderlo no hay mas remedio que realizar una práctica) Control PictureBox y Control Image Pueden mostrar una imagen almacenada en una Base de Datos. Por lo tanto. control actual que habremos seleccionado mediante cualquier método.

por otras razones. AllowDelete Devuelve o establece un valor que indica si el usuario puede eliminar registros del objeto Recordset subyacente a un control DBGrid. El control DBGrid tendrá tantas columnas como campos tenga el Recordset. se producirá un error si el usuario intenta agregar un registro. En este caso. Deberemos explicar qué ocurre cuando se crea un Recordset mediante código. no permitir eliminaciones incluso en el caso de que la propiedad AllowDelete sea True. Si la propiedad AllowAddNew es False. utilizando la expresión anterior. AllowRowSizing LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 315 . no permitir inserciones incluso en el caso de que la propiedad AllowAddNew sea True.Recordset = MiRecordset En este caso. los usuarios no pueden establecer el foco en dicha fila. En este caso.D. Así ya podemos rellenar las cuadrículas del control DBGrid. por otras razones. Con el Recordset creado con la instrucción anterior. El número de filas será igual al número de registros que tiene la tabla.Width = Valor Donde n es el número de la columna (la primera es la 0) y el valor debe expresarse según las unidades de medida (ScaleWidth) del Formulario que lo contiene. y posteriormente se fuerza a que el Recordset del control data sea igual a ese Recordset creado. El ancho de las columnas puede cambiarse mediante la propiedad Width del objeto Columns del DBGrid. Del control DBGrid podemos destacar estas propiedades : AllowAddNew Devuelve o establece un valor que indica si el usuario puede agregar nuevos registros al objeto Recordset subyacente a un control DBGrid. Utilice la propiedad AllowDelete para impedir que los usuarios eliminen registros del conjunto de registros a través de la interacción con el control DBGrid.registro en memoria. se producirá un error si el usuario intenta eliminar un registro. Si nuestra aplicación no tiene que presentar en el DBGrid todos los campos de la tabla de la B.Columns(n). El objeto Recordset subyacente puede. podemos forzar a un control Data que su Recordset sea igual al ya creado mediante la instrucción : Set Data1. el control Data1 tomará todos los registros con los campos campo1 y campo2 de la base de datos y los meterá en la memoria RAM. Si se sobrepasa el espacio físico del DBGrid para poder presentarlos. no quedará mas remedio que usar un control Data. El Recordset subyacente puede. podemos crear previamente un Recordset mediante código y a continuación forzar que el Recordset del control Data sea igual al Recordset creado. DBGrid1. aparecerán automáticamente flechas de deslizamiento vertical. Observe que una aplicación de acceso a datos ocupará mucha mas memoria RAM si establecemos el enlace con la base de datos mediante un control Data que si lo hacemos creando Recordsets a medida. La última fila que se muestra en el control DBGrid se deja en blanco para permitir a los usuarios introducir nuevos registros. Pero si necesitamos presentar los datos en un DBGrid.

pero los valores de la propiedad AllowUpdate tienen prioridad sobre los valores establecidos para las columnas (sin modificar éstos). El control DBGrid no está enlazado directamente al control Data. utilizaremos código en los procedimientos del control Data para pasarle los datos cuando nos interese. Cualquier cambio de tamaño de columna provoca un evento RowResize. Nota El objeto Recordset puede no permitir actualizaciones incluso si AllowUpdate es True para el control DBGrid. Esta propiedad no está disponible en tiempo de ejecución. y el usuario puede modificar el tamaño de las filas mediante arrastre. Los valores que puede tomar la propiedad DataMode son: 0-Bound.ColumnHeaders = [True / False] Si es True se muestran los encabezados de columna del control DBGrid. ColumnHeaders Devuelve o establece un valor que indica si los encabezados de columna se muestran en el control DBGrid. cualquier intento de hacerlo se ignora.AllowRowSizing = [True / False] Si la propiedad AllowSizing es True. Un DBGrid está enlazado cuando se le asigna un control Data en su propiedad DataSource. Sintaxis objeto.AllowUpdate = [True / False] Cuando la propiedad AllowUpdate es False. El control DBGrid está enlazado con el control Data. 1-Unbound. presenta sin mas los datos del Recordset de ese control Data. Puede también hacer uso de las propiedades del objeto Columns para hacer que columnas individuales del control DBGrid sean de sólo lectura. Sintaxis nombre.Devuelve o establece un valor que indica si un usuario puede modificar el tamaño de las filas del control DBGrid. el puntero del mouse se convierte en una flecha de doble cabeza (Size N S) cuando se sitúa sobre el divisor de filas entre selectores de registro. y si es False no se muestran. AllowUpdate Devuelve o establece un valor que indica si un usuario puede modificar datos del control DBGrid. DataMode Establece un valor que especifica si el control DBGrid funciona en modo enlazado o no enlazado. En este caso. en este caso se produce un error interceptable cuando el usuario intenta cambiar el registro. pero no puede modificar ninguno de los valores. Si le especificamos en la propiedad DataMode que no esté enlazado. el usuario puede aún desplazarse a través del control DBGrid y seleccionar datos. DefColWidth LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 316 . Sintaxis nombre.

Si queremos poner otro encabezamiento a una columna. Cuando el usuario elige el selector. Las dos únicas diferencias estriban en la forma en que se presenta la información al usuario y la presencia de la porción del control DBCombo en el cuadro de texto. Los controles DBList y DBCombo tienen dos modos que pueden utilizarse individualmente o al mismo tiempo: Autollenado: Llena automáticamente la lista con un campo seleccionado de entre todos los registros administrados por el control Data especificado por la propiedad RowSource del control DBList o DBCombo.RecordSelectors = [True / False] El Objeto Columns aplicado al control DBGrid. El objeto Columns es un objeto no privativo del control DBGrid. que se emplea para introducir valores. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 317 . Podemos cambiar las propiedades de cada una de las columnas de un DBGrid mediante las propiedades del objetos Columns asociado a él. La propiedad RecordSelectors devuelve o establece un valor que indica si se muestran los selectores de registro en el control DBGrid. CONTROLES DBList y DBCombo Los dos controles DBList y DBCombo se implementan de la misma manera.Columns(0). seleccionando el más largo de los dos. el registro completo (fila del control DBGrid) se selecciona. Si queremos cambiar su anchura : DBGrid1.Columns(3). por defecto. ejecutaremos la expresión : DBGrid1.DefColWidth [= valor] donde valor es un entero basado en el modo de escala del control.Width = 1000 En este caso estamos fijando la anchura de la columna cuarta por la izquierda a 1000 unidades de medida de las del Formulario que contiene al DBGrid. el nombre del campo que se va a presentar en esa columna. el control establece automáticamente el tamaño de todas las columnas en base al ancho del encabezado de columna o al valor de la propiedad Size del campo subyacente. Sintaxis objeto.Caption = "Cabecera" donde el 0 entre paréntesis significa que estamos afectando a la columna número 0 (la primera por la izquierda). Sintaxis objeto. Por ejemplo.Devuelve o establece un valor que indica el ancho de columna predeterminado para todas las columnas del control DBGrid. Si se da a la propiedad DefColWidth el valor 0. RecordSelectors Los selectores de registros aparecen a la izquierda de las filas en el control DBGrid. el encabezamiento de una columna en un DBGrid es. que contiene todas las columnas y las propiedades de las columnas de un control.

Para cambiarlo. esa propiedad se rellena con el mismo campo que el especificado en la propiedad ListField. Eso no quiere decir que no se pueda cambiar. Será el que introduzcamos en la propiedad BoundColumn del DBList o DBCombo. Respecto a este control Data estos controles funcionan solamente como receptores de datos : No pueden cambiar el contenido de los registros con los que rellenan su lista. el nombre del campo que contiene el número de teléfono. Esto explicado en otras palabras significa lo siguiente : En control DBList o DBCombo puede trabajar sobre dos controles Data. (Llamemos a esta base de datos Base A en esta explicación) El otro control Data es el que estos controles usan para introducir datos en su BD asociada. Esa BD tendrá mas campos. ¿Podríamos pasar a esa BD. haga click en la flecha vertical que aparece en la casilla de propiedades. Es sobre esta base de datos y el campo correspondiente sobre los que estos controles DBList y DBCombo actúan cambiando o introduciendo datos. presentar en la lista el nombre de una persona. BoundText LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 318 . En un DBList o DBCombo presentamos en su lista un determinado campo de una BD. por ejemplo. Un poco mas arriba decíamos que ese elemento de la lista podíamos pasarlo a otra BD (La especificada en la propiedad DataSource. También puede cambiarlo en tiempo de ejecución con la siguiente sintaxis : nombredelDBList.Actualización automática: Enlaza el registro seleccionado en el control a un campo específico del objeto Recordset administrado por el control Data especificado por la propiedad DataSource. El control Data y el campo de la BD asociados a estos controles DBList y DBCombo.BoundColumn = nombredelcampo Con estas ideas expresadas aquí. La respuesta es SI. pasar su número de teléfono. Para ello. puede comenzar a leer el texto de ayuda de esta propiedad. podemos escribir directamente el dato en su caja de texto en vez de seleccionarlo de la lista. (Llamemos a esta otra base de datos Base B) Basta con seleccionar un elemento de la lista (que pertenece a la base A) y un campo (X) del registro de la base A al que pertenece ese elemento se colocará en el campo correspondiente (el indicado en la propiedad DataField del control DBList o DBCombo) de la base B. y en vez de pasar el nombre que es el que figura en la lista. Ese campo (X) cuyo dato pasamos de la base A a la base B no tiene porqué ser el elemento que vemos en la lista. y donde verá que aparecen todos los campos de la base de datos seleccionada en el control Data asociado a este control. Léasela con la atención que se merece. Propiedad BoundColumn Devuelve o establece el nombre del campo de origen de un objeto Recordset que se utiliza para suministrar un valor de datos a otro Recordset. En el caso del DBCombo. y en su campo DataField). pongamos en la propiedad BoundColumn del DBList o DBCombo que estamos usando. en vez del elemento de la lista. son los especificados en las propiedades DataSource y DataField. Podríamos. Resumamos. Observe que por defecto. No se desespere si no entiende algo de lo allí expresado. otro campo de esa BD origen ?. Puede ser otro campo de la base A. que es otro campo de la misma BD. Es la propiedad que viene a continuación. Uno para rellenar la lista. nombre que hemos tomado de un listín telefónico. El control Data y el campo que rellena la lista son los especificados en las propiedades RowSource y ListField del control DBList o DBCombo.

Cuando se LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 319 . el DBList o DBCombo intenta buscar un elemento coincidente en el campo especificado en la propiedad BoundColumn de todos los registros de la BD asociada. MatchWithList Propiedad solo de lectura. la propiedad BoundText se establece en el valor Null. la propiedad MatchWithList se establece como True si el valor introducido es uno de los elementos que aparecen en la lista. el contenido de la propiedad BoundText no coincide con ninguno de los registros de la lista. Es decir. DataChanged Devuelve o establece un valor que indica que han cambiado los datos del control enlazado por algún proceso distinto de la recuperación de datos del registro actual. Esta propiedad es de lectura y escritura. Es decir. Esta propiedad está disponible solamente en tiempo de ejecución. y False (Predeterminado) que indica que los datos que hay actualmente en el control (si los hay) son iguales que los del registro actual. Es sencilla de usar para conocer el contenido del campo especificado en BoundColumn. Usando esta propiedad. Devuelve True si el contenido actual de la propiedad BoundText coincide con uno de los registros de la parte de lista del control. indicando que los datos que hay actualmente en el control no son iguales que los del registro actual. se establece el valor de la propiedad BoundText basándose en el campo especificado por la propiedad BoundColumn. Sintaxis Variable = objeto. si hay coincidencia con algún valor de ese campo.MatchWithList Si Variable = True el contenido de la propiedad BoundText coincide con uno de los registros de la lista.BoundText [= valor] En este caso. el código puede interceptar entradas que no están la lista. Si encuentra uno igual . Si no se encuentra dicha coincidencia.DataChanged ‘establece la propiedad ‘lee el valor actual de esta propiedad Variable puede ser True. Si no la hay. Si es False. o proporcionar código para agregar la nueva entrada a la tabla de origen. Cuando introduce un valor en la parte de texto del control DBCombo. No está disponible en tiempo de diseño.Devuelve o establece el valor de la propiedad BoundColumn de un control DBCombo o DBList pasado desde o hacia la propiedad DataField después de realizar una selección. BoundText seguirá con el valor especificado. Sintaxis objeto. debemos utilizar la siguiente sintaxis : objeto. (lectura del valor) Cuando la queramos utilizar para forzar el valor de esta propiedad a un valor determinado. Comentarios Cuando un control Data se mueve de un registro a otro.DataChanged [=Variable] Variable = objeto. es el contenido del campo especificado en la propiedad BoundColumn comentada anteriormente. BoundText se pone a Nulo. pasa datos desde los campos del registro actual a controles enlazados al campo específico o el registro completo.

Sintaxis objeto. MatchEntry Devuelve o establece un valor que indica cómo el control DBCombo o DBList realiza búsquedas basándose en la entrada del usuario. Sintaxis objeto.SelectedItem Cuando selecciona un elemento de la parte de lista del control DBCombo. Si DataChanged es True para algún control enlazado. La búsqueda se realiza a medida que se escriben los caracteres. la propiedad SelectedItem contiene un marcador que puede utilizar para reposicionar el registro seleccionado en el Recordset como especifica la propiedad RowSource. Si pasa a otro registro la propiedad DataChanged no se ve afectada. VisibleCount Devuelve un valor que indica el número de elementos visibles del control DBCombo o DBList. Sintaxis DBCombo1. SelText SelText devuelve o establece una cadena con el texto actualmente seleccionado.muestran datos en los controles enlazados.MatchEntry = valor Donde valor es una constante o un valor que define el comportamiento de un control cuando tiene el enfoque y el usuario introduce uno o más caracteres. Si no desea guardar los cambios de un control enlazado en la base de datos. Si el usuario o alguna operación cambia el valor del control enlazado. puede establecer la propiedad DataChanged como False en el evento Validate. la propiedad DataChanged se establece como False. el control Data invoca automáticamente los métodos Edit y Update para enviar los cambios a la base de datos. Un elemento se considera visible únicamente si una parte del texto es visible. se produce el evento Validate. o es una cadena de longitud cero () si no hay caracteres seleccionados. Cuando la propiedad MatchEntry se establece como vbMatchEntryExtended y el usuario presiona la tecla de retroceso o espera varios segundos. SelectedItem (Solo DBCombo) Devuelve un valor que contiene un marcador para el registro seleccionado en un control DBCombo. Cuando el control Data comienza a mover a otro registro. 1 vbMatchEntryExtended Coincidencia ampliada: El control busca una entrada que coincida con todos los caracteres introducidos. Al escribir repetidamente la misma letra se recorren todas las entradas de la lista que comienzan por esa letra. 0 vbMatchEntrySimple Coincidencia básica: (Predeterminado) El control busca la siguiente coincidencia del carácter introducido usando la primera letra de entradas de la lista. la propiedad DataChanged se establece como True. VisibleItems LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 320 .VisibleCount La propiedad VisibleCount devuelve un entero desde 0 al número de elementos visibles del control. la cadena de coincidencias de restablece. refinando progresivamente la búsqueda.

Pero adelanto que es complicado usarlos. pero pensado fundamentalmente para enlazarlo a datos a través del control Adodc1 (El control similar al Data en ADO). uno para cada elemento visible de la lista del control DBCombo o DBList. por ejemplo. o utilizar el método UpdateRecord del control Data. que lo hace automáticamente. se pueden meter imágenes en la base de datos Access. mediante los métodos AppendChunk y GetChunk. Para abrirlo no hay mas que leer la dirección del fichero. Hacerlo con el control Picture se puede. Basta para ello poner los valores adecuados en las propiedades DataSource y DataField para elegir un campo tipo Objeto OLE de la base de datos y está el problema resuelto. Basta para ello disponer de un CommonDialog. El campo debe ser del tipo Objeto OLE y puede manejarse de dos formas. Es posible introducir imágenes en una base de datos Access. ¡La lata que dan y lo poco que se usan! Controles Picture e Image para acceso a datos a través del control Data. mediante un control Data. como se ha visto. Y aquí se terminan las propiedades de DBList y DBCombo. pero es algo mas complicado. No es lo mismo para introducir los datos. Es muy sencillo sin embargo introducir y presentar imágenes residentes en una base de datos mediante los controles Picture e Image. Sin embargo también funciona con el control Data. no es aconsejable hacerlo debido al volumen tan grande de datos que genera. aunque con prestaciones reducidas.Devuelve una matriz marcadores. Estas dos condiciones le hacen el control ideal para presentar todos los datos del control Data para aquellos casos en los que no se permite cambiarlos al usuario. Estos controles son enlazados a datos y pueden guardar una imagen o presentarla. y otra de forma un poco complicada.VisibleItems Estos marcadores pueden emplearse para obtener registros individuales del conjunto de registros empleado para rellenar la lista. JPG o WMF. Sobre todo para presentar la imagen. Para presentar una imagen es preferible usar el control Image con la propiedad Stretch = False a usar el control Picture. muestra los datos solo para lectura. una de forma sencilla. A continuación la cargamos en el Control Picture o Image que está enlazado a datos mediante el método LoadPicture. para buscar una imagen dentro del disco. y meter en la base de datos la dirección completa del fichero. Nota final al control Data LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 321 . Pese a que. Merece la pena hablar del almacenamiento de imágenes en una base de datos. Tampoco permite cambiar el registro actual del control Data haciendo click sobre una de las líneas del MSFlexGrid. y presentarlo en el Picture o Image mediante el método LoadPicture. El fichero puede ser un BMP. Estando enlazado al control Data. Para introducir la imagen en la base de datos basta con cambiar de registro. Estos dos métodos los veremos un próximo capítulo. siempre veremos la imagen con el tamaño diseñado en el formulario. Con el Image y esa propiedad puesta a False. Abrimos el CommonDialog (CD1) y buscamos la imagen deseada. Sintaxis objeto. Control MSFlexGrid El control MSFlexGrid es un control similar al DBGrid. pero también es muy sencillo. Es preferible guardar la imagen en el fichero con la imagen.

Se comenzó a exponer que no es necesario usar un LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 322 . Efectivamente hay controles más modernos creados mediante la tecnología ActiveX que aportan unas prestaciones mayores que estos dos controles. El control Data y DAO tienen mucho que decir todavía en la programación en Visual Basic. No se desanime. enlazados mediante un control Data. Estudie bien el control Data y el acceso a través de DAO. Pero tienen también su contrapartidas. Visual Basic Guía del estudiante Cap. 12 Objetos DAO ACCESO A BASES DE DATOS SIN UTILIZAR EL CONTROL DATA En el capítulo anterior hemos visto los controles capaces de acceder a un Base de Datos. Y formas de acceso a datos mucho más modernas y abiertas que el motor Jet. Llevará mucho camino recorrido para estudiar posteriormente ADO.Puede ver en la información de Microsoft palabras como “los antiguos controles Data y Control de datos remotos (RDC)”.

(Data Access Objet). añadir registros o cambiar su contenido. La primera sorpresa suele ocurrir a la hora de declarar un objeto. Comenzaremos ahora a ver que el control Data pese a que puede evitarnos gran cantidad de líneas de código. y si ha instalado Access2000 tendrá la 3. Los objetos DAO utilizan el Motor de Bases de Datos Jet de Microsoft y trabajan directamente sobre el fichero que contiene la base de datos. Si nuestra aplicación se separa un poco de lo normal.1. debemos declararlos como se declaran las variables. El control Data se ha desarrollado para realizar un trabajo muy estándar. y siguen siendo válidos los criterios de declaración de variables en cuanto al ámbito de aplicación. 2.5. Pero en este capítulo vamos a ver como se pueden manejar bases de datos utilizando otros objetos de acceso a datos. Eso sí. Son los objetos RDO y ADO. mediante el uso de un control Data metemos en memoria RAM todo el contenido de la base de datos relativo al Recordset que hemos creado. debido precisamente a que no trabajan directamente sobre el fichero. El control Data también permite consultas más rápidas a la BD. Vaya a Proyecto | Referencias … de la barra de menú y seleccione Microsoft DAO 3. al igual que lo hace Access.5/3. (Las versiones 2. En realidad esta DLL no es mas que un componente de Access que podemos usar. un DBList o un DBCombo. Ahora ya no le dará el error anterior.6) Existen tantas versiones distintas como versiones de Access. lo mas probable es que necesitemos realizar las operaciones mediante código.51. No se ha definido el tipo definido por el usuario. y nos podremos referir a ellos por su nombre como hacíamos con todos los controles.51 Objet Library Haga click en Aceptar y ya tiene agregada esa referencia a su programa. pese a que no tienen representación en la interface gráfica. Veremos mas adelante que también será necesario cuando queramos guardar imágenes en una Base de Datos. Será necesario en aquellas aplicaciones en las que se va a usar un control DBGrid. son objetos Visual Basic como los demás. Esto no quiere decir que el Data haya que dejarlo en desuso. Verá que hay mas referencias parecidas a Microsoft DAO 3. Si declaramos un DAO en un procedimiento. cuyo estudio se realizará en capítulos posteriores. para gestionar una base de datos. para declarar un objeto tipo DataBase debemos hacerlo con la siguiente declaración: Dim MiBaseDatos As DataBase Y al ejecutar el programa puede ocurrirle el siguiente error: Error de compilación. Para que la conozca. sino sobre una conexión ODBC que enlaza con la base de datos. pues en esa DLL que acaba de agregarle a su programa está la explicación al secreto de lo que es un objeto DataBase. Y es más. Eso sí. estamos empleando mucha más memoria RAM. Agregar una referencia significa que le ha dicho a su programa que puede hacer uso de una colección de DLLs donde podrá encontrar la definición del objeto o la variable que no encuentra. El hecho de guardar el contenido completo del Recordset en la memoria hace que cualquier consulta sea más rápida. Si queremos que sea válido en toda la aplicación deberemos declararlo en la sección de declaraciones de un módulo. o en la sección de declaraciones de un formulario si fuese suficiente ese ámbito para nuestra aplicación. Es normal. no nos podremos referir a él fuera de ese procedimiento. debe agregarle una referencia. Concretamente los objetos DAO. El control Data será necesario en aquellas aplicaciones donde utilicemos un DBGrid. pero no tienen algunas prestaciones que tienen los DAO..0. como ha podido ver en el capítulo anterior.control Data para acceder a leer datos. Debe elegir la LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 323 . Estos últimos tipos son mas modernos. Existen otros objetos de acceso a datos. Por ejemplo. nos hace perder el control respecto al programa. Centrémonos sobre los objetos DAO Estos objetos. Lo que le está ocurriendo es que su programa no conoce el tipo de variable DataBase. pues como se recordará. 2. que no trabajan directamente sobre el fichero.

5 puede trabajar directamente sobre el fichero de la base de datos o a través de una conexión ODBC. Es importante resaltar lo de su estructura jerárquica. Al objeto que agrupa a todas las bases de datos abiertas en ese momento le llamamos Objeto Databases. IniPath. que dice que cualquier versión que Microsoft considere obsoleta no debe reconocer los datos guardados por versiones más modernas del mismo programa.6 no podrá abrirla con Access 97 ¡Esta es la compatibilidad hacia delante de Microsoft! Objetos DAO de acceso a datos Son muchos y tienen estructura jerárquica. Version Colecciones Errors. un objeto Database es un objeto DAO que representa una base de datos abierta. Es lógico. CompactDatabase. La versión Microsoft DAO 3. Workspaces Veremos estos métodos y propiedades según vayamos avanzando en el capítulo LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 324 . el objeto Databases contendrá dos elementos. El objeto dbEngine tiene los siguientes métodos. Con el primero nos permite CREAR bases de datos. Comenzaremos precisamente por él la explicación de los objetos DAO. Por ejemplo. Por ejemplo.2. Y como vimos en el capítulo anterior. LoginTimeout. es precisamente el Motor de Bases de Datos Jet y solamente existe uno. DefaultUser. ¿Cree que es oportuno en estos momentos. El dbEngine.5 corresponde a la versión de Access 97. Si crea una BD con la versión 3. Puede observarse que tiene muchos mas objetos en el espacio de trabajo Microsoft Jet que en el de ODBCDirect. pero con cuidado.6 corresponde a Access 2000. cuando se está escribiendo este libro. Si tenemos dos bases de datos abiertas en un determinado momento. El dbEngine es el motor Jet. Hay que señalar que las colecciones de estos objetos DAO son a su vez objetos de acceso a datos. Index o Relation. un objeto DAO crea los objetos DAO inmediatamente inferiores en jerarquía. Cuando cree con su programa una base de datos con esta versión. y por lo tanto necesita tener objetos tales como el Tabledef. Esto hay que explicarlo un poco mejor.0 No se olvide de la teoría de la compatibilidad de Microsoft. Idle. Todos los objetos DAO excepto el dbEngine tienen colecciones. no podrá abrirla con Access 2.1 y 20. está recién aparecido Access 2000. Properties. la versión 3. En el primer caso decimos que está trabajando en el espacio de trabajo Microsoft Jet Si le hacemos trabajar a través de ODBC decimos que estamos trabajando en el espacio de trabajo ODBCDirect Los objetos que emplea en cada uno de los espacios de trabajo pueden verse en las figuras 20. RegisterDatabase Propiedades DefaultPassword. No se sorprenda si antes de instalar Access 2000 no tenía esa referencia y después de la instalación sí. RepairDatabase. La versión 3. Lo verá un poco mas adelante. Es lógico. como verá mas adelante. Piense si es posible que alguien que vaya a abrir una base de datos guardada con su aplicación dispone de una versión anterior de Access. en los que todavía se está introduciendo en muchos usuarios Access 97 usar una DLL que nos cree bases de datos que solamente puedan ser abiertas por Access 2000?. ya que como verá. propiedades y colecciones Métodos CreateWorkspace. Si ha instalado este programa le aparecerá esa referencia en la lista de referencias.versión mas alta.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 325 .1 Objetos DAO para el espacio de trabajo Microsoft Jet En esta figura pueden verse los objetos y sus colecciones. Parece un poco complicado. Lo cierto es que para el trabajo que se hace normalmente con bases de datos este diagrama queda bastante reducido. No se extrañe tampoco de ver que objetos como el Fields y el Field existen en varios niveles.Fig. y posiblemente lo será. Lo verá mucho mejor mas adelante. Las colecciones llevan el nombre en plural. 20.

Objeto Workspace Un objeto Workspace define una sesión de trabajo para un usuario específico. que es una colección de cuentas de usuario. Estos objetos. que no son objetos de acceso a datos. Bases de Datos (Databases). 20.2 Objetos DAO para el espacio de trabajo ODBCDirect Este modelo parece un poco mas asequible. La razón es que no hace todo lo que hace el espacio de trabajo Microsoft Jet. Será necesario crear varias sesiones cuando necesitemos imponer restricciones de acceso a una base de datos. No se preocupe de que ahora mismo no lo entienda. No tendría sentido hablar aquí de ellos si no fuese porque encontrará referencias a estos objetos continuamente en la ayuda de Visual Basic. y en algún caso más. El objeto Workspace contiene: Para el espacio de trabajo Microsoft Jet: Grupos de trabajo. Ya lo entenderá. Pero lo normal es tener solamente una sesión abierta. que es un grupo de usuarios de un entorno multiusuario que comparten datos y el mismo sistema de base de datos. cuando tengamos que usar Transacciones (*) en un sistema multiusuario. sino de explotación de los recursos del sistema. Este el objeto que ahora nos interesa del objeto Workspace. Este Workspace es precisamente el que ocupa el número cero de la colección de Workspaces. una sesión de trabajo en el más puro estilo informático. Cuando se inicia Visual Basic. están enfocados a la seguridad respecto al acceso a las bases de datos que se trabajan conjuntamente. Grupos de usuarios. Pueden existir varias sesiones de trabajo. Una sesión de trabajo es precisamente eso. se crea un Workspace con palabra clave y nombre de usuario Admin. Un objeto Database es una base de datos abierta. Pero hay que exponerlo ahora. Es decir. pero en la mayoría de los casos eso no es lo normal.Fig. Para el espacio de trabajo ODBCDirect: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 326 . es el Workspaces(0). Y visual Basic nos facilita este caso abriendo una sesión de trabajo automáticamente. Las sesiones de trabajo tienen dueño (Usuario) y una palabra clave para acceder a ellas.

objeto que no tenemos en el Microsoft Jet ya que con este sistema accedemos directamente al fichero de la base de datos.. El número 0 A este Workspace no podemos ponerle ningún tipo de palabra de acceso.. Esta sintaxis es tan simple que un profesor de Visual Basic decía que es como un “juego de niños” No lo olvide y se le quitará el miedo al manejo de bases de datos mediante código.. ¿Para que se van a crear bases de datos mediante un programa si puedo hacerlo directamente con Access? .. Una vez declarado el nombre del objeto Workspace. En el espacio ODBCDirect tenemos un objeto llamado Connection. alguna cosa va a depender de cada método y de lo que Vd. hay que crearlo. mientras trabaje con Visual Basic y Bases de Datos: Set ObjetoDAOInferior = ObjetoDAOSuperior. el número 0 de la colección Workspaces. En el Microsoft Jet tenemos Usuarios y Grupos de Usuarios.. no usuario de ofimática. cada vez que se inicia una sesión de Visual Basic. No necesitamos ninguna conexión establecida previamente.. Para hacer que Misesion sea ese Workspace que crea automáticamente VB basta con ejecutar la siguiente línea de código Set Misesion = Workspaces(0) Pero si no queremos aprovechar este Workspace creado automáticamente por Visual Basic. Comenzaremos a explicar la operación de bases de datos mediante DAO explicando como se crean bases de datos Access mediante Visual Basic. y tal como citábamos mas atrás.. Ya podemos comenzar a comprender una diferencia entre ambos espacios de trabajo.) se mantendrá en todas las operaciones de creación y manipulación de objetos DAO. pero la estructura Set DAOInferior = DAOSuperior.Método ( . alguna cosa ) Logicamente el término Aquí . Objeto Database LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 327 .. En el espacio ODBCDirect no los tenemos. Ese nombre habrá que declararlo como nombre de una variable objeto Workspace : Dim Misesion as Workspace La declaración de la variable Objeto tiene las mismas características que cualquier variable en cuanto al ámbito en el que se puede usar.. se crea automáticamente un Workspace. usemos el método CreateWorkspace. y queremos usar otro. Creación de Objetos DAO Para crear un objeto DAO (Cualquiera que sea) debemos usar una forma que se va a repetir a lo largo de toda su vida profesional. Utilicemos este Workspace. Tiempo tendremos mas adelante de ver como se crea un Workspace. Posiblemente hasta ahora le haya parecido muy difícil y haya optado por usar el control Data para todas sus aplicaciones.. sea programador. Al objeto Workspace se le puede dar un nombre definido por el usuario. Esta pregunta me la han hecho los alumnos durante todos mis años de docencia.Método ( Aquí .. Si recuerda este Juego de niños verá que es más sencillo crear objetos DAO que poner un control Data en un formulario. Se verá al final del capítulo. que representa una conexión con una base de datos a través de ODBC Bases de Datos (Databases). ya que el permiso o denegación de acceso de uno u otro usuario a una base de datos se establece cuando se crea (en Windows) la conexión ODBC. La única respuesta para ello es que deseo que Vd. ya que se la ha puesto VB : Admin. para comenzar a trabajar... quiera hacer.Conexión... En realidad. Para que pueda usarse en toda la aplicación deberemos declararla en un Módulo con la sentencia Public Public Misesion as Workspace Esta advertencia es válida para la declaración de todos los objetos DAO.

para permitir la ordenación alfabética de los datos. La sintaxis del método CreateDataBase es el “juego de niños” citado antes: Set ObjetoDAOInferior = ObjetoDAOSuperior. Crear una Base de Datos ACCESS. En el ejemplo que veremos mas adelante.Un objeto Database representa una base de datos abierta.Método ( Parámetros ) En nuestro caso el Objeto DAO superior es el Workspace Misesion. El nombre del objeto Database tampoco tiene porque coincidir con el nombre del fichero que se va a crear. bien porque hemos creado una base de datos mediante el procedimiento CreateDataBase. Un objeto Database puede crearse. Eso sí. La colección Databases pertenece al Workspace. Al objeto Database se le debe dar un nombre definido por el usuario. y los parámetros que hay que pasar en este caso son: Nombre (y Path) del fichero de la base de datos Idioma. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 328 . el nombre del objeto Database es MiBaseDatos y el nombre del fichero es MiBase. En cualquiera de los dos casos.Mdb. Recuerde que el objeto Database NO es el fichero que va a contener la base de datos sino que es una estructura de base de datos que está de momento en la memoria RAM del ordenador. Previamente debemos declarar el nombre que queremos dar al objeto DataBase que se va a crear como un objeto Database : Dim MiBaseDatos as Database Si tenemos declarado un Workspace llamado Misesion mediante la declaración : Dim Misesion as Workspace Y hacemos que Misesion sea el Workspace creado automáticamente por VB Set Misesion = Workspaces (0) podremos usar el método del Workspace CreateDatabase para crear ese objeto Database. Colección Databases Es el conjunto de Objetos Database existentes. el objeto Database existe hasta que lo cerremos (mediante el método Close) o hasta que cerremos la aplicación. Método CreateDatabase Para crear una base de datos deberemos utilizar el método CreateDatabase. o porque hemos abierto una base de datos existente mediante el procedimiento OpenDatabase. Una colección Databases contiene todos los objetos Database abiertos en un objeto Workspace del motor de bases de datos Microsoft Jet. Para los idiomas español. El fichero se creará posteriormente cuando cerremos el objeto Database. inglés y francés debe usar dbLangGeneral. El objeto DataBase es la base de datos que creamos en la memoria RAM del ordenador. hay que declararlo como una variable objeto Database Dim MiDataBase As Database El nombre que le demos al objeto DataBase no tiene nada que ver con el nombre del fichero que alberga esa base de datos.

escenario. portugués. Ejecute Access y abra la BD C:\MiCarpeta\MiBase. Una Base de Datos ACCESS tiene tablas.MDB”. usará ese Workspace predeterminado.MDB. se utilizará el objeto Workspace predeterminado . NO el nombre del archivo con el que quedará guardada en el disco.MDB".CreateDatabase (nombre_base.MDB. Si no se indica una extensión. ¡Ya Existe! Pero observará que está completamente vacía. por ejemplo) Vayamos al ejemplo: Set MiBaseDatos = Misesion.51. (Obligatorio) que denominaremos inf_local y el Password o palabra clave que quiere usar para restringir su uso. nombre_base es el nombre del archivo de base de datos que se va a crear. también puede especificar una ruta de red.Workspaces(0) – e incluso. El Método CreateDataBase Crea un nuevo objeto Database. dbLangGeneral) Si ahora cierra el programa le creará la Base en el disco. al tiempo que explicamos el resto de los procedimientos que hay que usar para ello. (ACCESS) escenario es una expresión de cadena utilizada para especificar dos cosas: el orden alfabético que se va a usar en esta base de datos. como por ejemplo "C:\MiCarpeta\MiBase. como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD".CreateDatabase (“C:\MiCarpeta\MiBase. se agregará . Si la red lo admite. Misesion es el nombre del objeto Workspace existente que contendrá la base de datos. Si no pone nada en este parámetro le crea una base de datos sin cifrar. Si se omite este argumento. guarda la base de datos en disco y devuelve un objeto Database abierto. y de la última versión que le permite la referencia elegida para el motor de bases de datos (Microsoft DAO 3. Es normal. Con este método sólo pueden crearse archivos de base de datos . alemán. Es un argumento obligatorio. Es decir. Puede combinar varias opciones sumando las constantes correspondientes. pues no hace nada especial respecto a dbLangGeneral LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 329 . el nombre del archivo en el disco. italiano y español moderno se usa la siguiente constante : dbLangGeneral No use dbLangSpanish. Valores de los parámetros En el argumento inf_local se suministra información de la lengua empleada para especificar la propiedad CollatingOrder del texto para las comparaciones entre cadenas. Puede ser una ruta completa y un nombre de archivo. si no se pone nada. francés. Vamos a seguir creando esta base de datos. Este Password es opcional.MDB. Y de momento no hemos escrito ningún código para crear esas tablas. Consulte la tabla de constantes para inf_local incluida más adelante en este tema. En el argumento Opciones puede combinar varias opciones. Para los idiomas Inglés.Opciones. que le permite elegir la versión de la base de datos a crear (Equivalente a la versión de Access) y si deseamos crear una base de datos cifrada. opciones) MiBaseDatos es el nombre del objeto Database por el cual nos referiremos a esa base de datos. Vaya a la ayuda de VB. según se especifica a mas adelante. Verá que la sintaxis de este método es: Set MiBaseDatos = Misesion. Debe especificar el argumento inf_local o se producirá un error.

Opciones se pueden usar las siguientes constantes : Constante dbEncrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Descripción Crea una base de datos codificada. Relation). Para hacer las cosas poco a poco nos fijaremos solamente en las tablas y los campos. QueryDef. Pero tampoco se fíe mucho. Recordset. ya que no podrá abrir la base si no se conoce ese Password. Field.0 del motor de base de datos Microsoft Jet.pwd=NuevaContraseña" Para el último parámetro. será una Tabla que podemos ver cuando abramos la BD con Access. Access se los guardará codificados. Esta Versión es compatible con la 3. El método CreateDataBase abre esta nueva base de datos y devuelve un objeto Database. No piense que al codificar la base de datos va a mantener sus datos confidenciales en secreto. Fields. Crea una base de datos que utiliza la versión 3. alguna vez le pedirá que le obtenga un Recordset con los datos ordenados alfabéticamente ( acuérdese de la sentencia SQL ORDER BY Nombredelcampo ) Si desea introducir una palabra clave para restringir el acceso a la base de datos. pero que de momento está en la memoria RAM del ordenador.5 Si se omite la constante de codificación.0 del motor de base de datos Microsoft Jet. (Advertencia sobre las bases de datos codificadas. crea una Base de Datos sin nada que deberá rellenarla posteriormente con tablas. cuya estructura y contenido deberá completar utilizando objetos de acceso a datos adicionales. Utilice para ello el Password. No emplee este procedimiento en aplicaciones en las que necesite verdadera confidencialidad. Crear una Tabla. Método CreateTableDef. Verá mas adelante que también hay objetos Field en otros objetos DAO (Index. Es decir.Este parámetro es obligatorio. pero se los va a presentar de forma clara. (Objetos Tabledef y Field) El Objeto TableDef es una tabla de una base de datos ACCESS. Existen infinidad de craqueadores de contraseñas de Access. Hay que poner pwd antes de la contraseña dbLangGeneral & ". Objetos DAO para introducir en una base de datos Estos objetos que se pueden añadir son : Objetos TableDef. Deberá concatenarlo con la inf_local mediante el signo & y separarlo mediante punto y coma. Crea una base de datos que utiliza la versión 1. Crea una base de datos que utiliza la versión 1.5 del motor de base de datos Microsoft Jet. se creará una base de datos no codificada. El Password vale para proteger la BD de usuarios no “piratas”. Crea un objeto Tabledef. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 330 . QueryDefs. QueryDef. El Objeto TableDefs es la colección que contiene todas las tablas de la base de datos Un objeto Field representa un campo dentro de una tabla Access. pero de momento vamos a fijarnos solamente en las tablas. TableDefs. Cuando esa estructura se pase al fichero de la base de datos en el disco. La colección Fields contiene todos los campos de una tabla. que no es ni más ni menos que la estructura de una tabla Access. debe indicarlo a continuación.1 del motor de base de datos Microsoft Jet. Piense que una vez creada la Base de Datos. Crea una base de datos que utiliza la versión 2.

Pero como siempre. Puede ser perfectamente el objeto Database creado anteriormente. MiCampo121 as Field. etc Tipo de dato.MDB”) Declaremos ahora el nombre que quiere ponerle al objeto Tabledef que va a crear: (MiTabla1) Dim Mitabla1 As Tabledef Si queremos introducir varias tablas en la BD deberemos declarar tantos objetos Tabledef como tablas necesitemos: Dim MiTabla2 as Tabledef.CreateField ([nombre[. Aunque se le explicará mas tarde. Debemos crear objetos Field (Campos) para poder meterlos en los objetos Tabledef que acabamos de crear.CreateTableDef (“Asignaturas”) De momento solamente hemos creado uno o varios objetos Tabledef. origen[. Crear campos.OpenDatabase (“C:\MiCarpeta\MiBase. le adelanto el método para abrir una base de datos existente en el disco: Set MiBaseDatos = Misesion.CreateTableDef (“Profesores”) Set Mitabla3 = MiBaseDatos.CreateTableDef (“Alumnos”) Si queremos crear más Tabladefs: Set Mitabla2 = MiBaseDatos. pero de momento nos quedamos únicamente con el primero: Nombre. MiTabla3 as Tabledef. numérico. Date. El objeto Field solamente está en la memoria RAM del ordenador. simplemente) para poder ver con Access la base de datos que acaba de crear. Previamente declararemos los nombres de los Objetos Field a introducir. P. etc Sólo para los campos String. Dim MiCampo11 as Field. String. Indicará el número de caracteres de ese campo.e. MiCampo21 as Field (El Campo11 es el primer campo que meteremos en el Tabledef Tabla1. que es el nombre que podrá ver en Access como nombre de la tabla que va a crear. Creamos el objeto Field con la siguiente sintaxis Set MiCampo11 = Mitabla1. tamaño]]]) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 331 . Método CreateField Crea un objeto Field. etc. tipo [. Los parámetros que vamos a pasar en este método son: Nombre Tipo Tamaño Será el nombre de ese campo. NombreAlumno. Pero seguramente lo ha cerrado (cerrando el programa.CreateTableDef (Nombre) Ejemplo: Set Mitabla1 = MiBaseDatos. Apellidos. El Campo12 el segundo. Puede volver a crear el objeto DataBase abriendo la base de datos. atributos[. conexión]]]]) Se explicará para que sirven todos ellos. Set Mitabla1 = MiBaseDatos. vacíos. Una tabla tiene campos. que es la estructura de lo que mas tarde será un Campo de una tabla de la BD. …… y crearemos las tablas necesarias mediante el método CreateTableDef Si acude a la información de VB para ver los parámetros que hay que pasar en el método CreateTableDef verá que son muchos: ([nombre[. el Campo21 será el primer campo del Tabledef Tabla2. El objeto Field debe crearlo el objeto DAO superior a él: el Tabledef. Cuando pase a formar parte de una tabla será un campo de esa tabla. Un objeto Tabledef tiene Fields.El objeto Tabledef debe crearlo un objeto DataBase.

es decir.CreateField (“Edad”. Observe que cada objeto Field debe ser creado por el objeto Tabledef que lo va a contener.Tabledefs. dbText.Append Micampo14 MiTabla1.CreateField (“Fecha_Ingreso”. Pero antes de seguir reflexionemos y recordemos lo que hemos hecho hasta ahora. CreateField es un método del objetos TableDef.Append Mitabla2 Si ahora cerramos la base de datos mediante el método Close: MiBaseDatos. Puede servir también para evitar que dos registros tengan el mismo valor para un determinado campo. es decir. del objeto DataBase.CreateField (“Apellidos”.Append Micampo15 MiTabla2.Append Micampo21 Ya tenemos campos formando parte de la colección Fields de las tablas.Fields.Close Ya tenemos la base de datos creada en el disco de la misma forma que lo hubiera hecho Access. Una Relación es una correspondencia entre un campo de una tabla y otro campo de características similares en otra tabla.Fields. Se añade mediante el método Append.CreateField (“NombreProfesor”. CreateTableDef es un método del objeto Database. 20) Set MiCampo13 = Mitabla1. Esa colección de tablas es el objeto Tabledefs de la base de datos.CreateField (“ID_Alumno”. El método correspondiente para crear un objeto DAO pertenece al objeto DAO inmediatamente superior en jerarquía.Fields. Observe que. (MiTabla1 crea todos sus campos. dbText. En Visual Basic también. Esa colección de campos es el Objeto Fields de la tabla. dbText.Fields.Append Mitabla1 MiBaseDatos. dbDate) Set MiCampo21 = Mitabla2.TableDefs. Tenemos que añadirlos a la colección de campos de la tabla que los creó. y además que no se pueda repetir el mismo valor para dos registros distintos. En Access se puede establecer una relación de una forma muy sencilla. En el ejemplo que estamos preparando. pero todavía no están metidos en las tablas.Fields. de forma que no puedan existir dos registros con el mismo valor en ese campo. etc) Ya están todos los campos creados. Ahora debemos añadir las tablas a la colección de tablas de la base de datos. para ordenar los registros de la BD por ese campo. cada vez que creamos un objetos (DataBase. MiTabla2 los suyos. dbText.CreateField (“NombreAlumno”. 20) Se crean todos los campos que se quieren introducir en las tablas. CreateDatabase es un método del objeto Workspace.Append Micampo13 MiTabla1. Esto nos lleva al concepto de Base de Datos Relacional que seguramente ya sabe de que se trata. Esa marca puede servir por ejemplo.Append Micampo11 MiTabla1. Field) usamos el mencionado “juego de niños”. MiTabla1.Fields.(Vea el Anexo 1 Propiedades de los campos al final de este capítulo) Ejemplos Set MiCampo11 = Mitabla1.Append Micampo12 MiTabla1. 25) Set MiCampo14 = Mitabla1. Pero puede que le falte algo respecto a una base creada directamente con Access: los Indices y las Relaciones. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 332 . el Campo11 (ID_Alumno) queremos que sea un índice. Un índice es una marca que le podemos poner a cada uno de los registros en un campo. dbInteger) Set MiCampo15 = Mitabla1. Tabledef. 8) Set MiCampo12 = Mitabla1. Lo haremos también mediante el método Append MiBaseDatos.

y la colección Databases (Objeto Databases) pertenece a un objeto Workspace. Puede que le parezca un poco extraño alguno de los métodos que vamos a usar para crear un índice.Método ( .Colección. 8) El nombre del campo. El procedimiento es siempre el mismo : Objeto superior. tipo y tamaño deben coincidir con los datos que sirvieron para crear el campo en el objeto Tabledef. Tendremos que decir que pertenece al sistema. La colección Fields (Objeto Fields) pertenece a un objeto TableDef. recurra a la ayuda de VB.. (y aquí empieza la incongruencia citada) este objeto Index debe crear el campo que queremos que sea índice. abre la función Ver | Indices de la barra de menú. y el DBEngine ya no podemos asignarlo a ningún objeto DAO. El índice debe crearlo el Tabledef al que pertenece el campo que queremos que sea índice. Crear Indices para los campos. Se hace mediante el método del objeto Tabledef.CreateIndex (“Indice1”) Ya tenemos creado el Objeto Index. La colección Workspaces pertenece al DBEngine. como por ejemplo volver a usar el procedimiento CreateField para crear un campo que ya existe. Primer debemos crear el Objeto Index.. al ejemplo que ilustra esta Guía del Estudiante como colofón a este capítulo.CreateIndex([Nombre]) Donde NombreIndice es el nombre de una variable declarada como tipo de dato objeto Index.. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 333 .Las colecciones pertenecen también al objeto inmediatamente superior en jerarquía al tipo de objetos que forman la colección.. La sintaxis de CreateIndex es: Set NombreIndice = NombreTabledef.-) Hemos visto que después de crear un objeto. Este nombre lo puede ver si abre la base de datos con Access y en la vista de Diseño de la tabla. dbText. debemos añadirlo a la colección a la que debe pertenecer con el método Append. Le recomiendo que si no se acuerda bien de cómo se hace. Vamos a ver como se crea un Indice. la colección TableDefs (objeto TableDefs) pertenece a un objeto Database. CreateIndex. NombreTabledef es el nombre de variable del objeto TableDef que se desea usar para crear el nuevo objeto Index. Método CreateIndex Para crear un índice debe estar creado el campo al que se le va a aplicar el índice.CreateField (“ID_Alumno”. O si lo prefiere. Pero ese campo ya debe existir en el objeto Tabledef con el que hemos creado el índice (en este caso. Son las incongruencias que tiene a veces Visual Basic. que en este caso es exacta y concisa. en MiTabla1) Set MiCampo11 = MiIndice.Append Objeto a añadir Sigamos ahora perfeccionando la base de datos. Nombre es una variable de tipo String que da un nombre único al nuevo objeto Index. Ahora. Recordemos ese “juego de niños” : Set DAOInferior = DAOSuperior. En nuestro ejemplo: Declaramos el objeto Index Dim MiIndice as Index Creamos el índice Set MiIndice = MiTabla1.

Uniuqe = True MiIndice. DistinctCount que no se explican para no complicar mas el tema.No permite repetición de valores en ese campo Required . dbText.Append MiCampo11 Si fuesen dos los campos MiIndice.El objeto Index representa la clave primaria de la tabla.Indexes.CreateField (“C_Grupo”. el 123) Hay muchas mesas dentro de un inventario.Fields. 3) Ya tenemos el campo o los campos creados por el índice.Fields. Otras propiedades son: Primary .CreateField (“Numero”. pero alguna vez se terminará aprendiendo. Por ejemplo. en nuestro ejemplo. Para relacionar un LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 334 . Un objeto inventariable (por ejemplo una mesa) tiene un código de grupo (por ejemplo. Cada vez que hago esto en la vida real tengo que volver a leer este procedimiento en la Guía del Estudiante. Ese índice estará formado entonces por dos campos. Ya tenemos la base de datos completamente creada. Indice1). 3) Set MiCampo12 = MiIndice. Un objeto Index tiene propiedades. Es complicado.Pero un índice puede tener varios campos. etc) La combinación de código de grupo más el número del objeto dentro de ese grupo queremos que sea un índice. Lo hacemos mediante el método Append MiIndice. Una de ellas ya la hemos visto sin querer. Ahora debemos añadir ese índice a la colección Indexes del Objeto Tabledef. pero todas ellas tienen un número distinto (una tiene el 001. la propiedad Name (nombre del índice. Unique .Append MiCampo11 MiIndice.Indica si permite valores Nulos en los campos del índice. Ahora debemos añadirlo (o añadirlos) a la colección Fields del objeto Index recién creado.Indica que todos los campos del objeto Index deben rellenarse. Cuando los necesite no tendrá inconveniente en estudiarlos partiendo de la ayuda de VB) Para introducir el valor de una de estas propiedades se procede con la siguiente sintaxis: MiIndice.Fields. Se pueden establecer relaciones uno a uno ó uno a varios. (Existen además las propiedades Clustered. dbText. El código es el número que identifica de forma unívoca a un objeto. Sin embargo alguien dirá que le falta algo: Relacionar dos tablas Relaciones entre tablas Método CreateRelation Una Relación es una asociación establecida entre dos campos del mismo tipo ubicados en dos tablas distintas.Append MiCampo12 No crea que ya hemos terminado. piense en el código de un objeto en un inventario.Primary = True Ya está creado el índice y tiene ya metido uno o mas campos y todas sus propiedades.Append MiIndice Lo confieso. En este caso deberemos crear los dos campos: Set MiCampo11 = MiIndice. Foreign. IgnoreNulls . MiTabla1. otra el 002.

A la tabla que contiene el campo (o los campos) relacionados se le llama Tabla Relacionada. ese cambio se refleje en el campo o los campos relacionados con el. En este caso dbRelationUpdateCascade. Una relación debe tener campos. para que. que es un método del objeto Database. Para crear una relación usaremos el Método CreateRelation. le decimos a MiRelacion cual es la Tabla principal MiRelación. paciencia.campo con otros. Una vez creada la relación. Supongamos que queremos crear una relación en la base de datos creada en el ejemplo anterior. Set MiBaseDatos = Workspaces(0). Si no lo está. Por lo tanto. (Lógico. una relación se establece entre dos tablas. y queremos relacionar el campo Campo11 que está en MiTabla1 y que lo habíamos hecho clave primaria. Como para cualquier otro objeto DAO. deberemos hacer una cosa similar a la que hacíamos para el método CreateIndex. Este objeto forma parte de una colección.Table = "MiTabla1" Le decimos cual es el nombre de la tabla relacionada MiRelación.ForeignTable = "MiTabla2" ‘Nombre de la tabla relacionada 'Nombre de la tabla principal. Para crear una relación. podrá comprobarlo visualizándola con el visor de relaciones del Access Suponemos que la base de datos está abierta. la abrimos. con el campo Campo21 de MiTabla2. usaremos un nuevo objeto DAO : El objeto Relation. crear los campos mediante el Objeto Relation que acabamos de crear. A la tabla que contiene a este campo se le llama Tabla Principal. que es MiRelacion Set MiRelacion = MiBaseDatos.CreateRelation ("RelacionUno") Una vez creada. Pero esos campos ya deben estar creados en las tablas que se van a relacionar. MiTabla1 y MiTabla2 son los nombres reales de las tablas. pero le advertimos lo mismo que para los índices. que tendrá por nombre RelacionUno. Por lo tanto. la relación debe pertenecer al objeto DAO superior jerárquicamente a las tablas: el Objeto Database.OpenDatabase("MIBD. mediante el método CreateField. El ejemplo que trae la ayuda de VB puede ser muy aclaratorio. NO los nombres de los objetos Tabledef. Le ponemos los atributos a la relación. Deberemos declarar el nombre del objeto Field que vamos a crear para la relación Dim MiCampo as Field LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 335 .MDB") Creamos el objeto Relation. que es a su ves otro objeto DAO : el objeto Relations. MiRelación.Attributes = dbRelationUpdateCascade Le decimos cual es el nombre del campo de la tabla principal que vamos a relacionar. ese campo debe ser clave primaria.CreateRelation ("RelacionUno") Una relación se hace entre dos campos. es necesario declararlo : Dim MiRelacion as Relation Para crear la relación deberemos usar el método CreateRelation Set MiRelacion = MiBaseDatos. pero este nombre NO debe confundirse con el nombre del objeto DAO Relation. si hacemos un cambio en el valor del campo de la tabla principal.

Crear una consulta. Pero aunque podemos ver esos registros como tales. Campo11 debe estar ya creado en la tabla Tabla1. además de tablas. Puede faltarle una o varias consultas. La diferencia entre una consulta (Un QueryDef) y una tabla (Un TableDef) es que la Tabla tiene dentro de sí los datos.Fields. las consultas no contienen el dato.ForeignName = "Campo21" Añadimos el campo creado a la colección Fields del objeto Relation MiRelación. Le decimos ahora cual es el nombre del campo en la tabla relacionada MiCampo. La relación existe en una base de datos no activa que contiene las dos tablas vinculadas. Precisamente con un objeto QueryDef Consultas. Antes de utilizar el método CreateQueryDef debe declarar el nombre de los objetos a crear. lo que estamos presentando son los datos almacenados en la tabla o las tablas que componen esa consulta.Set MiCampo = MiRelación. sino el número del registro dentro de la tabla que lo contiene. Contienen una referencia a los registros de las tablas que los contienen. CONSULTAS. Las eliminaciones se realizarán en cascada.Append MiCampo Y ahora añadimos el objeto Relation recién creado a la colección Relations del objeto Database MiBaseDatos.Relations. esas tablas deben estar relacionadas) que cumplen unas determinadas condiciones.Append MiRelación Solamente nos falta ver que valores puede tener la propiedad Attributes del objeto Relation dbRelationUnique dbRelationDontEnforce dbRelationInherited dbRelationUpdateCascade dbRelationDeleteCascade La relación es uno a uno. Las actualizaciones se realizarán en cascada. Una consulta podríamos decir que son conjuntos de registros tomados de una o varias tablas (en este último caso. Parece un poco ilógico usar el método CreateField para un campo que ya está creado. Ahora ya casi podemos decir que tenemos la base de datos creada. Método CreateQueryDef Un objeto QueryDef representa una consulta de la base de datos. con sus datos exactamente igual que si se tratase de los registros de una tabla. El ámbito es igual que para cualquier variable: Public MiConsulta1 as QueryDef Public MiConsulta2 as QueryDef Ahora podemos utilizar el método CreateQueryDef para crear el nuevo objeto QueryDef en la base de datos. Las consultas no contienen datos. A la hora de presentar los datos de una consulta. La consulta tiene dentro una referencia al lugar de las tablas donde se encuentran los datos. Sintaxis Con la fórmula de siempre : LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 336 . El objeto QueryDefs es la colección de objetos QueryDef. El Objeto QueryDef Pero habrá observado que una base de datos ACCESS puede contener. La relación no es impuesta (no hay integridad referencial). declarándolos como Variables Objeto tipo QueryDef . Puede que sea así o que le falte alguna cosa.CreateField("Campo11") Le recordamos lo de antes. Las consultas también se pueden crear mediante objetos DAO.

Append MiConsulta1 Como caso práctico de creación de una consulta. Para añadirlo a la colección QueryDefs : MiBaseDatos. ya que no pueden existir dos clientes con el mismo ID_Cliente. Texto_sql es una expresión de cadena (instrucción SQL válida) que define el objeto QueryDef. (Si cree que hay campos que no tienen sentido en esta tabla (Idioma). excepto que hayamos creado el objeto QueryDef sin nombre.Set MiConsulta1 = MiBaseDatos. para introducir ese dato. podemos tener Set MiConsulta1 = MiBaseDatos. Esos datos no tienen porqué ser todos los datos de las tablas. Puede omitirlo a la hora de crear la consulta. Texto_sql]) Donde MiConsulta1 es una variable del tipo QueryDef que previamente se ha declarado como tal. etc. Será un campo tipo texto. donde introduciremos todos los datos relativos a las películas (existentes o no en el videoclub). Apellido1. resumen. Ejemplo práctico de creación de una base de datos. Ha llegado el momento de crear una base real para comprobar todo lo expuesto. precio. según se comentó mas atrás).CreateQueryDef ([Nombre][. de nombre Clientes donde figuran los nombres y dirección de los clientes. Pero puede haber versiones en varios idiomas. Otra tabla necesaria será la tabla Peliculas. pero deberá añadirselo posteriormente.QueryDefs. Este nombre será el que veamos al abrir la base de datos con Access en la pestaña Consultas. no es necesario añadirlo a la colección QueryDefs de la Base de Datos. Un videoclub tiene una base de datos en la que tenemos una tabla. Cada cliente tiene un ID_Cliente y ese ID_Cliente es único para él. Tiene un campo (ID_Cliente) que es el que define al cliente. (Este campo podría ser un autonumérico. El famoso ejercicio del Videoclub Vayamos a un ejemplo típico en cualquier curso de Visual Basic: el famoso Videoclub. calificación. Tendrá un campo. Una vez creado el objeto QueryDef.y quiero ser coherente con lo expuesto en el capítulo 1 donde se decía que solamente se usarían campos numéricos en aquellos datos con los que se hagan operaciones matemáticas) El campo ID_Cliente será clave primaria. Será el nombre por el que llamemos al Objeto QueryDef en el código de nuestra aplicación. así como el número de su cuenta bancaria.CreateQueryDef (“Fernandez”. una película deberemos definirla por el conjunto formado por su ID_Pelicula y por su Idioma. ID_Pelicula que identificará a esa película. por lo tanto. Apellido2 From Alumnos Where Apellido1 = ‘Fernandez’ ) Ahora ya tenemos la base de datos creada con todas las posibilidades. Lógicamente una consulta nos debe suministrar una serie de datos de una o mas tablas. El conjunto de esos dos campos será la clave primaria. director. artistas. Un autonumérico es un Long –numérico. Nombre es una expresión de cadena que representa el nombre de la nueva consulta que vamos a crear. MiBaseDatos es el nombre del objeto Database abierto en el que vamos a introducir el nuevo objeto QueryDef. donde figurarán todas las cintas existentes en el LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 337 . Texto_sql es precisamente el filtro de esos datos (expresado mediante una cláusula SQL). (Sin haber puesto el parámetro Nombre. Por lo tanto. “Select Nombre. pero personalmente no me gusta usar autonuméricos. tal como título. que albergará un número que se incrementará en 1 cada vez que se hace un nuevo cliente. piense que esto es un ejemplo para poder explicar de la forma más didáctica todas las posibles variaciones de una instrucción) Existe otra tabla denominada Cintas. existirá otro campo Idioma de tipo texto.

Podemos añadirle mas campos a nivel administrativo. 20. le ponemos un campo llamado ID_Pelicula que en esta tabla no será clave primaria. Tendrá un campo ID_Cinta que será la combinación de varios datos. En este ejercicio haremos que sea así. Eso sí. entre el campo ID_Cliente de la tabla Clientes y el campo ID_Clientes de la tabla alquileres (Será uno a infinito) y otra relación. Si le pone imaginación y este conjunto de datos puede meterse en un código de barras. Aparte tendrá otros dos campos. fecha de alquiler y fecha de devolución. crearla y salir) y un TextBox donde se ha puesto el nombre del fichero de la base de datos en su propiedad Text. que relacionará al cliente con la cinta que ha alquilado. uno que nos indique la película que tiene grabada esa cinta (Será la combinación de los campos ID_Pelicula e Idioma) y de un número secuencial que indicará el número de la copia. fecha de baja. Alquileres. Para darle más alegría al ejercicio le pondremos una relación entre los campos ID_Pelicula e Idioma de las tablas Peliculas y Cintas. sobre el que no haremos ningún tipo de relación.videoclub. Existirá una tercera tabla. una. entre el campo ID_Cinta de la tabla Cintas y el campo ID_Cinta de la tabla Alquileres (Relación 1 a 1 ya que solamente existe una cinta con esa ID_Cinta). etc.3 Interface gráfica de la parte de crear bases de datos para la aplicación del Videoclub CODIGO Private Sub BSalir_Click() Unload Me End Sub Private Sub BBorrar_Click() On Error GoTo RutErr Dim HayDir As String HayDir = Dir(TBNombreBase) If HayDir <> "" Then Kill TBNombreBase End If RutErr: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 338 . Veamos el código de cada uno de los botones (por orden inverso de complejidad del código) Fig. Para llevar a cabo este ejercicio se ha partido de una interface gráfica en la que pueden verse tres botones (Borrar la base de datos. La base de datos deberá tener dos relaciones. dándole a este campo un tamaño de 13 dígitos para poder meterlo en un código EAN-13. También le pondremos el campo Idioma. precio de esta copia. deben tener las mismas características) Como colofón a todo esto. Para poder relacionarla con la tabla Peliculas. como fecha de alta. le facilitará la operación de alquiler y devolución. (Se ha puesto el nombre de Pelicula al campo relacionado con ID_Pelicula para que se vea que dos campos relacionados no tienen porqué tener el mismo nombre. Tendrá un campo llamado ID_Cliente y otro ID_Cinta. crearemos una consulta en la que utilizaremos todas las relaciones.

dbDate) Capítulo 1 Página 339 Visual Basic – Guía del Estudiante .CreateField("Idioma". MiTabla2 As TableDef. MiCampo13 As Field Dim MiCampo14 As Field.CreateField("Pelicula". 25) MiTabla2. 50) Set MiCampo14 = MiTabla1. 8) Set MiCampo12 = MiTabla1. MiCampo42 As Field Dim MiCampo43 As Field. dbText. MiCampo41 As Field. MiCampo12 As Field. MiCampo21 As Field Dim MiCampo22 As Field.CreateDatabase(TBNombreBase. dbText. dbText. 15) Set MiCampo21 = Set MiCampo22 = Set MiCampo23 = Set MiCampo24 = Set MiCampo25 = Set MiCampo31 = Set MiCampo32 = Set MiCampo33 = Set MiCampo34 = Set MiCampo35 = Set MiCampo36 = LSB MiTabla2.CreateField("Apellidos".CreateTableDef("Clientes") Set MiTabla2 = MiBaseDatos. 255) MiTabla3.CreateField("ID_Cinta". MiCampo35 As Field Dim MiCampo36 As Field.CreateField("Fecha_Baja". dbText. 20) Set MiCampo13 = MiTabla1.CreateTableDef("Cintas") Set MiTabla4 = MiBaseDatos. dbText.CreateField("Precio". MiCampo32 As Field Dim MiCampo33 As Field. dbText. dbText. MiCampo44 As Field ‘Se crea el Objeto DataBase (Se toma el nombre del fichero del TextBox TBNombreBase Set MiBaseDatos = Workspaces(0). MiCampo34 As Field. dbText. dbDate) MiTabla3. dbText.If Err = 75 Then MsgBox "Tiene la Base de Datos abierta por otro programa" End If End Sub Creación de la base de datos Private Sub BCrear_Click() On Error GoTo RutErr Dim HayDir As String ‘Se comprueba que existe la BD y se invita a borrarla HayDir = Dir(TBNombreBase) If HayDir <> "" Then MsgBox "Ya existe el fichero con la base de datos.CreateField("Direccion".CreateField("ID_Pelicula".CreateField("Director". dbText. 50) Set MiCampo15 = MiTabla1. 8) MiTabla2. 13) MiTabla3. dbText. MiTabla3 As TableDef Dim MiTabla4 As TableDef Dim MiCampo11 As Field.CreateField("Fecha_Alta".CreateTableDef("Peliculas") Set MiTabla3 = MiBaseDatos. MiCampo24 As Field Dim MiCampo25 As Field. dbText. 20) MiTabla2. dbSingle) MiTabla3. 20) MiTabla3. MiCampo31 As Field. MiCampo23 As Field. Debe borrarlo previamente" Exit Sub End If ‘ Se declaran todas las variables tipo objeto Dim MiBaseDatos As Database Dim MiTabla1 As TableDef. 1) MiTabla3. dbText. 1) MiTabla2.CreateField("Nombre".CreateField("Idioma".CreateTableDef("Alquileres") ‘Cada Tabledef crea sus propios Objetos Field Set MiCampo11 = MiTabla1.CreateField("Titulo".CreateField("Resumen".CreateField("ID_Cliente". MiCampo15 As Field. dbLangGeneral) ‘Se crean los Objetos Tabledef Set MiTabla1 = MiBaseDatos.CreateField("Telefono".

Fields.Append MiTabla4.Set MiCampo41 = Set MiCampo42 = Set MiCampo43 = Set MiCampo44 = MiTabla4.Append MiTabla4.Fields.Fields. dbDate) MiTabla4.Fields.Fields.Append MiTabla2 MiBaseDatos.CreateIndex("IndiceCliente") ‘Este objeto Index crea el campo que va a ser índice. con los mismos datos que el ‘campo MiCampo11 Set CampoIndiceA = MiIndice1.Append MiTabla2.AllowZeroLength MiCampo13. MiCampo12. dbText.Append MiCampo14 MiTabla1.Append MiTabla3.TableDefs.Append MiCampo12 MiTabla1.Append MiTabla3 MiBaseDatos. dbText. MiIndice2 As Index.Fields.Append MiTabla2.Append MiTabla4.Append MiTabla4 ‘Se declaran las variables tipo objeto Index y tipo objeto Field para crear los índices Dim MiIndice1 As Index. dbDate) ‘Una vez creados los campos se les ponen las peopiedades que se estime oportuno ‘En este caso.Append MiTabla3. Nota Tenga presente que por defecto le ‘va a dejar el campo que NO permite valores nulos.Append MiTabla2.Append MiTabla3.Append MiTabla4.Fields.CreateField("ID_Cliente".Append MiTabla3.Fields. se ha puesto la propiedad AllowZeroLength (Permitir valores nulos en ese ‘campo) a lo que interesa en cada uno de los campos.TableDefs.Fields. 8) ‘Se añade el campo a la colección Fields del Index LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 340 . MiIndice3 As Index Dim CampoIndiceA As Field Dim CampoIndiceB As Field ‘Se crea el primer objeto Index Set MiIndice1 = MiTabla1.Append MiCampo21 MiCampo22 MiCampo23 MiCampo24 MiCampo25 MiCampo31 MiCampo32 MiCampo33 MiCampo34 MiCampo35 MiCampo36 MiCampo41 MiCampo42 MiCampo43 MiCampo44 ‘Se añaden las tablas a la colección Tabledefs del objeto Database MiBaseDatos. dbText.Fields.CreateField("Fecha_Alq".TableDefs.CreateField("ID_Cinta".Append MiTabla3. circunstancia que le va a crear problemas.Append MiTabla1 MiBaseDatos.Fields.TableDefs.Fields.Fields.Append MiTabla3.AllowZeroLength MiCampo14.Fields.Append MiCampo11 MiTabla1.Append MiCampo15 MiTabla2.AllowZeroLength MiCampo15.Fields.CreateField("Fecha_Dev".Append MiTabla2.Append MiCampo13 MiTabla1.Fields.CreateField("ID_Cliente".Fields. 8) MiTabla4.Fields.Fields.Fields.AllowZeroLength = = = = True False True True ‘Se añaden los campos a la colección Fields de las tablas MiTabla1. 13) MiTabla4.

13) CampoRelacionA.CreateIndex("IndiceCintas") Set CampoIndiceA = MiIndice3. dbText.CreateField("Idioma".Relations.ForeignName = "Idioma" MiRelacion3.CreateField("ID_Pelicula".Append MiRelacion1 ‘Se crea la segunda relación Set MiRelacion2 = MiBaseDatos. 13) MiIndice3.Append CampoIndiceA MiIndice2. pero podrían haber sido los mismos Dim MiRelacion1 As Relation.Append CampoRelacionA MiRelacion3.CreateField("ID_Cinta".Indexes.CreateIndex("IndicePeliculas") ‘Aquí se meten dos campos en el mismo índice Set CampoIndiceA = MiIndice2. dbText. MiRelacion3 As Relation Dim CampoRelacionA As Field Dim CampoRelacionB As Field ‘Se crea la primera relación entre el campo ID_Clientes de la tabla Clientes (Tabla ‘primaria) y el campo ID_Cliente de la tabla Alquileres (Tabla relacionada) Set MiRelacion1 = MiBaseDatos. "Cintas".Append CampoIndiceA MiIndice3. dbText.CreateField("ID_Pelicula". 1) MiIndice2.CreateRelation("RelCintasPelis".Append CampoRelacionB MiBaseDatos.CreateRelation("RelCintas".Append CampoIndiceA ‘Se le dice que es un índice primario (Clave primaria) MiIndice1.Fields. Por ‘claridad se han declarado objetos Field distintos para la creación de los índices y de las ‘relaciones. dbText.Primary = True MiTabla2. 8) CampoRelacionA.Fields. 8) Set CampoRelacionB = MiRelacion1.Attributes = dbRelationUnique Set CampoRelacionA = MiRelacion1.ForeignName = "ID_Cinta" MiRelacion2.CreateRelation("RelClientes".Relations.Append MiIndice3 ‘Se declaran los objetos Relation y un par de objetos Field para crear las relaciones.Fields.MiIndice1. "Cintas") Set CampoRelacionA = MiRelacion1. dbText.Fields.CreateField("ID_Cinta".Fields.CreateField("Idioma".Fields.Indexes. dbText. Película e Idioma Set MiRelacion3 = MiBaseDatos. MiRelacion2 As Relation.Fields. 10) Set CampoIndiceB = MiIndice2.Indexes.Relations. "Alquileres") MiRelacion2.Fields.Append MiRelacion2 ‘La tercera relación “relaciona” dos campos. "Clientes". 8) CampoRelacionA. "Peliculas".ForeignName = "ID_Cliente" MiRelacion1.Append CampoRelacionA MiBaseDatos. "Alquileres") Set CampoRelacionA = MiRelacion1.ForeignName = "Pelicula" CampoRelacionB.Primary = True MiTabla3.Append MiIndice1 ‘Se procede de igual forma con el segundo objeto Index Set MiIndice2 = MiTabla2.Append MiIndice2 Set MiIndice3 = MiTabla3. dbText.Primary = True ‘Se añade el objeto Index recién creado a la colección Index del objeto tabledef MiTabla1.Append CampoRelacionA MiBaseDatos.Append CampoIndiceB MiIndice2.CreateField("ID_Cliente".Append MiRelacion3 ‘Se comienza a crear una consulta (La sentencia SQL está cortada dado que no cabe en ‘una LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 341 .

No crea que el autor ha escrito la sentencia SQL que ha visto. "SELECT Clientes.Description End Sub Nota acerca de la sentencia SQL para crear la consulta.") ‘Se cierra la el objeto database.ID_Cinta " & _ " FROM Peliculas INNER JOIN (Clientes INNER JOIN (Cintas INNER JOIN Alquileres ON  Cintas. El signo  indica que esa línea continúa en la siguiente Dim MiConsulta1 As QueryDef Set MiConsulta1 = MiBaseDatos. Es muy bueno hacer prácticas con SQL.Telefono.ID_Cinta = Alquileres.4 Tablas de la BD de Videoclub creada con el código descrito LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 342 . MiBaseDatos. Se puede ser muy experto en SQL y tener miedo a crear una consulta SQL debido a la complejidad que puede tener. ha comprobado que era eso lo que quería. conoce. Peliculas.Idioma) AND  (Peliculas.  Clientes. Pero en algunos casos es preferible acudir a los trucos que nos proporcionan nuestras herramientas. para que no se olvide.línea.ID_Cinta)='0000000000001')).ID_Cliente) ON (Peliculas. Clientes. 20.Apellidos. Ha utilizado el truco de crear primero la consulta con Access. Alquileres. " & Err. El resultado de todo esto podemos verlo si abrimos la base de datos con Access Fig.ID_Cinta) " & _ " ON Clientes.ID_Cliente = Alquileres. En este momento es cuando se crea el fichero.CreateQueryDef("Pelis". pasó a Vista SQL y la copió.ID_Pelicula = Cintas.Titulo. de la forma gráfica que seguro que Vd.Pelicula)" & _ " WHERE (((Alquileres.Idioma = Cintas.Nombre.Close ‘se comunica al usuario la buena nueva de que la base ha sido creada. MsgBox "La base de datos se ha creado con éxito" ‘Aquí comienza la rutina de error Exit Sub RutErr: MsgBox "Ha ocurrido el error " & Err & ".

Fig.5 Y la consulta Fig. 20. 20.7 Propiedades de esa clave primaria LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 343 .6 Clave Primaria formada con los dos campos de la tabla Películas Fig. 20.

Si crea una base de datos con estas características. deberá introducir en su instrucción de apertura el Password con el que se creó.pwd=LSB". En el ejemplo siguiente hemos usado como Password las iniciales LSB Set MiBaseDatos = = Workspaces(0). le pida el Password. el programa para abrirla.MDB.) Si volvemos a la línea donde creabamos la base de datos del videoclub: Set MiBaseDatos = Workspaces(0). 20. Y no crea que ha conseguido la confidencialidad total de sus datos.pwd=PaswordElegido" concatenándolo tras el parámetro que especifica la lengua. dbEncrypt) Ha merecido la pena el trabajo.Fig. no se puede abrir.CreateDatabase(TBNombreBase. solamente la podrá abrir mediante el programa. Solamente le será útil para que no puedan ver el contenido del fichero . le presentará los datos de forma correcta. Lo que debe hacer es crearla con una contraseña (Password) de forma que cuando la quiera abrir.pwd=LSB") Cuando lleguemos a la parte de abrir bases de datos. dbLangGeneral & ". dbLangGeneral) Basta con añadirle ".8 Las relaciones creadas Crear bases de datos con contraseña Imagínese que quiere que su base de datos no se pueda abrir mediante Access. ya que si se abre con Access.dbLangGeneral & ". ni enviar una base de datos vacía con los discos de distribución. Además hemos controlado todos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 344 .CreateDatabase(TBNombreBase. Si no lo sabe.CreateDatabase(TBNombreBase. (Eso sí. Hemos creado la base de datos haciendo click en un botón de la aplicación. Crear bases de datos encriptada Puede encriptar el fichero de su base de datos. y no comunica el Password a nadie. Existen programas que puede bajarse de Internet que le leen la contraseña con la que ha protegido su base. Para encriptar una base de datos basta con añadir la palabra dbEncrypt en la instrucción donde ha creado la BD Set MiBaseDatos = Workspaces(0). explicaremos cómo se abre una base de datos con contraseña. pero sí suficiente para que un usuario “normal” no se la pueda abrir. No ha sido necesario venderle al cliente Access. No es una protección total.

Merece la pena crearse las bases de datos por programa. No tiene aplicación a la hora de crear un campo. DefaultValue Es el valor que le pone a ese campo si no introduce ninguno. Attributes y Size referidas a los campos En el método CreateField debe introducir el tipo del campo que desea crear.DefaultValue = “Madrid” Required Si/No Indica si el dato es requerido.AllowZeroLength = False) Alargaríamos demasiado este ya largo capítulo si se explican todos los las propiedades que puede tener un campo. Anexo1 Propiedades de los campos Ha visto mas atrás que puede ser necesario cambiar las propiedades de los campos una vez creados (Por ejemplo. con esta sintaxis p. MiCampo13. En caso de que tome el valor SI (True) es necesario introducir un dato en ese campo Value Es justamente el dato que almacena en ese campo. Sí puede cambiar el valor de esta propiedad por ejemplo.e. Le enumero los mas usuales Propiedad Type Constante dbBoolean dbCurrency dbDouble dbLong dbLongBinary dbSingle Propiedad Attributes Constante LSB Descripción Constante Descripción Campo tipo Byte Tipo Date/Time Numérico Integer Campo Memo CampoTexto Campo SI/NO dbByte Tipo moneda dbDate Numérico Doble dbInteger Entero Long dbMemo Binario largo (Objeto OLE) Numérico Single dbText Descripción Capítulo 1 Página 345 Visual Basic – Guía del Estudiante . Es la propiedad por defecto del objeto Field. (Como puede ver mas atrás.: CreateField("Fecha_Alq". cuando crea un recordset. Añada un poco de esfuerzo a su estudio y vea las propiedades de los objetos Field en la ayuda.los parámetros de los campos de nuestra BD. Puede indicar un valor a la hora de crear el campo: Campo14. dbDate) Ese tipo coincide con la propiedad Type aplicada a los campos. Le reseño aquí las que he considerado mas importantes AllowZeroLength Si/NO Si es Si permite que ese campo tenga valores nulos DataUpdatable Si/No Si es Si permite modificar el dato de ese campo. Puede ver la ayuda de VB para mas detalles. Propiedades Type. La propiedad Size solamente tendrá que aplicarla cuando vaya a crear un campo tipo Texto.

El campo está ordenado de forma descendente (Z-A o 100-0) (sólo se aplica a objetos Field de una colección Fields de un objeto Index). o Global o Public.Required = True micampo1N. dbText. dbAutoIncrField es la constante a utilizar cuando queremos crear un campo que se vaya incrementando cada vez que se introduce un nuevo registro (Campo Contador). Por ejemplo. Método OpenDatabase Hasta ahora hemos visto como crear una base de datos. usando el espacio de trabajo Microsoft JET. en bytes. Para abrir una base de datos existente deberemos usar el método OpenDatabase. borrarlos etc. No es lo más usual.dbFixedField dbVariableField dbAutoIncrField dbUpdatableField dbDescending El tamaño del campo es fijo (predeterminado en campos numéricos).CreateField("ID_Cinta". El valor del campo no puede ser modificado. El tamaño de un campo texto puede ser desde 1 a 255 caracteres. Sólo aceptado en tablas bases de datos Jet. de un objeto Field que contiene texto o el tamaño fijo de un objeto Field que contiene texto o valores numéricos Esta propiedad se le debe suministrar en la sintaxis de CreateField solamente cuando creamos un campo tipo texto . si queremos abrir una base de datos y poder referirnos a ella en toda la aplicación. el campo se ordena ascendentemente (A-Z o 0100) (predeterminado). que es en realidad sobre el que se leen y escriben datos. de la siguiente forma : Set micampo1N = mitabla01.Fields. como se pueden añadir registros.CreateField("ID". Para el resto de los tipos de datos. si hemos creado un campo denominado ID que será el contador de una serie de registros. debemos usar la propiedad Attributes ANTES de añadir ese campo al objeto TableDef correspondiente. Puede consultar el tamaño ocupado por cualquier campo. debemos declararla de esta forma en la sección de declaraciones de un módulo : Public MiBaseDatos as Database LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 346 . (en la sección de declaraciones de un Módulo o Formulario) si queremos que el ámbito sea toda la aplicación. Veremos luego como se puede crear un Recordset. El tamaño del campo es variable (Sólo campos de texto). 13). El valor del campo en los registros nuevos es incrementado automáticamente a un valor Long integer único que no puede ser modificado. Vamos a ver como se abre una base de datos mediante DAO. Lo normal es tener la base de datos creada y abrirla cuando queremos extraer datos o introducir datos.Attributes = dbAutoIncrField mitabla01.Append micampo11 Propiedad Size Devuelve o establece un valor que indica el tamaño máximo. el tamaño va implícito en el tipo de dato. Pero previamente deberemos declarar el nombre que se le va a dar a ese objeto Database mediante la instrucción Dim si queremos que el ámbito de ese Database sea un formulario. 4) micampo1N.Size ‘ Creamos el campo ID ‘ La propiedad Required la veremos ‘ Le damos atributo de contador ‘ Añadimos el campo a la tabla Abrir una Base de Datos ya existente mediante DAO. Por ejemplo. leyendo la propiedad Size de un campo: Variable = Micampo11. Si se omite esta constante. y queremos que se incremente en 1 cada vez que añadamos un registro.

Expresión de cadena utilizada para abrir la base de datos. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 347 . Al especificar nombre_bd hay que tener en cuenta algunas consideraciones: Si se refiere a una base de datos ya abierta por otro usuario con acceso exclusivo. Si Misesion = Workspaces (0). Se ha limitado a ver si existía el fichero indicado y a “apuntar” el nombre y path de ese fichero que contiene la base de datos.". No es necesario cambiar el nombre del Workspace. es necesario especificarla. exclusivo[. se producirá un error. Esta cadena constituye los argumentos de conexión ODBC.OpenDatabase(nombre_bd[. Si el nombre de archivo tiene extensión. como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD.-) Set MiBaseDatos = Misesion. se producirá un error. Misesion Variable de tipo de dato objeto Workspace que representa el objeto Workspace existente que va a contener a la base de datos. en el que el usuario podrá elegir una base de datos. Sintaxis Recuerde la expresión general: Set DAOInferior = DAOSuperior. Consulte la sintaxis en la propiedad Connect. y de lectura y escritura. nombre_bd Expresión de cadena con el nombre de un archivo (y su Path) de una base de datos existente. la base se abrirá para lectura/escritura. Al no expresarle mas parámetros la abre de modo no exclusivo. Lo veremos en otro capítulo. sólo-lectura[. Si se omite este argumento. la sentencia anterior podemos ponerla también : Set MiBaseDatos = Workspaces(0). la base se abrirá con acceso compartido. Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso de sólo lectura o False si se va a abrir con acceso de lectura/escritura. también puede especificar una ruta de red. origen]]]) La sintaxis del método OpenDatabase consta de las siguientes partes: MiBaseDatos Variable de tipo de dato objeto Database que representa el objeto DAO Database que se va a abrir. La base de datos abierta se agrega automáticamente a la colección Databases. aparecerá un cuadro de diálogo con todos los nombres de orígenes de datos ODBC registrados. Para especificar una cadena de origen deberá especificar también los argumentos exclusivo y sólo_lectura..Método ( ..Método OpenDatabase Abre la base de datos existente. El trabajo comienza cuando cree el recordset. Si no se refiere a una base de datos existente o a un origen de datos ODBC válido. Si se omite este argumento..MDB”) origen p.MDB.OpenDatabase (“C:\Guia_Est\Videoclub. Set MiBaseDatos = Misesion.MDB”) El hecho de poner siempre un nombre al Workspace es solamente a efectos didácticos Ya tenemos la base de datos abierta.e.MDB". Si es una cadena de longitud cero ("") y origen es "ODBC. Al no especificar nada en el parámetro origen entiende que la base es ACCESS Nota para todo este capítulo. exclusivo sólo_lectura Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso exclusivo (no compartido) o False si se va a abrir con acceso compartido. Pero no crea que nuestro programa ha hecho trabajo. abre la base de datos cuyo fichero está en C :\Guia_Est y se llama Videoclub. nombre_bd también puede ser un origen de datos OBDC. Si la red lo admite..OpenDatabase (“C:\Guia_Est\Videoclub.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 348 .

pero no pueden actualizarse. bien de una tabla. Recordset de tipo instantánea: Copia estática de un conjunto de registros que puede utilizarse para buscar datos o generar informes. casi toda la interacción con los datos se produce a través de objetos Recordset. Un Recordset lo crearemos con el método OpenRecordset que estamos estudiando. Pero si acude a la información de VB verá que también se puede abrir desde un TableDef. Recordset de tipo hoja de respuestas dinámica: Resultado de una consulta que puede tener registros actualizables. Al utilizar objetos de acceso a datos. para abrirlo basta con ejecutar la sentencia : Set Mirecordset = base_datos. No se complique la vida. Todos los objetos Recordset están formados por registros (filas) y campos (columnas). Un Recordset de tipo hoja de respuestas dinámica es un conjunto dinámico de registros que puede utilizarse para agregar. Los objetos Recordset de tipo instantánea pueden contener campos de una o más tablas de una base de datos. tipo[.EL OBJETO RECORDSET (O la mitad de lo que Vd. si al crear ese recordset le hemos impuesto que los registros cumplan una determinada condición. Resumiendo. tenemos oportunidad de ver que también se puede abrir desde otro recordset. necesita saber de Bases de Datos) Un objeto Recordset contiene los registros de una tabla o de una consulta. incluso campos de distintas tablas. Puede ser que no los contenga todos. A lo mejor.OpenRecordset (origen[. un Recordset es un conjunto de registros. bien de un conjunto de tablas (a través de una consulta) También hay una colección Recordsets. Y en ese caso. Este tipo de objeto Recordset puede contener campos de una o más tablas de una base de datos. debemos declararlo como variable tipo objeto. modificar o eliminar registros de una sola tabla de base de datos. pero que en este caso solamente podemos abrirlo para cambiar alguna de sus propiedades. En resumen. Como cualquier objeto DAO. Public Mirecordset As Recordset Una vez declarado. un recordset es un objeto de acceso a datos que contiene una colección de registros tomados. Recuerde cuando explicábamos en control Data se decía que este control creaba un Recordset a partir de sus propiedades DatabaseName y RecordSource. el conjunto de registros que tiene ese control Data es la totalidad de los registros de la tabla (o consulta) que poníamos en la propiedad RecordSource. un QueryDef y desde otro Recordset. Existen tres tipos de objetos Recordset: Recordset de tipo tabla: Representación en código de una tabla base de datos que puede utilizarse para agregar. Cualquier actualización posterior no se puede ver. cosa que viene muy bien algunas veces. El objeto Recordset se abre desde un objeto DataBase (que es lo normal). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 349 . Abra directamente los Recordsets desde la base de datos. opciones]]) Al crear un nuevo objeto Recordset se agrega automáticamente a la colección Recordsets. De esta forma. solamente contendrá los campos que a nosotros nos interese. Pero siempre podemos asignar a la propiedad Recordset de ese control Data un Recordset ya creado mediante código. Un Recordset tipo Tabla contiene todos los campos de una tabla y no puede contener campos que no pertenezcan a esa tabla. Los datos que tiene el recordset son los que existían cuando se realizó la fotografía. modificar o eliminar registros de una o más tablas de una base de datos subyacente. La colección Recordsets contiene todos los objetos Recordset abiertos de un objeto Database. Un recordset de tipo instantánea (Snapshot) es una fotografía que se hace a la tabla o tablas que lo componen.

Si no se especifica un tipo. dbOpenDynaset para abrir un objeto Recordset de tipo hoja de respuestas dinámica... el origen sólo puede ser un nombre de tabla. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 350 . de la siguiente forma : Set Mirecordset = MiBaseDatos. El origen puede ser un nombre de tabla. dbOpenDynaset) Si deseamos que el Recordset contenga todos los campos de esa misma tabla : Set Mirecordset=MiBaseDatos. Tipo es el tipo de Recordset que se quiere crear. OpenRecordset creará un objeto Recordset de tipo tabla cuando sea posible. Crear un Recordset desde otro recordset.OpenRecordset (dbReadOnly) Este nuevo Recordset contendrá los mismos campos que el Recordset origen. podemos crear el objeto MiRecordset eligiendo de la tabla MiTabla de esa base de datos los campos Campo1. pero no podremos cambiar datos en él. En el caso de los objetos Recordset de tipo tabla. Veamos lo que decíamos antes. También se eliminan automáticamente cuando creamos otro recordset con el mismo nombre.OpenRecordset (“SELECT * FROM MiTabla”. dbOpenSnapshot para abrir un objeto Recordset de tipo instantánea. Campo2.Método ( . y que sea del tipo de hoja de respuestas dinámica. Si desde el Recordset anterior.. Campo2 y Campo3. que tenga la condición de que sea solo lectura. (Cuando especifica como Origen el nombre de una Tabla) Si se especifica una consulta o una tabla adjunta.OpenRecordset (“MiTabla”. usaremos la sentencia : Set Mirecordset1 = Mirecordset. Se puede usar solamente para variar sus propiedades. queremos crear un nuevo Recordset denominado MiRecordset1. dbOpenDynaset) o simplemente sin utilizar la sentencia SQL : Set Mirecordset = MiBaseDatos.OpenRecordset (“SELECT Campo1. opciones]]) Si tenemos abierta una base de datos llamada MiBaseDatos. tipo[. Campo3 _ FROM MiTabla”.OpenRecordset (origen[. El parámetro opciones permite especificar las características del nuevo objeto Recordset tales como las restricciones de edición y consulta para otros usuarios.) Set Mirecordset = base_datos. Ejemplo de creación de un Objeto Recordset Decíamos que se puede crear un Recordset con la sentencia : Recuerde la Fórmula general Set DAOinf = DAOsup.base_datos es el nombre del objeto Database que va a crear el recordset. (La base de datos que acaba de abrir) Origen en la primera expresión es una variable de tipo String que especifica el origen de los registros del nuevo objeto Recordset. Los objetos Recordset se eliminan automáticamente de la colección Recordsets al cerrarlos con el método Close. un nombre de consulta o una instrucción SQL que devuelva registros. Vea la Ayuda de VB para mayor detalle... El tipo del nuevo objeto Recordset se define mediante una de las siguientes constantes : dbOpenTable para abrir un objeto Recordset de tipo tabla. dbOpenDynaset) En los ejemplos anteriores no se ha establecido ningún parámetro en Opciones. OpenRecordset creará un objeto Recordset de tipo hoja de respuestas dinámica..

Pueden crearse tantos Recordsets como se necesiten. a lo mejor queremos seleccionar todas aquellas direcciones en las cuales el código postal sea el 28700 (San Sebastián de los Reyes). Es más. Todo dependerá de lo que necesitemos de nuestro recordset y de cómo nos queramos mover por él. etc. Table? A la hora de crear un recordset podemos pensar que tipo es el más adecuado. y esta base de datos tiene una tabla llamada DIRECCIONES (Este sí es el nombre real de la tabla dentro de la B.D. o ver registros de varias tablas al mismo tiempo (lo que podemos ver en Access en una consulta). en cuyo caso es indispensable usar recordsets tipo tabla y moverse sobre un índice. etc. Métodos y Propiedades del recordset que va a necesitar inmediatamente LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 351 . MovePrevious. no el nombre que pueda tener esa B. Y si usa Dynaset dispone de más recursos. debemos elegir directamente el tipo Dynaset. ya que el tipo Table debe contener TODOS los registros de una UNICA TABLA. Si creamos un recordset tipo Table se nos puede complicar un poco el código a la hora de movernos a lo largo del recordset. Veamos la elección entre Dynaset y Table Si queremos seleccionar parte de los registros de una tabla. Veremos casos de uno y otro tipo. sobre todo de búsqueda. Por ejemplo. un poco más complicado y que exige un índice. si queremos seleccionar todos los clientes de Madrid (su código postal comenzará necesariamente por 28 y le seguirán tres cifras) : Set Mirecordset2 = CLIENTES. dbOpenDynaset) El Recordset Mirecordset2 contiene todos los campos de todos los registros de la tabla DIRECCIONES que cumplan la condición de que el código postal (campo COD_POSTAL en el ejemplo) sea igual a 28700. que la sentencia SQL está entre doble comilla. FindLast. Por ejemplo..) Vamos a abrir un Recordset con todos los clientes de San Sebastián de los Reyes : Set Mirecordset2 = CLIENTES.D. MoveLast. dbOpenDynaset) Tipo de recordset más práctico ¿Dynaset. buscar registros. ya que no podemos usar ciertos métodos como los Find (FindFirst.) debiendo utilizar para realizar la misma función los métodos Move (MoveFirst. Si estamos en ese caso es el único en el que tendremos dudas respecto al tipo elegido. no apreciará mucha diferencia entre uno y otro. Si no va a manejar miles de registros. o el método Seek.OpenRecordset (“SELECT * FROM DIRECCIONES WHERE COD_POSTAL LIKE 28???“. Podemos introducir cualquier sentencia SQL para determinar qué registros introducimos en el Recordset. Estos Recordsets pueden tener campos comunes. Imaginemos que hemos abierto la base de datos con el nombre CLIENTES (Recuerde que este es el nombre del objeto DAO usado para abrir la B. Vamos a prescindir del recordset tipo Snapshot si lo que queremos es leer y escribir datos. Cuando decimos movernos por él queremos decir cambiar de un registro a otro. (Lo que ganamos con la complicación del Seek es velocidad). podríamos crear dos Recordsets exactamente iguales. Esa rapidez se nota fundamentalmente cuando va a manejar miles de registros. Los desplazamientos a lo largo de un recordset tipo tabla son mucho más rápidos que sobre un recordset tipo Dynaset. Pero en la mayoría de los casos. Observe en esta y anteriores expresiones. Un recordset Snapshot solamente sirve para realizar informes (leer) de los datos en un instante determinado. seleccionando de esos campos unos determinados valores.OpenRecordset (“SELECT * FROM DIRECCIONES WHERE COD_POSTAL = 28700“. en el disco). MoveNext). necesitaremos crear un Recordset donde se elijan varios campos de una o varias tablas. en una base con las direcciones de los clientes.D.

Si desea hacer que el nuevo registro sea el actual. El valor de esta propiedad es de sólo lectura Sintaxis NombredeMiRecordset.MoveLast NombredeMiRecordset. Si le pide ese dato a un recordset tipo Dynaset recién creado. El valor devuelto por la propiedad RecordCount es un dato numérico Long (NombredeMiRecordset puede ser del tipo Dynaset. Método AddNew Crea un nuevo registro en un objeto Recordset de tipo Table o Dynaset.Propiedad RecordCount Devuelve el número de registros accedidos en un objeto Recordset. (Dynaset) los registros se insertan al final del conjunto. independientemente de las reglas de ordenación que pueda haber en vigor al abrir el conjunto de registros. En un objeto Recordset de tipo tabla cuya propiedad Index esté definida. Este método establece en los campos el valor Null (predeterminado para los objetos Recordset de tipo tabla) o los valores predeterminados. Pero en el caso de que sea Dynaset se va a encontrar con una sorpresa. si existen. En la práctica anterior observará tras este proceso que se cambia el contenido del Label al nuevo valor.RecordCount Donde NombredeMiRecordset es un objeto Recordset. No se modificará la base de datos hasta que se utilice el método Update. y posteriormente agregarlo al conjunto de registros del objeto Recordset. puede establecer en la propiedad Bookmark el marcador identificado por el valor de la propiedad LastModified. Un recordset tipo Dynaset tiene la ventaja (y el inconveniente) de que solamente guarda en memoria un registro. La posición del nuevo registro depende del tipo de objeto Recordset: En un objeto Recordset de tipo hoja de respuestas dinámica. Para ello basta con ejecutar estas dos líneas de código: NombredeMiRecordset. ya le indicará el número correcto de registros existentes. Por lo tanto no sabe cuantos registros tiene realmente hasta que no los recorre todos. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 352 . El registro creado queda en la memoria. y ahí se puede modificar simplemente asignando a cada campo el valor deseado. Snapshot Table. El registro que era actual antes de utilizar el método AddNew continúa siéndolo después. Sintaxis MiRecordset. tiene que acceder previamente al primero y al último. le devolverá el valor 1. Si no se ha establecido la propiedad Index. los nuevos registros se agregan al final del conjunto. Para que el método RecordCount le devuelva el número de registros existentes. Esto puede comprobarlo asignando a un Label el contenido de un campo. los registros se agregan en el lugar correspondiente al orden.MoveFirst A partir de ese momento. Para asignar un valor a un campo simplemente tenemos que poner la expresión : MiRecordset ! MiCampo1 = “Dato tipo string” MiRecordset ! MiCampo2 = Dato tipo numérico Una vez que se hayan introducido los datos en el nuevo registro. ¡Parece que solamente tiene un registro! No es así.AddNew El método AddNew crea un nuevo registro donde puede introducir nuevos datos. añadir un registro con un valor para ese campo distinto al que está presente en el Label y comprobar que el contenido del Label no se ve afectado por haber introducido un registro nuevo. debe utilizar el método Update para guardar los cambios y agregarlo al conjunto de registros.

Al terminar de realizar los cambios deseados. Otro usuario ha abierto la base de datos o el conjunto de registros para uso exclusivo. Uso de Edit o AddNew y utilización de nuevo de Edit o AddNew sin especificar antes Update. abierto y actualizable. Una vez invocado el método Edit. Método CancelUpdate LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 353 . se producirá un error.Vea la propiedad LastModified un poco mas adelante. Como en el caso del método AddNew este registro modificado está en la memoria y es necesario introducirlo en la BD. Es decir. Método Update Guarda el contenido del búfer de copia en un objeto Recordset de tipo hoja de respuestas dinámica o tabla especificado. Una vez añadido el registro. mete en la Base de Datos el contenido del registro que estaba en la memoria. Otro usuario ha bloqueado la página que contiene el registro. Cada vez que se crea o edita un registro se cambia el valor de la propiedad LastModified.Edit Donde MiRecordset representa el nombre de un objeto Recordset abierto y actualizable que contiene el registro a editar. los cambios efectuados en los campos del registro actual se copian en el búfer de copia. Sintaxis MiRecordset. Cierre del conjunto de registros indicado en MiRecordset sin utilizar antes Update. que tomará el marcador de ese registro creado o editado. Método Edit Copia el registro actual de un objeto Recordset de tipo hoja de respuestas dinámica o tabla en el búfer de copia para su edición. La base de datos o el conjunto de registros es de sólo lectura.Update Donde MiRecordset representa el nombre de un objeto Recordset de tipo hoja de respuestas dinámica o tabla. Sintaxis MiRecordset. debemos utilizar el Método Update para guardar los datos en la BD. El registro actual después de utilizar Edit es precisamente el registro que acabamos de editar. Si no es así o si MiRecordset no se refiere a un objeto Recordset de tipo tabla u hoja de respuestas dinámica. Ningún campo del registro es actualizable. a un objeto Table o a un objeto Dynaset abierto. Los cambios en el registro actual se perderán en las siguientes situaciones: Uso del método Edit o AddNew y desplazamiento a otro registro sin utilizar antes Update. Establecimiento de otro registro en la propiedad Bookmark. bien por haber utilizado el método Update. o cambiados los datos de un registro. bien por haber utilizado el método Edit. Para poder usar Edit debe existir un registro actual. utilice el método Update para guardarlos. El uso de Edit producirá un error en las condiciones siguientes: No hay registro actual.

previamente deberíamos haber obtenido el Bookmark de ese registro. salvo que el registro activo no cambia y algunas propiedades. string. debe haber un registro actual en el Recordset antes de utilizar Delete. En un Recordset basado completamente en tablas del LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 354 . y comprobamos que no hay otro registro con un valor mayor. Solamente se puede ver la propiedad Bookmark en aquellos recordsets que tengan la propiedad Bookmarkable a True. En Visual Basic. Para ello forzamos a que el registro cuyo Bookmark sea igual a Variable se convierta en registro actual: MiRecordset.Bookmark Seguimos buscando moviéndonos por todo el recordset. Método Delete Este método elimina el registro actual de un objeto Recordset de tipo hoja de respuestas dinámica o tabla.Cancela todas las actualizaciones pendientes del objeto Recordset. Sintaxis recordset. Cancela los cambios pendientes en la memoria cache actualizada. Imagínese que se está moviendo a lo largo del recordset y hemos visto un registro donde tenemos un dato importante (por ejemplo. significa el registro en el que estamos actualmente (registro actual) Podemos conocer en que registro estamos mediante la siguiente expresión: Variable = MiRecordset. Puede observar. Esto merece una pequeña aclaración. la respuesta será -1. un máximo del valor de un campo) No sabemos si habrá otro registro que tenga un valor mayor que este. Una vez eliminado. Propiedad Bookmark Devuelve o establece un marcador que identifica de forma única el registro actual de un objeto Recordset o define el registro actual de un Recordset como marcador válido. Queremos volver a aquel registro. pero antes anotamos el Bookmark de ese registro Variable = MiRecordset. pero es así). Bookmark en inglés significa ese papel que introducimos en un libro para saber en qué página hemos dejado la lectura. Deberemos seguir buscando. no se actualizan. El método CancelUpdate cancela todas las actualizaciones pendientes a causa de una operación Edit o AddNew. pues de lo contrario se producirá un error interceptable.Bookmark Pero tenemos que tener en cuenta que Variable es una variable tipo String (Sí.CancelUpdateTipo Tipo puede tomar los siguientes valores dbUpdateRegular dbUpdateBatch Comentarios Cancela los cambios pendientes que no están en la memoria caché.BookMark = Variable Y se colocará en el registro deseado. prueba de que está sobre un registro inexistente. este registro sigue siendo el registro actual. aunque parezca que para conocer la posición de un registro debería ser un numérico. como BOF y EOF. La utilización del método CancelUpdate tiene el mismo efecto que moverse a otro registro sin utilizar el método Update. Por lo tanto deberíamos haber declarado la variable previamente como una variable tipo String Dim Variable As String Pero esta propiedad sirve para colocarnos en el registro que deseemos. Para eliminar un registro. Eso sí. que si a continuación de Delete utiliza AbsolutePosition para conocer en que registro está.

Bookmark = NombreRecordset... MovePrevious Estos métodos son aplicables a todos los tipos de recordset.Bookmark Marca2 = Rs2. No hay límite en el número de marcadores que pueden establecerse. Antes de tener acceso a la propiedad Bookmark. Sin embargo. se produce un error interceptable. otros productos de bases de datos pueden no aceptar los marcadores. Por ejemplo. Por esta razón. Basta para ello igualar la propiedad Bookmark a la propiedad LastModified : NombreRecordset. aunque a primera vista parezca igual : If Rs1.LastModified Métodos MoveFirst. MoveNext.Clone() Marca1 = Rs1. si se intenta usar la propiedad Bookmark en una operación de comparación. muévase al registro deseado y asigne el valor de la propiedad Bookmark a una variable String que identificará el registro. La propiedad Bookmark se almacena internamente como matriz de Byte. el valor de la propiedad Bookmarkable es True y pueden usarse marcadores.Bookmark = Rs2. Si la propiedad Bookmark se establece a un valor que corresponda a un registro eliminado.LastModified El valor devuelto por esta propiedad es un tipo de datos Variant o String.Bookmark Then . Esta propiedad puede usarse para volver al último registro que ha sido modificado. Para asegurarse de que el Recordset acepta marcadores..OpenRecordset("Títulos") Set Rs2 = Rs1. inspeccione el valor de su propiedad Bookmarkable antes de usar la propiedad Bookmark. Sintaxis NombreRecordset. (Similar al devuelto por Bookmark) LastModified se puede usar para colocarse en el registro más recientemente agregado o actualizado. el siguiente o el anterior registro del objeto Recordset especificado y lo convierten en el registro actual. Rs2 as Recordset Set Rs1 = Db. Porque dará error. copie los valores de los marcadores a variables cadena y efectúe las comparaciones usando dichas variables cadena. Marca2 as String Dim Rs1 as Recordset..Bookmark If Marca1 = Marca2 Then Print "Esta comparación es válida " No intente realizar la siguiente comparación. y el uso de la propiedad Bookmark produce un error interceptable. Se sitúan en el primer. el último. Propiedad LastModified Devuelve un marcador que indica el registro más recientemente agregado o modificado. Si Bookmarkable es False. Por ejemplo.motor de base de datos Microsoft Jet. se producirá un error interceptable. no se pueden usar marcadores en un Recordset basado en una tabla anexa Paradox que no tiene clave principal. Para crear un marcador para otro registro distinto del registro actual. Sintaxis MiRecordset. el Recordset no acepta marcadores. MoveLast. el siguiente código compara marcadores en dos objetos Recordset: Dim Marca1 as String.{MoveFirst | MoveLast | MoveNext | MovePrevious} LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 355 .

Move comenzará por el registro actual. Inicio (opcional) es un valor de tipo String que identifica un marcador. No es posible utilizar los métodos MoveFirst ni MovePrevious en los Recordset tipo snapshot de desplazamiento hacia delante. el uso de este método para desplazarse hacia atrás producirá un error interceptable en tiempo de LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 356 . Sintaxis MiRecordset. Si utiliza MovePrevious cuando el registro actual sea el primero. el registro actual no varía. se producirá un error y EOF continuará con el valor True. se establecerá en BOF el valor True y no habrá registro actual. Si se omite. poblando completamente el objeto Recordset. Si el objeto Recordset no contiene registros y el valor de su propiedad BOF es True. Método Move Desplaza la posición del registro actual en un objeto Recordset. el primer registro pasa a ser el registro actual y en la propiedad BOF se establece False. en la propiedad BOF se establecerá True y no habrá registro actual. Si el primer o el último registro ya es el actual al utilizar MoveFirst o MoveLast. Si utiliza MoveLast en un objeto Recordset basado en una consulta SQL o QueryDef. la posición se desplaza hacia atrás (hacia el principio del archivo). Para establecer el índice actual puede usar la propiedad Index.Puede utilizar los métodos Move para desplazarse de un registro a otro sin aplicar una condición. Para desplazar la posición del registro actual en un objeto Recordset un número de registros determinado hacia adelante o hacia atrás. se forzará la terminación de la consulta. Si filas es mayor que 0. Si es menor que 0. Si utiliza de nuevo MovePrevious. Si se especifica una posición posterior al último registro. Si Recordset hace referencia a un objeto Recordset de tipo tabla o a un objeto Table. la posición del registro actual se situará al principio del archivo (BOF). Si utiliza MoveNext cuando el registro actual sea el último. la posición del registro actual se situará al final del archivo (EOF). la posición se desplaza hacia adelante (hacia el final del archivo). El marcador que debe utilizarse para definir el registro Inicio debe ser un Bookmark o similar (LastModified. inicio] Donde : filas es un valor de tipo Long con signo que especifica el número de filas (de registros) que se desplaza la posición. Si utiliza de nuevo MoveNext. Si no establece un índice actual. utilice el método Move. en la propiedad EOF se establecerá True y no habrá registro actual.Move filas[. el movimiento se hará según el índice actual de la tabla. el desplazamiento será relativo al marcador indicado. Si el conjunto no contiene ningún registro. Al abrir el conjunto de registros indicado en Recordset. el orden de los registros devueltos no estará definido. por ejemplo) Si se especifica una posición anterior al primer registro. se producirá un error y BOF continuará con el valor True. Si se especifica inicio.

NoMatch se establece a True y el registro actual pasa a ser el primero del objeto Recordset. el último. Al buscar campos que contengan fechas. Por ejemplo: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 357 . Recuerde siempre las comillas dobles para la expresión de búsqueda y las comillas simples si se trata de un dato string. pues de lo contrario es posible que no se encuentren los datos buscados. sin la palabra WHERE) que se utiliza para buscar un registro.ejecución. Puede utilizar la función Format para convertir la fecha. que satisfaga el criterio especificado y lo convierte en el registro actual. FindFirst hallará el primero de ellos. Por ejemplo: Dim Estabaaqui as String Estabaaqui = Recordset.NoMatch = True Then Recordset. Sintaxis MiRecordset. deberá utilizar el formato de fecha de los Estados Unidos (mes-día-año). 'Si no se ha encontrado ' Si no se ha encontrado. ' Sí se ha encontrado. el puntero de registro actual se situará en el primer registro del objeto Recordset y se establecerá en la propiedad NoMatch el valor True. Si las propiedades BOF o EOF tienen el valor True y se intenta usar el método Move sin un marcador válido. Si no se encuentra ningún registro que satisfaga el criterio. incluso cuando no utilice la versión para este país del motor de base de datos Jet. vuelve al que era el ‘registro actual. se generará un error interceptable. Compruebe siempre el valor de la propiedad NoMatch para determinar si la operación de búsqueda ha tenido éxito. Si el objeto Recordset está basado en una consulta. FindNext el siguiente y así sucesivamente. Criterio es una expresión de cadena (como la cláusula WHERE de una instrucción SQL.Bookmark = Estabaaqui Else . Lo mismo ocurrirá si el valor de la propiedad EOF es True y pretende desplazarse hacia adelante. . Métodos FindFirst.{FindFirst | FindLast | FindNext | FindPrevious} criterio MiRecordset es el nombre de un objeto Recordset. Si la búsqueda ha tenido éxito. FindLast. Si Recordset contiene más de un registro que satisfaga el criterio. NoMatch se establece a False. Aquí las instrucciones adecuadas End If No es posible utilizar estos métodos en un objeto Recordset de tipo snapshot de desplazamiento hacia delante. FindNext.Bookmark Recordset. If Recordset. Si ha fracasado. FindPrevious Estos métodos no se pueden aplicar a un recordset tipo Tabla Buscan el primer.. el siguiente o el anterior registro de un objeto Recordset de tipo instantánea u hoja de respuestas dinámica. La propiedad NoMatch tomará en este caso el valor False.FindFirst "Nombre = 'Luis' " ' Busca un nombre. la operación forzará la ejecución de la consulta en el número de filas especificado.

Para encontrar el registro que tenga por valor 00000012 usaremos la expresión MiRecordset. No se preocupe. "00000012" Pero observe ahora que el 0000012 no es un número. si quisiéramos que el índice activo fuese el IndicePeliculas lo haríamos índice activo mediante la siguiente instrucción: MiRecordset. >=. aparte de ponerlas en americano. comparación Es una de esta expresiones de cadena: <.. =. >.FindFirst "fecha > #" & Format(mifecha. Una vez que se lo indiquemos.Seek ">". "mm/dd/yyyy" ) & "#" Observe que las fechas. ese índice será el Indice activo. Sólo funciona en espacios de trabajo Microsoft Jet.7 En este caso habíamos creado el índice mediante código y hemos podido controlar su nombre. Por ejemplo.Seek comparación. de LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 358 .clave13 Son uno o más valores que corresponden a los campos en el índice activo del objeto Recordset.. Si quisiésemos encontrar un registro cuyo valor sea superior a 00000012 usaríamos la expresión MiRecordset. clave2. el nombre que le pone por defecto es el mismo que el nombre del campo. Método Seek Este método solo se puede usar con recordsets tipo Tabla Si no podemos usar los métodos Find en un recordset tipo Tabla. Observe lo dicho mas atrás para las comillas dobles en la expresión de búsqueda. clave2. es una cadena de caracteres.CreateIndex("IndicePeliculas") Puede ver el nombre de ese índice en la Fig. Sintaxis MiRecordset. el campo (o campos) de ese índice será sobre el que realizaremos la búsqueda mediante Seek. Todo índice tiene un nombre. clave1. Puede utilizar un argumento de hasta 13 claves. Antes de usar Seek se debe establecer el índice activo. Si hubiese mas de un registro con ese valor. Ese nombre del índice es el que debemos usar para crear el índice activo. "00000012" Ese registro será ahora el registro actual.Seek "=". clave1.. 20.Index = "IndicePelículas" A partir de ahora.clave13 Donde MiRecordset es un recordset de tipo Table que tiene definido un índice en el campo por el que se va a realizar la búsqueda. de un campo texto.Mirecordset. Habíamos visto cuando creábamos un índice que debía tener un nombre. <=. ¿Qué podemos hacer para buscar un dato en un recordset de este tipo? Usar el método Seek El método Seek busca el primer registro de un objeto Recordset indexado de tipo Table que cumple el criterio especificado para el índice activo y lo convierte en el registro activo. el registro actual será el primero que cumpla esa condición En el ejemplo hemos utilizado el comparador = para buscar un registro cuyo valor en el campo indicado por el índice activo sea igual al indicado en el siguiente parámetro (00000012).. hay que presentarlas entre almohadillas (#). Seek puede comparar el contenido de un campo numérico. deberemos indicarle cual es el índice de búsqueda. Si lo hubiésemos creado directamente en Access. Como podemos tener varios índices en una tabla. Recuerde el ejemplo: Set MiIndice2 = MiTabla2.

pero vamos a destacar una : crear un Recordset idéntico al Recordset de un control Data. Cuando lo encuentra. El método Seek busca en los campos clave especificados y localiza el primer registro que cumpla el criterio especificado por comparación y clave1. Si el método Seek no consigue localizar ninguna coincidencia. lo que posiblemente no concordará. excepto la clave que está buscando. si el campo es texto. para trabajarlo con código durante una parte de la ejecución del programa. Por tanto. dbOpenTable) Private Sub BBuscaCalle_Click() RsCalles. Las ocasiones en las que es necesario hacer esto pueden ser variadas.Index = "NombreVia" RsCalles.Seek ">=". Eso sí. Si comparación es menor que (<) o mayor o igual que (<=). El procedimiento BBuscaCalle_Click busca la primera calle cuyo nombre coincida con las letras tecleadas en el TextBox TBBuscaCalle Set BaseDatos = OpenDatabase("C:\Callejero\Calles. Seek empezará al final del índice y buscará hacia atrás. El índice tiene el mismo nombre que el campo porque se creó directamente con Access.mayor o igual (>=) o mayor que (>). y Original es el Recordset que se va a duplicar. Si utiliza Seek con un índice de múltiples columnas y no especifica un valor de comparación para cada campo del índice.Clone Donde Duplicado es una variable tipo Recordset. Si comparación es igual (=). etc.NoMatch = False Then TBNombreCalle = RsCalles!nombrevia Else TBNombreCalle = "No se encontró la calle" End If End Sub Método Clone En muchas ocasiones es necesario crear un Recordset que sea copia exacta de otro.mdb") Set RsCalles = BaseDatos. convierte ese registro en activo y la propiedad NoMatch se establece en False. cuyo campo NombreVia esta indexado. clave3.. Debe especificar valores para todos los campos definidos en el índice. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 359 .. debe compararlo con un valor del mismo tipo. . etc) estarán predeterminados en Null. la propiedad NoMatch se establece en True y el registro activo es indefinido. Seek empezará en una entrada cualquiera entre las entradas duplicadas existentes al final del índice. Es aconsejable usar el operador mayor que o igual en su lugar. en el parámetro Clave1 deberemos pasarle un campo numérico. TBBuscaCalle If RsCalles. Seek empezará al principio del índice y buscará hacia adelante. no podrá usar el operador de igual (=) en la comparación. deberemos pasarle un dato tipo texto. etc. En tal caso. a menos que haya entradas de índice duplicadas al final.OpenRecordset("Calles_Nombre". La sintaxis de Clone es la siguiente : Sintaxis Set Duplicado = Original. y donde podamos llegar con nuestra imaginación. es decir. Otras aplicaciones pueden ser copiar el Recordset de otra máquina a través de la Red de Area Local. el operador de igual sólo funcionará correctamente si tiene un registro que sea Null en su totalidad. Esto se debe a que algunos de los campos de criterio(clave2. si el contenido del campo es numérico. En el ejemplo siguiente se toman los nombres de las calles y otros datos de una tabla llamada Calles_Nombre.un campo Fecha/Hora.

No hay problemas. sumándole el importe de la transferencia. Puede utilizar el método Clone cuando desee realizar en un conjunto de registros una operación que requiera varios registros actuales. menos el importe del dinero transferido. La operación es sencilla : Busca la cuenta origen y crea un nuevo registro. Puede modificar un registro desde cualquier Recordset. pero en este caso. pero debe hacerlo invocando los métodos Edit . una vez sacado el dinero de LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 360 . Supongamos un Banco. o establecer su propiedad Bookmark El hecho de cerrar el Recordset original no afecta al duplicado y viceversa.Update.Con el método Clone puede crear múltiples Recordsets. Es un método típico de una BD que se está usando desde varios puestos a través de una Red de Area Local. ni tampoco en los objetos Recordset de tipo Tabla. CommitTrans y Rollback Estos métodos son métodos del Objeto Workspace Veamos estos tres métodos que. en el campo IMPORTE apunta el valor del dinero a transferir. Transacciones Métodos BeginTrans. volviendo a ejecutar la consulta con la que se ha creado ese Recordset. Pero que pasa si.Requery [NuevoQueryDef] Donde NombreRecordset es el nombre del Recordset. Puede compartir marcadores entre dos o más Recordsets creados de esta forma. Cada uno de ellos puede tener su propio registro actual. bien desde cualquiera de sus copias. bien desde el que sirvió de original. Si los valores de las propiedades BOF y EOF del objeto Recordset son ambos True después de utilizar el método Requery. Find o Seek (solo para Recordsets tipo Tabla). Método Requery El método Requery actualiza los datos de un objeto Recordset. Inicialmente. Debe hacer una transferencia entre dos cuentas corrientes que están en la misma base de datos. Este método es más rápido y eficiente que crear un nuevo Recordset. dadas sus funciones. deben estudiarse conjuntamente. y en el campo SALDO pone la diferencia entre lo que había en ese campo en la última operación. la consulta no habrá devuelto ningún registro y el objeto Recordset no contendrá datos. un Recordset creado con Clone carece de registro actual. Nota No es posible utilizar este método con snapshots de desplazamiento hacia delante (objetos Recordset de tipo instantánea con la opción dbForwardOnly activada). A continuación hace un proceso similar con la cuenta destino. El uso de Clone no modifica los datos de los registros. Sintaxis NombreRecordset. Para hacer que un registro sea el actual antes de utilizar el Recordset copia. Este método debe usarse cada vez que se sospeche que los datos de la Base de datos han cambiado. puede utilizar cualquiera de los métodos Move. Apunta en el campo OPERACIÓN una T de Transferencia. y se quieran presentar los datos actualizados. y NuevoQueryDef (opcional) es una consulta almacenada No es posible utilizar el método Requery en objetos Recordset tipo Snapshot o en los Dynaset que tengan la propiedad Restartable a False.

(Cuando se utilizan bases de datos SQL ODBC externas no es posible anidar las transacciones). Si realiza operaciones en más de una base de datos o conjunto de registros durante una transacción en un objeto Workspace. fallo de la red de área local) Obviamente la operación no se ha completado.Rollback Dentro de un objeto Workspace. Dado que una transacción pertenece a un Workspace. El hecho de usar transacciones. en la que le han sacado una cantidad de dinero. las transacciones son siempre globales y no se limitan sólo a la base de datos o al conjunto de registros. Quiere esto decir que una transacción debe iniciarse al comenzar una determinada operación. En este caso la propiedad Transactions del objeto Database o Recordset tendrá el valor False. metiendo la misma cantidad de dinero que se ha extraído anteriormente. En este caso. Es posible tener hasta cinco niveles de transacciones abiertos a un tiempo en un mismo objeto Workspace utilizando múltiples combinaciones anidadas de BeginTrans y CommitTrans o Rollback. En estas condiciones podemos crear una transacción.la cuenta origen. Veremos un poco más adelante como se crean los Workspaces. lo mas indicado es crear varios objetos Workspace para usar uno con cada transacción. Puede anidar transacciones. Para evitar estas situaciones usamos lo que se denomina una Transacción. es decir. y hay que devolver el dinero a la cuenta origen. se deberá cerrar primero la transacción que esté mas interior dentro del anidamiento. los cambios de la primera transacción NO quedarán guardados. y se vuelcan al disco solamente en el momento de terminar la transacción de modo afirmativo con CommitTrans. Es decir. en un sistema con varios usuarios que están trabajando simultáneamente sobre una Base de Datos. deberemos aplicar estos métodos al Workspace que ese usuario tenga abierto. aunque en el siguiente apunte se lo hayan vuelto a introducir. Podría hacerse un apunte. Algunas bases de datos pueden no admitir las transacciones. por la razón que sea (cuenta bloqueada. no se puede ingresar en la cuenta destino. ya que los cambios a introducir se van almacenando en un búfer en la memoria. y así sucesivamente. el método Rollback deshará todas las operaciones en todos ellos. y su saldo no se verá afectado.CommitTrans MiSesión. realizar esa operación sin realizar ninguna otra durante ese tiempo. éstas se desharán automáticamente. quedando el Objeto Workspace afectado por las operaciones internas a esa transacción tal y como estaba antes de comenzar dicha operación. bien con CommitTrans o con Rollback. Con CommitTrans terminamos la transacción y se guardan los cambios realizados (En ambas cuentas a la vez. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 361 . en el caso del ejemplo). no existe esa cuenta.BeginTrans MiSesión. Y aquí comenzamos a ver la necesidad de crear Workspaces distintos para distintos usuarios. Con Rollback se termina la transacción sin llegar a guardar los cambios. terminar la operación y finalizar la transacción. y posteriormente cierra una transacción que abarque a esta última con Rollback. que es una combinación de estos tres métodos. Lea detenidamente la Ayuda de estos métodos antes de trabajar con ellos. un determinado usuario deberá entrar con un Workspace propio (una sesión de trabajo solo para él). Si desea tener transacciones simultáneas. el orden de finalización de una transacción debe ser siempre de menor a mayor nivel jerárquico. Sintaxis MiSesión. Si cierra una transacción anidada mediante CommitTrans. ahorra accesos al disco (Importantísimo en algunas redes LAN y WAN). Con el método BeginTrans iniciamos la Transacción. Si cierra un objeto Workspace sin guardar o deshacer las transacciones pendientes. aparte de lo que significa para asegurar la integridad de los datos. Pero no sé lo que pensaría el cliente cuando vea un estadillo de su cuenta.

Propiedad DefaultUser. la propiedad DefaultUser se establece a "administrador" y la propiedad DefaultPassword se establece a una cadena de longitud cero (""). Hay un solo objeto dbEngine.5" ) Propiedad DefaultType Establece o devuelve un valor que indica qué tipo de espacio de trabajo (Microsoft Jet u ODBCDirect) utilizará el próximo objeto Workspace que se cree. Usuarios. y para no complicar el estudio de las bases de datos. método del dbEngine. Propiedad DefaultPassword. El método SetOption le permite sobrescribir los valores del Registro de Windows para el motor de base de datos Microsoft Jet. Es el encargado de contener y controlar todos los objetos DAO. Grupos de Trabajo. Establece o devuelve el número de segundos que se esperará antes de que se genere un error cuando se intenta conectar a una base de datos de ODBC. 20 segundos. Para que estas propiedades tenga efecto. No olvide que el dbEngine es el motor de bases de datos Jet. Crea objetos Workspace conectados a un origen de datos ODBC. "3. El dbEngine. El DefaultPassword es un tipo de datos String que puede tener hasta 14 caracteres de longitud en bases de datos Microsoft Jet y cualquier longitud en conexiones ODBCDirect. Comencemos con una mirada a este objeto desde el punto de vista de DAO. Propiedad IniPath. Devuelve la ubicación de la información de Registro de Windows de Microsoft Jet.La protección de accesos a una base de datos Access. Vamos a entrar ahora en la creación de Usuarios (Users) y Workspaces. El tipo de datos es String (p. De modo predeterminado. (Recuerde que cualquier operación indebida sobre el registro de Windows puede hacerle perder toda la información de su PC) Propiedad SystemDB (Muy importante) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 362 . Propiedad LoginTimeout. Tiene como cualquier objeto DAO sus propiedades y métodos. Establece el nombre de usuario utilizado para crear el Workspace predeterminado cuando se inicializa. Puede contener cualquier carácter excepto 0 ASCII. en orden ascendente de importancia práctica. Visión desde DAO El objeto dbEngine es el objeto de nivel más alto en el modelo de objeto DAO. Propiedad Version Devuelve la versión actual de DAO en uso. El DefaultUser es un tipo de datos String. Vamos a ver alguna propiedad. habíamos usado solamente el Workspaces(0) que VB crea automáticamente. Puede tomar los valores: dbUseJet dbUseODBC Crea objetos Workspace conectados al motor de base de datos Microsoft Jet. Establece la contraseña utilizada para crear el Workspace predeterminado cuando se inicializa. debe establecerla antes de llamar a cualquier método DAO. Hasta ahora.e. inherente a la aplicación. Acabamos de ver que es necesario poder crear Workspaces para cada usuario. El método para crear Workspaces es el CreateWorkspace. La base de datos de sistema. Tiene como valor predeterminado. Grupos de Usuarios. y no se pueden crear más. Workspaces.. que puede tener entre 1 y 20 caracteres de longitud en espacios de trabajo Microsoft Jet y cualquier longitud en espacios de trabajo ODBCDirect.

Count . Recuerde que antes de crear un nuevo usuario. Para crear un nuevo usuario deberemos suministrar la siguiente información: Nombre del usuario. aunque la abre como si se tratase de una base de datos ordinaria.Users. y colocarla en el directorio que quiera. que normalmente se llama System.Clear For I = 0 To Workspaces(0). Lógicamente no se puede leer con Access. Identificador de Usuario.Users(I). La sintaxis de CreateUser es: Set User = Objeto. Se guarda su nombre y su contraseña.Mdw o la especificada en la propiedad SystemDB) El método CreateUser corresponde al Workspace o al Objeto Group.Mda. debe indicar donde está la base de datos con la información del systema. Debe declararse como User) Objeto El nombre del Workspace (o del objeto objeto Group) que quiere utilizar para crear el nuevo objeto User. "MiContraseña") Workspaces(0). Con las siguientes instrucciones vamos a introducir los nombres de los usuarios en la lista ListUsers ListUsers. no la visualiza. con W98 y VB6. La contraseña puede tener hasta 14 caracteres de longitud y puede incluir cualquier carácter excepto el carácter ASCII 0 Esto merece algún comentario. pero cuando pretende abrir una tabla. Pero puede copiar esta base con otro nombre. PID. pero de eso no nos vamos a ocupar por ahora) Lo normal es crear el nuevo usuario con el Workspaces(0) que como sabe.CreateUser("Luis". En mi PC. Ese era el nombre para versiones antiguas del Motor Jet. PID y contraseña.Name ListUsers.Users. Lo único que tendrá que hacer es indicarle al dbEngine su nombre y ubicación mediante esta propiedad SystemDB En esa base de datos se guarda la información de los usuarios.AddItem NomUsuario Next I Creación de nuevos Workspaces. contraseña) Donde User es la variable tipo objeto User que desea crear. y con Access98 solamente encuentro System. Nombre Nombre del nuevo usuario PID. Este archivo es una base de datos Access.Mdw") Con las siguientes instrucciones se crea un nuevo usuario Dim NuevoUser As User Set NuevoUser = Workspaces(0).Establece o devuelve la ruta de acceso del archivo de información del grupo de trabajo (sólo espacios de trabajo Microsoft Jet). e introduce sus datos en el archivo de información del grupo de trabajo (Base de Datos System. "EsteesmiPID". (NOTA.Append NuevoUser Podemos saber cuantos usuarios tiene el Workspaces(0) y su nombre. lo crea automáticamente Visual Basic.SystemDB = "C:\Windows\System\System.CreateUser (Nombre. Contraseña para el nuevo usuario.1 NomUsuario = Workspaces(0). Crea un nuevo Usuario. mediante la propiedad SystemDB DBEngine.Mdw (Observe que la extensión es distinta a la .Mdb a la que nos tiene acostumbrados Access) Access usa este fichero y lo guarda generalmente en C:\Windows\System. Debe contener de 4 a 20 caracteres alfanuméricos Contraseñal. Método CreateWorkspace LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 363 .Mdw) Creación de nuevos usuarios Método CreateUser (Sólo espacios de trabajo Microsoft Jet). El nuevo usuario debe crearlo un Workspace (o un Group. .La ayuda dice que el nombre predeterminado es System.

La sintaxis es la siguiente: Set NuevoWorkSpace = DBEngine. Usuario. "Luis".Workspaces(I).Workspaces. Contraseña.. Como el objeto Workspace pertenece al dbEngine. Contraseña La contraseña del Usuario propietario del Workspace. En las siguientes instrucciones podemos ver el código para listarlos en ListWS ListWS.1 NomWS = DBEngine. No ocurre lo mismo con el Usuario.Podemos crear cuantos Workspaces necesitemos. la propiedad DefaultType del objeto DBEngine determinará a qué tipo de origen de datos está conectado el Workspace No es necesario añadir el nuevo Workspace a la colección Workspaces Veamos un ejemplo de cómo crear un Workspace para el usuario Luis creado anteriormente: Dim NewWS as Workspace Set NewWS = DBEngine. es un objeto persistente. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 364 . No tiene otra finalidad.Count .Workspaces. Workspaces y DataBases. Las partes de código expuestas se han sacado de un ejemplo creado para ver el número y nombre de los usuarios existentes. Puede tomar los valores dbUseJet para crear un espacio de trabajo Microsoft Jet. MiSesion) Usuario Nombre de un usuario registrado en la base de datos del sistema (Que lo habremos creado con CreateUser) que será el propietario del nuevo objeto Workspace. o dbUseODBC para crear un espacio de trabajo ODBCDirect. ese Workspace desaparece. Cuando salimos de la aplicación. es este objeto el que debe crearlo.Append NewWS Podemos ver todos los Workspaces existentes. que habremos declarado como variable tipo objeto Workspace. Nombre es el nombre del Workspace (P. "MiContraseña") DBEngine.e.Clear For I = 0 To DBEngine. y la contraseña de ese usuario. Y una sesión de trabajo se abre para que trabaje un usuario. es decir.AddItem NomWS Next I Debe tenerse en cuenta que el objeto Workspace es un objeto que solamente existe mientras está ejecutándose la aplicación. Tipo) NuevoWorkSpace es el Workspace que queremos crear. que queda en la base de datos del sistema. Si omite tipo. Tipo (Opcional).CreateWorkspace (Nombre. Es un ejemplo para explicar estos conceptos. Por eso. Indica el tipo de espacio de trabajo. a la hora de crear un Workspace debemos indicarle para que usuario. Recuerde que un Workspace es una sesión de trabajo.Name ListWS.CreateWorkspace("SesiondeLuis".

Visible = True LNUserName.Fig. Página 365 .Visible = True LNuevoUserPID." Then Dim NuevoUser As User Set NuevoUser = Workspaces(0).Visible = True TBNuvoUsePID.Visible = False BAnularUser.Visible = False LNuevoUserPID.K.Visible = True BBorrarUser.Visible = False BBorrarUser.CreateUser(TBNuevoUserName.Append NuevoUser TBNuevoUserName.Caption = "O.Users.Caption = "Añadir" Then TBNuevoUserName.9 Aspecto de la interface gráfica del ejercicio para crear Users y Workspaces Código de este ejercicio General/Declaraciones Option Explicit Dim VarDrag As String Dim NuevoWS() As Workspace Private Sub BAnadirUser_Click() On Error GoTo RutErr Dim NomUsuario As String.Visible = True TBNuevoUserPw.Visible = False LNUserName.Visible = False BAnadirUser.Visible = True BAnularUser.Left = 3480 BAnularUser. TBNuevoUserPw) Workspaces(0).Caption = "O.K. 20. I As Integer If BAnadirUser.Visible = False TBNuevoUserPw.Visible = False TBNuvoUsePID.Visible = False LNuevoUserPw.Visible = True LSB Visual Basic – Guía del Estudiante Capítulo 1 TBNuvoUsePID.Visible = True LNuevoUserPw." Exit Sub End If If BAnadirUser.

Visible = False LUserPw.K. TBNuevoWSPw) DBEngine.Caption = "Añadir" ListUsers.AddItem NomWS Next I BAnadirWs.Count ." Then Dim NumWS As Integer NumWS = Workspaces. NomWS As String Set NuevoWS(NumWS) = DBEngine.Clear For I = 0 To Workspaces(0).Visible = False LNWSName.Name ListUsers.Visible = True TBNuevoWSPw.Caption = "Añadir" Then TBNuevoWorkspace.Visible = False TBNuevoWSPw.AddItem NomUsuario Next I BAnularUser.Visible = True LNombreUsuario.1 NomWS = DBEngine.Name ListWS." End If End Sub Private Sub BAnadirWs_Click() On Error GoTo RutErr If BAnadirWs.Count .Visible = True LNWSName.BAnadirUser.Append NuevoWS(NumWS) ListWS.Users(I).Caption = "Añadir" TBNuevoWorkspace = "" TBNombreUser = "" TBNuevoWSPw = "" TBNuevoWorkspace.Visible = False BEliminarWs.Visible = False BAnadirWs.Users.Count ReDim Preserve NuevoWS(NumWS) Dim I As Integer.K.Visible = True End If RutErr: If Err = 3304 Then MsgBox "Debe introducir el PID (Mínimo 5 caracteres.Visible = True BAnularWS.Visible = False BAnadirUser.Visible = True TBNombreUser.Visible = True End If RutErr: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 366 .Visible = False LNombreUsuario.Visible = False BAnularWS.Clear For I = 0 To DBEngine.Visible = True BEliminarWs.Caption = "O. TBNombreUser.Workspaces." Exit Sub End If If BAnadirWs.Visible = False TBNombreUser.Caption = "O.CreateWorkspace(TBNuevoWorkspace. máximo 20 caracteres)" Exit Sub Else If Err > 0 Then MsgBox "Ha ocurrido el error " & Err & ".Workspaces(I).1 NomUsuario = Workspaces(0).Visible = True LUserPw.Workspaces.Left = 5520 BAnularWS.

Caption = "Añadir" TBNuevoWorkspace = "" TBNombreUser = "" TBNuevoWSPw = "" TBNuevoWorkspace.Enabled = False BAnadirWs.Caption = "O.Caption = "O. I As Integer Workspaces(0).Enabled = False BAnadirUser.Delete ListUsers.Count ." Then TBNuevoUserName.K.Visible = False LNUserName.1 NomUsuario = Workspaces(0).Visible = True BAnularWS.Enabled = True Then BBorrarUser.Caption = "Añadir" End If If BBorrarUser.Visible = False TBNuvoUsePID.Name ListUsers.Visible = False TBNuevoUserPw.Users.Visible = False BAnularUser.Visible = False ListUsers.Text ListUsers.Visible = False BAnularWS.Visible = False TBNombreUser.Clear For I = 0 To Workspaces(0).Visible = False LUserPw.Visible = True End If If BEliminarWs.Visible = False TBNuevoWSPw.Users(I).ListIndex = -1 End If End Sub Private Sub BAnularWS_Click() If BAnadirWs.Visible = False LNuevoUserPw.Visible = False LNWSName.Visible = False BAnadirUser.Visible = True End Sub LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 367 .If Err = 3029 Then MsgBox "El Password usado no coincide con el de ese Usuario (User)" Exit Sub End If End Sub Private Sub BAnularUser_Click() If BAnadirUser.Users.AddItem NomUsuario Next I BAnularUser.K.Visible = False BBorrarUser.Visible = True BAnadirUser.Visible = False LNombreUsuario.Visible = True BAnularUser." Then BAnadirWs.Enabled = True Then BEliminarWs.Visible = False LNuevoUserPID.Visible = False BEliminarWs.Visible = False End If End Sub Private Sub BBorrarUser_Click() Dim NomUsuario As String.

LineaEntr LineaEntr8 = "" LineaEntr8 = Left(LineaEntr.Path & "\Cap20Usr.9)) Loop Close #1 LBDSys = PathFichero TBTextINI = PathFichero DBEngine. NomUsuario As String Dim PathFichero As String Open App.AddItem NomUsuario Next I RutErr: If Err = 3028 Then MsgBox "No se puede abrir la base de datos del sistema. Len(LineaEntr) .Private Sub BEliminarWs_Click() Dim I As Integer.Name ListWS. 8) If UCase(LineaEntr8) = "PROYCAPT" Then Me. vbNormalFocus End Sub Private Sub Form_Activate() On Error GoTo RutErr Dim LineaEntr As String Dim LineaEntr8 As String Dim I As Integer.1 NomUsuario = Workspaces(0).Count .Count . Vealo en Ver Ini" End If End Sub LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 368 .Users. NomWS As String.1 NomWS = DBEngine.Path & "\Cap20Usr.Workspaces.Name ListWS.9) If UCase(LineaEntr8) = "DBENGINI" Then PathFichero = Trim(Right(LineaEntr.AddItem NomWS Next I BEliminarWs. Len(LineaEntr) .Text Then NumWS = I Next I Workspaces(NumWS).Name If NomWS = ListWS.Caption = Right(LineaEntr.1 NomUsuario = Workspaces(I).AddItem NomUsuario Next I For I = 0 To DBEngine.SystemDB = PathFichero For I = 0 To Workspaces(0).Clear For I = 0 To DBEngine.exe " & App.Count .Workspaces.Enabled = False BAnularWS.Name ListUsers.Close ListWS. NumWS As Integer For I = 0 To DBEngine.Count .Workspaces(I).INI" For Input As #1 Do Until EOF(1) Line Input #1.Workspaces(I).INI".Visible = True End Sub Private Sub BSalir_Click() End End Sub Private Sub BVerIni_Click() Shell "Notepad. Compruebe que su Path y nombre son correctos.Workspaces.Visible = False BAnadirWs.Users(I).1 NomWS = DBEngine.

Visible = False BAnularWS. Creación de Usuarios y WorkSpaces DBEngINI=C:\WinNT\System32\System. Y As Single) If Shift = 1 And Button = 1 Then VarDrag = Text1.Left = 6600 BAnularWS.Guía del Estudiante.Text Text1.Private Sub ListUsers_Click() BAnadirUser.INI que debe estar necesariamente en la misma carpeta que el programa.Drag End If End Sub El fichero Cap20Usr.mdw (Deberá cambiar el Path del fichero System. Cap.) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 369 .Visible = True End Sub Private Sub Text1_MouseDown(Button As Integer.Mdw de acuerdo a como lo tenga en su ordenador.Left = 4560 BAnularUser.Visible = True End Sub Private Sub ListWS_Click() BEliminarWs. en el caso del PC del autor tiene esta forma REM Visual Basic .Enabled = True BAnadirWs. 20.Visible = False BBorrarUser. Shift As Integer. X As Single.Enabled = True BAnularUser.

inf_local es una expresión de cadena utilizada para especificar el alfabeto usado a la hora de ordenar datos de esa Base de Datos. Debe expresar el Path completo y el nombre del fichero (C :\MiCarpeta\MiBase. BaseDatosNva es el nombre del fichero (con su Path completo) de la base de datos nueva. sino marcándolo como borrado. El objeto DAO que debe hacer estas cosas es el Motor de Bases de Datos. Descodifica la base de datos durante la compactación. Este método también deberá reorganizar los índices y marcadores internos a esa BD. Si se omite. el orden de intercalado y la codificación de una base de datos cerrada. Crea una base de datos que utiliza la versión 1. ya compactada. que hace una copia de la base de datos (no borra la BD original) sin copiar los datos inútiles. el Objeto DBEngine. Lea detenidamente la ayuda en línea de este Método. Puede elegirse entre cifrarla o no cifrarla y cambiar la versión del motor de bases de datos que va a usar la nueva Base de Datos. Es decir. inf_local [. Si la red lo admite. Método RepairDatabase LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 370 . Sintaxis DBEngine. BaseDatosNva [. cuando borramos un dato en realidad no lo estamos borrando. dbEncrypt dbDecrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Codifica la base de datos durante la compactación.) Por lo tanto. verá que tras sucesivas operaciones de escritura / borrado en una BD. Este argumento es opcional. la información local de BaseDatosNva será la misma que la de BaseDatosAnt. compacta y da la opción de modificar la versión.CompactDatabase BaseDatosAnt.0 del motor Jet Se puede usar una constante (solamente) de encriptación y una (solamente) de Versión.MDB) Si el nombre de archivo tiene extensión. Los métodos son CompactDatabase. también puede especificar una ruta de red. No es posible especificar en el argumento BaseDatosNva el mismo archivo de base de datos que en BaseDatosAnt.Mantenimiento y Copia de Bases de Datos. opciones]] BaseDatosAnt es el nombre del fichero de la base de datos a compactar. El parámetro a introducir es el mismo que para el argumento similar usado en la creación de la Base de Datos (dbLangGeneral para el caso de España). y RepairDatabase. creada al copiar la BaseDatosAnt.0 del motor Jet Crea una base de datos que utiliza la versión 1.MDB". que intenta (no siempre lo consigue) reparar los datos internos de una BD que presente datos corruptos (Se generan con bastante facilidad cuando apagamos el ordenador con la base abierta) Método CompactDatabase Copia. Opciones nos permite cambiar alguna característica de la Base de Datos. esta va aumentando su tamaño.5 del motor Jet Crea una base de datos que utiliza la versión 3.1 del motor Jet Crea una base de datos que utiliza la versión 2. (No intente recuperar un dato marcado y no borrado porque no se puede. Se necesita un método que limpie todos los datos inservibles de la BD para disminuir su tamaño. Vamos a ver dos métodos del Objeto DBEngine para el mantenimiento y copia de Bases de Datos ACCESS. Sólo se puede compactar BaseDatosNva con una versión igual o posterior a la de BaseDatosAnt. deberá especificarla. En una Base de Datos ACCESS. como por ejemplo "\\MISERVID\MIDIR\MiBase.

El método RepairDatabase también intenta validar todas las tablas del sistema y todos los índices. Para poder “jugar” con el nombre a cambiar y el nombre cambiado. que los demás usuarios tampoco pueden tenerla abierta mientras la repara. Actualizaciones consistentes. Sugerencia Después de reparar una base de datos. Los datos que no puedan repararse se pierden.Execute origen[. se producirá un error interceptable.RepairDatabase NombreBase Donde NombreBase es el nombre (Y path) del fichero que contiene la Base de Datos a reparar. Sintaxis Para un objeto DataBase NombreBD. opciones] Donde NombreBD es el nombre del objeto DataBase Origen es una instrucción SQL Opciones es un entero o constante que determina las características de integridad de datos de la consulta. es aconsejable compactarla con el método CompactDatabase para desfragmentar el archivo y recuperar espacio en disco. usamos EXECUTE para cambiar el campo Nombre en una tabla llamada CLIENTES de una Base de Datos abierta. Ejecuta una consulta de acciones o una instrucción SQL en el objeto Database especificado.Intenta reparar una base de datos dañada que accede al motor de base de datos Microsoft Jet.MDB". Recuerde. si está en un entorno multiusuario. Para poder reparar la base debe estar Cerrada. Sintaxis DBEngine. En opciones puede utilizar las siguientes constantes: dbDenyWrite dbInconsistent dbConsistent dbSQLPassThrough dbFailOnError dbSeeChanges Deniega el permiso de escritura a los demás usuarios. se introduce el nombre que queremos cambiar en TBNombre2 y el nuevo nombre en TBNombre1 Dim RegistrosCambiados As Long LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 371 . Opciones igual que para el Objeto Database. según se especifica mas adelante. Execute no devuelve un conjunto de registros. cuyo Objeto DataBase se llama BaseDatos. Puede especificar una ruta de red. METODOS DEL OBJETO DataBase Método Execute Este Método es para el Objeto DataBase y para el Objeto QueryDef.e. Paso a través de SQL. P. En el siguiente ejemplo. Deshace las actualizaciones en caso de error. Si la base de datos no puede repararse. se producirá un error. Para un objeto QueryDef NombreQuerydef. Ejemplo.Execute [opciones] Donde NombreQuerydef es el nombre del objeto QueryDef cuya propiedad SQL especifica la instrucción SQL a ejecutar. Hace que se pase la instrucción SQL a una base de datos ODBC para su procesamiento. Genera un error en tiempo de ejecución si otro usuario modifica los datos que se están editando. (Predeterminado) Actualizaciones inconsistentes. El método Execute sólo es válido para las consultas de acciones. Si utiliza Execute con otro tipo de consultas. : "\\MISERVID\ MIDIR\NombreBase. Debido a que las consultas de acciones no devuelven registros.

bien mediante el método UpdateRecord de dicho Control Data.Execute MiSQL. bien cambiando el registro actual del Control data. Para meter un gráfico en la BD basta con introducir ese gráfico en el Picture (o Image) mediante LoadPicture. por ejemplo. puede utilizar la propiedad RecordsAffected del objeto Database o Querydef. use luego el método Execute y complete la transacción con el método CommitTrans en el objeto Workspace. IMÁGENES EN UNA BASE DE DATOS ACCESS Una imagen (la fotografía de una persona por ejemplo) puede guardarse en una base de datos tipo ACCESS y presentarse en un control Picture. bien creando un Recordset con código e igualando la propiedad Recordset del Control Data a ese Recordset. aún cuando no pueda modificarse ni eliminarse una línea. Esta opción generará un error interceptable y deshará todos los cambios realizados con éxito cuando alguno de los registros afectados se encuentre bloqueado y no pueda actualizarse o eliminarse. asociamos el Control Data a la Base de Datos. RecordsAffected contienen el número de registros eliminados. puede anidar el método Execute dentro de una transacción: Utilice el método BeginTrans en el objeto Workspace actual. Eso sí. bien mediante sus propiedades DatabaseName y RecordSource. Propiedad RecordsAffected Para determinar el número de registros afectado por el último método Execute. actualizados o insertados al ejecutar una consulta de acciones. Al utilizar el método Execute para ejecutar un objeto Querydef. debemos usar un Control Data cuando vayamos a presentar una imagen. Ambos son controles enlazados a datos. DataField = Nombre del Campo. sin usar el control Data. Por lo tanto. el campo de esa BD donde se va a introducir la imagen debe ser LongBinary ( si esa versión de ACCESS lo tiene) u Objeto OLE. Un bit-map puede presentarse en un control Picture o en un control Image. tenemos el problema resuelto. ¡¡ Imagine una aplicación que sea una agenda de teléfonos y pueda insertar la foto de la persona !! Para introducir una imagen en una BD. el método Execute no fallará. Para obtener el mejor rendimiento. De esta forma se guardarán los cambios en el disco y se liberarán los bloqueos que se hayan podido producir durante la ejecución de la consulta. y el campo que contiene el gráfico a el Control Picture (o Control Image) mediante sus propiedades DataSource = Nombre del Control data. en la propiedad RecordsAffected del Querydef se establece el número de registros afectados. La asociación de la Base de datos al Control Data puede hacerse. Lo mismo que decíamos que necesitamos un Control Data cuando vamos a usar un DBGrid. Es posible que se pueda introducir y presentar un bit-map en un control Picture o Image de otra forma.RecordsAffected MsgBox RegistrosCambiados Dada una instrucción SQL sintácticamente correcta y teniendo los permisos adecuados. complicando el código. especialmente en un entorno multiusuario.Dim MiSQL As String MiSQL = "UPDATE CLIENTES SET NOMBRE = '" & TBNombre2 & "' WHERE NOMBRE= '" & TBNombre1 & "'" BaseDatos. No merece la pena liarse con esto. Introducir y presentar un bit-map en una base de datos es necesario hacerlo mediante un Control Data. Por ejemplo. dbFailOnError RegistrosCambiados = BaseDatos. Si introducimos un Control Data y un Control Picture o Control Image en el Formulario. debe especificar siempre la opción dbFailOnError cuando utilice el método Execute para ejecutar una consulta de actualización o eliminación. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 372 . y guardar los datos en la BD.

lee y graba el fichero . FoxPro. Este motor de bases de datos abre. 13 Acceso a Bases de Datos remotas mediante el motor Jet ODBCDirect Acceso a Bases de Datos remotas mediante objetos RDO Acceso a Bases de Datos remotas mediante el motor Jet ODBCDirect Hasta ahora todos los accesos realizados a una base de datos los hemos realizado directamente a través del Motor de bases de Datos Microsoft JET. leer o escribir un fichero creado por el mismo o por otros editores conocidos.MDB (o el dBase.Visual Basic . Paradox.) de la misma forma que un editor de textos puede abrir. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 373 . etc.Guía del Estudiante Cap.

No es un lenguaje común a todas las Bases de datos. mediante un lenguaje común para todas las bases. Por eso. El ODBC es una herramienta que nos permite ver a todas las bases de una forma única. Y significa también que si queremos llamar a esa conexión deberemos llamarla por su nombre : Luki LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 374 . Estas herramientas son. Haga doble click y le aparecerá un cuadro como el de la figura 13-1. El driver que debe utilizar para entenderse con la base de datos El nombre (y Path) de la base de datos que queremos manejar con esa conexión. Microsoft desarrolló varios drivers para otras tantas bases de datos y hojas de cálculo. Veamos como podemos establecerla. dBase y FoxPro. La conexión ODBC no la realiza Visual Basic.Las bases de datos (las buenas) tienen unas herramientas comunes para manejarlas. En cualquier caso. (*. por una parte el lenguaje SQL que puede dar instrucciones para leer o escribir una base abierta. por el cual la podremos nombrar para referirnos a ella. La conexión ODBC es el conjunto de datos que hay que aportarle a Windows para que pueda enlazar nuestra aplicación con la base de datos. y por otra. Es la interface que adapta a una base de datos para que nos podamos entender con ella en SQL. bajo una forma única para todas las bases: el ODBC. Estos datos son. pero la forma interna de trabajar una base de datos solamente la conoce su fabricante. de momento. También lo desarrolló para bases de datos tan populares como Oracle. desde el exterior. de sistema o de archivo. el Driver ODBC que es el que nos permite adaptar las particularidades de esa base de datos al lenguaje común. Por lo tanto es fácil pensar que esa interface deberá fabricarla el mismo fabricante que ha realizado la base de datos. la herramienta que abre esa base de datos y nos hace verla. Veamos ahora otro elemento fundamental para el trabajo con ODBC: la conexión. dependiendo de como lo haya abierto. La elección de uno u otro dependerá de los permisos de acceso que quiera establecer (y eso es. En este cuadro figuran todos los enlaces que están establecidos. al menos: El nombre de la conexión. para nota). Estos enlaces puede establecerlos para un usuario (DSN de usuario). deberá suministrarlo el fabricante de la base. Vaya a Inicio | Configuración | Panel de Control | ODBC de 32 Bits. Ese es el SQL. La realizará Windows. exceptuando que puede otorgar unas prerrogativas distintas de uso. Ese driver hay que instalarlo en el ordenador. En esa línea figura otro dato: Microsoft Access Driver. aunque Windows instala algunos por defecto. El lenguaje SQL es conocido por todo el mundo. Observe uno que figura en la lista: Luki. todas los enlaces ODBC que establezca funcionarán del mismo modo. Entre ellas para Access y Excel.mdb) Esto significa que el enlace de nombre Luki está usando el driver ODBC de Access.

Le aparecerá un cuadro donde le pide el driver que quiere utilizar. y la base de datos con la que quiere enlazar LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 375 . Fig. Muestra las conexiones existentes (una vez creada la conexión Luki) Sigamos con la creación del enlace ODBC. (no es necesario introducirlo). 13-1 Creación de un enlace ODBC.Fig. un comentario. le pedirá el nombre del nuevo enlace. haga click en el botón Agregar de la figura 13-1. 13 – 2 Elección del driver ODBC Haciendo click en Finalizar. Para crear uno nuevo.

la base de datos se maneja mediante un objeto Connection. El trabajar sobre una conexión nos aporta mayor versatilidad a las aplicaciones. No necesitaríamos realizar ninguna modificación en nuestro programa. 13-3 Introducción del nombre del enlace. Piense por ejemplo un caso en el que se emplea una base de datos Access. que manipulaba el fichero de la base de datos directamente. Creamos la conexión Luki tal como se describió mas atrás. Si no introduce esta base de datos de sistema. Nuestro programa seguiría llamando a la misma conexión ODBC.Fig. Creamos una interface gráfica sencilla LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 376 . La base de datos del sistema deberá elegirla para poder introducir usuarios con distintas atribuciones de acceso a la base de datos.Mdb que tiene una tabla llamada Personas. Es un ejemplo uy simple. tal como vimos más atrás. Este razonamiento es válido para cualquier sistema de acceso a bases de datos a través de ODBC. En ese entorno se manejaba la base de datos creando un objeto Database. El proceso para ello consiste en algo parecido a lo que hacíamos trabajando con el motor Jet en el espacio de trabajo Microsoft Jet. pero esta conexión. Hacemos click en ACEPTAR y ya está creada la nueva conexión. por lo que el cambio de código es mínimo. Si quisiésemos ampliar las prestaciones de la base de datos de esa aplicación posiblemente pensaríamos en migrar la BD a Oracle o SQLServer. deberá trabajar sin restricción de acceso. abriría una base Oracle o SQLServer en vez de la Access que abría originalmente. Nombre y Apellidos. El cambio se limita prácticamente a crear el objeto Connection en vez del objeto Database. En este caso. comentario (descripción) y base de datos asociada al enlace ODBC Veamos los datos que hemos introducido en nuestra conexión “Luki” Nombre del Origen de datos. en el que abrimos una base de datos Access llamada Alumnos. pero de distinta forma. La tabla personas tiene solamente tres campos: ID_Alumno. (RDO ó ADO) Sin embargo el ODBCDirect tiene una ventaja `para los que trabajamos normalmente con DAO: usa los mismos nombres para casi todos los métodos y funciones. Si atacamos a la base de datos a través de ODBC solamente deberíamos cambiar la conexión. ahora. Luki Descripción (Opcional) Conexión ODBC Cap. Una vez creada la conexión podemos utilizarla para conectar nuestra aplicación con la base de datos. Se elige la base de datos deseada. Comencemos a ver esto con u ejemplo. 21 Haciendo click en Base de Datos | Seleccionar nos muestra un cuadro de diálogo donde `podemos buscar la base de datos.

dbPessimistic) 'Es necesario recorrer el recordset para conocer cuantos registros tiene (Es Dynaset) RsODBC.MoveFirst If RsODBC. dbDriverNoPrompt. "ODBC.OpenRecordset("Personal".RecordCount LNumReg = RsODBC.DefaultType = dbUseODBC Set MiSesion = Workspaces(0) 'Se crea el objeto conexión Set MiConexion = MiSesion.Delete LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 377 .OpenConnection("Conexion1". añadir nuevos registros y borrar el registro actual.AbsolutePosition + 1 End Sub Private Sub BEliminar_Click() RsODBC.AbsolutePosition <> -1 Then LNumRegs = RsODBC.MoveLast RsODBC.Fig. General/Declaraciones Option Explicit Dim MiSesion As Workspace Dim MiConexion As Connection Dim RsODBC As Recordset 'Declaramos las variables tipo objeto Private Sub BCrearConexion_Click() 'Se le dice al DBEngine que debe trabajar en el espacio de trabajo ODBCDirect DBEngine.DSN=Luki") ´Se crea el objeto Recordset Set RsODBC = MiConexion. 13-4 Nuestra primera aplicación con ODBCDirect Mediante esta sencilla aplicación queremos visualizar los datos existentes. dbOpenDynamic.AbsolutePosition + 1 PresentaDatos Else MsgBox "La base de datos no tiene ningún registro" End If End Sub Public Sub PresentaDatos() TB_ID = "": TB_Nombre = "" : TB_Apellido = "" TB_ID = RsODBC!ID_Alumno TB_Nombre = RsODBC!Nombre TB_Apellido = RsODBC!Apellidos LNumReg = RsODBC. Veamos el código con los comentarios oportunos. False. dbRunAsync.

AbsolutePosition <> -1 Then PresentaDatos Else RsODBC.Update LNumRegs = RsODBC.MoveLast PresentaDatos End If End Sub Private Sub BMMenos_Click() If RsODBC.LNumRegs = RsODBC.AbsolutePosition <> -1 Then RsODBC.MovePrevious If RsODBC.MoveFirst PresentaDatos End If End Sub Private Sub BGuardarDatos_Click() RsODBC.AbsolutePosition <> -1 Then RsODBC.AddNew RsODBC!ID_Alumno = TB_ID RsODBC!Nombre = TB_Nombre RsODBC!Apellidos = TB_Apellido RsODBC.MoveNext If RsODBC.AbsolutePosition <> -1 Then RsODBC.MoveFirst PresentaDatos End If End Sub Private Sub BNuevoReg_Click() Limpia End Sub Public Sub Limpia() TB_ID = "" TB_Nombre = "" TB_Apellido = "" LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 378 .RecordCount LNumReg = RsODBC.AbsolutePosition <> -1 Then RsODBC.AbsolutePosition + 1 End Sub Private Sub BMas_Click() If RsODBC.MoveFirst PresentaDatos End If End If End Sub Private Sub BMMas_Click() If RsODBC.AbsolutePosition <> -1 Then RsODBC.MoveLast PresentaDatos End If End If End Sub Private Sub BMenos_Click() If RsODBC.RecordCount LNumReg = RsODBC.AbsolutePosition <> -1 Then PresentaDatos Else RsODBC.AbsolutePosition + 1 If RsODBC.

DSN=Luki") MiSesion. la sintaxis de OpenConnection es la siguiente: Set MiConexion = MiSesion.OpenConnection("Conexion1". Veamos que son los parámetros Nombre. Vea mas abajo la información de OpenConnection para ver los parámetros que hay que pasarle a este método.OpenRecordset("Personal". dbRunAsync. Set MiConexion = "ODBC. Si opta por poner el nombre del enlace ODBC. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 379 . Opciones. False. Sólolectura y Conectar) En el ejemplo: Set MiConexion = "ODBC. Abre un objeto Connection usando un origen de datos ODBC ya creado. dbDriverNoPrompt. Por eso. Nombre no lo usará normalmente) El parámetros Nombre puede ser una cadena cualquiera. y que es el nombre por el que nos tendremos que referir a esa conexión en toda la aplicación. Debemos declararlo antes de usarlo Dim MiConexion as Connection Si MiSesion es el Workspace que queremos usar. Vamos a analizar las instrucciones de ese procedimiento que son distintas a las que estamos acostumbrados a manejar DBEngine. Visual Basic interpreta que debe conectar a través de ese enlace y ya no necesita poner ningún valor al parámetro Conectar.OpenConnection (Nombre. se producirá un error de tiempo de ejecución.OpenConnection("Conexion1". Tenga en cuenta que el ODBCDirect lo ejecuta el motor Jet (que como recordará es el objeto DBEngiine). Si no le diésemos ningún valor a esa propiedad. Opciones. El objeto Connection sería el equivalente en DAO al objeto Database. dbDriverNoPrompt. o el nombre del enlace ODBC establecido en Windows (que en nuestro ejemplo sería Luki). False.DefaultType = dbUseODBC Vea la propiedad DefaultType en el Capítulo 20. Puede tomar uno de los siguientes valores: DbDriverNoPrompt El administrador del controlador de ODBC toma los datos de los parámetros Nombre y Conectar para saber cual es el enlace ODBC que debe usar. dbOpenDynamic.DSN=Luki") MiSesion. Conexión1) deberá poner el nombre del enlace ODBC en el parámetro Conectar. cuando utilizábamos los métodos CreateDataBase u OpenDatabase no necesitábamos darle ningún valor a esa propiedad. tomaría el otro valor posible (dbUseJet) que es su valor por defecto. Si opta por poner una cadena cualquiera (como hicimos en el ejemplo. nombre del usuario y contraseña). Sólolectura y Conectar Nombre es el nombre de la conexión (no se debe confundir con el nombre del objeto Connection que es MiConexion. Si no proporciona suficiente información. Solamente hemos utilizado código distinto el procedimiento BCrearConexion_Click. Set RsODBC = MiConexion. Opciones Este parámetro es para definir que tipo de respuesta va a dar el administrador del controlador de ODBC para solicitar al usuario información sobre la conexión (Nombre del origen de datos (DSN). La propiedad DefaulType debemos igualarla a dbUseODBC para que trabaje en el espacio de trabajo ODBCDirect. dbPessimistic) Vea mas abajo una ampliación del método OpenRecordset Método OpenConnection Es un método del Workspace que solamente es aplicable cuando el DBEngine está trabajando en el espacio de trabajo ODBCDirect.End Sub Observe que casi todo el código es igual que el que escribiríamos si hubiésemos utilizado el espacio de trabajo Microsoft Jet.

Una. con este parámetro DbDriverPrompt forzamos al programa a que utilice los recursos Windows para seleccionar el enlace ODBC DbDriverComplete (Este es el valor predeterminado). y siempre terminan con el signo punto y coma (." Otra parte obligatoria. aparecerá otro cuadro solicitando el nombre de inicio de sesión y la contraseña." Si desea especificar el usuario propietario de esa conexión debe añadir "UID = usuario. estos datos se obtendrán de las propiedades UserName y Password del objeto Workspace." También puede indicar cuanto tiempo debe esperar el administrador del controlador de ODBC para generar un error en caso de que no conteste el sistema a la petición ODBC. Este parámetro está formado por varias partes." y como ese usuario tendrá una contraseña. que contiene la expresión "ODBC.5 Cuadro de diálogo de ODBC Una vez seleccionada la conexión. ambos separados por un signo =. que muestra todos los enlaces ODBC existentes.DbDriverPrompt El administrador del controlador de ODBC muestra el cuadro de diálogo de ODBC. deberá añadirla también "PWD = contraseña. En resumen." Observe que cada una de estas partes lleva un identificador y un dato. (aparentemente) como si se pone DbDriverNoPrompt esta opción se comporta Sólolectura (Opcional). LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 380 . obligatoria.) Si omite los parámetros UID y/o el PWD. La conexión se hace con el DSN que selecciona el usuario en ese cuadro de diálogo. Fig. Este tiempo deberá introducirlo con la expresión "LOGINTIMEOUT = segundos. True si la conexión se va a abrir con acceso de sólo lectura y False si la conexión se va a abrir para acceso de lectura/escritura (predeterminado) Conectar (Opcional si se ha puesto el nombre del enlace en el parámetro Nombre). Se comporta (aparentemente) como si se pone DbDriverNoPrompt DbDriverCompleteRequired Al igual que la anterior. 13. si no ha puesto en el parámetro Nombre el nombre del enlace ODBC es "DSN = NombredelaConexión.

por ejemplo a que el usuario introduzca un dato. de una consulta o una instrucción SQL que devuelva registros. Esto permite a su aplicación seguir procesando otras instrucciones mientras se ejecuta la consulta en segundo plano (Vea mas adelante la propiedad StillExecuting dbExecDirect Ejecuta una consulta saltando el método SQLPrepare y llamando directamente al método SQLExecDirect. dbOpenForwardOnly Abre un objeto Recordset de tipo Forward-only. que es la forma normal de trabajar del ODBC. (El tamaño de una página depende de la base de datos que esté usando. Lógicamente este bloqueo solamente tendrá efecto cuando esté trabajando en un entorno multiusuario.OpenRecordset (Origen." Bloquearmodificaciones Este parámetro es fundamental si quiere escribir en la base de datos. pero debe tener en cuenta que tiene la base bloqueada desde el Edit hasta el Update. de sus datos. que es parecido a un cursor dinámico ODBC DbOpenDynaset Abre un objeto Recordset de tipo Dynaset. pero se van a ver ciertas peculiaridades que tiene cuando se abre un recordset en el espacio de trabajo ODBCDirect En este caso es el objeto Connection quien abre el recordset.0. Esto puede ocasionarle que. El espacio de trabajo ODBCDirect no permite recordsets tipo Tabla. El bloqueo optimista significa que solamente estará bloqueada la página que contiene el registro mientras se ejecuta el método Update. si están dos usuario trabajando sobre el mismo registro. Bloquearmodificaciones) Origen Puede ser un nombre de tabla. pero todo va a depender de la aplicación. Funciona de forma similar al dbOptimistic. Opciones. se introduzca un dato erróneo. procure que las instrucciones entre uno y otro no tengan ningún tiempo de espera. similar al estudiado en el capítulo 20 para el espacio de trabajo Microsoft Jet DbOpenSnapshot Abre un objeto Recordset de tipo Snapshot. pudiendo modificar otros registros que estén fuera de ese segmento de 2 Kbytes. consulte la "Referencia del programador de Microsoft ODBC 3. utilizando el criterio de bloqueo optimista. y de la probabilidad de que ocurra esa colisión. DbOptimistic Permite cambiar datos y añadir registros en el recordset. utilizando el criterio de bloqueo pesimista. Esto significa que solamente tendrá bloqueada una parte relativamente pequeña de la base de datos. La ventaja que tiene es que tiene menos tiempo bloqueada la página de la base de datos. que tiene la particularidad de que no permite movernos en el recordset de adelante hacia atrás. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 381 . Este es el tipo que creará por defecto si no se especifica nada en el parámetro Tipo. Es el criterio mas seguro de bloqueo de datos.Método OpenRecordset Este método ya se estudió en el capítulo anterior.: Set MiRecordset = = MiConexion. Utilice esta opción sólo cuando no se abra un objeto Recordset basándose en una consulta de parámetros. Parece así en principio que no se debe usar. Los tipos que se pueden elegir son: DbOpenDynamic Abre un objeto Recordset de tipo Dynamic. pues si lo omite le pone por defecto que la base es de solo lectura. Esto significa que bloquea la página donde se encuentra el registros desde que se ejecuta el método Edit hasta que se ejecuta el Update. Si hace bloqueo pesimista. Opciones Debe indicar uno de estos dos valores (si no pone alguno de ellos da error): DbRunAsync Ejecuta una consulta asíncrona. Para obtener más información. Mediante este parámetro va a determinar el tipo de bloqueo de la base de datos para entornos de trabajo multiusuario. Tipo Indica el tipo de recordset que queremos crear. dbOptimisticValue Utiliza la concurrencia optimista basándose en valores de fila. En Access es de 2048 Bytes. Puede poner uno de estos valores: DbReadOnly (Predeterminado) No permite que los usuarios hagan cambios en los registros del Recordset DbPessimistic Permite cambiar datos y añadir registros en el recordset. Tipo.

Este modelo de cursor también permite al cliente cancelar la conexión con el servidor y volverla a establecerla con el mismo servidor o con otro diferente. Para utilizar la actualización por lotes en DAO 3.StillExecuting = True DoEvents Loop Mientras la propiedad StillExecuting sea True.OpenConnection("Luki1". para esperar a que se haya creado el objeto Connection MiConexion. StillExecuting se utiliza con los objetos y para las operaciones siguientes: Objeto Connection. pues MiConexión no existe aún. haremos un bucle de la siguiente forma Set MiConexion = MiSesion. no se puede tener acceso a ningún objeto devuelto. Esta propiedad puede ser muy útil cuando tiene consultas encadenadas y necesita esperar a que termine una para comenzar con la siguiente.StillExecuting = True Aquí las instrucciones que quiera Loop Método Cancel Cancela la ejecución de un método asícrono de llamada. QueryDef o Recordset) después de haber iniciado uno de los métodos citados anteriormente.Cancel La sintaxis del método Cancel consta de las siguientes partes: Objeto puede ser: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 382 . para controlar que aún se está ejecutando uno de los métodos Execute u OpenConnection Objeto QueryDef.5. NextRecordset u OpenRecordset Para ver el valor que tiene la propiedad StillExecuting deberá poner el nombre del objeto que quiere comprobar (Connection. para comprobar su método Execute Recordset. la operación se realiza de forma asíncrona. Sólo funciona espacios de trabajo ODBCDirect. debe utilizar un espacio de trabajo de ODBCDirect. por lo tanto no sabemos cuando tendremos disponible el objeto a crear o los datos de la consulta. que devolverá True si todavía se está ejecutando. Propiedad StillExecuting Cuando abrimos una conexión mediante OpenConnection. Sintaxis objeto. pero no mantienen bloqueos en el servidor o ejecutan actualizaciones por fila. donde podrá comprobar si aún se están realizando los métodos Move. la propiedad DefaultCursorDriver se debe establecer a dbUseClientBatchCursor en el momento de abrir la conexión y se debe abrir el Recordset con el argumento de tipo de bloqueo del método OpenRecordset establecido a dbOptimisticBatch. Modelo de cursor para clientes que trabajan con cursores. Actualización por lotes. no pretenda crear un recordset con MiConexion Mientras que StillExecuting sea True. Basta con hacer un bucle del tipo Do While MiConexion. En su lugar. el cliente actualiza muchas filas que están almacenadas en el búfer local y después ejecuta una actualización por lotes. dbDriverNoPrompt) Do While MiConexion. Por ejemplo. y False si ha terminado.dbOptimisticBatch Activa la actualización optimista por lotes. Para poder controlar si la operación se está realizando todavía leeremos la propiedad StillExecuting. Por ejemplo. un QueryDef o creamos un recordset y le ponemos en Opciones DbRunAsync.

hemos creado un recordset a partir de él. OpenConnection u OpenRecordset que se hayan invocado con la opción dbRunAsync. Es decir. que solamente existirán en la memoria RAM. y como paso previo a la creación del recordset hemos creado un QueryDef con todos aquellos registros cuyo campo Apellidos sea igual a Alvarez Pérez. DBEngine.Connection para cancelar el método Execute u OpenConnection QueryDef. Se expone aquí con fines didácticos. 13-6 Estructura jerárquica de los objetos de acceso a datos en el espacio ODBCDirect Objetos QueryDef en el espacio de trabajo ODBCDirect Habíamos visto en el capítulo 20 que un QueryDef era una consulta cuando todavía no estaba guardada en el disco. En el espacio de trabajo ODBCDirect no se pueden crear bases de datos. Ese QueryDef se transforma en una consulta de la base de datos una vez que se cierra el objeto Database. aparte de los ya estudiados en este capítulo. Veamos cada uno de ellos. Se pueden crear objetos QueryDef. no prácticos. un QueryDef es una consulta en memoria RAM. para cancelar el método Execute Recordset para cancelar el método OpenRecordset El método Cancel solamente sirve para cancelar la ejecución de una llamada asíncrona de los métodos Execute. que en este caso serán objetos efímeros. dos objetos que ya nos son conocidos: el QueryDef y el Database. Una vez creado ese QueryDef. desapareciendo en el momento que cerremos ese QueryDef o cerremos la aplicación. Cancel devolverá un error de tiempo de ejecución si en el método que está intentando finalizar no se utilizó dbRunAsync. Objetos Database y QueryDef en el espacio de trabajo ODBCDirect Repasemos la estructura jerárquica de los objetos de acceso a datos en el espacio de trabajo ODBCDirect. No tiene mucho sentido hacer esto ya que podríamos crear directamente el recordset imponiendo esa condición en el campo Apellidos. En el siguiente ejemplo hemos abierto la conexión. Fig.DefaultType = dbUseODBC LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 383 . Podemos ver que siguen existiendo. Puede crear un QueryDef para crear posteriormente a partir de él un Recordset con el que puede presentar o escribir el contenido de los registros.

OpenDatabase (Nombre. Opciones. El Objeto Parameter.OpenDatabase("BaseDatos1".RecordCount LNumReg = RsODBC. Deberemos suministrarle información del enlace ODBC que debe usar.MoveLast RsODBC. como en los otros casos Set RsODBC = MiBaseDatos.AbsolutePosition + 1 PresentaDatos Else MsgBox "El recordset no tienen ningún registro" End If Puede apreciar en la fig. dbOptimistic) If RsODBC. DBEngine. dbOpenDynaset. Este objeto sirve para cambiar los parámetros que se le pasan al QueryDef para crearlo.OpenRecordset("Personal". False.MoveFirst LNumRegs = RsODBC. "Select * From Personal Where Apellidos = "Alvarez Pérez") Set RsODBC = MiConsulta. dbDriverNoPrompt) 'Pero podríamos haberselo pasado en el parámetro Conexión y ponerle como parámetro 'nombre cualquier cadena de caracteres Set MiBaseDatos = MiSesion. abrimos el fichero que indique el enlace ODBC.MoveLast RsODBC.DSN=Luki") Set MiConsulta = MiConexion. dbDriverNoPrompt. dbOptimistic) If RsODBC.OpenRecordset(dbOpenDynaset. y en el segundo. "ODBC. y pasamos posteriormente a usar ODBC. Conexión) Para indicarle el enlace ODBC que debe usar puede hacerlo de las dos formas que venimos viendo para los parámetros Nombre y Conexión. y que por lo tanto deberá poner la misma referencia (En Proyecto | referencia) que en el caso del DAO trabajando en el espacio de trabajo Microsoft Jet. False. No olvide que sigue tratándose de DAO. 13-6 otro objeto que está jerárquicamente debajo del QueryDef.OpenConnection("Conexion1". "ODBC. dbRunAsync. El objeto Database en el espacio de trabajo ODBCDirect En el espacio ODBCDirect puede también abrir un objeto Database en vez de un objeto Connection. Le remito a la ayuda de VB para mayor explicación de este objeto. La sintaxis sigue siendo igual que en el espacio de trabajo Microsoft Jet: Set MiBaseDatos = MiSesion.DSN=Luki") 'Ahora creamos el recordset. Sólolectura. dbRunAsync. En la LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 384 .RecordCount LNumReg = RsODBC.MoveFirst LNumRegs = RsODBC. Si indica el nombre del enlace en el parámetro Nombre lo aceptará y será necesario poner el parámetro Conexión. Si `pone un nombre cualquiera en el parámetro Nombre deberá indicar el nombre del enlace en el parámetro Conexión.AbsolutePosition + 1 PresentaDatos Else MsgBox "La base de datos no tiene ningún registro" End If Mediante los ejemplos expuestos en este capítulo espero que el alumno comprenda como trabaja DAO a través de ODBC. dbDriverNoPrompt. Esta posibilidad de crear un objeto Database nos aproxima aún más al código empleado en el espacio de trabajo Microsoft Jet.DefaultType = dbUseODBC Set MiSesion = Workspaces(0) 'En la siguiente línea le pasamos el nombre del enlace ODBC en el parámetro Nombre Set MiBaseDatos = MiSesion.OpenDatabase("Luki".CreateQueryDef ("Pepito". mediante el ODBCDirect.Set MiSesion = Workspaces(0) Set MiConexion = MiSesion. La diferencia a la hora de crear un objeto Database (abrir una base d e datos) entre el espacio de trabajo Microsoft Jet y ODBCDirect es que en el primero abrimos directamente el fichero de la base de datos.AbsolutePosition <> -1 Then RsODBC.AbsolutePosition <> -1 Then RsODBC. Por lo tanto puede ser muy útil usar este objeto en aquellos casos en los que ya se había escrito el código.

Y si tiene problemas nadie se los va a resolver. movernos de un registro a otro. que también tienen su propio driver ODBC.). ya que en este caso no trabajamos directamente sobre la BD sino sobre la conexión ODBC que Windows realizó a una base de datos. Tras estos inconvenientes parece lógico encontrar alguna contrapartida positiva.siguiente parte de este capítulo se estudiarán los objetos RDO. objetos que trabajan exclusivamente a través de ODBC. etc. con el que podíamos acceder a la base de datos sin escribir ni una línea de código. y en contra de toda teoría de ODBC. Tampoco son iguales las protecciones y los permisos de acceso. 13 Continuación Acceso a Bases de Datos remotas mediante objetos RDO En la primera parte de esta capítulo hemos visto como acceder a bases de datos a través de ODBC usando el motor JET. De hecho RDO ya se ha quedado obsoleto al nacer ADO. enlace que vamos a utilizar en este capítulo. El acceso se realizaba mediante ODBCDirect. La razón está en que los drivers de una base y otra no trabajan exactamente igual. Normal. dBase o FoxPro. si piensa usar SQLServer u Oracle y si la aplicación va a escribir datos en la base no use RDO. que deberemos declarar y crear. Consejo de viejo profesor: Si va a trabajar con una determinada base de datos a través de RDO comience el proyecto usando esa base de datos. ¡Y Access y SQLServer son del mismo fabricante!. Normal. tiene un comportamiento muy irregular con la propiedad AbsolutePosition. Si solamente los va a leer no tendrá problemas. Pero eso será objeto de otro capítulo de esta Guía del Estudiante y hoy nos toca aprender RDO. dBase. También. (Access. damos por supuesto que el alumno conoce como crear ese enlace. El funcionamiento es similar. obtenga los datos y nos los pase. Con las ideas captadas hasta aquí verá que es sencillo abordar estos nuevos objetos. FoxPro. Lo mismo podemos decir cuando tenemos que contar registros. editar o añadir nuevos registros. Por ejemplo poder conectar con cualquier tipo de base de datos. Y lo peor no es solamente tener que aprender sus nombres. pero las propiedades son distintas y tienen distintos nombres. nos las cambian por rdoResultset. en RDO existe un control similar: el Control RemoteData. También vimos como crear un enlace ODBC. y varios detalles que procuraremos explicar en este capítulo para ahorrar al alumno el trabajo de tener que experimentarlos por sí mismo. El control RemoteData Al igual que DAO. Lo primero que nos encontramos al trabajar con RDO es que es más lento que DAO. (Y esto no es teoría. pudiendo incluso realizar la aplicación atacando una base Access. Si preparamos una aplicación en RDO trabajando con una base Access y pretendemos cambiar la base por otra SQLServer. pero también nos permite trabajar con Access. Pero lamentablemente. DataBase o Dynaset. RDO tiene objetos de acceso a datos. Comparación de sus objetos. Es simplemente experiencia del autor). no es lo mismo abrir un fichero y leerlo (que es lo que hace DAO) que pasar unos parámetros a otro programa (Driver ODBC de Access) para que este abra el fichero. modo de operación del motor JET. Mediante el control RemoteData podemos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 385 . consejo de viejo profesor. para luego trabajar con una base SQLServer u Oracle sin variar ni una línea de código. Esta forma de trabajar nos permite enlazar con bases de datos tipo Oracle o SQLServer. Los objetos RDO se crearon para cubrir el hueco que tenía VB para conectar con bases de datos distintas a las que trabaja el motor JET. Mediante estos objetos podemos leer y escribir datos en una BD mediante código. argumentando que deje RDO y use ADO. Y puestos a dar consejos. al igual que en DAO existía el Control Data. es la forma más segura de aprenderlos). y podíamos usar la misma sintaxis y objetos que habíamos visto con los objetos DAO. Visual Basic . observaremos que lo que funciona perfectamente en la primera no funciona en la segunda. (Aunque. RDO no tiene la posibilidad de crear bases de datos como hacíamos en DAO. Esa debería ser la gran ventaja de RDO. Comencemos. una directamente a través de DAO y otra a través de RDO. nos vemos obligados a retocar la mayor parte de las líneas de código (Cosa que no ocurría con ODBCDirect) Y lo tercero. RDO y DAO. sino que en una aplicación hecha en DAO que sea necesaria cambiarla a RDO.Guía del Estudiante Cap. Como ya se explicó en el capítulo anterior. Lo segundo que nos va a llamar la atención es el nombre de los objetos de acceso a datos. Esa falta de rapidez es el coste de la tecnología de bases abiertas. observaremos que la primera accede a la BD con una rapidez mayor que la segunda. no es cierto. Si creamos dos aplicaciones que trabajen sobre una base Access. Podemos añadir mas desventajas de RDO: no puede contar los registros que tiene. Una vez que nos habíamos familiarizado con palabras como Recordset. rdoConnection o Keyset respectivamente.

por lo que es fácil pensar que las propiedades de este control y los valores que deben tomar son distintas a los del control Data.enlazar una base de datos a los típicos controles enlazados a datos (Label. La lista siguiente está copiada literalmente de la información de Microsoft MSDN Library Visual Studio. pero en este caso se enlazan a través de una conexión ODBC. Como es mucho más sencillo (sencillo no quiere decir mejor) usar el control RemoteData que trabajarse con código los objetos de acceso a datos. Pero antes vamos adelantar la equivalencia entre los objetos DAO y los objetos RDO. Objetos de datos remotos y los objetos de DAO/Jet equivalentes Objeto de RDO Objeto de DAO/Jet equivalente rdoEngine DBEngine rdoError Error rdoEnvironment Workspace rdoConnection Database rdoTable TableDef No está implementado Index rdoResultset Recordset No implementado Tipo Table Tipo Keyset Tipo Dynaset Tipo static Tipo Snapshot Tipo dynamic (ninguno) Tipo forward-only Tipo forward-only No implementado (*) User RdoColumn Field rdoQuery QueryDef rdoParameter Parameter No implementado (**) Relation No implementado (*) Group Control RemoteData Control Data (*) En RDO. (**) Al no trabajar directamente sobre la base de datos. información que merece la pena instalarla en su ordenador pese a lo que ocupa. los usuarios y grupos de usuarios son precisamente los que lleve implícitos la conexión ODBC. DBGrid). vamos a comenzar estudiando este control. TextBox. no se pueden crear relaciones en ella. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 386 .

Para introducir los datos de la propiedad Connect deberá usar una palabra para definir el dato. Puede leer el valor de esta propiedad. sino ampliarla con otros datos de la conexión. Le devolverá precisamente el DNS que está utilizando. WSID Nombre de la estación de trabajo (Nombre del PC que se va a comunicar con el servidor WSID=NombredemiPC. DSN=MiConexiónODBC. DSN Origen de datos ODBC registrado. ya que el control RemoteData no abre un fichero de BD sino una conexión ya establecida. Sintaxis NombredelControlRDO.0 El control Remote Data tiene un aspecto similar al control Data. tal como el nombre del usuario. El DSN No es más que el nombre de la conexión ODBC. En este caso.El control RemoteData Este control nos permite crear una aplicación de acceso a datos completa sin utilizar código. Mediante la propiedad Connect le introducimos al control RemoteData la información necesaria para abrir la conexión. Esta propiedad se puede dejar en blanco si la propiedad Connect del control identifica un nombre de origen de datos (DSN) registrado en el Registro de Windows. DATABASE Base de datos predeterminada para usarla una vez conectado DATABASE=MiBase. su contraseña. nombre de la estación de trabajo desde la que vamos a trabajar e incluso el nombre de la aplicación en la que vamos a usar los datos de esa base.DatasourceName = MiConexión Puede cambiarse en tiempo de ejecución. pero un poco más complicada de usar. PWD Contraseña asociada al usuario PWD=MiContraseña. Esta propiedad sólo le devolverá un valor si ha introducido previamente algún valor en la propiedad DatasourceName. SERVER Nombre del servidor donde se aloja la base de datos SERVER=MiServidor. será necesario tener una conexión ODBC hecha. pero por otro camino. Algunas Propiedades del Control RemoteData DatasourceName Devuelve o establece el nombre del origen de datos (DSN). DRIVER Descripción del controlador DRIVER=SQL Server. No está normalmente en la caja de herramientas. inmediatamente debe utilizar el método Refresh para abrir la nueva conexión con la base de datos. Como final del dato debe introducir necesariamente el signo punto y coma . incluyendo en esta información. UID Nombre de un usuario reconocido UID=Luis. no solamente el nombre de la conexión. No le devolverá valor alguno si ha introducido la conexión a través de la propiedad Connect. Esta propiedad es mucho más completa que la anterior. nombre del controlador ODBC a usar. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 387 . como hacíamos con la propiedad DatasourceName. Eso sí. tanto en la caja de herramientas como en el formulario: El control RemoteData toma por defecto el nombre MSRDCx. por lo que habrá que añadirlo en Proyecto | Componentes introduciendo el Microsoft Remote Data Control 6. el nombre de la base de datos. seguido del signo = y del dato a introducir. el servidor donde se ubica esta base de datos. Propiedad Connect Esta propiedad cumple la misma función que la anterior.

de cómo haya creado la base de datos. Lo más probable es que si cambia de BD ya no le trabajará tan perfectamente. que puede estar habilitado para trabajar desde un puesto o desde varios puestos. Y cada una de ellas puede tener varias tablas.Si conoce SQLServer.DATABASE=BaseGE. …) Observe que tras cada parámetro existe un separador . DATABASE es el nombre de la base de datos que quiere utilizar una vez realizada la conexión. Oracle. No se fíe nunca de que su aplicación trabaja perfectamente sobre una base de datos. y la otra.APP Nombre de la Aplicación que va a Usar la Base de Datos APP=MiAplicación NOTA . model. una sencilla. para trabajar con los datos ya introducidos en la conexión ODBC. Si tenemos creada una conexión ODBC con todos los datos necesarios para que pueda abrir una base de datos. los atributos que le dio a cada uno de los usuarios. DatasourceName. Pero cuando usamos una BD a través de Red de Area Local. el sistema de ficheros de SQLServer) SQLServer mostrando su carpeta de Bases de Datos (BDGepa.UID=Luis. un usuario puede leer y escribir y otro solamente leer) Este parámetro le indica cual de esas bases de datos que contiene el fichero de SQLServer (para hablar con mas propiedad. etc.). Veamos un ejemplo de cómo introducir esta propiedad: Dim MiVariable As String MiVariable = "DSN=MiConexionODBC. dentro de un fichero de esta base de datos pueden existir varias bases de datos.PWD=MiContraseña. Cada una de estas bases de datos tiene un propietario y varios usuarios. Dependerá del driver. que cada uno tendrá un nombre y un Password. es mucho más simple usar la propiedad DatasourceName y el Control RemoteData le abrirá perfectamente la BD.e. Recuerde lo mencionado más atrás.Connect = MiVariable El hecho de que podamos abrir una base de datos mediante DatasourceName o Connect tiene su explicación. e incluso puede estar habilitado para trabajar sobre una BD utilizando una determinada aplicación. y no estarlo para utilizar esa misma BD con una aplicación distinta." RemoteData1. Y como no. Para los que no conocen SQLServer. para variar los datos de esa conexión ODBC ya existente y lograr con ello LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 388 . la configuración de esta BD no es tan simple como la de Access. master. Es decir. Por eso este control nos brinda las dos posibilidades. Cada usuario tiene habilitadas unas funciones (p. lo normal es que esa base esté compartida por varios usuarios. dependerá del tipo de base de datos que esté usando (SQLServer. No es necesario introducir todos los datos.

(el nombre de la conexión se lo pasamos en la propiedad DatasourceName) y que en la propiedad Connect le pasamos el nombre del usuario y la contraseña. Solamente sirve para consultas) Con los registros seleccionados por la propiedad SQL. Ahora nos falta indicarle los datos que deseamos leer o escribir. utilizando los métodos OpenConnection o EstablishConnection. RemoteData incluso sin tener una conexión preestablecida.todas las ventajas que nos ofrece ODBC respecto a restricciones de usuarios. pero en este caso. podemos introducir directamente ese rdoResultset como rdoResultset del control RemoteData. Puede utilizar el control.y por lo tanto la base de datos que utilizará. No le recomiendo que se complique la vida rizando el rizo. un rdoResultset o un rdoTable. Nos falta lo que sería en DAO. Esta instrucción SQL debe comenzar necesariamente por SELECT. donde hemos seleccionado todos los registros cuyo campo Apellido1 sea Suárez. Eso lo veremos más adelante. basta con escribir la instrucción SQL en la ventana de propiedades. podemos poner: MSRDC1. Pero deberá establecer mediante el programa. Si pudiésemos crear un rdoResultset mediante algún procedimiento. etc. pero en este caso adopta otro nombre: rdoResultset. Es el equivalente al objeto Database en DAO (Vea cuadro página 2) El control LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 389 . (y seguro que podremos hacerlo). que la conexión apunte a una determinada base de datos. Es muy típico por ejemplo. En RDO se ha buscado otra terminología. Por ejemplo.Resultset = rdoResultsetYaCreado Propiedad Connection Veamos previamente que es un objeto rdoConnection. podemos asignar a esta propiedad el nombre de una Consulta ya almacenada en la BD. Una instrucción típica sería SELECT * From Alumnos SELECT * From Alumnos Where Apellido1= 'Suárez' En tiempo de ejecución podemos introducir una de estas instrucciones en la propiedad SQL MSRDC1.SQL = "SELECT * From Alumnos Where Apellido1= 'Suárez'" Si la BD tiene una consulta (la típica consulta de Access) llamada C_Suarez. posiblemente para diferenciarlo claramente de DAO. También podemos introducir en esta propiedad un rdoQuery. pero el alumno aventajado puede intentar obtener información en la escasa bibliografía existente. darle los datos para crear el Recordset (Por ejemplo el nombre de una tabla o una sentencia SQL. al igual que lo hacíamos con el Recordset del Control Data en DAO: Set MSRDC1. Se sale del contenido deseado para este curso comentar estos métodos. (la conexión ODBC en este caso es muy normal que tenga solamente el nombre. y en vez de campos. pudiendo establecer previamente la conexión ODBC. DatasourceName y Connect hacemos que el control RemoteData sepa la conexión sobre la que va a trabajar . en vez de registros es habitual hablar de Filas. En tiempo de ejecución. debemos anteponer la palabra EXECUTE. y que no apunte a ninguna base de datos concreta). contraseñas. Propiedad SQL Mediante las dos propiedades estudiadas. formamos lo que en DAO era un recordset. Para el control RemoteData esta información se le introduce en la propiedad SQL La propiedad SQL establece o devuelve una instrucción SQL válida para crear un conjunto de registros a partir del origen de datos establecido en las propiedades DatasourceName o Connect.SQL = EXECUTE C_Suarez (No intente hacer esto mismo con el nombre de una tabla. Un Objeto rdoConnection es un objeto de acceso a datos remotos. tal como hacíamos en la propiedad RecordSource del control Data). hablamos de Columnas. Para establecer esta propiedad en tiempo de diseño. Puede incluso utilizar ambas propiedades.

Connection. mediante la caja de propiedades. al igual que ocurría con el objeto Database.Connection.StillConnecting Then ….MoveNext) NO es recomendable establecer la propiedad BOFAction a 1 (rdBOF) ni la propiedad EOFAction a 1 (rdEOF).Close Propiedades EOFAction y BOFAction Establecen el comportamiento del RemoteData cuando llega a la fila anterior a la primera o a la fila posterior a la última.resultset. Según la definición de Microsoft: Conjunto lógico de filas administrado por el origen de datos o por el administrador de controladores ODBC. Por ejemplo. (Por ejemplo. Por ejemplo. igual que el cursor de la pantalla indica la posición actual. o en tiempo de ejecución mediante la siguiente sintaxis: MSRDC1. debido a que se encuentra en el EOF ó BOF intentando introducir un nuevo dato. Crea una nueva fila. ya que puede entrar en una situación de la que es imposible salir. cerrar la conexión MSRDC1.Connect Si deseamos saber si el control RemoteData sigue conectado para realizar una determinada operación: If MSRDC1. Se genera el evento Validate y a continuación el evento Reposition.EOFAction = valor Los valores (o constantes) que puede tomar son los siguientes: Para la propiedad BOFAction Valor 0 1 Constante rdMoveFirst rdBOF Efecto Se mueve a la primera fila Se mantiene en la fila anterior a la primera. y se desactiva el botón de desplazar hacia abajo Para la propiedad EOFAction Valor 0 1 2 Constante rdMoveLast rdEOF rdAddNew Efecto Se mueve a la última fila Se queda en la fila posterior a la última. La propiedad EOFAction sólo tiene efecto cuando se manipula el cambio de filas mediante el ratón. No tiene efecto si se llega a la fila posterior a la última mediante código. Propiedad CursorDriver Devuelve o establece un valor que especifica el tipo de cursor que se va a crear. (#G!*¡&@%) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 390 . Veamos primero qué es un cursor. Se desactiva el botón de desplazar hacia arriba. sobre los botones del control RemoteData.RemoteData tiene un objeto rdoConnection subyacente y podemos "verlo" mediante esta propiedad.BOFAction = valor MSRDC1.Connection. y no puede. el objeto rdoConnection es un objeto de acceso a datos del que podemos ver sus propiedades y ejecutar sus métodos. Podemos ejecutar uno de sus métodos. (Y no es un juego de palabras) Puede establecerse en tiempo de diseño. Si ve aparecer un aviso de error parecido a Estado del conjunto de datos no válido para Update le está indicando que se ha metido en un proceso del que no puede salir. mediante la instrucción MSRDC1. si queremos ver la cadena de conexión completa podemos analizar la propiedad Connect del Objeto Connection: Label1 = MSRDC1. Los cursores reciben dicho nombre porque indican la posición actual dentro del conjunto de resultados. El poner verlo entre comillas no significa otra cosa que. Se genera el evento Validate y a continuación el evento Reposition.

que es estrictamente de pago. o empleamos mas tiempo. todas las actualizaciones a las tablas base se retrasan hasta que use el método BatchUpdate. Guarda los valores actuales de los controles enlazados en la base de datos. No suelen ser muy explícitos con los manuales aportados. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 391 . Puede tomar los siguientes valores: Descripción El controlador ODBC elegirá el tipo de cursores adecuado. En este caso. rdUseOdbc 1 RemoteData usará la biblioteca de cursores de ODBC . Y es que eso dependerá de la base de datos (Oracle no se comporta como SQLServer. En un caso lograremos o rapidez y en otro poco tráfico. si es necesario. en el puesto. el conjunto de registros que forma ese recordset deberá estar en la memoria RAM de algún equipo. rdUseServer 2 Se usarán cursores del lado del servidor. Podemos no crear un cursor. no usaremos memoria pero. y ninguna de ellas se comporta como Access) y depende también del controlador ODBC que utilice (Hay controladores de varias marcas para la misma base de datos) Es muy frecuente realizar un código que funciona perfectamente con un controlador ODBC. operar con ellas e introducirlas de nuevo. y cuando se cambia de controlador – o de versión – ya no funciona. Nota Cuando usa una biblioteca de cursores ClientBatch. o al menos tienen la habilidad de explicarlo de una forma tan sutil que es a veces inescrutable. a la que le vamos a manipular sus registros desde un puesto conectado al servidor donde se encuentra la base de datos a través de una red de área local. y una serie de puestos de operación. Este concepto de cursores es nuevo (No existía en DAO) debido a que RDO se utiliza fundamentalmente en sistemas basados en un servidor. modificar una columna y después ejecutar el método Update.Vamos a no complicarnos la vida para intentar comprenderlo. pero en ambos casos gastaremos recursos. rdUseClientBatch 3 RDO usará la biblioteca de cursores por lotes de tipo optimista. A esa memoria ocupada por el recordset. El mecanismo de ODBC espera una base de datos albergada en un servidor. Hemos empleado una palabra no muy exacta: suelen ser. Para ello usamos la propiedad CursorDriver. Constante Valor Métodos del control RemoteData Método UpdateRow Es equivalente al método UpdateRecord del Control Data. o introducimos más tráfico en la red. Casi siempre esas dudas se resuelven en el curso que cada marca tienen para su base de datos. El control RemoteData permite elegir el crear un cursor en el servidor. unidos al servidor a través de una red. Le recomiendo que repase el tema de cursores de la base de datos concreta que esté usando. o puede ser beneficioso mantener ese conjunto de filas en la memoria RAM del servidor para tener disponibles allí los datos y acceder a ellos de forma rápida a través de la red. Y en algunos casos puede ser beneficioso llevarse todas las filas de un rdoResultset al puesto. El crear un cursor de lado cliente o de lado servidor puede hacer que su código funciones o no funcione. Le recomiendo mucho cuidado. pero no actualiza las tablas base. donde se alberga la base de datos. y a la forma en la que están guardados los datos dentro de ella es a lo que llamamos Cursor. Se usarán rdUseIfNeeded 0 cursores del servidor si hay alguno disponible. y espero que la bibliografía que le brinda el fabricante sea suficiente. ocupando cierto espacio. Cuando creamos un recordset. que permiten avanzar hacia a delante y hacia atrás. Los cursores lado cliente suelen ser de lectura / escritura. o crearlo solamente si es necesario. Estos cambios pueden perderse si la aplicación termina antes de que se haya completado el método BatchUpdate. excepto que no ocurre ningún evento. ¿Del servidor? ¿Del cliente? En cualquiera de ellos que esté deberá estar en la memoria RAM. El método UpdateRow tiene el mismo efecto que ejecutar el método Edit. el método UpdateRow actualiza el rdoResultset local. El tráfico de datos a través de la red es algo que se debe optimizar. Los cursores lado servidor suelen ser solamente de lectura y de avance solamente hacia delante. una vez procesadas. en la base de datos.

Si tenemos un rdoResultset creado con código (Ahora veremos como se hace) la sintaxis sería MirdoResultset.BatchUpdate (filaunica. si es False. Sintaxis MSRDC1. no sobreescribirá si va a ocurrir una colisión. BatchUpdate (filaunica. Si está a False. tiene sus métodos.Método BatchUpdate (Método del rdoResultset) Este método no es del control RemoteData. forzar) Con esta introducción ya podemos pensar que el alumno tiene cierta idea respecto a lo que es el control RemoteData. o si lo prefiere. de filas ya que estamos en RDO). actualiza todo el lote. Forzar (Booleano)indica si está a True que sobreescribirá la fila actual. un RemoteData tiene asociado un Resultset.Resultset. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 392 . independientemente de si causa o no colisiones. forzar) Donde MSRDC1 es el nombre del control RemoteData Filaunica (Booleano) indica si es True. De igual forma que un control data tenía asociado un recordset. que solamente actualizará la fila actual. Este método es un método del rdoResultset. y que como cualquier objeto de acceso a datos. y este es uno. sino de su rdoResultset asociado. Vamos a comenzar a explicar lo que son los objetos de acceso remoto a datos (Objetos RDO) y podremos seguir viendo cosas acerca del control RemoteData como aplicación de estos nuevos objetos. Realiza una actualización optimista por lotes. El lote es un conjunto de filas. El Resultset es el objeto rdoResultset del control RemoteData (Colección de registros. Pueden ser las filas del cursor.

Lo de remoto no implica que la base de datos deba estar en un ordenador distinto al que tiene la aplicación. debe establecer una referencia a Microsoft Remote Data Object 2. se produce el evento InfoMessage del rdoEngine Propiedades del objeto rdoEngine rdoDefaultLoginTimeout Determina el valor predeterminado la propiedad LoginTimeout de los objetos rdoEnvironment que se creen. El significado de RDO es que se accede a la base de datos a través de una conexión ODBC.0 en Proyecto | Referencias. los objetos RDO tienen una estructura jerárquica que se puede ver en la siguiente figura: Estructura jerárquica de los objetos RDO Los objetos RDO siguen la misma regla para su creación que los objetos DAO: el objeto jerárquicamente superior crea al objeto inferior. La característica del rdoEngine es que trabaja siempre a través del Administrador de controladores. (Aunque esta sea la disposición más usual en aplicaciones que usan RDO). es decir. veremos los objetos RDO basándonos un poco en este conocimiento. Es el objeto de nivel jerárquico superior. Al igual que en DAO.Objetos de datos remotos (Objetos RDO) Como ya conocemos los objetos de acceso a datos DAO. por lo tanto no se crea por otro objeto. Los objetos rdoEnvironment de nueva creación se inicializan de acuerdo a los valores predeterminados establecidos en el objeto rdoEngine. Esta propiedad se utiliza en la administración del tiempo LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 393 . Se crea de forma automática el objeto rdoEnvironments(0). Cada vez que se recibe uno de estos mensajes. Los objetos de datos remotos nos permiten manipular componentes de un sistema de base de datos ODBC remoto. Es el equivalente al dbEngine de DAO. sino que está creado simplemente al introducir la referencia. al igual que lo hacía el dbEngine con el Workspaces(0) en DAO. el motor de bases de datos. El Objeto rdoEngine El objeto rdoEngine representa el origen de datos remoto. Para usar objetos de datos remotos. El objeto rdoEngine contiene al objeto rdoEnvironments (Colección de objetos rdoEnvironment) y el rdoErrors. (Windows 95/98/2000 o Windows NT). RDO solamente funciona en plataformas de 32 bits. El objeto rdoErrors contiene todos los mensajes de error enviados desde el origen de datos remoto.

Esta propiedad determina si el Administrador de controladores ODBC crea cursores por lotes del lado del cliente. En este método es necesario suministrar todos los parámetros (Nombre. Usuario y Contraseña) LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 394 . RdUseServer Utiliza cursores del servidor RdUseClientBatch Usa la biblioteca de cursores optimista por lotes RdUseNone No crea un cursor desplazable. Si el archivo DLL del idioma especificado no está presente en el equipo del usuario. para nombrar a este rdoEnvironment debemos hacerlo con MiSesion).disponible para la conexión. rdoVersion Examina la versión de RDO en uso. Puede tener hasta 14 caracteres. para mostrar los mensajes de error.rdoDefaultLoginTimeout = NumeroDeSegundos Si el valor NumeroDeSegundos es cero. rdoDefaultCursorDriver Determina el valor predeterminado de la propiedad CursorDriver de los objetos rdoEnvironment. lo cual no requiere un archivo DLL independiente. asegúrese de incluir el archivo DLL del lenguaje apropiado.rdoLocaleID = valor Por defecto. del servidor o si no crea cursores. este rdoEnvironment creado no se suma a la colección rdoEnvironments. dará error. el rdoEnvironments(0). locales. Sintaxis rdoEngine. esta propiedad toma el valor 0. Crea un nuevo objeto rdoEnvironment. Cuando se inicializa el rdoEngine se crea automáticamente una sesión de trabajo predeterminada. una sesión de trabajo) Sintaxis Set MiSesion = rdoEngine. ya que si no lo hace. que pone la configuración establecida en Windows. Cuando distribuya la aplicación. Si la conexión no se ha realizado en el número de segundos indicado. siempre que empleemos transacciones. Contraseña) Donde: Nombre es la propiedad Name del nuevo objeto rdoEnvironment. (Es decir.rdoDefaultCursorDriver = valor Donde Valor es un valor o contante según puede verse en la siguiente tabla RdUseIfNeeded (Predeterminado) elige el estilo de cursores más apropiado para el Controlador RdUseODBC Utiliza la biblioteca de cursores ODBC. (En el código. En una aplicación multiusuario es necesario crear un rdoEnvironment para cada uno de ellos. Cuando esto ocurre. Contraseña es la contraseña usada en esa sesión. con el nombre de usuario que tenga el rdoEngine en su propiedad rdoDefaultUser y con contraseña igual a la propiedad rdoDefaultPassword. Métodos del rdoEngine rdoCreateEnvironment Este método es equivalente al CreateWorkspace de DAO. Debe suministrar un nombre. esperará indefinidamente a que se realice la conexión.rdoCreateEnvironment(Nombre. rdoLocaleID Devuelve o establece un valor que indica la configuración regional de la biblioteca RDO. Sintaxis rdoEngine. se coloca un mensaje informativo en la colección rdoErrors para indicar que RDO no pudo cargar el archivo DLL de recursos para la configuración regional especificada. RDO se establece como rdLocaleEnglish. Básicamente es un conjunto de resultados de sólo lectura de tipo forward-only rdoDefaultUser y rdoDefaultPassword Determinan los valores predeterminados de las propiedades UserName y Password de los objetos rdoEnvironment cuando se abren conexiones sin suministrar valores para estos parámetros. Usuario. Usuario es el nombre del usuario. Sintaxis rdoEngine.

deberá ser el usuario quien introduzca los datos a través del cuadro de creación del enlace ODBC.INI. silencio. Si le ponemos True. Eso sí. atributos DSN es el nombre que queremos dar a la conexión ODBC Controlador es el nombre del controlador ODBC. No es trivial esta cadena de caracteres y es propia de cada controlador. por lo que solamente exponemos su sintaxis: MiSesión. no mostrará el cuadro. Visual Basic crea automáticamente un rdoEnvironment. Si la información suministrada no es completa.CursorDriver = Valor donde Valor toma uno de estos valores o constantes: 0 1 2 3 rdUseIfNeeded rdUseOdbc rdUseServer rdUseClientBatch El controlador ODBC elegirá el tipo de cursores adecuado. NO el nombre de la DLL.rdoRegisterDataSource DSN. Visual Basic crea automáticamente un Workspace o un rdoEnvironment si el proyecto contiene la referencia al motor de bases de datos correspondiente.dll Silencio es un valor True / False y se refiere a si queremos que presente el cuadro de creación de un enlace ODBC (El mismo que aparece en Windows) Si ponemos False en esta propiedad. Una expresión de cadena que es una lista de palabras clave que se van a agregar al archivo ODBC. Se usarán cursores del servidor si hay alguno disponible. Debe ser uno de los instalados y hay que poner el nombre exacto por el que se le conoce en Windows. RDO usará la biblioteca de cursores por lotes de tipo optimista. Vamos a bajar un nivel jerárquico y ver el siguiente objeto RDO El Objeto rdoEnvironment Un objeto rdoEnvironment es una sesión de trabajo en RDO. controlador. ponga el parámetro Silencio a False y se olvide de este parámetro de atributos. mostrará el cuadro citado. Atributos. de la misma forma que creaba un Workspace. La colección de todos los objetos rdoEnvironment es el objeto rdoEnvironments. En un rdoEnvironment podemos tener varios objetos Connection (varias conexiones) de la misma forma que en un Workspace podíamos tener varias objetos Database. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 395 . debe poner Microsoft Access Driver y no odbcjt32.rdoRegisterDataSource Sintaxis Introduce la información de conexión en el Registro de Windows para un origen de datos ODBC (Crea una conexión ODBC igual que lo haríamos en Windows) rdoEngine. Visual Basic no creará ninguno de ellos si no tiene la referencia a ningún motor de bases de datos. Propiedades del Objeto rdoEnvironment Propiedad CursorDriver Ya hemos visto esta propiedad para el control RemoteData. Usará la biblioteca de cursores de ODBC . El objeto rdoEnvironment creado es el rdoEnvironments(0) y el nombre de usuario será el que tenga el rdoEngine en su propiedad rdoDefaultUser y la contraseña igual a la propiedad rdoDefaultPassword NOTA. le introducimos los datos de la conexión a través de ese cuadro. y por lo tanto deberemos pasarle todos los parámetros correctamente. Los objetos rdoEnvironment se anexan automáticamente a la colección rdoEnvironments a menos que no proporcione un nombre para el nuevo objeto cuando utilice el método rdoCreateEnvironment. La aplicación al objeto rdoEnvironment es similar. Hasta aquí las propiedades y métodos del rdoEngine. Equivale al Workspace de DAO. Por ejemplo. Se usarán cursores del lado del servidor. le recomiendo que si no conoce muy bien la cadena a introducir. Las palabras claves están en una cadena delimitadas por retornos de carro. Por lo tanto.

Si no se especifica nada. Esta propiedad es sólo de lectura y devuelve un Long. Propiedad LoginTimeout Devuelve o establece el número de segundos que el Administrador de controladores ODBC espera antes de que se produzca un error de espera al abrir una conexión. Si este valor es igual a 0 se espera indefinidamente y no se producirá ningún error. LineaComandos. UID Nombre de un usuario reconocido PWD Contraseña asociada al usuario DRIVER Descripción del controlador DATABASE Base de datos predeterminada LSB Visual Basic – Guía del Estudiante Capítulo 1 DSN=MiConexiónODBC. cuyo contenido repetimos aquí por comodidad. En otras palabras. objeto que deberá declarar antes de abrirlo: Dim MiConexion as rdoConnection Set MiConexión = MiSesion. Conectar. DSN Origen de datos ODBC registrado. Determina si muestra o no muestra el cuadro de diálogo de abrir la conexión ODBC. Es similar a la propiedad hDC (para controles) o hWnd (para formularios) que ya hemos visto en capítulos anteriores. crea un objeto rdoConnection. LineaComandos. Es similar a la propiedad Connect del control RemoteData. Página 396 . este valor es prioritario al establecido en el objeto rdoEnvironment. Alguna instrucción nos pedirá el hEnv como parámetro. RdDriverComplete (3) Igual que rdDriverComplete pero deshabilita las opciones Required que ya estén bien pasadas en la información facilitada. se abre para lectura / escritura. y en su defecto. SóloLectura Determina si la conexión se abre como sólo lectura o para lectura / escritura.OpenConnection(Nombre.Propiedad hEnv Esta propiedad es el Handle de la conexión ODBC. Sintaxis NombreDelObjetordoEnvironment. Opciones) Nombre puede ser una conexión ya creada. DRIVER=SQL Server. SóloLectura. Para introducir los datos de la propiedad Connect deberá usar una palabra para definir el dato. Como final del dato debe introducir necesariamente el signo punto y coma . Si establece un valor para esta misma propiedad en uno de sus objetos rdoConnection. Si este parámetro es una cadena vacía. en cuyo caso se abrirá esa conexión. o mediante el cuadro de dialogo de abrir la conexión. seguido del signo = y del dato a introducir. Puede tomar estos valores rdDriverPrompt (0) Muestra el cuadro de diálogo rdDriverNoPrompt (1) No muestra nunca el Cuadro de diálogo rdDriverComplete (2) Muestra el cuadro de diálogo solamente si la información facilitada no es suficiente para abrir la conexión. Conectar Este es el argumento que lleva los datos completos de la conexión. de 15 segundos. Este valor lo usan las APIs de Windows para trabajar. deberá obtener los datos de la conexión.LoginTimeout = NumeroDeSegundos El valor predeterminado es el de la propiedad rdoDefaultLoginTimeout del objeto rdoEngine. UID=Luis. PWD=MiContraseña. Métodos del objeto rdoEnvironment Método OpenConnection Abre una conexión con un origen de datos ODBC. o bien del argumento Conectar.

Es el equivalente al Objeto DataBase de DAO Un objeto rdoConnection (es decir. Y muy distinta de cómo lo hace Access. Sintaxis MiSesion.SERVER WSID APP para usarla una vez conectado DATABASE=MiBase. La forma de trabajar de SQLServer es distinta de cómo lo hace Oracle. que debe devolver False cuando se ha completado la operación de conexión. *1 CommitTrans finaliza la transacción actual y guarda los cambios.. Además. CommitTrans. Por ejemplo. Puede comprobar si se ha completado la conexión examinando la propiedad StillConnecting del objeto rdoConnection recién creado. Nombre de la estación de trabajo (Nombre del PC que se va a comunicar con el servidor WSID=NombredemiPC. Puede también crear un nuevo objeto rdoConnection que no esté vinculado de forma inmediata con una conexión física específica a un origen de datos.StillConnecting = false then …. se producirá un error interceptable. El objeto rdoConnection Un objeto rdoConnection representa una conexión abierta con un origen de datos a través de ODBC. Nombre del servidor donde se aloja la base de datos SERVER=MiServidor. Nombre de la Aplicación que va a Usar la Base de Datos APP=MiAplicación Estos datos complementan la información de la conexión. Le recomiendo que estudie las transacciones en el manual de su gestor de base de datos. Puede comprobarlo analizando la propiedad Transactions del objeto Connection. Las modificaciones pendientes de los objetos RDO inferiores que estuviesen abiertos se deshacen. *2 RollbackTrans finaliza la transacción actual y restaura las bases de datos del objeto rdoEnvironment al estado en que estaban cuando comenzó la transacción actual. *0 BeginTrans comienza una nueva transacción. de este argumento Conectar solamente tomará el nombre de usuario y la contraseña. Método Close Cierra un el rdoEnvironment y todas las conexiones que tenía abiertas. BeginTrans. el siguiente código crea un objeto rdoConnection independiente: Dim OtraConexion as New rdoConnection. RollbackTrans (Transacciones) Son los métodos para realizar transacciones. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 397 . If MiConexion. Si ya habíamos establecido la conexión mediante el argumento Nombre. es distinto para cada base de datos. una conexión a una base de datos a trvés de ODBC) se crea o con un control RemoteData o mediante el método OpenConnection del objeto rdoEnvironment. El funcionamiento en RDO es distinto al de DAO.Close No se puede cerrar el rdoEnvironments(0) Si utiliza Close con el objeto ya cerrado. Hay algunas bases de datos que no aceptan transacciones. y en esa conexión ya estaban perfectamente definidos todos los parámetros de esa conexión.

Posteriormente puede introducir las características que desee y establecer la conexión real con la base de datos. Propiedad QueryTimeout Devuelve o establece un valor que especifica el número de segundos que espera el Administrador de controladores ODBC antes de que se produzca un error de tiempo de espera al ejecutarse una consulta. Muchas de ellas ya se han visto. Esta propiedad puede leerse siempre. ya que son los que se han introducido en Windows al crear la conexión ODBC. bien al estudiar el control RemoteData o los objetos RDO ya estudiados. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 398 . devuelve Nothing. Propiedades del Objeto rdoConnection Un objeto rdoConnection tiene Propiedades. Sintaxis MiConexion. (Puede no tener Password) Nombre del driver ODBC empleado Nombre de la base de datos que se va a emplear Nombre del servidor remoto Nombre de la estación de trabajo dentro de la red Nombre de la Aplicación (El separador es el carácter punto y coma (. Propiedad hDbc Devuelve el controlador de conexión ODBC.) No es necesario aportar estos datos para crear la conexión. si la ha habido. No es normal hacer esto.LastQueryResults Si no se había creado todavía ningún Resultset. por lo que le remito en caso necesario. clónico del ultimo que se ha generado. Sintaxis objeto. El valor predeterminado es de 30 segundos. Esta propiedad podemos utilizarla para crear un nuevo Resultset. Y es similar a hDc o hWnd Propiedad LastQueryResults Devuelve un objeto rdoResultset. Este valor lo utilizan las APIs de Windows. a la ayuda de VB de este objeto. La propiedad Connect contiene la cadena de conexión ODBC. precisamente el que se ha generado la última consulta. Estos datos solamente son necesarios si la conexión ODBC se creó sin aportarle datos acerca de la base de datos.Connect = CadenaDeConexión Las partes de CadenaDeConexión son: (Puede no usar alguna de ellas) DSN UID PWD DRIVER DATABASE SERVER WSIS APP Nombre del origen de datos (Nombre de la conexión ODBC) Nombre del usuario (Puede no tener nombre de Usuario) Password. Propiedad Connect Devuelve o establece un valor que proporciona información sobre el origen de un objeto rdoConnection abierto. Las propiedades que se han visto se describirán sólo de forma somera. pero no puede modificarse una vez establecida la conexión. Sintaxis Dim MiRs as rdoResultset Set MiRs = MiConexion.hDbc La propiedad hDbc devuelve un valor de tipo Long.

crear un Resultset Propiedad StillExecuting Devuelve un valor que indica si una consulta está aún ejecutándose. Es fundamental saber que la conexión ya está establecida antes de realizar ninguna operación con ella. Si el valor es 1. Es el equivalente al Recordset de DAO El Objeto rdoResultset se crea mediante el método OpenResultset del rdoConnection.AsyncCheckInterval = valor El valor por defecto es de 1 segundo (1000 mseg) Comentarios Al usar la opción rdAsyncEnable para ejecutar una consulta de forma asíncrona. Esta propiedad le permite asegurarse de esta circunstancia antes de ejecutar la instrucción BeginTrans. RDO comprueba periódicamente el origen de datos para determinar si la consulta se ha completado. Sintaxis objeto.Propiedad StillConnecting Devuelve un valor que indica si la conexión se está estableciendo todavía. no si el conjunto de resultados actual es actualizable. Sintaxis MiConexion. para conocer si ya se ha finalizado el proceso de selección de filas que esa operación implica. y False si ya está establecida.StillConnecting Esta propiedad devuelve True si la conexión no ha terminado de establecerse.UpdateOperation [= valor] El Objeto rdoResultset El Objeto rdoResultset es el conjunto de filas que devuelve la ejecución de una consulta. RDO también comprueba el estado de las consultas asíncronas cuando se examina la propiedad StillExecuting. Esta propiedad se usa cuando creamos un rdoResultset o un rdoQuery. La propiedad Transactions llama a la función SQLGetInfo de ODBC para determinar si el controlador ODBC es capaz de permitir transacciones. Esta propiedad puede aplicarse al rdoConnection. Puede modificar la duración del intervalo entre comprobaciones mediante la propiedad AsyncCheckInterval. la operación de modificación se realiza mediante dos instrucciones. Ejemplo: ‘Creamos el objeto rdoEnvironment utilizando el objeto creado automáticamente por VB LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 399 . Propiedad AsyncCheckInterval Devuelve o establece un valor que especifica el número de milisegundos que espera RDO entre dos comprobaciones para ver si se ha completado una consulta asíncrona. Propiedad UpdateOperation Esta propiedad afecta a la forma en la que se realiza la modificación de una fila en una actualización optimista por lotes.StillExecuting Propiedad Transactions Devuelve un valor que indica si se pueden realizar transacciones con un objeto rdoConnection ó rdoResultset. Devuelve True cuando la consulta está ejecutándose todavía. Sintaxis MiConexion. primero una instrucción Delete (borra la fila) y a continuación otra instrucción Insert (Crea la fila con los nuevos valores). por ejemplo. rdoQuery y rdoResultset. Sintaxis objeto. Si a esta propiedad se le pone el valor 0 (Predeterminado) la modificación de la fila se realiza mediante una instrucción Update. False si ya se ha finalizado.

o una sentencia SQL que pueda devolver filas. Por defecto. MiConexión = Objeto Connection con el que se crea el rdoRsultset Nombre = Nombre de una tabla o consulta de la base de datos. y se puede recorrer en ambos sentidos sin limitación. insertar nuevas filas. Ex_situxpe. insertar nuevas filas. rdConcurBatch 5 Concurrencia optimista usando actualizaciones de modo por lotes.tipo [. rdOpenDynamic. Valores Status devueltos por cada fila actualizada con éxito. Ex_numproye. lo crea solo lectura. Ex_tipotram. de fila. rdConcurRowVer 3 Concurrencia optimista basada en el Id. Ex_subsiste " & _ "From Expedientes Order By Ex_Numero_Ini". Ex_tipoprop. Ex_plan. RdConcurLock 2 Concurrencia pesimista. El tipo Dinámico es un rdoResultset que se puede actualizar.tipoBloq [. Los miembros de este rdoResultset no son fijos. No se puede retroceder .OpenResultset("Select Ex_expedite.Set GepaWs = rdoEnvironments(0) ‘El objeto rdoEnvironment crea el objeto rdoConnection Set GepaConex = GepaWs.OpenResultset(nombre [. rdConcurValues 4 Concurrencia optimista basada en valores de filas. rdConcurRowVer) Puede ver que el proceso de creación de un rdoResultset en RDO no difiere demasiado de la creación de un recordset en DAO. El parámetro opciones acepta estos valores: (Se pueden sumar ambas) Constante rdAsyncEnable 32 Valor Descripción Ejecuta la operación de forma asíncrona. Abre un rdoResultset tipo Keyset Abre un rdoResultset tipo Dinamico Abre un rdoResultset tipo estático El tipo forwar-only es un rdoResultset en el que las filas solamente se pueden explorar en sentido ascendente.opciones]]]) Donde MirdoResultset = variable tipo rdoResultset que debe estar declarada. Ex_tipoexpe.Es similar al Dynaset de DAO. Opciones = Opciones que puede tener el rdoResultset El argumento Tipo puede tener una de estos valores: Constante rdOpenForwardOnly rdOpenKeyset rdOpenDynamic rdOpenStatic Valor 0 1 2 3 Descripción (Predeterminado) Abre un rdoResultset tipo forward-only. " & _ "Ex_presenta. Es similar al Snapshot de DAO Para el parámetro Tipo de Bloqueo acepta los siguientes datos: Constante Valor Descripción rdConcurReadOnly 1 (Predeterminado) Sólo lectura. rdDriverNoPrompt. y se puede recorrer en ambos sentidos sin limitación. " & _ "Ex_Numero_Ini. El tipo Keyset es un rdoResultset que se puede actualizar. Veamos cada una de las partes del Método OpenResultset Set MirdoResultset = MiConexión. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 400 . False) ‘(Gepa es el nombre de la conexión ODBC creada en el ordenador) ‘El objeto rdoConnection crea el objeto rdoResultset Set GepaRs = GepaConex. Ex_redaproy. El tipo estático presenta los valores existentes en la BD en el momento de su creación y no detecta las posibles variaciones de los datos en la misma.OpenConnection(“Gepa”. Tipo = Tipo de cursor que se va a crear TipoBloq = Tipo de bloqueo de la base de datos. Los miembros de este rdoResultset son fijos.

En DAO la variable donde se guarda el Bookmark debía se un String. Si un DBMS no admite lotes de instrucciones. Devuelve un Variant con una matriz de las filas que han provocado una colisión la última vez que se invocó el método BatchUpdate. Si Bookmarkable es False. es decir. por ejemplo. El número de elementos de esta matriz es el que indica la propiedad BatchCollisionCount BatchSize (Propiedad) Devuelve o establece un valor que especifica el número de instrucciones enviadas al servidor en cada lote. EOF Son idénticas a las mismas propiedades del Recordset de DAO Bookmark Funciona igual que en el Recordset de DAO. Igual que en RDO. Desconozco la razón. Esto no significa que haya mas de un rdoResultset. el objeto rdoResultset no admite marcadores y el uso de Bookmark producirá un error La propiedad Bookmark no se aplica a los objetos rdoResultset de tipo forward-only. Devuelve un integer o una constante de acuerdo con la tabla siguiente: Constante LSB Valor Descripción Capítulo 1 Página 401 Visual Basic – Guía del Estudiante . Depende del tipo de cursor. En RDO van a depender del tipo de cursor y del tipo de bloqueo. si acepta la propiedad Bookmark. ya que depende del tipo de cursor. Para asegurarse de que el objeto rdoResultset admite marcadores. se pueden introducir varias sentencias SELECT y cada una de ellas crea un conjunto de registros. Se puede ir accediendo a cada uno de los conjuntos de registros mediante el método MoreResults. Pero en RDO es posible que esa propiedad no se pueda usar. El objeto rdoResultset tiene algunas particularidades que no tienen los recordsets de DAO. Esta propiedad puede modificarse en cualquier momento. BOF. En RDO es un variant. EditMode Devuelve un valor que indica el estado de edición de la fila actual. Propiedades del Objeto rdoResultset El rdoResultset no tiene exactamente las mismas propiedades que el Recordset. En caso de que esta propiedad sea mayor de 0 significa que la actualización por lotes no se ha completado con éxito. ActiveConnection Devuelve una referencia a la conexión con la que está asociado el rdoResultset BatchCollisionCount Devuelve un valor que especifica el número de filas que no finalizaron la última actualización por lotes. es decir. examine el valor de su propiedad Bookmarkable antes de usar su propiedad Bookmark. poder obtener resultados múltiples. pero no siempre funciona. BatchCollisionRows Devuelve una matriz de marcadores que indica las filas que han provocado colisiones en la última operación de actualización por lotes. Devuelve un Long. con lo que cada instrucción se enviará por separado.rdExecDirect 64 (Predeterminado) Evita la creación de procedimientos almacenados para ejecutar la consulta. En este caso habrá que ejecutar el método BatchUpdate para completar la actualización. Y además no siempre funcionan tal como lo hacían en el recordset. De forma predeterminada se envían 15 instrucciones al servidor en cada lote. Bookmarkable Devuelve un valor que indica si un objeto rdoResultset admite marcadores. puede establecer esta propiedad a 1. pero usando una variable String para almacenar el Bookmark falla. Veamos las propiedades del rdoResultset AbsolutePosition. sino que existe un único rdoResultset con resultados múltiples.

LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 402 Constante Valor . El bloqueo se realiza sobre una página de datos. Los valores admitidos son: Descripción (Predeterminado) El cursor es de sólo lectura. Se obtienen valores de rdConcurBatch 5 estado para cada fila actualizada correctamente. No se admiten rdConcurReadOnly 1 actualizaciones. RdEditInProgress 2 Se ha invocado el método AddNew y la fila actual del búfer de copia es una fila nueva que no se ha guardado en la B. Si esta propiedad no está disponible en el controlador. devuelve -1 Status Devuelve o establece el estado de la fila o columna actual. se producirá un error. En general. Si LockEdits es False (valor predeterminado) y utiliza después Update mientras la página está bloqueada por otro usuario. LockEdits Devuelve un valor de tipo Booleano que indica el tipo de bloqueo en vigor. El valor devuelto es un Single entre 0. rdConcurLock 2 Concurrencia pesimista. El valor de esta propiedad indica si la fila o la columna estarán implicadas en la próxima actualización optimista por lotes y de qué modo lo estarán. LastModified Devuelve un marcador que indica la última fila modificada o agregada más recientemente. Es un Long. D. Si devuelve True utiliza bloqueo pesimista. Se ha invocado el método Edit y la fila está en buffer de copia. Si LockEdits es True y otro usuario ya tiene la página bloqueada. PercentPosition Devuelve o establece un valor que indica o modifica la ubicación aproximada de la fila actual en el objeto rdoResultset.RdEditNone RdEditInProgress 0 1 No se está efectuando ninguna operación de modificación. se producirá un error al intentar usar el método OpenResultset. sino el número de filas a las que se ha accedido. basándose en el porcentaje con respecto al total de filas de dicho objeto. Restartable Devuelve un valor que indica si un objeto rdoResultset admite el método Requery. No es por lo tanto. Esta propiedad no indica el número de filas del Resultset. rdConcurValues 4 Concurrencia optimista basada en los valores de las filas. Devuelve un Variant. Debe usarse antes de utilizar el método Requery para evitar que se produzca un error. el equivalente a la propiedad RecordCount del Recordset DAO. Esta propiedad solamente se aplica a los rdoResultset tipo Keyset y Dynamic. Concurrencia optimista con actualizaciones por lotes. Si devuelve False utiliza bloqueo optimista. RowCount Devuelve el número de filas a las que se ha tenido acceso en un objeto rdoResultset. Este marcador es el Bookmark de esa fila. Lea la ayuda de VB para obtener mayor información de cada uno de los tipos. rdConcurRowVer 3 Concurrencia optimista basada en el identificador de fila.0 y 100. que vuelve a ejecutar la consulta en la que está basado el objeto rdoResultset.0 Puede usar la propiedad PercentPosition con una barra de desplazamiento de un control Form o TextBox para indicar la ubicación de la fila actual en un objeto rdoResultset. La página suele se de 2 K (Ese es el tamaño que utiliza Microsoft SQL Server) LockType Devuelve o establece un valor entero de tipo Long que indica el tipo de tratamiento de concurrencia. los demás usuarios pueden leer datos de las páginas bloqueadas.

. Por lo tanto no se asuste si pretende ejecutar un método y no funciona. Type Devuelve un Long el tipo de rdoResultset. sino el driver de ODBC. (0 = rdOpenForwardOnly. Probablemente es que Visual Basic ha puesto por defecto unas características a los objetos que no son las adecuadas. mediante las operaciones que nos permite el propio driver de ODBC. del cursor y de si es lado cliente o lado servidor. antes de presentar los datos de esa consulta.Los valores admitidos para la propiedad Status son: Constante rdRowUnmodified rdRowModified rdRowNew rdRowDeleted rdRowDBDeleted Valor 0 1 2 3 4 Valor de la propiedad Prepared (Predeterminado) La fila o la columna no se han modificado o se han actualizado correctamente. 1 = rdOpenKeyset. Eso sí. unas permiten hacer unas operaciones y otras no. Esto no es exactamente igual en RDO. 2 = rdOpenDynamic. En DAO era Visual Basic quien abría la base de datos. pero aún no se han eliminado de la base de datos. La fila o la columna se han eliminado. Es típico crear un bucle parecido a este: Do While GepaRs. Y si no fuese posible. bases que controla directamente Visual Basic a través de la dll correspondiente a la versión de la BD que vamos a abrir. pero aún no se han insertado en la base de datos. La fila o la columna se han eliminado localmente y también de la base de datos. La fila o la columna se han modificado y aún no se han actualizado en la base de datos. en última instancia nos queda realizar directamente la operación que pretendíamos realizar con el método.StillExecuting = True DoEvents Loop Transactions Devuelve un valor Booleano que indica si un rdoResultset permite transacciones. La fila o la columna se han insertado con el método AddNew. La propiedad debe ser False para poder presentarlos. Lo mismo podemos decir del tipo de rdoResultset. Lo veremos más adelante. en este caso estamos en sus manos. dependiendo de la base de datos. Y no solamente eso. sin embargo no se puede esperar que funcionen siempre de la misma forma. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 403 . StillExecuting Devuelve un valor de tipo Booleano que indica si una consulta está aún ejecutándose. 3 = rdOpenStatic) Updatable Devuelve un valor Booleano que indica si se pueden efectuar cambios en el rdoresultset Métodos del Objeto rdoResultset El rdoResultset tiene algunos métodos comunes con el Recordset de DAO. Access. etc. Esta propiedad es muy útil (muy necesaria) para saber si la consulta ya está disponible. Aquí quien abre el fichero que contienen la base de datos no es Visual Basic. dBase. y una base muy concreta. es decir.

Sintaxis MirdoResultset. Método Close Cierra un rdoResultset abierto. se descartan los cambios guardados en el objeto rdoResultset local.. el rdoResultset debe aceptar marcadores. pues el método AddNew no devuelve ningún error si se intenta añadir una nueva fila a un rdoResultset no actualizable. aunque puedan causar colisiones. Veamos que significa esto. Para que sea la nueva la fila actual basta con poner el siguiente código: MirdoResultset. Debe tener cuidado también con asegurarse que tras el método AddNew ejecuta el método Update antes de cambiar de fila. se envían a la base de datos todos los cambios pendientes. se usa la propiedad Bookmarkable. Si usa el método CancelBatch. se ejecuta el método AddNew. CancelUpdate La fila recién añadida no pasa a ser la fila actual. Para comprobarlo. pero no se meten en la base de datos. hace que la actualización sea solamente de la fila actual. Si desea interrumpir la entrada de datos. Método BatchUpdate Realiza una actualización optimista por lotes. Hay que tener cuidado. ya que de no hacerlo se pierden los cambios realizados y VB no avisa de ese error. Sigue siendo fila actual la que era anteriormente. se actualizan todas las filas pendientes. Este método solamente se puede aplicar a un rdoResultset del tipo Client Batch (Cuando se crea el rdoResultset usando como tercer parámetro rdUseClientBatch) El tipo de rdoResultset puede ser Keyset o Dynamic. solamente se guardan en el rdoResultset local. forzar) El parámetro filaÚnica es un Booleano que si es True. cuando usamos el método Update para guardar los datos.LastModified Pero eso sí. Sintaxis MirdoResultset. Si se está usando cursores de tipo Client Batch los datos se escribitrán en la BD cuando se ejecute el método BatchUpdate. Si es False. se introducen los datos en los campos y se termina la operación con el método Update.BookMark = MirdoResultset.Close LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 404 . Para evitar este error hay que comprobar la propiedad Updatable del rdoResultset. forzar es tambiénun Booleano que si es True fuerza a escribir los valores. Cuando se ejecuta este método.Método AddNew Crea una nueva fila para un objeto rdoResultset actualizable. una vez ejecutado el método AddNew puede anularse usando el método CancelUpdate MirdoResultset. Es igual al método Close del Recordset de DAO Sintaxis MirdoResultset. que es cuando los datos entran en la base de datos. Ese error va a salir cuando ejecutemos el método Update.AddNew Funciona igual que el mismo método de DAO. En estas condiciones.BatchUpdate (filaÚnica.

El usuario no tiene permiso para realizar la operación. Se producirá un error al utilizar Delete si: No hay ninguna fila actual.GetRows (filas) Donde filas es el número de filas que se quieren recuperar.Delete Es posible deshacer la eliminación de una fila si emplea transacciones y el método RollbackTrans. La fila ya se ha eliminado. Por ejemplo. La conexión o el rdoResultset es de sólo lectura. Cuando la propiedad LockEdits del objeto rdoResultset es True (bloqueo pesimista). y se mantienen bloqueadas hasta que se ejecuta Update. Cuando se utiliza el método MoreResults se borran las filas del conjunto de resultados actual y se colocan en su lugar las filas correspondientes al siguiente. se han empleado varias sentencias SELECT para crearlo. basta con ejecutar el método CancelUpdate. todas las filas del conjunto de filas del objeto rdoResultset se bloquean en cuanto se ejecuta Edit. Si desea anular el cambio que está realizando. Cada sentencia formará dentro del rdoResultset un juego de filas. de esta forma: matriz(intColumn)(intRow) Método MoreResults Este método se utiliza cuando se ha creado un rdoResultset de resultados múltiples. Sintaxis MirdoResultset. Método GetRows Recupera múltiples filas de un rdoResultset y las introduce en una matriz. Ninguna columna de la fila es actualizable. Sintaxis MirdoResultset. El método devuelve un Booleano que es True si ha encontrado un nuevo conjunto de resultados. o False si no lo ha encontrado. Sintaxis matriz = MirdoResultset.Método Delete Elimina la fila actual de un objeto rdoResultset actualizable. Funciona de la misma forma que el método del mismo nombre del Recordset de DAO. Al igual que en el método AddNew. se perderán los cambios. Otro usuario ha bloqueado la que contiene la fila. la biblioteca de cursores del servidor no es compatible con este tipo de consultas si no desactiva el procesamiento del cursor en un cursor de sólo lectura sólo hacia adelante con la propiedad RowsetSize a 1. suponiendo que usa BeginTrans antes que el método Delete. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 405 . No todas las bibliotecas de cursores son compatibles con consultas de conjuntos de resultados múltiples. Método Edit Inicia la operación de cambiar los valores de los datos de la fila actual o en un objeto rdoResultset actualizable. Es un Long matriz es un Variant El primer subíndice de la matriz identificará la columna y el segundo identifica el número de fila. es necesario terminar la operación con el método Update.Edit Si cambia la fila actual antes de ejecutar el método Update. es decir.

y más rapidez que con RDO. ODBC es una tecnología ya obsoleta (En el año 2002) y no debe emplearse para nuevos proyectos. independencia de drivers. Su comportamiento es muy parecido a DAO. ya que si se quiere emplear ODBC es mucho más práctico y sencillo emplear DAO en su versión de ODBCDirect. MoveLast. eficacia. inicio] Métodos MoveFirst. y las particularidades del ODBC en cuanto a la situación de los cursores. exceptuando los nombres de los objetos.Move filas[.Método Move Cambia la posición de la fila actual en un objeto rdoResultset. Método Requery Actualiza los datos de un objeto rdoResultset volviendo a ejecutar la consulta en la que está basado el objeto. LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 406 . y este autor recomienda: USE ADO EN TODOS SUS NUEVOS PROYECTOS Pero si usa Access con la base de datos instalada en el mismo ordenador que el programa. Sintaxis MirdoResultset. Tendrá código compatible con DAO. Ya se ha comentado su funcionamiento con los métodos AddNew y Update. con lo que ello conlleva. control sobre el programa. sencillez. Funciona igual que el mismo método del Recordset de DAO Sintaxis MirdoResultset. MoveNext y MovePrevious Funciona de la misma forma que los métodos del mismo nombre en el Recordset de DAO. No se debe emplear para nuevos proyectos. Lógicamente un curso de Visual Basic debe incluir RDO.Requery [opciones] El valor admitidi para Opciones es rdAsyncEnable (32) que ejecuta la operación de forma asíncrona Método Update Termina una operación de modificación de datos o de añadir una nueva fila. No vamos a profundizar más en los objetos RDO. Además RDO es una tecnología considerada obsoleta por Microsoft. Con Access DAO significa: Rapidez. Microsoft dice. Si usa Access olvídese de nuevas tecnologías. use directamente DAO. pero siempre para aplicarlo al mantenimiento de aplicaciones ya existentes.

Guía del Estudiante Cap. pero desde su inicio. El objetivo de OLE DB es poner a disposición del programador una herramienta de nivel inferior que le de acceso universal a los datos con independencia del origen de datos. Quizás sea el uso de palabras de argot muy rebuscadas. ya sea un servidor de correo electrónico. Con el estilo didáctico que caracteriza a este libro. que más que facilitar el estudio. no se puede acceder a ellos directamente desde Visual Basic. una hoja de cálculo u otro tipo de almacenamiento de datos. O L E A D O D B Bases de datos Relacionales Aplicación que accede a los datos O D B C Texto Modelo de datos ADO R D O D A O Bases de datos relacionales O D B C Modelo DAO/RDO LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 407 . Debido a la complejidad de los elementos de OLE DB. ADO está como metido en una aureola de dificultad a la que solamente pueden acceder informáticos especialmente elegidos. para ello utilizaremos los objetos ADO que permiten acceder a la práctica totalidad de las funciones de OLE DB. No se porqué.Visual Basic . atemorizan al principiante. La Guía del Estudiante pretende quitar esos velos que ocultan la sencillez de lo cotidiano y mostrar la facilidad de esta técnica. pasaremos de las definiciones gloriosas e iremos a lo verdaderamente importante: saber programar con ADO ADO permite crear aplicaciones capaces de manipular bases de datos a través de un proveedor OLE DB (Object Linking and Embedding for DataBase). 14 ACTIVE X DATA OBJECT (ADO) ADO es lo último de Microsoft en acceso a bases de datos.

y también otras bases de datos sencillas como dBase. y tiene sus dispositivos de seguridad en cuanto a permisos de acceso (Vea El dbEngine. pudiendo recoger los resultados devueltos por dichos procedimientos como parámetros de salida. Esta característica permite mejorar el rendimiento y la rapidez de las aplicaciones. Es una gran base de datos. no podremos utilizar con él las características de ADO que se refieren a dichos tipos de procedimientos. Y ello es debido a que Access es una base de datos sin grandes aspiraciones en cuanto a seguridad. Fig 72. existen tres objetos principales dentro de ADO: El objeto Connection. el objeto Command y el objeto recordset. y estos mecanismos de seguridad de Access tampoco son una maravilla. No se necesita navegar por ninguna jerarquía de objetos para poder crearlos. Esta característica mejora el rendimiento tanto de la aplicación como de la red.1 Jerarquía de Objetos ADO. • Soporte para limitar el número máximo de registros devueltos de una sola vez en un recordset. La mayoría de los objetos se pueden instanciar de forma independiente. De esta forma crearemos solo los objetos que necesitemos. Menor carga de memoria y de espacio en el disco duro. Por lo tanto Access se ha quedado como una gran base de datos LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 408 . Es decir. • ADO nos permite utilizar los procedimientos almacenados en el sistema gestor de la base de datos (si este soporta esta funcionalidad). Hay que tener en cuenta que todas estas características están limitadas por el servidor de los datos.Las características generales de ADO son: • • Mayor velocidad y facilidad de uso. Antes de proseguir con estos objetos vamos a explicar donde y porqué se deben utilizar objetos ADO en vez de objetos DAO u objetos RDO Hasta ahora habíamos utilizado bases de datos Access. Luego veremos algunas de las características principales de cada uno de estos objetos. Connection* Errors Command* Parameters Recordset * Error* Parameter * Fields Field* * Todos los objetos marcados con un asterisco contienen la colección Properties con un subconjunto de objetos Property. Visión desde DAO y la propiedad SystemDB en el Capítulo 12) sin embargo estas posibilidades se usan en muy pocas ocasiones. Acceder a Access es extremadamente fácil. • Diferentes tipos de cursores. Las características específicas que proporciona ADO para entornos de Cliente/Servidor (C/S) son: • Creación de los objetos de forma independiente. • Soporte para recibir varios recordset como resultados devueltos de un procedimiento almacenado. si el servidor de datos no soporta procedimientos almacenados. Properties Property Como puede verse en la figura.

En DAO. Con ADO no hay que preparar previamente ninguna conexión. Con ODBC se preparan conexiones permanentes en el ordenador. previamente debemos declararlo como variable objeto Connection: Dim MiConexion as ADODB. Este no es más que una DLL. como se ha dicho. Access y las demás BD controladas por el motor Jet). Para crear un objeto Connection. el método ideal de acceso es DAO. Claro que en este caso. bien directamente o a través de ODBC Direct. Para que VB pueda acceder a ADO es necesario introducir en el programa la referencia a Microsoft ActiveX Data Objets 2. mediante los parámetros que debemos aportar en la sintaxis de creación del recordset. a la hora de crear el objeto recordset deberemos indicarle. disponer de privilegios distintos para cada usuario. o bien accediendo a través de la dirección IP del servidor. ODBC se ha quedado obsoleto. La función de este objeto es recoger toda la información del proveedor de los datos que se va a utilizar para crear un objeto recordset. todos aquellos datos que le aportaríamos a la creación del objeto Connection.Connection El sitio donde se debe declarar depende como siempre. SQLServer. Para crear el objeto Connection deberemos utilizar la siguiente sintaxis: LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 409 . Podemos acceder a través de ODBC. un juego de DLLs que puede ver en la carpeta: C:\Archivos de Programa\Archivos Comunes\System\Ado Estas DLLs permiten conectar con las bases de datos más conocidas (Oracle. Veamos como se crea la conexión: Mediante el Objeto Connection EL OBJETO CONNECTION El objeto Connection representa una sesión con el origen de los datos.1 Library (Proyecto|Referencias) Una particularidad de ADO frente a lo ya visto con DAO o RDO es que ADO se salta la jerarquía a la hora de crear nuevos objetos. En ADO podemos crear cada objeto sin que exista el objeto inmediatamente superior. Como ve no tiene ventajas. pero como ya se dijo en el. y cualquier programa puede acceder a la BD a través de esas conexiones. la BD se suele buscar bien mapeando el disco del servidor como una unidad más del puesto cliente. Si hubiese dos programas ejecutándose simultáneamente y accediendo a la misma base de datos a través de ADO. es el propio programa quien crea esa conexión al ajecutarse. Y Microsoft ha sacado para ello ADO. cada programa prepara una conexión a esa BD. métodos y colecciones de este objeto. Dependiendo de la funcionalidad del proveedor de los datos podremos utilizar determinadas propiedades. Es el propio programa el que llama al proveedor de datos OLE DB y le pasa como parámetros los datos necesarios para que este realice la conexión y abra la BD. capítulo correspondiente. En ADO no existe esa posibilidad ya que. Por ejemplo podemos crear un recordset sin que exista el objeto Connection. Y ADO permite abrir la base de datos usando para ello un dispositivo intermedio que es el proveedor OLE DB. En esta base de datos. Solamente que nos desentendemos un poco de abrir y cerrar el objeto Connection. hay que recurrir a bases de datos tipo Oracle o SQLServer. Ya empezamos a tener problemas: Visual Basic no puede acceder directamente a abrir estas bases de datos. trabajar en una red de área local con muchos usuarios. Cuando queremos empezar a tener una seguridad en los accesos. Cuando se accede directamente.para aplicaciones que no pasen de algunos centenares de miles de registros y con pocos puestos de operación. ADO funciona de forma diferente a ODBC. el objeto DAO superior creaba al objeto DAO inferior (Recuerde aquello del juego de niños). En ODBC podríamos ver las conexiones existentes en el PC a través del Panel de Control | Fuentes de Datos ODBC. del ámbito que deseamos que tenga ese objeto. Mejor dicho.

User ID=scott. ‘Provider=MSDAORA.Data Source=MADRID. User Id Especifica el nombre de usuario que abre la conexión. (Nombre de la base de datos a la que se va a acceder. etc.Data Source=C:\GuiadelEstudiante\PruebaADO. ni con que usuario. pero de momento es completamente inútil ya que no sabe ni siquiera que base de datos debe abrir.mdb. Si lo que queremos es cre