Vous êtes sur la page 1sur 394

INDICE

INTRODUCCIN Caractersticas Generales de Visual-Basic VARIABLES: DEFINICION Y ENTORNO

Pgina 1

Visual Basic - Gua del Estudiante Cap. 1


INTRODUCCION Antecedentes histricos. ___________________________________ El lenguaje de programacin BASIC (Beginner's All purpose Symbolic Instruction Code ) naci en el ao 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 ingls), y con instrucciones muy sencillas y escasas. Teniendo en cuenta el ao de su nacimiento, este lenguaje cubra casi todas las necesidades para la ejecucin de programas. Tngase en cuenta que las mquinas existentes en aquella poca estaban estrenando los transistores como elementos de conmutacin, los ciclos de trabajo llegaban a la impensable cifra de 10.000 por segundo y la memoria no pasaba de unos pocos ks en toroides de ferrita. La evolucin del BASIC por los aos 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 crendose la normativa BASIC STANDARD Con la aparicin de los primeros ordenadores personales, dedicados comercialmente al usuario particular, all por la primera mitad de los ochenta, el BASIC resurgi como lenguaje de programacin pensado para principiantes, y muchos de estos pequeos ordenadores domsticos lo usaban como nico sistema operativo (Sinclair, Spectrum, Amstrad) Con la popularizacin 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 crdito entre los profesionales de la informtica. Las razones para ello eran obvias: - No era un lenguaje estructurado. - No existan herramientas de compilacin fiables. - No dispona de herramientas de intercambio de informacin. - No tena libreras. - No se poda acceder al interior de la mquina. - Un largo etctera de desventajas respecto a otros lenguajes de programacin. Tal fue ese abandono por parte de los usuarios, que la aparicin del Quick-BASIC de Microsoft, una versin ya potente del BASIC, que correga casi todos los defectos de las versiones pas prcticamente inadvertida, a no ser porque las ltimas versiones del sistema operativo MSDOS incluan una versin de Quick-BASIC algo recortada (Q-Basic) como un producto mas dentro de la amplia gama de ficheros ejecutables que acompaan 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 versin del popular BASIC ya es un lenguaje estructurado, lo que permite crear programas modularmente, mediante subrutinas y mdulos, 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 grfico Windows. Sin embargo algo haba en el BASIC que tentaba a superarse: su gran sencillez de manejo. Si a esto se le aade el entorno grfico Windows, el aprovechamiento al mximo de las posibilidades de Windows en cuanto a intercambio de informacin, de sus libreras, de sus

Pgina 2

drivers y controladores, manejo de bases de datos, etc. el producto resultante puede ser algo que satisfaga todas las necesidades de programacin en el entorno Windows. La suma de todas estas cosas es VISUAL - BASIC. Esta herramienta conserva del BASIC de los aos 80 nicamente su nombre y su sencillez, y tras su lanzamiento al mercado, la aceptacin a nivel profesional hizo borrar por fin el "mal nombre" asociado a la palabra BASIC. Actualmente se est comercializando la versin 5.0 de este producto. Desde su salida al mercado, cada versin supera y mejora la anterior. Dados los buenos resultados a nivel profesional de este producto, y el apoyo prestado por el fabricante para la formacin 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 mquina 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 programacin. (Visual-C). o realizar libreras (DLLs) que lo hagan. En la mayor parte de las aplicaciones, las herramientas aportadas por VB son mas que suficiente para lograr un programa fcil de realizar y de altas prestaciones. Caractersticas Generales de Visual-Basic Visual-Basic es una herramienta de diseo de aplicaciones para Windows, en la que estas se desarrollan en una gran parte a partir del diseo de una interface grfica. En una aplicacin Visual - Basic, el programa est formado por una parte de cdigo puro, y otras partes asociadas a los objetos que forman la interface grfica. Es por tanto un termino medio entre la programacin tradicional, formada por una sucesin lineal de cdigo estructurado, y la programacin orientada a objetos. Combina ambas tendencias. Ya que no podemos decir que VB pertenezca por completo a uno de esos dos tipos de programacin, debemos inventar una palabra que la defina : PROGRAMACION VISUAL. La creacin de un programa bajo Visual Basic lleva los siguientes pasos: - Creacin de un interface de usuario. Este interface ser la principal va de comunicacin hombre mquina, tanto para salida de datos como para entrada. Ser necesario partir de una ventana - Formulario - a la que le iremos aadiendo los controles necesarios. - Definicin de las propiedades de los controles - Objetos - que hayamos colocado en ese formulario. Estas propiedades determinarn la forma esttica de los controles, es decir, como son los controles y para qu sirven. - Generacin del cdigo asociado a los eventos que ocurran a estos objetos. 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. - Generacin del cdigo del programa. Un programa puede hacerse solamente con la programacin de los distintos procedimientos que acompaan a cada objeto. Sin embargo, VB ofrece la posibilidad de establecer un cdigo de programa separado de estos eventos. Este cdigo puede introducirse en unos bloques llamados Mdulos, en otros bloques llamados Funciones, y otros llamados Procedimientos. Estos Procedimientos no responden a un evento acaecido a un objeto, sino que responden a un evento producido durante la ejecucin del programa. No es necesario entender de momento lo anterior. Visual Basic introduce un concepto nuevo

Pgina 3

de programacin, y es necesario cambiar hasta el argot del programador. Posiblemente se le habrn acumulado demasiados trminos de una sola vez. Es normal. A poco que siga leyendo ver las cosas ms claras cuando se explique una por una.

Pgina 4

VARIABLES. DEFINICION Y ENTORNO Basic, desde siempre, al contrario de otros sistemas de programacin, no exigi la definicin 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. Existirn varias variables para poder introducir los datos de los alumnos. Estas variables pueden tener nombre tales como: Nombre Apellido1 Apellido2 Direccin Telfono DNI La variable Nombre tomar valores distintos segn vayamos introduciendo los datos de los distintos alumnos. Es posible, que a lo largo de la ejecucin del programa, esta variable Nombre valga: Jos Pedro Mara Luis Espero que su intuicin o conocimiento anterior le lleve a conocer el concepto de variable. Mas adelante lo ver mas claro. Decamos que Basic no exige la definicin previa de las variables. Otras herramientas exigen que se haga as. Por lo tanto es normal encontrar, en otros sistemas de programacin, que un programa comienza de la siguiente forma: Declare Nombre As String Declare Apellido1 As String Declare Apellido2 As String Declare Direccin As String Declare Telfono As String Declare DNI As Nmero Le dice que Nombre es una sucesin de letras

Le dice que Telfono es una sucesin de letras Le dice que DNI es un nmero

Mediante estas declaraciones, el programa sabe de que tipo de dato se trata y por tanto cmo debe trabajar con l. En otros sistemas de programacin distintos de Basic, es necesario realizar esta declaracin 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 DNI=50000000 Nombre ="Pedro" Telfono = "1234567" entiende que DNI, Nombre y Telfono son variables, que DNI es un nmero (No hemos metido su valor entre comillas), y que Nombre y Telfono son sucesiones de caracteres alfanumricos (su valor est entre comillas)

Pgina 5

Esta particularidad de no necesitar declarar las variables hace que sea sencillo introducir una variable nueva. Sin embargo entraa un gran peligro. Imagnese que en un paso posterior del programa, le mandamos escribir esos tres datos anteriores con la instruccin PRINT Print DNI 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 ningn valor. Por lo tanto no escribir nada y encima no dar ningn 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. Basic ha pensado en ese problema, y se puede solucionar con esta que ser la primera instruccin 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 comunicacin de error.

TIPOS DE VARIABLES Las variables pueden ser de los siguientes tipos: (El nmero indicado en segundo lugar indica el nmero 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) Nmeros enteros, en el rango de 0 a 255 Nmeros enteros en el rango de -32768 a 32767 Nmeros enteros en el rango de -2147483648 a 2147483647 Punto flotante, simple precisin Punto flotante, doble precisin. Entero, con punto decimal fijo (Tpico de monedas) Cadenas alfanumricas de longitud variable o fija Fechas Referencia a objetos Otros tipos de datos

(*) Una variable tipo String ocupa el mismo nmero de bytes que caracteres tenga la cadena. (**) Una variable tipo Variant ocupa 16 bytes si se trata de un nmero y 22 bytes + longitud de la cadena si se trata de un dato tipo cadena de caracteres. Existen tambin 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 Picture, 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. Este tipo ocupa mas bytes que, por

Pgina 6

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 necesitara (2) si la hubisemos declarado previamente. Si esa variable va a estar en el rango de 0 a 255, y no declaramos previamente que la variable va a se del tipo Byte, o la declaramos como integer, p. e., estamos desperdiciando memoria RAM y posiblemente, retardando la ejecucin del programa. Lo mismo podemos decir del resto de las variables, y lo importante que es definirlas y definirlas 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 intencin de que ocupen menos espacio. Paradoja del VB. Si la declaramos como Byte ocupamos menos espacio en memoria. Declarar una variable como Boolean tiene tambin sus ventajas (escribir menos cdigo por lo general cuando necesite leer o escribir una variable tipo Boolean), pero tenga presente esta observacin respecto a los datos Boolean. Puede declarar el tipo de la variable mediante un carcter despus del nombre de la variable. Esta tcnica, 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:

% #

Integer Double

& @

Long Currency

! $

Single String

Ejemplos Prcticos de declaracin de variables En Visual Basic, cuando declaramos una variable como String (Cadena de caracteres), no es necesario declarar su longitud. VB aceptar cualquier nmero de caracteres. Si desea evitar que se puedan introducir ms de un determinado nmero de caracteres, debe declarar su nmero. Por ejemplo : Dim Var1 as String Dim Var2 as String * 15 Var1 puede tener cualquier nmero de caracteres Var2 puede tener un mximo 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 ningn 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 cdigo oportuno para producir el aviso. La declaracin de variables tipo String con nmero de caracteres predefinido presenta tambin inconvenientes a la hora de tratar esa cadena de caracteres con sentencias tales como Mid, Left y Right, o a la hora de aadir una cadena a otra. La experiencia nos indica que NO merece la pena declarar variables tipo String con el nmero de caracteres prefijado. En una gran parte de los casos una variable que se compone de nmeros debe declararse como una variable de cadena de caracteres (String), y no como numrica. Cuando pensamos por ejemplo en un nmero de DNI, compuesto por 7 u 8 cifras, un cdigo postal, el nmero de una calle, el piso de un edificio, parecen invitar a que la variable que los contenga sea una variable de tipo numrico (Byte, Integer, Long, ...). Estas variables, aunque su contenido sean nmeros, siempre se deben declarar como String, ya que se tratan en realidad de cadenas de caracteres, aunque estos sean nmeros. Para aclarar mas estas ideas, piense en el nmero

Pgina 7

del DNI con la letra del NIF incluido, o que el lugar del DNI se deba rellenar con el nmero del permiso de residencia, (lleva letras). Piense en el cdigo postal de una provincia que comienza por 0 ( 08XXX = Barcelona ) . Si la variable que va a contener ese cdigo postal se declara como numrica, el cero de la izquierda lo desprecia, por lo que ese cdigo postal quedara reducido al 8XXX, nmero de 4 cifras que el cartero nunca reconocera como un cdigo postal, que necesariamente ha de tener 5 cifras. Para terminar, piense la forma de introducir en una variable numrica el nmero 32Bis de una calle o el piso S2 de un edificio. O piense en una variable que va a contener un cdigo de un producto. Ese cdigo siempre va a ser un nmero, por ejemplo de 9 cifras. Ha pensado como tratara el ordenador una variable numrica que contiene el cdigo 000100123 ?. El resultado sera que convertira ese cdigo en la cifra 100123, y Vd. deber buscarse la vida para aadir los ceros iniciales a la hora de sacarlo a una impresora, por ejemplo. En todos los casos anteriores, el nmero no representa una cantidad numrica, sino un nombre. Lo que ocurre es que ese nombre contiene solamente nmeros. Qu variables debemos declarar entonces como numricas ? La respuesta es bien sencilla : Aquellas que van a contener datos con lo que vamos a realizar operaciones matemticas. 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 nmeros mayores de 255 ni nmeros negativos. Cada vez que declare una variable numrica piense en los valores que puede tener, sobre todo cuando esa variable va a ser el resultado de una operacin matemtica. Recuerde el escaso margen de una variable tipo Integer ( de -32768 a 32767) Si la aplicacin va a tratar moneda, piense en la forma de expresar los nmeros decimales y el nmero de ellos permitidos, as como el redondeo. La variable correcta para este caso es Currency, pero Currency le aade automticamente el tipo de moneda de cada pas (Pts. Para Espaa) 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 extrae si le expresa el nmero de pesetas en dlares. Cambie el pas en su S. O.

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 habamos llamado Procedimientos. Podemos tener procedimientos que no estn relacionados con ningn evento ocurrido al formulario o a sus controles. (Los Procedimientos que iremos insertando a lo largo de la aplicacin) Aparte de formularios y controles, un programa puede tener Mdulos, y en cada uno de los mdulos podemos insertar cuantos Procedimientos y Funciones queramos. La estructura de un programa VB puede ser de la siguiente forma: Formulario1 Formulario2 Formulario3 Mdulo1 Modulo2

Pgina 8

Declaraciones Proc. A1 Proc. A2 Proc. A3 Proc. A4 Proc. A5 Proc. AA1 Proc. AA2 Proc. AA3

Declaraciones Proc.B1 Proc.B2 Proc.B3 Proc.B4 Proc.BB1 Proc.BB2 Proc.B33

Declaraciones Proc.C1 Proc.C2 Proc.C3 Proc.C4 Proc.CC1 Proc.CC2 Proc.CC3 Proc.CC4

Declaraciones Proc.D1 Proc.D2 Proc.D3 Proc.D4

Declaraciones Proc.E1 Proc.E2 FuncinE1 FuncinE2 FuncinE3 FuncinE4 FuncinE5 FuncinE6

Si se declara una variable dentro de un procedimiento o Funcin, esa variable "NO SALE" del Procedimiento o Funcin donde se declar. El procedimiento puede estar en un Formulario (Cualquier procedimiento de un control o un procedimiento creado por nosotros) o en un Mdulo (En este caso, el procedimiento solo puede ser creado por nosotros) En un Formulario, una variable puede declararse de dos formas : Privada o Pblica. Para declarar una variable a nivel de formulario debe hacerse en la seccin de declaraciones, que est la ventana de cdigo Objeto = General, Proc. = Declaraciones. Si se declara Privada, esa variable se puede mover por todo el formulario, (es decir, por todos los procedimientos de todos los controles del formulario y por los Procedimientos que pudisemos insertar en ese formulario), pero no sale de dicho formulario. Si se declara como Pblica, esa variable puede moverse por todo el formulario, de la misma forma que lo hara declarada como Privada, y adems puede ser usada desde otro Formulario o Mdulo, citndola con el nombre del Formulario, seguido del nombre de la variable (Formulario.Variable) En un Mdulo una variable puede declararse como Privada, con lo que no saldr de ese Mdulo, o Pblica, pudiendo en este caso usarse en todo el programa. Cuando se declara una variable como pblica en un Mdulo, basta referirse a ella por su nombre, sin citar el nombre del Mdulo 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, a al declararla en un Procedimiento, solamente ser vlida 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 declarara por segunda vez. A esta nota cabe exceptuar cuando declaramos variables para una operacin tipo contador For I = 1 To N Esa variable I es prctico declararla con el mismo nombre en cada Procedimiento donde se use.

Tipos de declaracin de variables. Sentencia DIM Es la forma mas comn de declarar una variable como Privada. Puede emplearse en un Procedimiento, Funcin, Formulario o Mdulo. La sintaxis es de la siguiente forma:

Pgina 9

Dim

nombrevariable As Integer

(o el tipo que sea)

Declarando una variable con la sentencia DIM, en un formulario, Funcin, procedimiento o mdulo, el entorno de la variable ser el explicado anteriormente para una variable declarada como Privada. Es decir, esa variable no sale del formulario, procedimiento mdulo donde se declar. Cada vez que entremos al formulario, procedimiento o mdulo, esa variable tomar el valor cero (si es numrica) o nulo (si es string). Sentencia PRIVATE Es la forma de declarar una variable como Privada. Puede emplearse solamente en la seccin de declaraciones de un Formulario o Mdulo. La sintaxis es de la siguiente forma: nombrevariable As Tipovariable

Private

Declarando una variable mediante la sentencia PRIVATE en un Formulario o Mdulo, esa variable puede usarse en todo ese Formulario o Mdulo (En todos sus Procedimientos y Funciones), pero NO fuera del Formulario o Mdulo donde se declar. La sentencia Private no puede usarse en un procedimiento o funcin.

Sentencia PUBLIC

Es la forma de declarar una variable como Pblica. Puede emplearse solamente en la seccin de declaraciones de un Formulario o Mdulo. La sintaxis es de la siguiente forma: Public nombrevariable As Tipovariable

Declarando una variable de esta forma en la seccin de declaraciones de un Mdulo, esa variable puede usarse en cualquier parte del programa citndola simplemente por su nombre. Si se declara de esta forma en la seccin 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 Mdulo puede usarse tambin la sentencia Global en vez de Public : Sentencia GLOBAL Declara una variable que es vlida en todo el programa. La sintaxis es: Global nombrevariable As tipovariable

La sentencia Global slo puede usarse en el apartado de declaraciones de un Mdulo. Mediante la sentencia Global la variable puede usarse en todo el espacio del programa. 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 solucin. Si declarsemos una variable en un procedimiento o funcin, como esttica, esa variable, aunque no la podremos utilizar fuera de ese procedimiento o funcin, cuando volvamos a l conservar el

Pgina 10

valor que tena cuando lo abandonamos. Esta declaracin como esttica se realiza mediante la intruccin Static Static nombrevariable As tipovariable

El nombre de una variable puede ser tan largo como queramos. hasta un mximo de 40 caracteres. En la versin VB para Espaa se pueden usar incluso la y vocales acentuadas. Es indiferente usar mayscula minsculas. No se sorprenda, si por ejemplo, la ha declarado con maysculas y luego la cita con minsculas al escribir el cdigo, que automticamente se cambie a maysculas. 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 algn 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 En un Formulario (En su seccin de declaraciones) Como Privada (Solamente se puede usar en ese Formulario) Dim Variable As Tipovariable Private Variable As Tipovariable Como Pblica (Puede usarse en toda la aplicacin) Public Variable As Tipovariable En un Mdulo Como Privada (Solamente puede usarse en ese Mdulo) Dim Variable As Tipovariable Private Variable As Tipovariable Como Pblica (Puede usarse en toda la aplicacin) Public Variable As Tipovariable Global Variable As Tipovariable

Pgina 11

Error tpico 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 lnea : Dim Variable1, Variable2, Variable3, Variable4 As String Esta declaracin 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 lnea, es la siguiente : Dim Variable1 As String, Variable2 As String, Variable3 As String, Variable4 As String.

Pgina 12

Lenguaje Basic del Visual Basic. No ha sido un juego de palabras. VB emplea unas instrucciones casi iguales a las que emplea Quick Basic. Sin embargo ha aadido otras nuevas instrucciones, inherentes con la programacin visual. Vamos a estudiar aqu las instrucciones y definiciones mas sencillas, comunes a QB y VB. Sentencias condicionales. Llamamos sentencias condicionales a aquellas que se realizan si se cumple una determinada condicin. Son las sentencias por las que empieza cualquier texto de Basic, y este no va ser menos. La sentencia condicional ms usada es: Si se cumple una condicin Entonces Realiza estas instrucciones Si no se cumple Realiza estas otras instrucciones Fin de la sentencia. As de fcil es programar en Basic. Lo que ocurre es que esta herramienta habla ingls, y lo descrito anteriormente toma la forma: If condicin Then Instrucciones Else Otras instrucciones End If En este ejemplo, la condicin era que, o se cumple una condicin y ejecuta unas determinadas instrucciones, o no se cumple, y ejecuta otras condiciones distintas. Puede ocurrir que, caso de no cumplirse la condicione primera, se abra un abanico de dos o tres posibilidades. La sentencia condicional tendra entonces la forma: If condicin 1 Then Instrucciones ElseIf Condicin 2 Otras instrucciones ElseIf Condicin 3 Otro juego de instrucciones Else Instrucciones que debe realizar caso de no cumplir las condiciones 1, 2 y 3. End If Como decamos anteriormente, este es el tipo de sentencia condicional mas usada. Existe otra: Select Case Su nombre casi nos define lo que es: Selecciona, dependiendo del caso, un determinado juego de instrucciones:

Pgina 13

Select Case variable

' variable es una variable que puede tomar los valores (p.e.) de 1 a 4

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 End Select Este procedimiento resulta mucho mas sencillo y rpido que las sentencias If Then Else vistas anteriormente, cuando el margen de eleccin es mayor que 2. Cuando lo que queremos es elegir un valor, no ejecutar instrucciones como hacamos anteriormente, disponemos de otras dos funciones: Choose y Switch. Switch toma una serie de parmetros, todos por parejas. El primer trmino de cada pareja es la expresin a evaluar. El segundo es el valor que tiene que devolver. En realidad Switch es una funcin (las funciones las veremos muy pronto) A = Switch (B=1, 5, B=2, 7, B=3, 11) Esta instruccin obtiene un valor para A que depender del valor que tome B entre los valores posibles (1, 2 3) La sentencia Choose es casi igual, cambia solamente la forma. La misma intruccin anterior puede realizarse con Choose de la siguiente forma: A = Choose ( B, 5, 7, 11 ) En estas sentencias, Switch y Choose, si el valor de B no coincide con ninguno de los valores que se le haban establecido (1, 2 3 en nuestro caso), la sentencia devuelve el valor Nulo ( Null ). Esto puede producir algn error si no se contempla esa posibilidad. Con estas sentencias condicionales es posible realizar bifurcaciones del programa, cambiar las propiedades de un objeto, obtener resultados de operaciones, .... Sentencias de bucle. Es muy comn utilizar bucles a lo largo de un programa. Un bucle es una sucesin repetitiva de instrucciones, que se estarn realizando mientras se cumpla una condicin o mientras no se cumpla otra condicin. Es tan sencillo como esto: Mientras condicin Instrucciones Fin del bucle Existen dos formas de bucle: Una, que realiza un nmero determinado de recorridos por el bucle. Es el denominado bucle por contador. Otra, realiza el bucle hasta que se cumpla (o deje de cumplirse) una condicin. Es el llamado bucle por condicin.

Pgina 14

Bucle por contador Realiza el bucle tantas veces como le indiquemos. Por ejemplo, en este bucle nos va a presentar las 26 letras maysculas del alfabeto ingls For N=65 To 90 Label1.caption = Chr ( N ) Next N Este "programa" nos presentar en una caja (Label) los caracteres cuyo nmero ASCII vaya desde el 65 (A) al 90 (Z) Comenzar presentando el correspondiente al nmero 65, e ir presentando sucesivamente el 66, el 67, etc., hasta llegar al 90, donde se parar. Bucles por condicin Ejecuta las instrucciones del bucle mientras se cumple una condicin 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, e incrementa su valor una unidad. Analiza si el valor de X es menor que 1000, y si es cierto, vuelve a realizar el bucle. As hasta que X ya no sea menor que 1000. Al dejar de cumplirse que X sea menor que 1000, sale del bucle. Acabamos de realizar un temporizador, y tambin de exponer las sentencias condicionales y los bucles, inicio de cualquier curso de Basic. Como final de leccin, se propone un problema. Con el primer bucle, donde visualizbamos los caracteres A a la Z, posiblemente no nos diese tiempo de ver cada una de las letras que iban apareciendo en la pantalla, en la etiqueta Label1, dado que cambiara con mucha velocidad, y solamente veramos la Z, que es donde se detuvo el programa. Podemos poner un temporizador cada vez que presente una letra, y as nos dar tiempo a verla. Con los dos bucles vistos anteriormente ya podemos hacerlo. Si lo que queremos es que el programa se ejecute mientras no se cumpla una determinada condicin, la sentencia ser: X=0 Do Until X > 1000 X=X+1 Loop Observe que la diferencia entre una y otra es la condicin, While para indicar Mientras se cumpla que ... y Until para indicar Mientras no se cumpla que .... Para terminar bien el programa anterior utilizaremos la condicin de While cumpla la condicin) For N=65 To 90 Label1.caption = Chr ( N ) Label1.RefreshN X=0 Do While X < 1000 X=X+1 (Mientras se

' Refresca la etiqueta

Pgina 15

Loop Next N Este es nuestro primer programa en BASIC. En VISUAL BASIC es idntico, pero nos falta la interface grfica. Para realizarla basta con abrir el VB y sobre el formulario que aparece al abrirlo, introducir una etiqueta, (Label) que llevar el nombre por defecto de Label1. Solo nos queda pensar donde introducimos el cdigo anterior. Podemos introducir un botn de comando (Command Button) que saldr con el nombre por defecto de Command1. Haga doble click sobre el botn. Aparecer el procedimiento Click. Este procedimiento es el que se realiza cuando hacemos click sobre ese botn. Escriba en ese procedimiento este cdigo. Private Sub Command1_Click() ' Esta lnea sale automticamente For N=65 To 90 Label1.caption = Chr ( N ) Label1.RefreshN ' Refresca la etiqueta X=0 Do While X < 1000 ' Bucle de temporizacin X=X+1 Loop Next N ' Termina el bucle de temporizacin End Sub ' Esta lnea sale automticamente Hemos puesto nuestra primera piedra en Visual Basic. Este ejemplo es muy sencillo. Visual Basic es tan sencillo como este ejemplo.

Pgina 16

BASIC DE VISUAL BASIC (2) ___________________________ Funciones de cadenas Se denomina CADENA a una sucesin de caracteres. Una cadena puede tener uno o varios caracteres alfanumricos. Una cadena es tambin una sucesin de nmeros. Ejemplo de cadenas: Curso de Visual Basic abcdefghijklmnopqrstuvwxyz1234567890 123456789 Hagamos una distincin entre una cadena que contenga nmeros y un nmero. Un nmero tiene un valor, pero tambin tiene una presentacin escrita. El valor es algo que estar en el ordenador como una sucesin de bits. Dependiendo de como lo hayamos declarado, tendr mas o menos bits. Pero esa informacin no es un nmero legible por el usuario. Lo que s es legible por el usuario es la representacin en numeracin decimal (u octal, o hexadecimal, o incluso en binario) de ese nmero. Esa representacin del nmero en un determinado sistema de numeracin es una cadena. As, el nmero nueve, que en la memoria del ordenador ser una sucesin de bits, el ordenador puede presentrnoslo como: 9 9 11 1001 En numeracin decimal En numeracin hexadecimal En numeracin octal En numeracin binaria

Esas formas de presentarnos el nmero son CADENAS de caracteres. El valor del nmero dentro del ordenador es un NUMERO. Para presentar un nmero en la pantalla, el ordenador debe convertirlo previamente a una cadena. Cuando introducimos un valor numrico por teclado o pantalla, el ordenador para hacer operaciones con l, debe transformarlo a un nmero. Estas consideraciones nos llevan a las dos primeras funciones con cadenas: Str (nmero) Convierte un nmero a una cadena en numeracin decimal.

Val

(cadena numrica) Obtiene el valor (el nmero) correspondiente a esa cadena.

Ejemplos Variablenumerica = Val (TextBox1.Text) Este ejemplo convierte la cadena de caracteres (numricos) que hubiese en la caja de texto TextBox1 en un nmero, y asocia este nmero a la variable Variablenumerica. Si el contenido de la caja de textos no fuesen caracteres numrico (abcd, por ejemplo), Variablenumerica tomara el valor 0.

Pgina 17

Label1.Caption = Str (Variablenumerica) Este ejemplo pondra en la etiqueta Label1 los caracteres correspondientes al valor que tuviese la variable Variablenumerica . Nota para recordar: Siempre habr que convertir un nmero a una cadena cuando queramos presentarlo en la pantalla. Siempre habr que convertir a nmero la cadena de caracteres numricos que hayamos introducido por teclado o por pantalla, cuando queramos operar con ese nmero. Un Label, cuando tiene que presentar un nico nmero, no le pedir que se lo convierta a cadena, pues VB hace automticamente esa conversin. Sin embargo, cuando tiene que presentar un nmero, y adems un texto en el mismo Label, VB no realizar automticamente ese cambio, por lo que le dar un error. Le recomiendo que convierta los nmeros a variables de cadena siempre que los quiera presentar en un Label o TextBox. Existe una funcin mas amplia que Str. Se trata de Cstr. Esta funcin no solamente transforma un nmero a una cadena, como hace Str, sino que convierte cualquier tipo de variable a una variable tipo String (cadena). Esta funcin transforma, por ejemplo, una variable tipo Booleana en una variable de cadena, devolviendo la cadena Verdadero si el valor de la variable booleana es True, y Falso si es False. Puede tambin transformar a una cadena de caracteres el valor de un CheckBox o de un OptionButton. En estos casos devuelve 0 y 1 para el CheckBox (Desactivado / Activado) y Verdadero Falso para el OptionButton (Activado / Desactivado) label1.Caption = CStr(booleana) Label1.Caption = Verdadero si booleana es true Label1.Caption = Falso si booleana es False Label2.Caption = 1 Label2.Caption = 0 si Check1 est activado si Check1 est desactivado

Label2 = CStr(Check1.Value)

Label3 = CStr(Option1.Value)

Label3.Caption = Verdadero si Check1 est activado Label3.Caption = Falso si Check1 est desactivado

Si se aplica Cstr a una variable tipo Fecha/Hora devuelve la fecha / Hora en formato corto. Mas funciones de cadena: Left (cadena, n) Extrae los n primeros caracteres de una cadena, comenzando por la izquierda. Si cadena = Curso de Visual Basic Resultado = Left (cadena, 10) Right (cadena, n) (Para todos los ejemplos) ----> Resultado = Curso de V

Extrae lo n ltimos caracteres de la cadena ----> Resultado = sual Basic

Resultado = Right (cadena, 10)

Mid (cadena, m, n) Extrae n caracteres de la cadena, siendo el primer carcter extrado el que ocupa el lugar m. (Vea Instruccin Mid mas abajo)

Pgina 18

Resultado = Mid (cadena, 3, 10)

---->

Resultado = rso de Vis

LCase (cadena)

Devuelve otra cadena igual, pero con todos los caracteres en minsculas. (LCase = Lower Case) ----> Resultado = curso de visual basic

Resultado = Lcase (cadena)

UCase (cadena)

Devuelve otra cadena igual, pero con todos los caracteres en maysculas. (UCase = Upper Case) ----> Resultado = CURSO DE VISUAL BASIC

Resultado = UCase (cadena)

Len (cadena)

Devuelve la longitud de la cadena ----> Resultado = 21

Resultado = Len (cadena) LenB (Cadena)

Devuelve el nmero de Bytes empleados para almacenar la cadena. Sorprndase, es el doble que Len (Cadena) Devuelve una cadena de n caracteres como el indicado ----> ----> ----> Resultado = aaaaaaaa Resultado = AAAAAAAA Resultado = AAAAAAAA

String (n, carcter)

Resultado = String (8, "a") Resultado = String (8, Chr(65)) Resultado = String (8, 65) Space (n)

Devuelve una cadena formada por n espacios. ----> Resultado = A B

Resultado = "A" + Space (6)+ "B"

LTrim

Elimina los posibles espacios que tenga una cadena por su izquierda. Elimina los posibles espacios que tenga una cadena por su derecha. Elimina los espacios que tenga una cadena, tanto por su izquierda como por su derecha. (No elimina los espacios centrales de la cadena)

Rtrim

Trim

Estas tres funciones se emplean para quitar los posibles espacios que pueden resultar de una entrada de datos. Tienen especial importancia cuando se toman los datos de un archivo o base de datos, donde fueron introducidos por otro programa. No se pone ningn ejemplo de estas funciones, pues sera difcil verlo impreso. InStr (cadena, cadena1) Busca la cadena1 dentro de cadena y devuelve el nmero de orden dentro de cadena donde se encuentra la primera letra de cadena1 Resultado = InStr (cadena, "sua") ----> Resultado = 12

Pgina 19

StrConv

Convierte una cadena de caracteres en otra, segn las instrucciones que le sigan. Puede sustituir a UCase o LCase si la instruccin es UpperCase o LowerCase respectivamente, o poner la primera letra de todas las palabras de la cadena en maysculas, si la instruccin es ProperCase. ----> Resultado = CURSO DE VISUAL BASIC ----> Resultado = curso de visual basic ----> Resultado = Curso De Visual Basic

Resultado = StrConv (cadena, UpperCase)

Resultado = StrConv (cadena, LowerCase)

Resultado = StrConv (cadena, ProperCase) Instruccin Mid

Mid puede usarse tambin para cambiar el contenido de una cadena. Observe la sutileza entre Mid como Funcin de cadena y Mid como Instruccin. La Instruccin Mid reemplaza un nmero especificado de caracteres en una variable de cadena con caracteres de otra cadena. Sintaxis Mid(cadena1, inicio[, longitud]) = cadena2 Resultado Mid (cadena, 7,2)=Sobre ---- > Resultado = Curso sobre Visual Basic

FUNCIONES CON NUMEROS _________________________ Visual Basic puede operar con nmeros tal como lo hara cualquier persona. Conoce las 4 reglas, y puede utilizar parntesis de la misma forma que los escribimos sobre el papel. Los operadores que utiliza para las operaciones bsicas son: + * / \ Mod ^ Suma Resta Multiplicacin Divisin Divisin sin decimales Resto de una divisin Eleva a un exponente

Ejemplos Resultado = 12 + 15 Resultado = 15 - 12 Resultado = 15 * 12 Resultado = 15 / 12 Resultado = 15 \ 12 Resultado = 15 Mod 12 Resultado = 12 ^ 2 resultado = ( ( 4 * 3 ) / 2 ) ^ 2 ----> ----> ----> ----> ----> ----> ----> ----> Resultado = 27 Resultado = 3 Resultado = 180 Resultado = 1.25 Resultado = 1 resultado = 3 Resultado = 144 Resultado = 36

Pgina 20

Estos operadores se denominan Operadores aritmticos. Existen otras operaciones que se pueden realizar con nmeros: comparaciones. 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: = <> < <= > => Igual que No igual que Mayor que Mayor o igual que Menor que Igual o menor que

Estos operadores se suelen utilizar en estructuras de programa donde se tome una decisin. El operador = puede usarse tambin para comparar cadenas o fechas. Operadores Lgicos Estos operadores slo tienen sentido cuando hablemos de variables Booleanas, es decir, aquellas que solamente pueden tomar los valores cero y uno. Operador And Or Xor Funcin Funcin AND Funcin OR Funcin XOR Devuelve True si A=True y B=True A=True o B=True A=True y B=False A=False y B=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

Eqv

F. Equivalente A=True y B=True A=False y B=False Implicacin A=True y B=True A=False y B=True A=False y B=False A=False A=True

Imp

Not Like

Negacin Igualdad

A=True A=False

Otras Funciones con nmeros CInt Abs Sgn Sqr Exp Parte entera Devuelve la parte entera de un nmero con decimales

Valor Absoluto Devuelve el valor absoluto de un nmero Signo Devuelve el signo de un nmero

Raz cuadrada Devuelve la raz cuadrada de un nmero Exponenciacin Devuelve el nmero elevado al exponente indicado

Pgina 21

Log Trigonomtricas Sin

Logaritmo

Devuelve el logaritmo natural de ese nmero

Seno

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 nmero (Angulo en radianes)

Cos Tan Atn

Coseno Tangente Arco Tang.

Una funcin curiosa Timer Tiempo acumulado Devuelve el tiempo (en segundos) que ha pasado desde las 12 de la noche.

Generacin de nmeros aleatorios Randomize (Numero) Inicia el generador aleatorio tomando como dato de partida el Numero. Devuelve el resultado en una variable llamada Rnd. NOTA MUY IMPORTANTE.- Los nmeros aleatorios generados de esta forma son siempre iguales, eso s, dependiendo del nmero que se le introduzca como parmetro. Esta generacin de nmeros no produce nmeros aleatorios pues como se dijo, dependen del numero que se meta como parmetro, y si este se repite, se repite la sucesin de nmeros que nos crea el generador aleatorio. La forma de obtener nmeros realmente aleatorios es introducir como parmetro un nmero que sea variable con el tiempo. Ese nmero no puede ser otro que el nmero timer visto antes. Y siempre con la precaucin de que medie mas de un segundo entre dos instrucciones Randomize. La funcin toma entonces la forma: Randomize Timer La funcin Randomize devuelve una variable Rnd con un nmero comprendido entre 0 y 1 (Nunca ser 0 ni 1) Leyendo el valor de la variable sucesivas veces, se puede obtener una sucesin de nmeros aleatorios. No es necesario ejecutar la instruccin Randomize Timer cada vez que se quiera obtener un dato de la variable Rnd. Un ejemplo. Generador de nmeros para la Lotera Primitiva Supongamos que tenemos un formulario con una etiqueta de nombre Label1, un botn de comando de nombre Command1. Cuando hagamos click sobre el botn de comando deber generar un nmero comprendido entre el 1 y el 49. En el procedimiento click de Command1 pondremos el siguiente cdigo: Private Sub Command1.click Randomize Timer A = Rnd A = Rnd * 100

Pgina 22

A = CInt(A) Do While A > 49 A = A - 49 Loop Do While A < 1 A = A + 49 Loop Label1.caption = A End Sub Realice este pequeo programa, con la instruccin Randomize Timer y sin ella.

Funciones con fechas. Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la informacin relativa a la fecha y la hora. Dispone para ello de una declaracin de variable: Date. Una variable declarada como date puede contener una fecha, una fecha y una hora o una hora solamente. Date Time Now WeekDay Day Month Year Hour Minute Second DateAdd DateDiff DatePart DateSerial TimeSerial DateValue Devuelve la fecha de hoy. Esta fecha la toma del reloj del ordenador. Devuelve la hora actual. Devuelve la fecha y hora actual. Devuelve el da de la semana (En nmero, 1=Domingo, 2=Lunes,...) Obtiene el da, a partir de una fecha Obtiene el mes a partir de una fecha. Obtiene el ao a partir de una fecha. Obtiene la hora a partir de una hora Obtiene el minuto a partir de una hora. Obtiene el segundo a partir de una hora. Aade un intervalo de tiempo a una fecha Obtiene el intervalo de tiempo entre dos fechas Devuelve una parte de una fecha (semana, trimestre, etc.) Compone una fecha a partir de parmetros relativos Compone una hora a partir de parmetros relativos. Devuelve una fecha a partir de un dato que se le parezca y VB pueda obtener de l una fecha vlida

Mediante estas instrucciones podemos obtener el dato necesario de una fecha u hora. Por ejemplo, para obtener el da de hoy solamente:

Pgina 23

Da = Day (Now)

Da ser un nmero

El da de la semana lo obtendramos Diasemana = WeekDay (Now) Diasemana ser un nmero

DateValue, una instruccin que le sacar mucho provecho Fecha = DateValue (120796) Fecha = DateValue (12 07 96)

Fecha =12/07/96

Pgina 24

Funcin FORMAT
Esta funcin permite presentar cadenas de numricas o fechas de una determinada forma. Permite establecer el Formato de esa cadena. Si recurre a la ayuda de VB acerca de esta funcin se va a enterar muy poco de lo que puede dar de s. La sintaxis que presenta es : Format(expresin[, formato[, primerdadesemana[, primerasemanadelao]]]) Lo mejor que puede hacer con esta definicin de la sintaxis de Format es olvidarla. No le aclara mucho lo que se puede hacer con Format. La funcin Format se usa para poner una fecha en un determinado formato. Con la expresin : FechadeHoy = Format (Now, yyyy-mm-dd) la variable FechadeHoy tendr el valor 1998-05-21, que se refiere al da 21 de mayo de 1998, segn el formato recomendado por la norma ISO-8601 para la presentacin de fechas. Si hubisemos puesto la expresin FechadeHoy = Format (Now, dd/mm/yy) , la variable FechadeHoy contendra el valor 21/05/98 referido al da citado. Las posibilidades de Format llegan tambin al campo de las cadenas numricas. Por ejemplo la cifra 123456 se transformar en las siguientes expresiones, segn como empleemos la funcin Format Variable = Format(123456, "Currency") Variable = Format(123456, "Standard") Variable = 123.456 Pts Variable = 123.456,00

Veamos ahora con un poco mas de conocimiento la sintaxis de Format Variable = Format (expresin[, formato[, firstdayofweek[, firstweekofyear]]]) Donde expresin es una cadena o fecha vlida formato es uno de los formatos predefinidos (Standard, Currency, etc. Vea mas abajo) firstdayofweek. Especifica el primer da de la semana. Puede tomar uno de estos valores o constantes : Constante vbUseSystem VbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday Valor 0 1 2 3 4 5 6 7 Descripcin El especificado en el sistema operativo. Domingo (valor por defecto) Lunes Martes Mircoles Jueves Viernes Sbado

firstweekofyear Especifica cual es la primera semana del ao. Puede tomar uno de los siguientes valores o constantes : Constante vbUseSystem Valor 0 Descripcin Usa el valor del sistema operativo

Pgina 25

vbFirstJan1 vbFirstFourDays vbFirstFullWeek

1 2 3

La primera semana es la que contiene al da 1 de Enero(Valor por defecto La primera semana es la que contiene al menos, 4 das de ese ao (Rec. ISO - 8601) La primera semana es la que tiene todos sus das en ese ao

No se complique la vida con el tema del primer da de la semana ni la primera semana del ao. No lo usar con frecuencia. Centrmonos mas en el parmetro Formato. Puede tomar muchos valores. Veamos los principales. Primero para nmeros Observe que usamos la expresin Variable =Format (1234567,Formato) para todos lo s ejemplos de nmeros. Para poner los nmeros separados por millares : Variable = Format(1234567, "##,###,###") Variable = 1.234.567

(Cada carcter # indica que ah va un nmero. El separador debe ser una coma, no un punto, aunque esto depende del idioma que est usando) Puede poner una de estas expresiones, eso si, siempre entre comillas dobles : General Number Currency Fixed Standard Percent Scientific . Para fechas Muestra el nmero tal como lo tecle En formato de la moneda de su sistema operativo Sin separador de millar y dos decimales (1234567,00) Con separador de millares y dos decimales (1.234.567,00) Multiplica el nmero por cien y lo presenta cono porcentaje(123456700,00%) Usa notacin cientfica (1,23E+06)

(Observe que usamos el ejemplo Format(Now, Formato) y Now = 21/07/98 a las 22:16:00 y pico) 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

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

Format dispone de mas opciones. Sera muy largo explicarlas aqu. Para mas informacin, en la WEB de Microsoft puede encontrar mas formatos posibles.

Pgina 26

MATRICES __________

Cuando utilizamos varias variables que tienen un significado similar para nosotros, pero que son distintas (Por ejemplo, el nombre de los alumnos de una clase) podemos utilizar una matriz. Esta matriz est formada por tantos elementos como alumnos tenga la clase. El nombre asociado a cada uno de los elementos de la matriz puede ser: Alumno (n) Donde n es el nmero por orden de lista de ese alumno.

Las matrices normalmente comienzan a numerar por el nmero 0. Este comienzo puede no ser el mas apropiado para la variable que estamos planteando, pues ningn alumno tiene el nmero de orden 0. Para hacer que una matriz comience a numerar por el 1 se debe definir mediante la instruccin: Option Base 1 que debe colocarse al comienzo del mdulo o formulario donde declaremos la matriz. Para declarar la matriz se hace como con todas las variables, especificando entre parntesis el nmero de elementos que componen la matriz: Dim Alumno (25) as String Hemos declarado que la variable alumno es una cadena, y que hay 25 elementos en esa matriz. Una matriz tambin se puede declarar de la siguiente forma : Dim Alumno(1 To 25) as String Donde le decimos que la variable Alumno tiene 25 elementos, que el primero tiene el ndice 1 y el ltimo tiene el ndice 25. Pero imaginemos que queremos meter en la misma matriz el nombre, primer apellido y segundo apellido del alumno. Necesitaremos declarar una matriz de 25 por 3. Como todos los elementos sern cadenas de caracteres, podemos declararla de la siguiente forma: Dim Alumno (1 To 25, 1 To 3) As String De esta forma, el primer apellido del alumno que ocupa el puesto nmero 15 de la clase, ser el elemento: Alumno (15, 2) Podemos definir matrices de dimensin superior a dos. Podemos llegar a un mximo de 60 dimensiones. Una matriz de 5 dimensiones se declarara: Dim Variable ( 1 To N, 1 To M, 1 To P, 1 To Q, 1 To R) entendiendo que hay N, M, P, Q y R elementos en cada una de las dimensiones respectivamente. Una variable ya declarada como una matriz puede redimensionarse a lo largo del programa mediante la instruccin ReDim

Pgina 27

ReDim Alumno (1To 25) Mediante esta instruccin, estamos ReDimensionando una matriz ya declarada. No se puede redimensionar una matriz inexistente. Mediante la declaracin 1 To 25 le estamos diciendo que el primer elemento de la matriz es el 1, independientemente de lo que hayamos puesto en OPTION BASE. Si se redimensiona simplemente con el nmero de elementos : ReDim (25) le estamos diciendo que tiene 25 elementos, pero que el primero sea el 0 el 1 depende de haber puesto OPTION BASE 0 u OPTION BASE 1. Una matriz puede redimensionarse cuantas veces se quiera a lo largo de la aplicacin, pero esa redimensin no puede afectar al nmero de dimensiones de la matriz. Si redimensionamos la matriz perder la informacin existente. Para evitar perder la informacin presente en la matriz, debe utilizar la sentencia ReDim Preserve. Si usa la palabra clave Preserve en matrices de dimensin superior a 1, va a encontrarse con comportamientos no esperados. Como podr ver en la Ayuda de VB, usando ReDim Preserve slo puede cambiar el tamao de la ltima dimensin de matriz y no puede modificar en ningn momento el nmero de dimensiones. NO es cierto del todo. S lo podr hacer una sola vez. Respecto a cambiar el nmero de dimensiones, si ha declarado la matriz con unas dimensiones determinadas, ya no podr cambiar las dimensiones ni con ReDim ni con ReDim Preserve. Le saldr un error que dice que las dimensiones de la matriz ya han sido declaradas. Pero si ha declarado la matriz sin dimensiones : Dim MiMatriz() puede cambiar las dimensiones y volver a cambiarlas Dim MiMatriz (1 To 5, 1 To 9) Dim MiMatriz (1 To 8, 1 To 15, 1 To 6)

Observe que no solamente la hemos cambiado dos veces de dimensiones (la primera a 2 y la segunda a 3), sino que tambin hemos cambiado el nmero de elementos en cada dimensin. Si hubisemos utilizado ReDim Preserve solamente podramos haber usado la primera de las dos lneas anteriores : ReDim Preserve MiMatriz (1 To 5, 1 To 9) pero ya no podramos volver a cambiar el nmero de dimensiones con la segunda lnea. Nos dara un error. Con ReDim podemos cambiar el nmero de elementos de cada dimensin cuantas veces queramos. Por ejemplo, podemos redimensionar MiMatriz de las siguiente forma : ReDim MiMatriz (1 To 5, 1 To 9) ReDim MiMatriz (1 To 15, 1 To 20) ReDim MiMatriz (1 To 25, 1 To 30) ........................... Si hubisemos empleado ReDim Preserve, podramos cambiar los elementos de todas las dimensiones de la matriz una vez : ReDim Preserve (1 To 5, 1 To 9)

Pgina 28

a partir de ahora, solamente podemos cambiar los elementos de la ltima dimensin : ReDim Preserve (1 To 5, 1 To 20) ReDim Preserve (1 To 5, 1 To 30) es decir, no podremos hacer esto : ReDim Preserve (1 To 10, 1 To 30) donde se seala en negrita el error.

Esto no causa ningn error en una matriz de una dimensin, ya que si la matriz tiene slo una dimensin, puede cambiar el tamao de esa dimensin porque es la nica y la ltima. Cuando a lo largo de la aplicacin 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 mximo y mnimo de una matriz se usan las funciones UBound y LBound. UBound devuelve el mayor subndice disponible para la dimensin indicada de una matriz. Sintaxis UBound(nombredelamatriz[, dimensin])

LBound devuelve el mayor subndice disponible para la dimensin indicada de una matriz. Sintaxis LBound(nombredelamatriz[, dimensin])

Ejemplo Tengamos una matriz llamada Mimatriz, de tres dimensiones. En un momento de la aplicacin se ejecut la siguiente instruccin vlida : 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 Dimensin 1, ISD 1 = Indice Superior Dimensin 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

Pgina 29

VISUAL BASIC
Tras esta pequea introducin al lenguaje Basic ya estamos en disposicin de encender el ordenador y comenzar a trabajar con Visual-Basic. Se supone que su PC tiene instalado el programa Visual basic, bien en su versin de 16 bits si dispone de Windows 3.xx o la de 32 bits si dispone ce Win95 Windows NT. Entre en el programa VB. Le aparecer en pantalla algo similar a esto : (Para VB Vers. 4)

Este es el comienzo del programa . Observe que en esta pantalla existen varias cosas. En la parte superior , la barra de ttulo del programa Visual Basic, con el texto : Proyect1 - Microsoft Visual Basic (Diseo) Por debajo de esta barra de Ttulo del VB, encontramos la barra de men de VB, con las leyendas : Archivo Edicin Ver Insertar Ejecutar Herramientas Complementos Ayuda Por debajo de esta barra de men tenemos la barra de herramientas, donde podr ver varios iconos, que cada uno representa un determinada operacin que Vd. puede realizar. Estas operaciones est todas en la lnea de men, y puede acceder a ellas abriendo los mens desplegables que existen en cada una de las palabrea Archivo Edicin Ver ...... de esta lnea 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 de la pantalla tiene una caja rectangular con tres columnas de iconos. Esa caja es la Caja de Herramientas (No la confunda con la barra de herramientas de la parte superior) Pgina 30

Esta caja de herramientas es, salvando las distancias, lo mismo que una caja de herramientas real que pueda tener un mecnico para realizar su trabajo. En ella estn los iconos que representan a los controles con los que Vd. va a desarrollar su aplicacin VB. No estn todos los que pueden estar, al igual que en una caja de herramientas de un mecnico no estn todas las herramientas que puede usar. Estn solamente las mas usuales. Si necesita alguna mas, puede cogerla de otra parte (barra de Men, Herramientas, Controles personalizados) y agregarlos a esa caja de herramientas, al igual que lo hara un mecnico con una herramienta especial, que la metera en su caja slo 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 estos apuntes. Eso depende si Ud. tiene la versin personal o la profesional, o si usa la versin de 16 32 bits. Esa caja de herramientas puede personalizarla a su gusto. Para ello, deber cargar un proyecto ya existente en los discos de distribucin de Visual Basic, llamado AUTO32LD.VBP (versin 32 bits) AUTO16LD.VBP (Versin 16 bits) que se encontrar en el directorio donde haya cargado el programa Visual Basic. Este proyecto no tiene otra funcin que determinar las herramientas con las que quiere abrir el VB. Para introducir herramientas nuevas en la caja de herramientas, basta con desplegar el men Herramientas de la barra de men, e ir a Controles personalizados. Haciendo click en esta lnea de controles personalizados, podemos seleccionar nuevos controles para aadir 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 ACEPTAR, y podr observar que esos nuevos controles ya se le han aadido a la caja de herramientas. Para que esos nuevos controles le aparezcan de entrada cuando inicia una sesin de VB, debe salir de Visual basic guardando los cambios. Vuelva a entrar y observar que ya le aparecen esos nuevos controles en la caja. 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. Adems, cuando realice una aplicacin y la distribuya una vez compilada, Visual Basic entregar en los disquetes de distribucin las DLLs u OCXs 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 intiles en el ordenador destino de su aplicacin. A la hora de compilar el programa (Crear archivo .EXE) quite todos los controles personalizados que no necesite su aplicacin. (Slo 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 anloga, cargando el programa AUTOxxLD.VBP, abriendo men de herramientas, Controles personalizados, quitando la marca al cuadro situado en la parte izquierda del control a eliminar, y guardando el proyecto al salir. En el centro, y ocupando casi toda la pantalla, tenemos el Formulario. Este Formulario es la interface grfica de su aplicacin, sobre el que podr aadir los controles que necesite. Lo veremos mas adelante con todo detalle. Observa dos ventanas, una denominada Ventana de Propiedades, donde puede ver las propiedades del formulario, Form1, y otra, denominada Ventana de Proyecto. Existe otra ventana, que no est en la figura anterior, la Ventana de Depuracin. Por cada formulario y cada control que introduzca en el proyecto, le aparecer otra ventana, denominada ventana de cdigo. No se extrae de que esta presentacin grfica del Visual Basic coincida con otros sistemas de desarrollo (Delphi, p.e.). La lgica de desarrollo de una aplicacin en Windows ha llevado a varios fabricantes de software a utilizar un entorno grfico similar (diramos idntico). A Visual basic le queda el orgullo de ser el primero en utilizarlo.

Pgina 31

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 Cdigo.

Esta figura le muestra un Formulario con su ventana de cdigo. Cada objeto grfico de VB tiene su propia ventana de cdigo. As, si en este formulario hubisemos introducido un Label y dos CommandButton, todos ellos tendran su propia ventana de cdigo. La ventana de cdigo la podemos ver haciendo doble click sobre cualquier objeto de nuestro proyecto. En este caso hemos hecho doble click sobre el nico objeto que tenamos : el formulario. Observe las dos cajas de la parte superior, uno con la inscripcin Objeto : que en el momento que le sacamos la foto tena Form, y el otro con la inscripcin Proc : (procedimiento), que en el momento de la foto tena 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 cdigo de ese objeto. Todos los objetos grficos (controles) existentes dentro de un formulario y el propio formulario aparecern 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 cdigo en uno de los procedimientos, saldr por defecto ese procedimiento para el cual hemos escrito el cdigo. Si no hay cdigo en ninguno de los procedimientos, saldr el que tenga por defecto cada objeto. Solamente nos queda por decir, para cerrar este captulo, 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 internase grfica, lo que le puede ocurrir a un objeto es que se le haga click, doble click, que se pase el cursor del ratn por encima, etc. Este es el Evento. El Procedimiento es la respuesta por parte de ese objeto, al evento que le est sucediendo.

Pgina 32

Esa respuesta, esa forma de Proceder del objeto al evento que le est sucediendo, debemos programarla segn nuestras necesidades, es decir, debemos escribir el cdigo que necesite nuestra aplicacin 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 ningn efecto, basta con dejar sin cdigo el procedimiento correspondiente a ese evento. En los eventos que queramos que realice alguna operacin, le escribiremos en su procedimiento el cdigo necesario para que esa operacin se realice. Sin darnos cuenta, hemos comenzado a escribir el cdigo de la aplicacin. Observar que el primer elemento del men desplegable de la lista de objetos se denomina General. Este no es en realidad ningn objeto, sino un apartado existente en cada formulario, que, al desplegar su lista de procedimientos tiene la seccin de declaraciones, donde debemos declarar las variables que queremos que afecten a todo el formulario y sus controles, y tendr adems, los nombres de todos los procedimientos que introduzcamos (vase 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 cdigo. Esto ocurre cuando se borra algn control que tena escrito cdigo en alguno de sus procedimientos. Visual Basic sabe lo mucho que cuesta escribir el cdigo asociado a un control. Si borramos un control de nuestro formulario accidentalmente, despus de haber introducido todo el cdigo asociado a l, Visual Basic nos sorprende con que ese cdigo no lo tira inmediatamente, sino que lo reserva como un procedimiento en ese apartado General del formulario. Si en realidad queramos borrar el control y todo su cdigo, 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 cdigo que aparece en la ventana de cdigo cuando hacemos click sobre el nombre del control eliminado. Deberemos borrar todo el cdigo, incluida la cabecera donde figura el nombre del control eliminado, y la parte final, que siempre termina con EndSub. El primer estorbo lo observar si crea otro control con el mismo nombre, cosa fcil ya que VB da un nombre por defecto a cada control (Command1, Command2....). El cdigo asociado al control eliminado pasar automticamente al nuevo control con el mismo nombre. Una aplicacin puede tener todo su cdigo 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 aplicacin. 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 aadir cuantos procedimientos queramos. Estos procedimientos se aaden al formulario, y debern definirse por un nombre que Vd. debe elegir. Para que se ejecuten las instrucciones (cdigo) 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 Insertar, y en el men que le desplegar, volver a hacer click sobre Procedimiento. VB le presentar un cuadro donde le pedir el nombre, si quiere que sea un procedimiento, una funcin o una propiedad. A lo largo del curso ir viendo que es cada cosa. Escribiendo el cdigo en los sucesivos procedimientos, bien en los propios de cada objeto, bien en los procedimientos que vayamos creando, es posible completar la aplicacin. Pero en una aplicacin larga esta forma de escribir el cdigo no sera la mas adecuada. Es mas, posiblemente sera demasiado engorroso escribirla de esta forma, y muy probablemente deberamos escribir el mismo cdigo para varios procedimientos, lo que alargara intilmente el programa y el tiempo de desarrollo. Para disponer de un sitio donde escribir parte (o la mayor parte) de su programa, puede

Pgina 33

introducir uno o varios mdulos. Expliquemos lo que es un mdulo. Un Mdulo es una parte del programa donde solamente puede escribir cdigo. Es igual que un formulario, sin interface grfica. Un profesor de Visual Basic lo expresaba diciendo que un Mdulo es un Formulario sin cara. En un mdulo pueden existir procedimientos al igual que en los formularios, pero como un mdulo no tiene interface grfica, esos procedimientos debe introducirlos el programador tal y como explicamos un poco mas atrs. El mdulo tiene su propia ventana de cdigo, al igual que un formulario, con un objeto nico, el apartado General. Aqu tambin tenemos la seccin de declaraciones, al igual que los formularios. En esta seccin de declaraciones se comporta de manera similar a la de los formularios, pero permite algo que no nos permite la seccin de declaraciones de un formulario : Declarar variables que se pueden utilizar en todo el programa. Esto ya lo ha visto mas atrs, con las sentencia de declaracin Global y Public. Los mdulos se emplean para la declaracin de variables globales, y para escribir el cdigo de la aplicacin que sea comn a varios formularios. Esto nos evita tener que repetir cdigo intilmente. Ese cdigo comn se escribir en un procedimiento que previamente habremos insertado en este mdulo, y lo citaremos por su nombre desde cualquier parte del programa. Cual es el nombre de un procedimiento existente dentro de un mdulo ? Depende. Si estamos ejecutando cdigo escrito en otro procedimiento dentro del mismo mdulo, es decir, si estamos dentro de ese mismo mdulo, basta con citarlo por su nombre : p.e., si en el MduloA tenemos un procedimiento llamado Procedimiento1, y queremos llamarle desde una lnea de cdigo dentro de ese mismo mdulo, basta con referirse a l con : Procedimiento1 Si la lnea de cdigo donde nos vamos a referir a l est fuera de MduloA, deberemos referirnos a ese procedimiento con : MduloA.Procedimiento1 Lo mismo podemos decir para cualquier procedimiento insertado en un formulario. Desde dentro del formulario basta con referirse a l citndolo por su nombre. Desde fuera de ese formulario deberemos citarle como : Formulariox.Procedimientoy donde damos por hecho que Formulariox es el nombre del formulario que lo contiene, y Procedimientoy es el nombre del procedimiento. Fjese 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 terminologa VB segn vayamos avanzando en el curso. Funciones Al igual que introducimos Procedimientos, podemos introducir Funciones en nuestra aplicacin. Una Funcin es un Procedimiento al que le pasamos uno o varios parmetros. (O Ninguno) Ver los Procedimientos y funciones mas adelante (Cap. 15). Al igual que los Procedimientos, pueden ser pblicas (se vern en toda la aplicacin) o privadas (se vern solamente en el formulario donde estn. Main

Pgina 34

Merece la pena pararse un poco para estudiar el Procedimiento Main. Para verlo con mas detalle, comentaremos como comienza a trabajar una aplicacin realizada en Visual Basic. Imaginemos una aplicacin que tiene 3 Formularios. En cada uno de ellos tiene cdigo. Logicamente la aplicacin 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 cdigo necesario para que la aplicacin se ejecute en el orden deseado. Si hacemos click en la Barra de Men de Visual Basic, en Herramientas | Opciones obtendremos el siguiente cuadro de dilogo :

Ver que tiene 4 pestaas, y actualmente tiene abierta la pestaa correspondiente a Proyecto, y tiene desplegada una lista donde nos pide el Formulario Inicial. En esa lista figura tambin la expresin Sub Main. Si ponemos como formulario inicial uno de los formularios, la aplicacin comenzar por ese formulario. Si en uno de los Mdulos existentes en el proyecto, ponemos un procedimiento llamado Main, podemos comenzar la ejecucin de la aplicacin justamente por ese procedimiento. En ese procedimiento pondremos el cdigo necesario para que, posteriormente, se muestre uno de los formularios. Esto es muy practico cuando queremos hacer una funcin previa a mostrar cualquier formulario (abrir una base de datos, por ejemplo). Para comenzar la aplicacin por Main se elige esa opcin en la lista Formulario Inicial. Recuerde que Main debe estar en un Mdulo ! El cuadro de dilogo anterior sirve adems para otras cosas. Entre ellas poner el nombre del proyecto (nombre que no aparecer por ninguna parte, solo en los datos internos de la aplicacin) y su descripcin. En otra pestaa podemos configurar varias prestaciones del entorno de trabajo : Guardar la aplicacin antes de ejecutar. Esta prestacin nos va a evitar muchos disgustos. Es muy prctico guardar la aplicacin antes de ejecutarla, pues de esta forma evitamos que, si Pgina 35

nuestra aplicacin tiene un error tal que hagamos colgarse a Windows, siempre tendremos la aplicacin metida en el disco duro. Pero tambin es una pequea pesadez tener que esperar a que se guarde cada vez que la ejecutamos. Si tenemos la activada la casilla Declaracin de variables requerida nos pondr automticamente Option Explicit en el encabezamiento de todas las secciones de declaraciones de la aplicacin. Podemos elegir tambin las ventanas que queremos que estn siempre visibles, y que verifique automticamente la sintaxis de una instruccin en el momento de escribirla.

Pgina 36

La pestaa de Editor nos permite fundamentalmente 2 cosas : Ver solamente el cdigo correspondiente al procedimiento que estamos escribiendo Ver el cdigo del Mdulo (o Formulario) completo. En este ltimo caso es un poco mas difcil de manejar la ventana de cdigo, sobre todo si el programador no est muy habituado a ello. Le presenta procedimiento tras procedimiento, separados por una lnea. Para seleccionar una u otra opcin hay que seleccionar o deseleccionar la casilla Ver mdulo completo. Cambiar el color de la letra y del fondo del cdigo, segn el tipo que sea (cdigo, comentario, error devuelto, etc.). Los alumnos mas aventajados y con ganas de marear al profesor y, lo que es peor, a sus compaeros, conocen la forma de poner como invisible una parte del texto del cdigo. Si observa comportamientos raros en el texto donde escribe el cdigo, revise el cuadro de Colores de Cdigo. FIN del primer captulo de VISUAL BASIC - Gua del Estudiante. CopyRight Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 37

Visual Basic - Gua del Estudiante Cap. 2


FORMULARIO ____________ El primer objeto Visual Basic con que nos encontramos es el FORMULARIO. De hecho, cada vez que iniciamos Visual Basic (VB) nos presenta en pantalla un nuevo formulario, que tiene por defecto el nombre de Form1 El Formulario es un objeto, que sirve de soporte de otros objetos. El nombre de FORMULARIO lo toma precisamente porque, al igual que un formulario de papel contiene textos escritos, lugares donde podemos escribir, figuras, cajas donde podemos elegir una u otra opcin, etc., en este cuadro grfico que llamamos formulario, podemos introducir textos escritos, lugares donde podemos escribir, figuras, cajas donde podemos elegir una u otra opcin .... En realidad un formulario es lo que normalmente conocemos por VENTANA. El nombre de formulario le viene muy bien cuando ese formulario es una ventana donde vamos a introducir datos alfanumricos. Cuando en vez de introducir datos, lo que tenemos es, por ejemplo, una ventana donde se reproducen exactamente los controles de operacin de una mquina, parece en principio que sera mas correcto el nombre de "ventana". De alguna forma lo hay que llamar, y esa forma es FORMULARIO. Posiblemente a lo largo de estos apuntes nos referiremos al formulario con el nombre de ventana, o incluso, pantalla. Procuraremos usar el nombre apropiado: FORMULARIO.

Forma inicial del formulario.

Pgina 38

Ejemplo de un formulario para una aplicacin industrial. Este formulario reproduce el panel de control de un transmisor - receptor de radio. En este caso, parece que el nombre de ventana le viene mejor que el de formulario. Observe que dentro del formulario existen gran cantidad de objetos. Botones, que hacen la misma funcin que el botn real en el equipo de radio, y un par de displays, que muestran un texto, en este caso las frecuencias de transmisin y recepcin. Como cualquier objeto Visual Basic, un formulario tiene propiedades y procedimientos: PROPIEDADES. Name Nombre Define al objeto durante la ejecucin del programa. Se introduce en tiempo de diseo y no se puede variar durante la ejecucin. Nombre por defecto: Form1 (Form2 y sucesivos) Este nombre por defecto debe cambiarse, (debera cambiarse por norma en el momento de introducir el formulario), ya que de no hacerlo corremos el riesgo de borrar el cdigo existente de otro formulario del mismo nombre en el momento de guardar la aplicacin. Caption Ttulo

Es el texto que aparecer en la barra de Ttulo cada vez que aparezca en pantalla este formulario. No tiene otra funcin dentro del programa. El programa no accede a este formulario por el ttulo, sino por el nombre. Puede cambiarse en tiempo de ejecucin. NOTA.- No confundir Nombre (Name) con Ttulo (Caption)

Control Box

Control menos del Formulario

Valor por defecto : True

Pgina 39

Propiedad booleana que admite los valores de true (verdadero) o False (Falso). Si esta propiedad es True, aparecer en la esquina superior izquierda el "menos" para desplegar el men de control de este formulario. Si esta propiedad se pone como False, no existir dicho "menos" y por tanto no se puede desplegar dicho men. MinButton MaxButton

Valor por defecto: True

Botones (flechas) de minimizar y maximizar este formulario. Son igualmente propiedades booleanas, que admiten el valor True o False. Si estn en true, aparecer la flecha correspondiente. Si estn en False, no aparecer dicha flecha. Deben configurarse de una u otra forma, dependiendo si se quiere minimizar / maximizar este formulario durante la ejecucin. Nota. En los formularios MDI child, es necesario poner a true las propiedades ControlBox, MinButton y MaxButton para poder maximizar el formulario hijo. De no ponerlas a true, s se pretende maximizar el formulario hijo, (Propiedad WindowState=2) el formulario no aparece. BorderStyle Tipo de borde

Define el tipo de borde que tendr el formulario durante la ejecucin. No se puede cambiar en tiempo de ejecucin, Admite los siguientes valores: 0 - None El formulario no tiene borde alrededor

1 - Fixed Single El formulario tendr un borde fino, y no podr cambiarse su tamao durante el tiempo de ejecucin. Con este valor, el formulario puede tener un men de control, barra de ttulo y botones de maximizar y minimizar. Solo podr cambiarse de tamao utilizando estos botones. 2-Sizable El formulario tendr borde grueso, y se podr cambiar su tamao en tiempo de ejecucin mediante los botones de maximizar y minimizar, y mediante el arrastre de uno de los bordes con el ratn. 3 - Fixed Dialog El formulario tendr borde grueso, y no se podr redimensionar durante la ejecucin. No puede tener los botones de maximizar ni minimizar. 4 - Fixed ToolWindow En las versiones de 16 bits de Windows y Windows NT 3.51 y anteriores se comporta como Fixed Single. No puede cambiar de tamao. En Windows 95 muestra el botn Cerrar, y el texto de la barra de titulo aparece con un tamao de fuente reducido. El formulario no aparece en la barra de tareas de W95. 5 - Sizable ToolWindow En las versiones de 16 bits se comporta como Sizable. En W95 muestra el botn Cerrar y el texto de la barra de titulo aparece con un tamao de fuente reducido. El formulario no aparece en la barra de tareas de W95. Valor por defecto: 2 . Sizable

Pgina 40

Nota: Al cambiar a determinados valores, las propiedades MaxButton y MinButton se ponen a False. Pueden cambiarse a True posteriormente. Appearance Apariencia Valor por defecto: 3D

Admite los valores 0 (=Flat, plano) y 1 (=3D) Si tiene el valor 1 (3D), el formulario aparecer con cierto efecto tridimensional, y los controles que le introduzcamos a este formulario aparecern como esculpidos dentro de l. Con valor 0 (Flat) en esta propiedad, el formulario aparecer durante la ejecucin como una superficie plana. El color de fondo se ve afectado al cambiar esta propiedad. Si se cambia a 3D, el fondo (Backcolor) toma el color definido en Windows en el Panel de Control. Si se cambia a Flat, toma el color blanco Autoredraw Valor por defecto: False

Propiedad booleana. Esta propiedad, estando en True, permite actualizar el contenido del formulario y de sus controles incluso cuando no estn visibles. Imaginemos que en este formulario existe un texto, una etiqueta (Label) o caja de texto (Text Box) cuyo texto se haya cambiado, bien por programa, bien por una entrada, mientras este formulario no estaba visible. Lo mismo podemos decir de las propiedades de cualquier otro control. Si esta propiedad Autoredraw est en False, al hacer visible este formulario, aparecer igual que cuando se ocult. Si esta propiedad est en True, aparecer actualizado. Backcolor Color del fondo

Establece el color del fondo del formulario. Puede cambiarse en tiempo de ejecucin. Valor por defecto: El establecido en el Panel de Control de Windows. ClipControls Valor por defecto: False

Propiedad Booleana. 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 mtodo grfico o el aspecto de un control Shape o Line. Ver mas adelante los efectos de esta propiedad. DrawStile Valor por defecto : 0

Establece el estilo de lnea de la salida de mtodos grficos: Valores: 0 - Lnea continua 1 - Rayas 2 - Puntos 3 - Raya-Punto 4 - Raya - Punto - Punto 5 - Transparente 6 - Continuo interior. Valor por defecto: 1

DrawWidth

Establece el ancho de una lnea dibujada. El valor debe expresarse en pixeles. Enabled Activado Valor por defecto: True

Pgina 41

Propiedad booleana. Si est en True, el formulario est activado y se puede interactuar con l. Si est en False, se desactiva el formulario, impidiendo de esta forma, que se pueda trabajar con l. ForeColor Valor por defecto: Negro

Establece el color del primer plano del formulario. Es el color que tendrn las letras si escribimos en l, o los dibujos, si lo que hacemos es dibujar. En tiempo de diseo, determina el color de la rejilla,. FillStyle Tipo de relleno Valor por defecto: 2

Establece el modo de rellenar controles Shape, o figuras (crculos o cuadrados) creados con los mtodos grficos Circle y Line. Valores: 0 - Continuo 1 - Transparente 2 - Lnea Horizontal 3 - Lnea Vertical 4 - Diagonal hacia arriba 5 - Diagonal hacia abajo 6 - Cruzado 7 - Diagonal cruzada

FillColor

Color de relleno

Especifica el color del relleno contemplado en FillStyle. Font Tipo de letra Valor por defecto: El determinado en la personalizacin.

Especifica el tipo y tamao de la letra que se usar en el formulario. Al seleccionar esta propiedad en la ventana de propiedades, aparece un cuadro de dialogo donde se eligen ambos parmetros. Cuando introduzca nuevos controles en el Formulario, la propiedad Font de estos controles tomar el valor que tenga esta propiedad en el Formulario. Puede servirle este pequeo truco para utilizar en todos los controles una determinada fuente sin tener que teclearla para cada control. FontTranparent Texto Transparente Valor por defecto: True

Establece si el texto o grfico de fondo del formulario se muestra (True) o no se muestra entre los caracteres de texto escritos en el propio formulario. FontSize Tamao de letra

Establece el tamao de la letra. Esta propiedad, que puede variarse en tiempo de ejecucin, vara solamente el tamao, y no el tipo de letra. El tamao debe expresarse en puntos. Mximo, 2160 puntos. FontBold, FontItalic, FontStrikethru, FontUnderline Permiten, en tiempo de ejecucin, cambiar un texto a negrita, cursiva, tachado y subrayado. Son propiedades booleanas True / False Height Altura Valor por defecto: No existe

Define la altura del formulario. El valor de esta propiedad no se introduce normalmente como un dato numrico, sino que toma el valor automticamente, dependiendo de las

Pgina 42

dimensiones del formulario durante el tiempo de diseo. Puede cambiarse durante el tiempo de ejecucin.

HelpContextID

Valor por defecto: 0

Establece un nmero de contexto asociado para este formulario. Este nmero se aplica para determinar la ayuda interactiva asociada a este formulario. Vea mas adelante, el tema Ayuda de Windows. Puede tomar los siguientes valores : vlido. Icon Icono Esta propiedad define el icono que va a representar a este formulario cuando est minimizado. Si el formulario es el formulario padre o formulario de inicio de una aplicacin, este icono es el que toma el Asistente de Instalacin para colocarlo como icono de apertura del programa en el grupo de programas Windows correspondiente. 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, hacindolo directamente sobre la caja de propiedades. Valor por defecto: el icono que se le haya programado en la personalizacin. KeyPreview Valor por defecto: False 0 - No se especifica nmero de contexto >0 Un entero que especifique un contexto

Propiedad Booleana. Cuando un formulario tiene dentro de s varios controles, uno de ellos es el que est activo. En estas condiciones, si se pulsa una tecla, esa pulsacin la recibe en primer lugar el control que est activo, y si ste no la procesa, pasa esa pulsacin al formulario. Para hacer que esa pulsacin pase directamente al formulario, debe ponerse esta propiedad en True. Left Borde Izquierdo Valor por defecto: No existe

Indica la posicin del borde izquierdo del formulario. Normalmente no se introduce como valor numrico, sino que lo toma automticamente de la posicin que tenga el formulario en el tiempo de diseo. Puede cambiarse en tiempo de ejecucin, para mover el formulario. LinkMode Valor por defecto: 0

Permite que una aplicacin destino inicie una conversacin DDE con el formulario (origen de datos). Puede tomar los siguiente valores: 0 - No hay interaccin DDE 1 - Source. Indica que este Formulario es origen de una comunicacin DDE. El dato que se va a traspasar en esa comunicacin DDE estar en un TextBox, en un Label o en un PictureBox de este Formulario. LinkTopic Establece el tema al que este formulario va a responder a una conversacin DDE, cuando funciona como origen. Es por este tema por el que se debe llamar a este formulario cuando acta de origen en una conversacin DDE MDIChild Valor por defecto: False

Pgina 43

Establece que este formulario es un formulario Hijo dentro de un formulario MDI. No se puede cambiar en tiempo de ejecucin. Es una propiedad booleana True = es formulario hijo False =No lo es

MouseIcon

Valor por defecto: ninguno

Establece un icono personalizado para el puntero del ratn cuando est encima de este Formulario. Este icono puede ser un bit-map de los existentes en el directorio Icons de Visual Basic o cualquiera que tengamos. Si se pone 99 como valor de la propiedad MousePointer (siguiente), cada vez que el puntero del ratn pase por este Formulario, cambiar su forma y adoptar la del icono elegido. MousePointer Valor por defecto: flecha

Determina la forma del puntero del ratn cuando se coloca encima del formulario. Puede elegirse uno de los punteros preestablecidos (15 en total) o el personalizado visto en la propiedad anterior. Para elegir ese icono personalizado, debemos poner en esta propiedad el valor 99. Picture Grfico Valor por defecto: No existe

Mediante esta propiedad podemos poner un grfico como fondo del formulario. El grfico puede ser un bit-map o un fichero .ICO ScaleHeight, ScaleWidth, ScaleMode, Indican la unidad de medida de dimensin de altura y anchura del Formulario. ScaleMode indica en qu unidades de medida se van a medir esas dimensiones. Acepta Twips (1), Point(2), Pixel (3), Character (4), Pulgadas (Inch) (5), Milmetros (6), Centmetros (7). Si colocamos la propiedad ScaleMode en cualquiera de estos valores, las propiedades ScaleHeight y ScaleWidth nos vendrn dadas automticamente dependiendo del ancho del Formulario, y no se extrae 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) sern los que tengan que ser, medidos en la unidad que hemos elegido. 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, los textos o los dibujos. Podemos poner, por ejemplo, que el Formulario mida 400 de ancho ( ScaleWidth = 400) y 300 de alto (ScaleHeight = 300) forzndole estas propiedades, bien en tiempo de diseo en la caja de propiedades, o en tiempo de ejecucin mediante cdigo. Entonces sabemos que el formulario, independientemente de las dimensiones fsicas que tenga sobre la pantalla, medir 400 de ancho y 300 de alto, y si en estas condiciones queremos colocar un control o un dibujo justo en el medio del Formulario, sabemos que tenemos que colocarle en las coordenadas 200, 150. Que unidad de medida estaremos utilizando entonces en el Formulario ? Unas definidas por el usuario (distintas para el ancho y el alto) que sern 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. Observe que la propiedad ScaleMode se ha cambiado automticamente a User (0) al introducir las dimensiones de ancho y alto que nosotros queremos. Estas unidades de medida afectarn a los controles que metamos en este Formulario. Se medirn en su ancho y alto con la unidad de medida definida para el ancho y alto del Formulario. Lgicamente tambin afectar a las propiedades Left y Top de los controles, pero estas propiedades se vern afectadas adems por las propiedades ScaleLeft y ScaleTop del Formulario que se vern a continuacin. ScaleLeft, ScaleTop Pgina 44

Estas propiedades, medidas en la unidad de medida elegida para el ancho y alto mediante las propiedades ScaleMode, ScaleWidth y ScaleHeight anteriores, expresan las coordenadas iniciales de la parte izquierda y de la parte superior respectivamente del Formulario. Estas propiedades no afectan a la posicin del Formulario en la pantalla (Si est maximizado seguir ocupando toda la pantalla, si est en Normal ocupar el mismo sitio que se dio en tiempo de diseo). Supongamos que se le asigna a un Formulario, las propiedades ScaleWidth = 400, y ScaleHeight = 300. Si colocamos un control justamente en el centro del Formulario tendr sus propiedades Top =150 y Left=200. Si ponemos ahora las propiedades del Formulario ScaleLeft a 30 y ScaleTop a 10, ese control, para seguir en el centro del Formulario deber tener sus propiedades Top a 160 (150 + 10) y Left a 230 (200 + 30). Recuerde que las medidas de un formulario crecen, desde la esquina superior izquierda, segn avanzamos hacia abajo y hacia la derecha. Como aclaracin de las relaciones entre distintas unidades de medida, puede ver en la siguiente table la correspondencia entre cada una de ellas y la unidad imaginaria Twip. 1 Point=20 Twips ; 1Pixel=15 Twips : 1 Charecter=240 Twips ; 1 Inch (pulgada) =1440 Twips 1mm=56,52 Twips 1 cm=566 Twips Tag Valor por defecto: No existe Esta propiedad no la usa directamente Visual-Basic. Sirve para asociar al formulario informacin adicional para fines externos a la programacin. Pero tambin le puede servir para almacenar en ella una variable para que la use un cdigo ajeno al formulario. El autor de estos apuntes tiene por costumbre utilizar la propiedad Tag del formulario inicial para guardar el parmetro que se le pasa a algunos programas para acceder a ellos con unos determinados privilegios. Resumiendo, est ah para lo que el programador quiere. Top Posicin del borde superior Valor por defecto: No existe

Esta propiedad establece la posicin del borde superior del formulario. Normalmente no se introduce como valor numrico sino que lo toma automticamente de la posicin que tenga el Formulario durante el tiempo de diseo Este valor puede cambiarse durante la ejecucin para, conjuntamente con Left, variar la posicin del Formulario. Los valores de Top y Left definen la esquina superior izquierda del Formulario. Visible Valor por defecto: True Propiedad Booleana. Asignndole el valor True la pantalla es visible, y asignndole el valor False, no se ve. Este valor puede cambiarse durante el tiempo de ejecucin para ocultar y hacer visible el formulario. Width Ancho Valor por defecto: No existe

Define la anchura del formulario. Normalmente no se introduce como valor numrico sino que lo toma automticamente del tamao que tenga el formulario durante el tiempo de diseo. Juntamente con Height define el tamao del formulario. Puede cambiarse durante el tiempo de ejecucin. WindowState Establece el estado en el que aparecer el formulario cuando se activa y presenta en pantalla. Admite tres opciones: 0 - Normal El formulario recupera la posicin y tamao que tena en el tiempo de diseo. Pgina 45

1 - Minimizado El formulario aparece minimizado, representado por su icono. 2 - Maximizado El formulario aparece maximizado, ocupando toda la pantalla. PROCEDIMIENTOS Activate DblClick DragDrop GotFocus KeyPress LinkError datos LinkOpen LostFocus MouseMove MouseUp QueryUnload Unload Activacin Doble click Arrastrar y soltar Obtener el foco Pulsar una tecla Error de enlace Click Deactivate DragOver KeyDown KeyUp LinkExecute Click Desactivacin Arrastrar por encima Mantener pulsada una tecla Soltar una tecla Ejecucin de un enlace de

Romper el enlace Load Cargar el formulario Perder el foco MouseDown Pulsar una tecla del ratn Mover el ratn (Detecta la posicin del ratn sobre el formulario) Soltar una tecla del ratn Paint Pintar Confirmacin de descarga Resize Cambio de tamao Descargar el formulario

Un Formulario sirve, fundamentalmente, de contenedor de controles. Es la ventana de Windows de nuestra aplicacin. Una aplicacin puede tener varios Formularios y dentro de cada uno de ellos, los controles necesarios para cada paso o estado de la aplicacin. Un Formulario puede servir tambin como soporte de textos o dibujos.

CONTROLES Una vez introducido un Formulario, se pueden colocar los objetos (controles) que forman parte de la aplicacin. Estos controles se irn viendo en prximos captulos. Los controles, lo mismo que el Formulario, tienen Propiedades y Procedimientos. Las Propiedades definen las caractersticas del Control. Los Procedimientos definen la forma de actuar (la forma de proceder) de un control frente a un evento. Tanto las propiedades como los procedimientos deben ser definidos por el programador. Las propiedades dejan un pequeo margen de actuacin, los procedimientos son en su totalidad, definidos por el programador. Estos procedimientos forman parte del programa. Podra incluso hacerse una aplicacin que no tuviese mas cdigo que el introducido en los procedimientos. Para colocar un control en un Formulario, basta con tomarlo de la caja de herramientas existente en la parte izquierda de la pantalla de VB y llevarlo al Formulario. Si no existiese el control deseado en la caja de herramientas, deberemos ir a cogerlo a Controles personalizados que est en el men desplegable Herramientas de la barra de Men de VB. Se elige el nuevo control, marcando la caja de opcin a la izquierda de su nombre, y haciendo click en ACEPTAR. Este control ya pasa a la caja de herramientas.

Pgina 46

COMMAND BUTTON BOTON DE COMANDO _______________________________________ El Command Button es un objeto que sirve para introducir datos a travs de la pantalla. El Botn de Comando tiene la siguiente forma:

El botn de comando puede usarse para la entrada de datos con el ratn, o para validar cualquier operacin. El tamao puede cambiarse a voluntad, pero la forma siempre es rectangular. En la figura anterior vemos dos botones de comando, uno de ellos (el Command2) marcado con unos puntos en su contorno. Estos puntos nos permiten variar su tamao en tiempo de diseo. Tambin puede cambiarse su tamao y posicin en tiempo de ejecucin.

PROPIEDADES Name Nombre Es el nombre que define a este objeto durante la ejecucin del programa. No se puede cambiar en tiempo de ejecucin. El nombre por defecto es Command1, Command2, etc. Estos nombres por defecto deberan cambiarse por otros que nos indiquen algo respecto a este control, aunque en este caso no es tan imprescindible como para los formularios. Caption Ttulo Es el texto que aparece en el botn. Puede cambiarse en tiempo de ejecucin. No tiene otra funcin dentro del programa. NOTA.- No confundir Nombre (Name) con Ttulo (Caption) Appearance Apariencia Determina la forma del botn. Admite los valores de Flat y 3D. No se aprecia en gran medida la diferencia.

(Plano)

Backcolor

Color de fondo Es el color de un pequeo cuadrado que aparece rodeando el ttulo, NO el color del botn, que es invariable. Puede cambiarse en tiempo de ejecucin.

Cancel Establece un valor que indica si un botn de comando es el botn Cancelar de un formulario. Es una propiedad booleana, y admite los valores True o False. Puede utilizar la propiedad Cancel para dar al usuario la opcin de cancelar los cambios que no se han hecho efectivos y devolver el formulario a su estado anterior. En un formulario slo puede haber un botn de comando con la propiedad Cancel = True. Default Establece un valor que determina el control CommandButton que es el botn de comando predeterminado de un formulario. Slo un botn de comando de un formulario puede ser el botn de comando predeterminado. Cuando Default se define a True para un botn de Pgina 47

comando, se define automticamente a False para el resto de los botones de comando del formulario. Cuando la propiedad Default del botn de comando est establecida a True y su formulario primario est activo, el usuario puede elegir el botn de comando (invocando su evento Click) presionando ENTRAR. Cualquier otro control que tuviera el enfoque no recibe evento de teclado (KeyDown, KeyPress o KeyUp) de la tecla ENTRAR a menos que el usuario haya movido el enfoque a otro botn de comando del mismo formulario. En este caso, al presionar ENTRAR se elige el botn de comando que tiene el enfoque en lugar del botn de comando predeterminado. DragIcon Establece el icono que se presenta como puntero en una operacin de arrastrar y colocar. DragMode Establece un valor que determina si se usa el modo de arrastre manual o automtico en una operacin de arrastrar y colocar. Los valores posibles de nmero son: 0 1 Enabled Manual (Predeterminado) Automtico

Habilitado Propiedad Booleana que habilita o deshabilita el botn. Cuando est deshabilitado (Enabled = False), el botn no tiene efecto, y su apariencia vara, presentando un tono plido tanto en su cuerpo como en su ttulo. Puede variarse en tiempo de ejecucin. Fuente Es el tipo de letra para el ttulo. Puede cambiarse en tiempo de ejecucin.

Font

Height

Altura Establece la altura del botn. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de las dimensiones que se le den al botn en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin.

HelpContextID Establece un nmero de contexto asociado para este control. Este nmero se aplica para determinar la ayuda interactiva. Puede tener los siguientes valores: 0 = No se especifica nmero de contexto >0 Un entero que especifica un contexto vlido. Index Indice En el caso de que se tengan varios botones que realicen una funcin similar (Las teclas numricas de una calculadora, p.e.) puede hacerse un array con estos botones de comando. Todos tendrn el mismo nombre, y se diferencian por un ndice. Esta propiedad Index toma el nmero de ese ndice. Left

Pgina 48

Posicin de su parte izquierda. Indica la posicin del botn, concretamente de la parte izquierda del mismo. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que se le de al botn en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin. MouseIcon Icono para el puntero del ratn Determina el icono que presenta al puntero del ratn cuando pasa por encima del botn, cuando se especifica en la propiedad MousePointer que el puntero del ratn es el definido por el usuario. (Custom)

MousePointer Puntero ratn Determina la forma del puntero del ratn cuando ste pasa por encima del botn. Puede elegirse uno de los punteros preestablecidos (15) o incluso uno diseado especialmente. Para especificar que el puntero es uno diseado especialmente, hay que poner a esta propiedad el valor 99 (Custom), y en este caso aparecer el icono determinado por la propiedad MouseIcon TabIndex N de orden para tabulador Cuando disponemos de varios controles en un mismo formulario, solamente uno de ellos tiene el foco. Esta expresin de tener el foco significa que ese control est remarcado y en esa condicin, si pulsamos la tecla ENTER hara el mismo efecto que hacer click con el ratn en ese control. Esto es necesario, ya que existen ordenadores que no disponen de ratn (tpico de algunos porttiles). En estos casos, para elegir uno u otro control debemos pulsar repetidas veces la tecla TABulador. El foco ir cambiando de uno a otro control (pueden ser controles de distinto tipo) cada vez que pulsemos la tecla TABulador. Esta propiedad TabIndex marca el orden que seguir el foco a travs de cada control. Sale del control de la tecla TAB Propiedad booleana. Cuando esta propiedad est a False, el botn no tomar el foco cuando se pulse la tecla del Tabulador. Sin embargo sigue manteniendo el ndice de la propiedad TabIndex descrita anteriormente. Puede cambiarse en tiempo de ejecucin. Esto nos permite descartar algn botn de tomar el foco, cuando por facilidad para el usuario, sea conveniente en determinados puntos del programa.

TabStop

Tag Esta propiedad no la usa directamente Visual-Basic. Sirve para asociar a este control alguna informacin adicional para fines externos a la programacin. Similar a la del formulario. Top Indica la coordenada de la parte superior del control. Puede variarse durante el tiempo de ejecucin. Esta propiedad, juntamente con Left definen la esquina superior izquierda del botn de comando. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que se le den al botn en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin.

Pgina 49

Visible

Visible Propiedad Booleana. Si es true, el botn se ve, si es False el botn no se ve. Puede cambiarse en tiempo de ejecucin. De hecho, es un recurso muy usado para dejar visibles en un formulario, solamente los objetos (controles) necesarios.

WhatThisHelpID

(Propiedad, Windows 95) Devuelve o establece un nmero de contexto asociado a un objeto. Se utiliza para dotar a las aplicaciones de Ayuda interactiva con el men emergente Qu es esto? de la Ayuda de Windows 95.

Width

Ancho Define el ancho del botn. Con Height determina la dimensin del botn.

PROCEDIMIENTOS DEL BOTON DE COMANDO Click KeyDown MouseDown DragDrop KeyPress MouseMove DragOver KeyUp MouseUp GotFocus LostFocus

El botn de Comando no tiene el procedimiento DbClick !

LABEL ETIQUETA ____________________

Una etiqueta es un control que nos permite presentar un texto. La etiqueta debe usarse en aquellos casos en los que exista una informacin esttica o dinmica que no deba ser cambiada por el operador. Puede adoptar estas formas: con borde tridimensional, borde plano o sin borde, y el texto justificado a la izquierda, a la derecha o centrado.

Se ha incluido la trama para poder observar los lmites de la etiqueta sin borde.

Pgina 50

PROPIEDADES Alignment Justificacin Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta. Apariencia Tamao Propiedad booleana. Si se pone a True, el tamao de la etiqueta se ajusta al texto que contiene. Backcolor Color de fondo Es el color de fondo de la etiqueta. Puede cambiarse en tiempo de ejecucin. Tipo de fondo Opaco o transparente. Cuando se selecciona transparente, se ve solamente el texto de la etiqueta. Cuando se selecciona opaco, este texto se v sobre un fondo gris. Tipo de borde Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario. Ttulo Es el texto de la etiqueta. Puede cambiarse en tiempo de ejecucin, lo que permite usar la etiqueta como dispositivo de presentacin de textos. No se puede cambiar por el procedimiento de arrastrar con el ratn, por lo que es el control adecuado cuando se quiere presentar un texto que no se pueda cambiar por el operador. DataField DataSource Establecen la base de datos y el campo donde est el texto Datos que se llevar a la propiedad Caption. Estas propiedades permiten presentar los datos de una Base de Datos mediante un procedimiento muy sencillo, con la ayuda de un control Data (Se ver mas adelante) Plana o tridimensional.

Appearance Autosize

BackStyle

BorderStyle

Caption

DragIcon Establece el icono que se presenta como puntero en una operacin de arrastrar y colocar. DragMode Establece un valor que determina si se usa el modo de arrastre manual o automtico en una operacin de arrastrar y colocar. Los valores posibles de nmero son: 0 1 Enabled Manual (Predeterminado) Automtico

Habilitado Propiedad Booleana que habilita o deshabilita la etiqueta Cuando est deshabilitado (Enabled = False), no tienen efecto los eventos que se

Pgina 51

produzcan sobre ella, y su apariencia vara, presentando un tono plido tanto en su cuerpo como en su ttulo. Puede variarse en tiempo de ejecucin. Font Fuente Es el tipo de letra para el ttulo. Puede cambiarse en tiempo de ejecucin. ForeColor Es el color de la letra de la etiqueta. Puede cambiarse en tiempo de ejecucin. Height Altura Establece la altura de la etiqueta. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de las dimensiones que se le den a la etiqueta en tiempo de diseo. Index Indice En el caso de que se tengan varios etiquetas que realicen una funcin similar puede hacerse un array con etiquetas. Todas tendrn el mismo nombre, y se diferencian por un ndice. Esta propiedad Index toma el nmero de ese ndice. Left Posicin de su parte izquierda Indica la posicin de la etiqueta, concretamente de su parte izquierda. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que ocupaba en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin.

LinkItem LinkMode LinkTimeout LinkTopic Estas propiedades establecen la forma en que debe llevarse a cabo una conexin DDE con otra aplicacin. Se vern con mas detalle al estudiar los enlaces DDE MouseIcon Icono del puntero del ratn MousePointer Puntero ratn Para estas propiedades es aplicable todo lo dicho para las mismas en el Botn de Comando Name Nombre Es el nombre de la etiqueta con el que se le conocer a lo largo del programa TabIndex N de orden Al igual que para los botones de comando, la etiqueta tiene propiedad TabIndex. Sin embargo, una etiqueta NUNCA tomar el foco. Vea la propiedad UseMneumonic mas adelante.

Tag Esta propiedad no la usa directamente Visual-Basic. Sirve para asociar a este control alguna informacin adicional para fines externos a la programacin. Top Indica la coordenada de la parte superior del control. Puede variarse

Pgina 52

durante el tiempo de ejecucin. Esta propiedad, juntamente con Left definen la esquina superior izquierda del botn de comando. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que se le den a la etiqueta en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin. UseMneumonic 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. Es una propiedad Booleana. Los valores que puede tomar son True o False. True (Predeterminado) Los caracteres (&) que aparezcan en el texto de la propiedad Caption definen al carcter siguiente como tecla de acceso. El signo (&) no aparece en la interfaz del control Label. False Los caracteres (&) que aparezcan en el texto de la propiedad Caption aparecen como tales en la interfaz del control Label. En tiempo de ejecucin, al presionar ALT+ la tecla de acceso definida en la propiedad Caption del control Label, el enfoque se desplaza al control siguiente al control Label en el orden de tabulacin. Visible Visible Propiedad Booleana. Si es true, la etiqueta se ve, si es False no se ve. Puede cambiarse en tiempo de ejecucin. WhatThisHelpID (Propiedad, Windows 95) Devuelve o establece un nmero de contexto asociado a un objeto. Se utiliza para dotar a las aplicaciones de Ayuda interactiva con el men emergente Qu es esto? de la Ayuda de Windows 95. Width Ancho Define el ancho de la etiqueta. Con Height determina la dimensin de la misma. 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. Es una propiedad Booleana. Esta propiedad puede cambiarse en tiempo de ejecucin True El control Label se expande o contrae horizontal y verticalmente para adaptarse al texto y al tamao de la fuente. Contempla para la expansin horizontal la colocacin de los espacios del texto. False (Predeterminado) El texto no se ajusta a la siguiente lnea; el control Label se expande o contrae horizontalmente para adaptarse a la longitud del texto y verticalmente para adaptarse al tamao de la fuente y al nmero de lneas. Nota Si se establece False en AutoSize, el texto siempre se ajustar a la lnea siguiente, independientemente del tamao del control Label y

Pgina 53

del valor de la propiedad WordWrap. Esto puede ocultar parte del texto, ya que el control Label no se expande en ninguna direccin .

PROCEDIMIENTOS DEL LABEL Click DragOver Change LinkClose DbClick LinkError DragDrop LinkNotify

TEXT BOX CAJAS DE TEXTO _____________________________ Las cajas de texto son los controles en los que Visual Basic presenta o introduce textos. Es por tanto un control bidireccional. Normalmente se usan para introducin de textos, o para la presentacin de aquellos que el operador pueda cambiar. Para cambiar o escribir un texto en una caja de texto, basta con conseguir que esa caja de texto tenga el foco y teclear el texto en el teclado. Esto se puede lograr, bien haciendo click con el ratn en esa caja de texto, bien con la tecla TAB, bien por programa. La caja de texto no se debe usar nunca para presentar textos que el operador de la aplicacin no deba cambiar. sese para ello la etiqueta, control no bidireccional, que adems tiene la ventaja de ocupar menos memoria de programa. Las cajas de texto pueden tener una o varias lneas, segn est la propiedad Multiline. La capacidad mxima de una caja de textos es de 64 Kbytes. La forma de una caja de texto es la siguiente, dependiendo de las propiedades BorderStyle y Appearance:

PROPIEDADES Alignment Justificacin Establece si el texto se justifica a la izquierda, a la derecha, o se centra sobre la etiqueta. Esta propiedad solamente tiene efecto cuando la propiedad Multiline est a True, ignorndose en caso contrario. Es decir, permite colocar el texto justificado a la derecha cuando ese texto puede ser de varias lneas. Para una nica lnea, se justifica siempre a la izquierda. Esta propiedad no puede cambiarse en tiempo de ejecucin, pero s puede leerse en que condicin est. Apariencia

Appearance

Pgina 54

Plana o tridimensional. Backcolor Color de fondo Es el color de fondo de la caja de texto. Puede cambiarse en tiempo de ejecucin.

BorderStyle

Tipo de borde Sin borde o con borde. En caso de haber elegido en la propiedad Appearance el modo tridimensional, y eligiendo con borde en esta propiedad, el aspecto adopta una forma como incrustada en el formulario.

DataField DataSource

Fuente de Datos Establecen la base de datos y el campo donde est el texto que se llevar a la propiedad Text. Estas propiedades permiten presentar de una forma muy sencilla datos de una Base de Datos. Se vern cuando se estudie el control Data y el motor de bases de datos

DragIcon Establece el icono que se presenta como puntero en una operacin de arrastrar y colocar. DragMode Establece un valor que determina si se usa el modo de arrastre manual o automtico en una operacin de arrastrar y colocar. Los valores posibles de nmero son: 0 1 Enabled Manual (Predeterminado) Automtico

Habilitado Propiedad Booleana que habilita o deshabilita la etiqueta Cuando est deshabilitado (Enabled = False), no tienen efecto los eventos que se produzcan sobre el TextBox. No se puede escribir el l ni pasarle el foco, pero s se le puede cambiar el texto mediante el programa. Puede ser una buena alternativa para impedir que el usuario pueda cambiar un determinado texto. Esta propiedad puede variarse en tiempo de ejecucin. Fuente Es el tipo de letra que se utilizar en el TextBox. Puede cambiarse en tiempo de ejecucin.

Font

ForeColor

Color de la letra Determina el color de las letras del texto. Altura Establece la altura de la caja de texto. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de las dimensiones que se le den a la caja en tiempo de diseo.

Height

HelpContextID Establece un nmero de contexto asociado para este control. Este

Pgina 55

nmero se aplica para determinar la ayuda interactiva. Puede tener los siguientes valores: 0 = No se especifica nmero de contexto >0 Un entero que especifica un contexto vlido. Index Indice En el caso de que se tengan varias cajas de texto que realicen una funcin similar puede hacerse un array con ellas. Todas tendrn el mismo nombre, y se diferencian por un ndice. Esta propiedad Index toma el nmero de ese ndice. Left Posicin de su parte izquierda. Indica la posicin de la caja de texto, concretamente de su parte izquierda. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que ocupaba en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin.

LinkItem LinkMode LinkTimeout LinkTopic Estas propiedades establecen la forma en que debe llevarse a cabo una conexin DDE con otra aplicacin. Se vern con mas detalle al estudiar los enlaces DDE Locked Establece si el texto se puede editar, es decir, cambiar. Cuando se pone esta propiedad a True, el texto existente en la caja puede resaltarse con el ratn, e incluso copiarlo al portapapeles, pero no puede variarse tecleando un nuevo texto. Se puede cambiar por programa, cambiando la propiedad Text. Si est en False, puede cambiarse el texto mediante teclado.

MaxLenght Indica, si se establece, la longitud mxima del texto.

MouseIcon Puntero del ratn personalizado MousePointer Puntero ratn Determina la forma del puntero del ratn cuando ste pasa por encima de la caja de texto. Puede elegirse uno de los punteros preestablecidos en esta propiedad, (15 en total) e incluso un puntero personalizado en la propiedad MouseIcon. Para que aparezca este puntero personalizado, MousePointer debe ponerse al valor 99. Lo tpico para esta propiedad es el I-Beam (barra vertical) Name Nombre Es el nombre de la caja de texto con el que se le conocer a lo largo del programa PasswordChar En ocasiones, es conveniente que no se pueda leer lo que se escribe en la caja de texto, caso por ejemplo de la entrada de un password o palabra de paso. Esta propiedad nos permite indicar un carcter que sustituye a cualquier carcter que tenga la caja de texto. (Tpicos el * o ?). El texto que tenga en la propiedad Text no cambia por el hecho

Pgina 56

de presentar en pantalla un carcter distinto. Esta propiedad puede cambiarse en tiempo de ejecucin. Para quitar el PasswordChar basta con forzarlo al carcter nulo : Text1.PasswordChar = Esta propiedad se ignora cuando la propiedad Multiline est a True. ScrollBars Cuando la propiedad Multiline de la caja de texto est a True, se pueden colocar barras de desplazamiento del texto hacia arriba y abajo, o hacia los lados. Esto nos permite tener una caja de texto de tamao reducido y poder leer en ella un texto mayor que la propia caja. Esta propiedad puede tomar los siguiente valores : 0 - No salen barras 1 - Barras de desplazamiento horizontal 2 - Barras de desplazamiento vertical 3 - Ambas barras. TabIndex N de orden para obtener el foco Al igual que para los botones de comando, esta propiedad para tabulador marca el orden en el que le llegar el foco al pulsar la tecla TAB

Tag Esta propiedad no la usa directamente Visual Basic. Sirve para asociar a este control alguna informacin adicional para fines externos a la programacin. Top Indica la coordenada de la parte superior del control. Puede variarse durante el tiempo de ejecucin. Esta propiedad, juntamente con Left definen la esquina superior izquierda de la caja de texto. Normalmente esta propiedad no se introduce numricamente, sino que la toma automticamente de la posicin que se le de en tiempo de diseo. Puede cambiarse, cambiando el valor a esta propiedad, en tiempo de ejecucin. Visible Visible Propiedad Booleana. Si es true, la caja de texto se ve, si es False no se ve. Puede cambiarse en tiempo de ejecucin. WhatThisHelpID (Propiedad, Windows 95) Devuelve o establece un nmero de contexto asociado a un objeto. Se utiliza para dotar a las aplicaciones de Ayuda interactiva con el men emergente Qu es esto? de la Ayuda de Windows 95. Width Ancho Define el ancho de la caja de texto. Con Height determina la dimensin de la misma.

PROCEDIMIENTOS DE LA CAJA DE TEXTO Click Change DblClick DragDrop DragOver GotFocus

Pgina 57

KeyDown

KeyPress

KeyUp

LinkClose

FRAME

RECUADRO

Se obtiene directamente de la caja de herramientas

Tiene la siguiente forma :

Un control Frame proporciona un agrupamiento identificable para controles. Tambin puede utilizar un Frame para subdividir un formulario funcionalmente por ejemplo, para separar grupos de controles OptionButton. Para agrupar controles, en primer lugar trace el control Frame y, a continuacin, meta los controles dentro de Frame. De este modo podr mover al mismo tiempo el Frame y los controles que contiene. Si traza un control fuera del Frame y, a continuacin, intenta moverlo dentro de ste, el control se colocar sobre el Frame, pero no pertenecer a el. Es decir, si es un OptionButton este se comportar como si estuviese fuera del Frame, aunque fsicamente est dentro de el. Cuando un control Frame tiene dentro otros controles, y hacemos invisible al Frame, mediante su propiedad Visible = False, los controles interiores al Frame quedan tambin invisibles.

PROPIEDADES Las sealadas con (*) no presentan novedades respecto a las ya comentadas para los controles precedentes. Appearance Backcolor Caption ClipControls Si esta propiedad est a True, los mtodos grficos en eventos Paint vuelven a dibujar el objeto entero. Antes del evento Paint se crea una zona de recorte alrededor de los controles no grficos del formulario. Si (*) (*) Es el ttulo que aparece en el borde del Frame.

Pgina 58

esta propiedad est a False dibujarn solamente las reas ltimamente expuestas. En tiempo de ejecucin, esta propiedad es de slo lectura. DragIcon DragMode Enabled Cuando esta propiedad est a False, tanto los procedimientos asociados al propio control Frame como todos los controles dentro del Frame estarn inhabilitados. Si esta propiedad est a True, todos ellos estn habilitados. Font En esta propiedad, el tipo de letra afecta solamente al ttulo del Frame, no a los controles internos a el. ForeColor Color de las letras del ttulo del Frame. Height HelpContextID Index Left MouseIcon MousePointer Name TabIndex Tag Top Visible Cuando un Frame est con la propiedad Visible = False, tanto el propio Frame como todos los controles interiores a el sern invisibles. (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)

WhatsThisHelpID Width

PROCEDIMIENTOS DEL FRAME Click MouseMove DblClick MouseUp DragDrop DragOver MouseDown

CHECK BUTTON Y OPTION BUTTON

(BOTONES DE ELECCION Y OPCION)

Se obtienen directamente de la caja de herramientas.

Dada la similitud de ambos controles, se comentan conjuntamente.

Pgina 59

El control CheckBox, o casilla de verificacin, permite elegir una opcin (activada/desactivada, True/False) que el usuario puede establecer o anular haciendo click. Una X en una casilla de verificacin indica que est seleccionada, activada, o con valor True. Cada casilla de verificacin es independiente de las dems que puedan existir en el formulario, pudiendo tomar cada una de ellas el valor True o False, a voluntad del operador. Un control OptionButton muestra una opcin que se puede activar o desactivar, pero con dependencia del estado de otros controles OptionButton que existan en el formulario. Generalmente, los controles OptionButton se utilizan en un grupo de opciones para mostrar opciones de las cuales el usuario slo puede seleccionar una. Los controles OptionButton se agrupan dibujndolos dentro de un contenedor como un control Frame, un control PictureBox o un formulario. Para agrupar controles OptionButton en un Frame o PictureBox, dibuje en primer lugar el Frame o PictureBox y, a continuacin, dibuje dentro los controles OptionButton. Todos los controles OptionButton que estn dentro del mismo contenedor actan como un solo grupo, e independientes de los controles OptionButton de otros grupos distintos. Aunque puede parecer que los controles OptionButton y CheckBox funcionan de forma similar, hay una diferencia importante: Cuando un usuario selecciona un OptionButton, los otros controles del mismo grupo OptionButton dejan de estas disponibles automticamente. Por contraste, se puede seleccionar cualquier nmero de controles CheckBox.

En el ejemplo de la figura, existen tres grupos de OptionButton, uno en un PictureBox, que acta, al tiempo que como cuadro de imagen, como contenedor de controles OptionButton. Otro grupo est en el interior de un control Frame, y el otro grupo est en el formulario. Los tres grupos son independientes entre s, pero interiormente al grupo solamente puede seleccionarse uno de los OptionButton que lo componen. En el formulario tambin existen tres CheckBox, que como puede verse, se pueden seleccionar los que se desee, sin ningn tipo de exclusin entre ellos.

PROPIEDADES Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.

Pgina 60

Alignment

Comn a ambos controles. Admite los siguientes valores : 0 - Left Justify 1 - Right Justify

Cuando se elige el valor 0, justificado a la izquierda, el ttulo del control aparece a la derecha del botn, pegado a la figura del botn. Cuando se elige el valor 1, justificado a la derecha, el ttulo (Caption) aparece a la izquierda del botn, comenzando en la parte izquierda del cuerpo total del control, es decir, no tiene porqu aparecer con su parte derecha pegado al botn, caso que el cuerpo total del control se haya hecho mas largo que la palabra del ttulo. Appearance Backcolor Caption DataField DataSource (*) (*) (*). Propiedades del CheckBox solamente. Establecen la base de datos y el campo donde estn los datos (True / False) que se llevarn a la propiedad Value . 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. En este caso, el CheckBox solamente permite presentar (logicamente) datos de tipo Booleano. (*) (*) (*) (*) (*) Comn a ambos controles. La altura del control solamente afecta a la colocacin del Titulo (Puede ponerse un ttulo largo en varias lneas), no al tamao del botn, que es invariable. (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) Comn a ambos controles El valor de esta propiedad indica si el control est seleccionado (Value = 1) o no seleccionado (Value = 0 Value = False). Esta propiedad puede cambiarse en tiempo de ejecucin. Mediante esta propiedad, podemos tanto forzar el valor como leerlo. Atencin. Presenta una diferencia entre uno y otro control respecto a la forma de expresarse respecto a su valor cuando est seleccionado. Para forzar que el control NO est seleccionado, o para leer el Value

DragIcon DragMode Enabled Font ForeColor Height

HelpContextID Index Left MouseIcon MousePointer Name TabIndex TabStop Tag Top Value

Pgina 61

cuando no est seleccionado, podemos utilizar tanto Value = 0 como Value = False. Sin embargo, cuando lo que se quiere es poner la propiedad a True hay una diferencia entre ambos controles. Para el OptionButton podemos utilizar indistintamente las siguiente formas : Option1.Value = True Option1.Value = 1

Con cualquiera de ellas seleccionaremos ese control por programa. Para el CheckBox solamente se podr usar para este propsito la instruccin : Check1.value = 1 El poner como Value el valor True nos dar en este control un error. Para la lectura del Value, existe una diferencia entre el valor devuelto por el CheckBox y el devuelto por el OptionButton. Para leer el dato existente en un CheckBox es necesario utilizar la forma : variable = Check1.Value donde variable tomar el valor 1 (no True) Para el control OptionButton emplearemos una instruccin igual : variable = Option1.Value Visible WhatsThisHelpID Width PROCEDIMIENTOS (*) (*) (*) donde variable tomar el valor True (no 1)

Click KeyDown

DblClick (Solo OptionButton) KeyPress KeyUp

DragDrop LostFocus

DragOver

GotFocus

LIST BOX Y COMBO BOX Estos dos controles, debido a su similitud, se estudian conjuntamente. 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 ms. Si el nmero de elementos supera el nmero que puede mostrarse, se agregar automticamente una barra de desplazamiento al control ListBox. Pgina 62

Un control ComboBox combina las caractersticas de un control TextBox y un control ListBox. Los usuarios pueden introducir informacin en la parte del cuadro de texto y seleccionar un elemento en la parte de cuadro de lista del control. En resumen, un ComboBox es la combinacin de un ListBox, que se comporta como si de un ListBox se tratase, y de un TextBox, con comportamiento anlogo a un TextBox sencillo, con la particularidad aqu de que el texto se le puede introducir por teclado, o elegir uno de los que figuran en la parte ListBox del Combo. Estos controles toman la siguiente forma :

Puede verse en la figura un ejemplo de presentacin de un ListBox (izquierda), un ComboBox con la lista desplegada (Centro) y un ComboBox con la lista sin desplegar (Combo2 a la derecha). La lista tiene varios elementos. Cada lnea de esta lsta es un elemento de la lista. Como el nmero de elementos de la lista tiene mas elementos de los que le podan caber, gener automticamente la barra de desplazamiento vertical. El ComboBox est normalmente sin desplegar. Se despliega cuando se hace click con el ratn en la flecha que tiene en su parte derecha (vase fig. Anterior). Al desplegarse, muestra la lista con todos sus elementos. Haciendo click con el ratn en cualquiera de sus elementos, el elemento elegido pasa a la parte TextBox del Combo y la lista vuelve a replegar. El ListBox (y por tanto el ComboBox) tiene unas propiedades y mtodos particulares que solamente se pueden aplicar durante el tiempo de ejecucin : ListCount - Indica el nmero de elementos que tiene la lista ListIndex - Indica el nmero de orden del elemento seleccionado dentro de la lista. AddItem - Aade un elemento a la lista. RemoveItem - Elimina un elemento de la lista. Text - Obtiene el elemento seleccionado. List (n) - Obtiene el elemento cuyo orden dentro de la lista es n. ListCount valdr 0 si la lista no tiene ningn elemento, y n si tiene n elementos. Para seleccionar un elemento de la lista, basta con hacer click con el ratn sobre l. Ese elemento se resaltar con fondo en azul. Una vez seleccionado un elemento, la propiedad ListIndex tomar el valor del nmero de orden que ocupa ese elemento en la lista, comenzando por el 0 para el elemento que ocupa el primer lugar. Si no se selecciona ningn elemento, el valor de la propiedad ListIndex ser -1. El primer elemento de la lista es ListIndex 0, y el valor de la propiedad ListCount siempre es uno ms que el valor mayor de ListIndex. En el ComboBox la propiedad Text contiene el texto que contenga la parte TextBox del

Pgina 63

Combo, bien haya sido introducida desde teclado o mediante la recuperacin de un elemento la parte ListBox del mismo.

Ejemplos Supongamos que tenemos un ListBox llamado List1, y un ComboBox llamado Combo1. Se enumeran distintas formas de obtener informacin de ellos. Variable = List1.Listcount Variable contendr un nmero con el nmero total de elementos de la lista List1. Variable = List1.ListIndex Variable contendr un nmero con el nmero de orden del elemento de la lista seleccionado en ese momento. List1.AddItem ELEMENTO NUEVO Aade un elemento a List1. En este caso, el elemento aadido es la palabra ELEMENTO NUEVO. Variable = VISUALBASIC List1.AddItem Variable Aade un elemento a List1. En este caso, el elemento aadido es la palabra VISUALBASIC. Variable = List1.Text Variable contendr el elemento que estaba seleccionado en List1. ( Variable ser una cadena de caracteres) Variable = List1.List (n) Variable contendr el elemento que ocupa el nmero de orden n dentro de la lista. Variable = List1.List (List1.ListIndex) Variable contendr el elemento que estaba seleccionado en List1. Se ha utilizado la propiedad List para obtener el elemento, y en vez de introducir un nmero para definir el elemento que se desea, se introdujo el valor ListIndex de List1, que es concretamente, el nmero de orden del elemento seleccionado en ese momento. Observe que poner List1.List (List1.ListIndex) es idntico a poner List1.Text. List1.RemoveItem (n) Elimina el elemento n de List1. List1.RemoveItem (List1.ListIndex) Elimina el elemento que estaba seleccionado en ese momento. List1.listIndex = n Selecciona el elemento n de List1 (Se resalta en azul el elemento n) PROPIEDADES DE ListBox y de ComboBox Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.

Pgina 64

Appearance Backcolor Columns

(*) (*) Propiedad de ListBox solamente.

Determina si los elementos se presentan en una sola columna o en varias columnas, y la forma de presentar los elementos en el ListBox. Si esta propiedad se pone a 0 la lista tendr solamente una columna, y presentar los elementos uno debajo de otro. Cuando los elementos sean mas que los que se pueden presentar en la lista, aparecen automticamente unas barras de desplazamiento vertical. Si la propiedad se pone a un nmero distinto a 0, el ListBox es de tipo multicolumna, presentar en cada columna los elementos que le quepan dependiendo de su dimensin vertical, y tendr tantas columnas como sea necesario para albergar el nmero de elementos que tenga. Presentar en su cuadro tantas columnas como se le indique en el valor de esta propiedad, y si no puede presentar todos los elementos en las columnas que muestra, le aparecern barras de desplazamiento horizontales para poder movernos por todas las columnas que tenga. Recuerde : El nmero que se le asigna a la propiedad Columns no indica el nmero de columnas que tendr el ListBox sino el nmero de columnas que presenta. Esta propiedad puede asignarse en diseo, mediante la caja de propiedades, o en tiempo de ejecucin mediante una instruccin como esta : Nombrelista.Columns = nmero . Esta propiedad no puede definirse a 0 o cambiada desde 0 en tiempo de ejecuciones decir, no se puede convertir en tiempo de ejecucin un ListBox de mltiples columnas en un ListBox de columna nica o un ListBox de columna nica en un ListBox de mltiples columnas. Sin embargo, s es posible cambiar durante la ejecucin el nmero de columnas de un ListBox de mltiples columnas.

DataField DataSource

. Establecen la base de datos y el campo donde estn los datos que se llevarn al TextBox o ComboBox para presentar datos procedentes de una Base de Datos. (*) (*) (*) (*) (*) (*) (*) (*) No aplicable a ListBox o ComboBox Propiedad muy importante.

DragIcon DragMode Enabled Font ForeColor Height HelpContextID Index IntegralHeight ItemData

Devuelve o establece un nmero especfico para cada elemento de un control ComboBox o ListBox. Sintaxis objeto.ItemData(ndice) [= nmero] La sintaxis de la propiedad ItemData tiene las siguientes partes: objeto Nombre del ListBox o ComboBox.

Pgina 65

ndice El nmero de un elemento concreto del objeto. nmero El nmero que se asocia con el elemento especificado. Comentarios La propiedad ItemData es una matriz de valores enteros largos cuyo nmero de elementos es el valor de la propiedad ListCount del control. Los nmeros asociados con cada elemento se pueden usar para cualquier fin. Por ejemplo, se puede usar en la confeccin de una lista de telfonos, el nmero de identificacin de un empleado, etc. Cuando se rellena el ListBox, tambin se rellena los elementos correspondientes de la matriz ItemData con los nmeros correspondientes. La propiedad ItemData se usa a menudo como ndice de una matriz de estructuras de datos asociados con los elementos de un control ListBox. Nota Cuando se inserta un elemento en una lista con el mtodo AddItem, el elemento tambin se inserta automticamente en la matriz ItemData. Sin embargo, el valor no se reinicializa a cero; retiene el valor que estaba en esa posicin antes agregar el elemento a la lista. Cuando se usa la propiedad ItemData, asegrese de establecer su valor al agregar nuevos elementos a la lista. Left (*)

List Es el contenido de la lista. Si la lista de elementos es corta e invariable, pueden introducirse los elementos en el cuadro de propiedades durante el diseo. MouseIcon MousePointer Name Sorted Establece o devuelve un valor que indica si los elementos de un ListBox o ComboBox se colocan automticamente en orden alfabtico. Los valores que puede adoptar son True o False. True Los elementos de la lista se ordenan alfabticamente (sin distinguir entre maysculas y minsculas). False (Predeterminado) Los elementos de la lista no se ordenan alfabticamente. Cuando esta propiedad tiene el valor True, Visual Basic se encarga de casi todo el procesamiento de cadenas necesario para mantener el orden alfabtico, incluyendo el cambio de los nmeros de ndice cuando se agregan o eliminan elementos. Nota El uso del mtodo AddItem para agregar un elemento en una posicin especfica de la lista puede romper el orden alfabtico, y los elementos agregados con posterioridad pueden no ordenarse correctamente. TabIndex TabStop Tag Top Visible WhatsThisHelpID Width (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)

Pgina 66

PROCEDIMIENTOS

Click

Change (Solo ComboBox)

DblClick GotFocus

DragDrop KeyDown

DragOver KeyPress

DropDown (Solo ComboBox) KeyUp LostFocus

MouseDown (Solo ListBox)

MouseMove (Solo ListBox)

MouseUp (Solo ListBox) NOTA MUY IMPORTANTE El procedimiento Change del ComboBox solamente se efecta cuando el cambio se produce mediante la entrada de un texto DESDE EL TECLADO, no por un cambio en la parte Text de este control, producido al llevar un elemento desde la parte List a la parte Text.

CONTROLES HScrollBar y VScrollBar Son dos controles similares, para introducir un dato cuasi-analgico en una aplicacin. Se toman directamente de la caja de herramientas, y tienen un aspecto parecido al de un control de volumen de un equipo de msica. El HScrollBar est en posicin horizontal, y el VScrollBar en posicin vertical.

Mediante estos controles se pueden introducir datos variando la posicin del cursor. PROPIEDADES de HScrollBar y VScrollBar Las sealadas con (*) son comunes a ambos controles y no presentan novedades respecto a las ya comentadas para los controles precedentes.

DragIcon DragMode Enabled Height HelpContextID Index LargeChange

(*) (*) (*) (*) (*) (*)

Esta propiedad establece la variacin de la propiedad Value cada vez que se hace click en el interior de la barra de desplazamiento, en la parte por donde

Pgina 67

pasa el cursor. Left Max Esta propiedad establece el valor mximo para la propiedad Value, es decir, el valor de esta propiedad cuando el cursor est en su parte mxima. (Recuerde que el cursor est en el mximo, cuando est mas a la derecha, caso del HScrollBar, o cuando est en la parte mas baja, caso del HScrollBar. Min Esta propiedad establece el valor mnimo para la propiedad Value, es decir, el valor de esta propiedad cuando el cursor est en su parte mnima. (Recuerde que el cursor est en el mnimo, cuando est mas a la izquierda, caso del HScrollBar, o cuando est en la parte mas alta, caso del HScrollBar. MouseIcon MousePointer Name SmallChange Esta propiedad establece la variacin de la propiedad Value cada vez que se hace click en las flechas superior o inferior de la barra de desplazamiento. (*) (*) (*) (*) (*) (*) (*) (*)

TabIndex TabStop Tag Top Value

Esta propiedad lee o establece el valor dado por la posicin del cursor. Este valor tiene un mnimo, establecido por Min y un mximo, establecido por Max. Esta propiedad es la que se debe leer para conocer la posicin 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, tras mover el cursor, se suelta el botn del ratn. 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. El procedimiento Scroll se realiza en el instante que se est moviendo el cursor. Por lo tanto, es este procedimiento el que se debe usar para conseguir el efecto de un cambio continuo mientras se est moviendo el cursor.

TIMER

TEMPORIZADOR

Este objeto permite establecer temporizaciones. Presenta una novedad respecto a los controles estudiados hasta ahora. El control Timer solamente se ve durante el tiempo de diseo. En

Pgina 68

tiempo de ejecucin, el control permanece invisible. La temporizacin producida por el Timer es independiente de la velocidad de trabajo del ordenador. (Casi independiente. El timer no es un reloj exacto, pero se le parece) Se toma directamente de la caja de herramientas, 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. Si el valor de la propiedad Interval est a 0 (Predeterminado), no se produce el evento Timer. (El control Timer est deshabilitado cuando se pone la propiedad Interval = 0) Left Name Tag Top (*) (*) (*) (*)

PROCEDIMIENTOS Timer Se produce cada vez que se cumple un intervalo completo.

SHAPE Se toma directamente de la caja de herramientas :

Shape es un control grfico que se muestra como un rectngulo, un cuadrado, una elipse, un crculo, un rectngulo redondeado o un cuadrado redondeado. Utilice controles Shape en tiempo de diseo en lugar o adems de invocar los mtodos Circle y Line en tiempo de ejecucin. Puede dibujar un control Shape en un contenedor, pero no puede actuar como contenedor. (Esto quiere decir que un control Shape nunca le servir, por ejemplo, para albergar varios OptionButton y pretender que sean independientes de otros controles OptionButton que se encuentren fuera del control Shape.

Pgina 69

Este control no tiene Procedimientos. En realidad, solamente sirve para mostrar un determinado grfico, envolver grficamente a otros controles, pero no tiene ninguna aplicacin en cuanto a programa. Es un adorno para sus aplicaciones. PROPIEDADES Backcolor BackStyle Esta propiedad establece si Shape permite ver a su travs (Transparent) o n lo permite (Opaque) BorderColor Establece el color del borde. BorderStyle Establece el tipo de borde. Puede ser : Transparent, (No se ve el borde), Solid, (Borde de lnea continua),Dash, (lnea a rayas), Dot, (lnea a puntos), DashDot, (lnea de raya - punto), dash-Dot-Dot, (lnea de raya - punto - punto), InsideSolid, (raya continua) El efecto de establecer la propiedad BorderStyle depende del valor de la propiedad BorderWidth. Si BorderWidth no es 1 y BorderStyle no es 0 o 6, BorderStyle se establece como 1. BorderWidth Establece el ancho de la lnea. DrawMode FillColor FillStyle Height Index Left Name Shape Establece la forma del control. Puede ser : Rectangular, cuadrado, redondo, ovalado, cuadrado con esquinas redondeadas y rectangular con esquinas redondeadas. Tag Top Visible Width (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)

PROCEDIMIENTOS

No tiene.

.LINE Se toma directamente de la caja de herramientas

Pgina 70

Line, al igual que Shape, es un control grfico que solamente sirve para poner una lnea en un formulario. Del mismo modo, no tiene procedimientos, por lo que no sirve para aportar cdigo al programa. Solo sirve para aportar una caracterstica grfica, es un adorno. PROPIEDADES BorderColor Establece el color de la lnea. BorderStyle Establece el tipo de lnea : Puede ser : Transparent, (No se ve la lnea), Solid, (Lnea continua),Dash, (lnea a rayas), Dot, (lnea a puntos), Dash-Dot, (lnea de raya - punto), dash-Dot-Dot, (lnea de raya - punto - punto), InsideSolid, (raya continua) BorderWidth Establece el ancho de la lnea. DrawMode Index Left Name Tag Visible X1, X2 Y1, Y2 (*) (*) (*) (*) (*) (*) Establece las coordenadas x del inicio y final. Establece las coordenadas y del inicio y final

PROCEDIMIENTOS CONTROL GAUGE

No tiene.

Este control presenta una informacin numrica de forma grfica, bien como un display lineal (tpico por ejemplo en ecualizadores de audio ), o como una aguja. No est normalmente en la caja de herramientas, por lo que hay que traerla desde los Controles Personalizados (Men desplegable de Herramientas). Se denomina MicroHelp Gauge Control. El archivo que lo contiene se denomina GAUGE16.OCX, (Ver. 16 bits) GAUGE32.OCX (Ver. 32 bits)

Mediante este control, podemos presentar una magnitud numrica de una forma cuasianalgica. Podramos decir que es un control similar al HScrollBar, que en vez de meter informacin a la aplicacin, la presenta. Este control puede servir, por ejemplo, para presentar el tanto por ciento de ejecucin de una tarea, como elemento tranquilizante. Puede presentar el nivel de un depsito de agua, etc. Pgina 71

Presenta las dos formas siguientes :

En la figura puede verse un Gauge de aguja, uno de barra horizontal y otro de barra vertical. Para mejorar la presentacin, el Gauge permite poner un grfico como fondo, cambiar el color de la barra, color de fondo, etc. El control Gauge crea medidores definidos por el usuario, que puede elegir entre los estilos lineales (relleno) o de aguja. Nota para la distribucin Cuando cree y distribuya aplicaciones con controles Gauge, tendr que instalar el archivo apropiado en el subdirectorio SYSTEM de Windows del cliente. El Kit para instalacin que incluye Visual Basic, le proporciona herramientas para escribir los programas que instalan las aplicaciones correctamente. PROPIEDADES Autosize, Backcolor, DragIcon, DragMode, Enabled, ForeColor, Height, HelpContextID, Index, InnerBottom, InnerLeft, InnerRight, InnerTop, Left, Max, Min, MouseIcon, MousePointer, Name, NeedleWidth, Picture, Style, TabIndex, Tabstop, Tag, Top, Value, Visible, WhatsThisHelpID, Width. Son destacables por nuevas o particulares, las siguientes propiedades : ForeColor Color de la barra InnerBottom Distancia entre la parte baja del control y el comienzo de la barra o aguja. InnerLeft, InnerRight, InnerTop. Idntico al anterior, respecto a otros lados. Max Valor de la propiedad Value a fondo de escala Min Valor de la propiedad Value para indicacin cero. NeedleWidth Ancho de la aguja Style Tipo de marcador. Puede tomar los siguientes valores : 0 = de barra, horizontal. 1 = de barra, vertical. 2 = de aguja, de 180 grados 3 = de aguja, de 360 grados. Value Valor numrico a presentar. Debe ser igual o menor que la propiedad Max, e igual o mayor que la propiedad Min. PROCEDIMIENTOS Change KeyPress DblClick KeyUp DragDrop LostFocus DragOver MouseDown GotFocus MouseMove KeyDown MouseUp

FIN del segundo captulo de VISUAL BASIC - Gua del Estudiante.

Pgina 72

CopyRight Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 73

Visual Basic - Gua del Estudiante Cap. 3


Controles (Continuacin) El CommonDialog
El CommonDialog es un control del que se libran muy pocas aplicaciones. Dada la importancia de este control, se le dedica un capitulo nico en esta Gua del Estudiante. CUADRO DE DIALOGO CommonDialog

Normalmente se encuentra en la caja de herramientas

Este control no se presenta en tiempo de diseo mas que con un simple icono :

El cuadro de dilogo, CommonDialog se utiliza para varias funciones : Abrir Ficheros Guardar Ficheros Elegir colores Seleccionar Impresora Seleccionar Fuentes Mostrar el fichero de Ayuda

En realidad el cuadro de dilogo permite conocer datos con los cuales, y mediante el cdigo adecuado, abriremos o guardaremos ficheros, elegiremos colores o seleccionaremos fuentes. Es decir, el CommonDialog NO realiza mas funciones que mostrar ficheros existentes, fuentes disponibles, colores, para que, mediante cdigo, abramos esos ficheros o usemos una determinada fuente. Dependiendo de la aplicacin para la que vaya a usarse se deber activar de distintas formas. Si el cuadro de dilogo se va a usar para seleccionar la impresora y para otras aplicaciones, es recomendable usar uno exclusivamente para seleccionar la impresora. Esta ltima recomendacin se debe a que, para el control de la impresora, el CommonDialog SI realiza las funciones de seleccin de impresora predeterminada. Esta diferencia operativa hace que si usamos el mismo CommonDialog para seleccionar impresora y abrir ficheros, por ejemplo, se cuelgue el CommonDialog. El control CommonDialog es un control personalizado (Microsoft CommonDialog Control COMDLG16.OCX / COMDLG32.OCX), y como casi todos los controles personalizados presenta un asistente de propiedades propio. Puede accederse a las propiedades mediante el cuadro de propiedades tpico de otros controles, o mediante el asistente, pulsando el botn derecho del ratn con el puntero colocado encima del icono del cuadro de dilogo.

Pgina 74

Analizando las propiedades, vemos que tiene gran cantidad de ellas. Esto es porque agrupa todas las propiedades correspondientes a la cinco funciones que puede desarrollar. Se detalla a continuacin la forma de usar el CommonDialog para cada aplicacin. Se entiende que el nombre - Name - que se ha puesto para el cuadro de dilogo en todos los ejemplos es CD1) FUENTES Para mostrar el cuadro de dilogo correspondiente a Tipos de Letra ( Fonts ), debe ejecutarse la instruccin: CD1.ShowFont y haber puesto, en la propiedad Flags del cuadro de dilogo, el valor de 1, 2 3, correspondiente respectivamente a los tipos de letra de la pantalla, de la impresora o ambos. (Vase la propiedad Flags mas adelante) Si no pone uno de estos valores, le dir que no tiene fuentes instaladas. El cuadro de dilogo que se presenta es el siguiente:

Los valores que se pueden obtener de este cuadro de dialogo son: CD1.FontName Indica el nombre de la fuente CD1.FontSize Indica el tamao de la fuente CD1.Color Indica el color de la fuente (Abrir con Flags=256+1, 2 3) CD1.FontBold = (True / False) Si es True, se ha elegido "Negrita" CD1.FontItalic = (True / False) Si es True, se ha elegido "Cursiva" CD1.FontStrikethru = (True / False) Si es True, se ha elegido "Tachada " CD1.FontUnderline = (True / False) Si es True, se ha elegido "Subrayada" Si se elige una versin Negrita Cursiva seran True las opciones FontBold y FontItalic El objeto Font no puede aplicarse al CommonDialog. Es decir, no podemos poner : Variable = CD1.Font.Size sino Variable = CD1.Fontsize

En el ejemplo que acompaa a este captulo, puede ver como se introducen las caractersticas Pgina 75

de una determinada fuente elegida en un cuadro de texto.

Pgina 76

COLOR Para mostrar el cuadro de dilogo correspondiente al color, se deber ejecutar la instruccin: CD1.ShowColor El cuadro de dilogo presentado tiene esta forma:

(La parte derecha del cuadro puede no salir. Depende del valor de la propiedad Flags. Se saca haciendo click en Definir colores personalizados, si est activado. Tambin depende de la propiedad Flags) El nmero correspondiente al color elegido se puede conocer analizando la propiedad color de cuadro de dilogo. En nuestro ejemplo, lo obtendramos con Variablecolor = CD1.Color donde Variablecolor contendr un nmero correspondiente al color elegido. Nota acerca del nmero del color. Para establecer un color por medio de cdigo, se pondr un valor de color a la propiedad correspondiente de ese objeto. El valor del color puede establecerse de tres formas que se comentan a continuacin. Colores en Visual Basic. Visual Basic acepta para especificar un color, tres procedimientos: Mediante el nmero de color, mediante la sentencia RGB ( rojo, verde, azul ) o mediante la funcin QBColor. Por nmero El nmero que representa el color en VB est formado por la suma de la componente roja, la componente verde y la componente azul. Podramos verlo muy bien en numeracin

Pgina 77

Hexadecimal: Color = Hex XX YY ZZ Donde ZZ es un nmero Hexadecimal que representa la cantidad del color rojo. El mnimo estara en 0 (H00) y el mximo en 255 (HFF) YY representara la cantidad de color verde y XX la de color azul, ambos con los mismos lmites explicados para el rojo. Por ejemplo: el rojo puro sera: el verde puro sera: el azul puro sera: Hex(0000FF) = 255 Hex(00FF00) = 652280 Hex(FF0000) = 16711680

Una mezcla de un poco de rojo (HB1), otro poco de verde (H56) y otro poco de azul (H1F) dara el siguiente nmero: Hex(1F56B1) = 2053809 El nmero de color puede estar comprendido entre 0 (correspondiente al negro) y el 16777215 (correspondiente al blanco. Observe que esa cantidad, 16.777.215 (FFFFFF en hexadecimal) corresponde a los famosos 16 millones de colores de las tarjetas grficas. Si queremos poner el color de fondo a un control Label, usaremos la propiedad Backcolor. Si el Label se llama Label1, pondramos la instruccin Label1.Backcolor = 12345678 Por la sentencia RGB Se puede expresar el color, poniendo simplemente RGB (rojo, verde, azul), donde rojo es un nmero entre 0 y 255 que indica la cantidad de color rojo que se aporta al color, verde un nmero comprendido entre 0 y 255 indicando la cantidad de verde, y lo mismo para azul. Esta es la forma mas sencilla de poner la propiedad color, y con la que mejor controlaremos el mismo. Si queremos poner al Label anterior un color mediante la sentencia RGB, ejecutaramos la sentencia : Label1.Backcolor = RGB (128, 30, 100) Mediante la Funcin QBColor Esta funcin se ha puesto en Visual Basic para compatibilidad con los colores que se usan en Quick-Basic y Qbasic. Mediante esta funcin se obtienen solamente 16 colores. Sintaxis Objeto.QBColor(color)

El argumento color es un nmero entero entre 0 a 15, segn la siguiente lista: Nmero 0 1 2 3 Color 8 9 10 11 Nmero Color

Negro Azul Verde Aguamarina

Gris Azul claro Verde claro Aguamarina claro

Pgina 78

4 5 6 7

Rojo Fucsia Amarillo Blanco

12 13 14 15

Rojo claro Fucsia claro Amarillo claro Blanco brillante

Para el mismo Label anterior, usaramos la sentencia : Label1.Backcolor = QBColor (12) Fin de la nota acerca del nmero del color

IMPRESORAS Nota: Si utiliza un CommonDialog para impresoras y otras aplicaciones, puede tener problemas. Utilice un CommonDialog exclusivamente para impresoras. Para presentar el cuadro de eleccin de impresora, ejecute la instruccin: CD2.ShowPrinter (A este cuadro de dialogo le hemos llamado CD2 para evitar los problemas referidos en la nota). Aparecer el siguiente cuadro de dilogo:

La impresora elegida puede conocerla llamando a la propiedad DeviceName de un objeto que an no hemos visto: el objeto Printer. Este objeto es el encargado de pasar al Administrador de Impresin todos los trabajos de impresin que generen las aplicaciones Visual Basic: Nombredelaimpresora = Printer.DeviceName Para que la impresora quede como impresora por defecto de Windows, debe tener a True la propiedad PrinterDefault del cuadro de dilogo. En este cuadro puede observarse, que adems de los botones de ACEPTAR y CANCELAR, existe otro, INSTALAR. Haciendo click en este, podemos cambiar la impresora por cualquier otra que tenga instalada.

Pgina 79

ABRIR Y GUARDAR ARCHIVOS Posiblemente las opciones mas usadas del cuadro de dilogo. Para presentar el cuadro de dilogo correspondiente a Abrir Archivo, debe ejecutar la instruccin: CD1.ShowOpen Si lo que necesita es abrir el cuadro de dilogo para guardar un fichero, debe ejecutar la instruccin : CD1.ShowSave pero antes deber introducir el filtro o filtros de archivos que necesite. Ojo, ANTES ! Un filtro sirve para que en el cuadro de dilogo se presenten solamente los ficheros de nuestro inters. Se pueden seleccionar por el nombre, la extensin o las dos cosas. La sintaxis para introducir un filtro es la siguiente: CD1.Filter = "Descripcin del fichero|nombre.extensin" donde "nombre" puede ser un nombre o usar caracteres comodn. Lo mismo para "extensin" Por ejemplo, para buscar archivos ejecutables, con cualquier nombre y extensin .EXE CD1.Filter = "Ficheros ejecutables |*.exe" Observe el carcter separador entre la descripcin de los ficheros (Ficheros ejecutables) y el parmetro de busca (*.EXE). No ponga ningn espacio entre el separador y los caracteres de busca. El separador es el carcter ASCII 124. Puede buscar varios tipos de ficheros, separando los caracteres de busca por medio del carcter punto y coma (;) CD1.Filter = "Ficheros ejecutables |*.EXE;*.COM;*.BAT" Puede tambin introducir dos filtros, separados por el separador | (En una lnea solamente). CD1.Filter=Ficheros de un tipo |*.EXE |Ficheros de otro |*.COM |Otros ficheros |*.BAT Por ejemplo : CD1.Filter = "Ficheros Word |*.DOC|Ficheros Write |*.WRI"

No se pueden poner dos lneas con filtros, se quedara solamente con la ltima ! En este caso, cuando se presente el cuadro de dilogo, solamente presentar uno de los filtros, y deber seleccionar manualmente el otro en un cuadro situado en la parte inferior izquierda del cuadro de dilogo. Para predeterminar cul de los dos filtros saldr sin tener que seleccionarlo, deber ejecutar esta instruccin, ANTES de invocar el cuadro de dilogo CD1.FilterIndex = 2 En este caso, aparecer por defecto el filtro escrito en segundo lugar. El orden de los filtros comienza por 1. El cuadro de dilogo deber presentar un directorio. Este directorio con el que, por defecto, aparece el cuadro de dilogo, se puede introducir mediante la propiedad InitDir, que deber contener el nombre del directorio y su path. Si no se especifica, comenzar por el directorio actual.

Pgina 80

Para conocer el nombre del fichero elegido, se emplea la propiedad FileName : Nombrefichero= CD1.filename El nombre del fichero, Nombrefichero en la sentencia anterior, viene con su path, es decir, nombre y direccin completa, por lo que puede emplearse directamente la salida del CommonDialog para abrir un fichero. El cuadro de dilogo de abrir o cerrar tiene esta forma :

El cuadro de guardar es similar. Observe que en este caso hemos desplegado la segunda opcin de filtro de ficheros :

Como ve ambos cuadros son prcticamente iguales. Solamente se difieren en que uno pone Abrir y el otro Guardar como en su barra de ttulo. Tambin en que el cuadro Guardar como presenta los nombres de los ficheros con un tono apagado. Funcionalmente difieren. Por ejemplo, si quiere guardar un fichero con un nombre ya existente, y dependiendo de la Pgina 81

propiedad Flags que ver mas adelante, le aparecer la siguiente advertencia :

Si desea otra leyenda en la barra de ttulo, puede cambiarla usando el asistente de propiedades, que lo obtendr colocando el cursor del ratn sobre el icono del CommonDialog y pulsando el botn derecho. Haga click sobre Propiedades en el popmen que se presenta. Aparecer esto :

PRESENTAR AYUDAS Mediante el CommonDialog se puede presentar un fichero de ayuda. (Ficheros del tipo .HLP de Windows) Pese a que se pueden presentar estos ficheros basndonos en el CommonDialog, es preferible usar directamente el programa WinHelp.Exe, que puede ejecutarlo mediante la funcin Shell : VariableID = Shell (WinHelp.Exe FicheroAyuda.hlp,1) Para mostrar el fichero de ayuda debe poner el nombre (y Path) del fichero de ayuda en la propiedad HelpFile del CommonDialog

Pgina 82

CD1.HelpFile = "C:\MiCarpeta\MiFicheroAyuda.HLP" Puede mostrar el ndice, o una pgina concreta de ese fichero. Para ello debe jugar con la propiedad HelpCommand, que le va a indicar al CommonDialog qu ayuda debe mostrar. CD1.HelpCommand =Valor Las opciones para valor son: 1 &H1 cdlContext Muestra la Ayuda de un contexto determinado. Cuando se usa esta valor, tambin se debe especificar un contexto con la propiedad HelpContext. &H2 cdlQuit Notifica a la aplicacin Ayuda que el archivo de Ayuda especificado ya no se est utilizando. &H3 cdlContents Muestra el tema de contenido de ayuda, definido con la opcin Contents de la seccin [OPTION] del archivo .HPJ. &H3 cdlIndex Muestra el ndice del archivo de Ayuda especificado. Las aplicaciones slo deben utilizar este valor para un archivo de Ayuda con ndice nico. &H4 cdlHelpOnHelp Muestra la Ayuda para utilizar la propia aplicacin Ayuda. &H5 cdlSetContents Determina el tema de contenido a mostrar cuando el usuario presiona la tecla F1. &H5 cdlSetIndex Establece el contexto especificado en la propiedad HelpContext como ndice actual para el archivo especificado en la propiedad HelpFile. Este ndice seguir siendo el actual hasta que el usuario acceda a un archivo de Ayuda distinto. Utilice este valor slo para los archivos de Ayuda con ms de un ndice. &H8 cdlContextPopup Muestra en una ventana emergente un tema de Ayuda determinado, identificado por un nmero de contexto definido en la seccin [MAP] del archivo .HPJ. &H9 cdlForceFile Asegura que WinHelp muestre el archivo de Ayuda correcto. Si se muestra el archivo correcto, no sucede nada. Si se muestra un archivo incorrecto, WinHelp abrir el correcto. &H101 cdlKey Muestra la Ayuda sobre una palabra reservada determinada. Al usar esta opcin, deber especificar tambin una palabra reservada con la propiedad HelpKey. &H102 cdlCommand Ejecuta una macro de Ayuda. &H105 cdlPartialKey Muestra el tema de la lista de palabras claves que coincide con la palabra pasada en el parmetro dwData, si slo se encuentra uno. Si se encuentra ms de uno, aparecer el cuadro de dilogo Buscar mostrando los temas encontrados en el cuadro de lista Ir a. Si no se encuentra ninguno, se mostrar el cuadro de dilogo Buscar. Para que aparezca el cuadro de dilogo Buscar sin pasar una palabra reservada, utilice un puntero largo a una cadena vaca.

4 5 5

257

258 261

Si queremos que se muestre el ndice de la ayuda, pondramos esta propiedad de la forma : CD1.HelpCommand = cdlHelpIndex Para mostrar la pgina que se ha puesto en el fichero de ayuda como Contexto 2 (En Seccin [MAP] del fichero .HPJ (Vea Creacin de Ficheros de Ayuda),

Pgina 83

CD1.HelpCommand = cdlHelpContext CD1.HelpContext = 2 Para mostrar la Ayuda de la Ayuda de Windows : CD1.HelpCommand = cdlHelpHelpOnHelp Una vez establecidas estas propiedades, mostraremos la ayuda con el Mtodo ShowHelp CD1.ShowHelp Repitindole que no se debe usar el CommonDialog para mostrar ayudas, pero para cumplir el objetivo de plasmar en este texto la mayor informacin acerca de cada control, se enumeran a continuacin el resto de propiedades que afectan a la presentacin de ayuda : HelpFile HelpContext HelpKey

PROPIEDADES DEL CommonDialog La Propiedad Action La propiedad Action se incluye en la versin 4 de VB solamente por motivos de compatibilidad con anteriores versiones. Realiza las mismas funciones que ShowFont, ShowColor, ShowPrinter, ShowOpen y ShowSave. No debe usarse esta propiedad, sino los equivalentes citados, en previsin de que pueda ser eliminada en futuras versiones. La sintaxis de Action es : Valor 0 1 2 3 4 5 6 Descripcin Ninguna accin. Muestra el cuadro de dilogo Abrir. Muestra el cuadro de dilogo Guardar como. Muestra el cuadro de dilogo Color. Muestra el cuadro de dilogo Fuente. Muestra el cuadro de dilogo Impresora. Ejecuta WINHELP.EXE. Nombre.Action [= valor]

NO utilice la propiedad Action. Utilice en su lugar ShowFont, ShowPrinter, ShowSave, ShowOpen , ShowColor y ShowHelp CancelError Devuelve o establece un valor que indica si se genera un error cuando el usuario elige el botn Cancelar. Sintaxis : True False objeto.CancelError = (True / False)

Se genera un error. (Predeterminado) No se genera ningn error.

Pgina 84

Cuando se establece True en esta propiedad, se producir el error nmero 32755 (cdlCancel) cada vez que el usuario elija el botn Cancelar. Debe poner esta propiedad a true cuando quiera detectar que se ha pulsado el botn CANCELAR. Luego, debe detectar con la rutina de deteccin de errores adecuada, si el error producido ha sido el 32755. De ser as, es que han pulsado ese botn, y Vd. proceder en consecuencia. Color Esta propiedad es de lectura / escritura De escritura :Establece el color predeterminado con que aparecer el CD para elegir color. Puede introducirse como RGB o numricamente, como se explic mas atrs. Para que aparezca este color predeterminado, debe poner la propiedad Flags a 1. De lectura : Entrega el color elegido, bien en el cuadro de eleccin de color, bien en el cuadro de eleccin de fuente. Copies Establece el valor predeterminado para nmero de copias que aparecer en el CD cuando se abra para elegir impresora. DefaultExt Devuelve o establece la extensin de archivo predeterminada para el cuadro de dilogo. Sintaxis objeto.DefaultExt [= cadena]

Puede utilizar esta propiedad para especificar una extensin de archivo predeterminada, como por ejemplo .TXT o .DOC. Importante para el CommonDialog de Guardar: Cuando se guarde un archivo sin extensin, se le agregar automticamente la especificada en esta propiedad. DialogTitle Devuelve o establece la cadena mostrada en la barra de ttulo del cuadro de dilogo. Sintaxis Nombre.DialogTitle [= ttulo]

Esta propiedad puede introducirse en la ventana de propiedades, o por programa. Puede utilizar esa propiedad para mostrar el nombre del cuadro de dilogo en la barra de ttulo. Nota El control CommonDialog ignora el valor de la propiedad DialogTitle cuando muestra los cuadros de dilogo Color o Fuente. El ttulo predeterminado para un cuadro de dilogo Abrir es Abrir, y para un cuadro de dilogo Guardar como es Guardar como. FileName Devuelve o establece la ruta y el nombre de archivo de un archivo seleccionado. La lectura de esta propiedad devuelve el nombre del archivo seleccionado actualmente en la lista. Si no hay ningn archivo seleccionado, FileName devuelve una cadena vaca. Filter (Explicada mas atrs) Devuelve o establece los filtros que aparecen en el cuadro de lista Tipo de un cuadro de dilogo.

Pgina 85

Sintaxis

CD1.Filter [= descripcin1 |filtro1 |descripcin2 |filtro2...]

Utilice el smbolo de canalizacin ( | , (ASCII 124) ) para separar los valores de descripcin y de filtro. No incluya espacios antes ni despus del smbolo de canalizacin, pues apareceran en los valores de descripcin y valor. Al especificar ms de un filtro en un cuadro de dilogo, utilice la propiedad FilterIndex para especificar el filtro predeterminado. Nota para los que no tiene teclado de 102 teclas. Para obtener el carcter ASCII 124, pulse la tecla ALT y, sin dejar de pulsarla, teclee 124 en el teclado numrico. FilterIndex Devuelve o establece un filtro predeterminado para un cuadro de dilogo Abrir o Guardar Como. Sintaxis CD1.FilterIndex [= nmero]

Esta propiedad indica el filtro predeterminado cuando se han especificado varios filtros para un cuadro de dilogo Abrir o Guardar. El ndice del primer filtro definido es 1. Flags Propiedad que tiene distintos significados para cada tipo de cuadro de dilogo. Tiene la misma sintaxis para todos los cuadros. Sintaxis CD1.Flags [= valor]

El parmetro valor establece distintas alternativas, dependiendo de cada cuadro.

Para el cuadro de dilogo Color Las opciones para valor son:

&H1& cdlRGBInit Establece como valor de color inicial para el cuadro de dilogo el indicado en su propiedad Color. &H2& cdlFullOpen Hace que el cuadro de dilogo se muestre completo al crearlo, incluyendo la seccin que permite al usuario crear colores personalizados. Sin esta opcin, el usuario debe elegir el botn de comando Definir colores personalizados para mostrar tal seccin. &H4& cdlPreventFullOpen Desactiva el botn de comando Definir colores personalizados, evitando que el usuario defina colores. &H8& cdlShowHelp Hace que el cuadro de dilogo muestre un botn Ayuda.

Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. Para los cuadros Abrir y Guardar

Pgina 86

Las opciones para valor son: 1 &H1& cdlReadOnly Hace que la casilla de verificacin Slo lectura aparezca marcada inicialmente al crear el cuadro de dilogo. Este indicador tambin seala el estado de la casilla Slo lectura cuando el cuadro de dilogo est cerrado. 2 &H2& cdlOverwritePrompt Hace que el cuadro de dilogo Guardar como genere un cuadro de mensaje si el archivo seleccionado ya existe. El usuario deber confirmar que desea sobrescribir el archivo. 4 &H4& cdlHideReadOnly Oculta la casilla de verificacin Slo lectura. 8 &H8& cdlNoChangeDir Hace que el cuadro de dilogo restablezca como directorio actual el que lo era en el momento de abrirse. 16 &H10& cdlShowHelp Hace que el cuadro de dilogo muestre el botn Ayuda. 256 &H100& cdlNoValidate Especifica que el cuadro de dilogo comn permita caracteres no vlidos en el nombre de archivo devuelto. Funciona tanto con el cuadro de Abrir como con el de Cerrar. Tenga cuidado a la hora de crear un archivo con nombre no vlido ! 512 &H200& cdlAllowMultiselect Especifica que el cuadro de lista Nombre de archivo admita selecciones mltiples. El usuario puede seleccionar ms de un archivo en tiempo de ejecucin presionando la tecla MAYS y utilizando las teclas FLECHA ARRIBA y FLECHA ABAJO para seleccionar los archivos deseados. Al hacerlo, la propiedad FileName devolver una cadena con los nombres de todos los archivos seleccionados. Los nombres estn delimitados en la cadena con espacios. 1024 &H400& cdlExtensionDifferent Indica que la extensin del nombre de archivo devuelto es distinta de la especificada en la propiedad DefaultExt. Este indicador no estar activado si la propiedad DefaultExt es Null, si las extensiones coinciden, o si el archivo no tiene extensin. El valor de este indicador puede comprobarse al cerrar el cuadro de dilogo. 2048 &H800& cdlPathMustExist Especifica que el usuario slo pueda introducir una ruta de acceso vlida. Si se establece este indicador y el usuario introduce una ruta no vlida, aparecer un mensaje de advertencia. 4096 &H1000& cdlFileMustExist Especifica, para el cuadro de Abrir, que el usuario slo pueda escribir en el cuadro de texto Nombre de archivo nombres de archivos existentes. Si este indicador est activado y el usuario introduce un nombre de archivo no vlido, aparecer una advertencia. Este indicador activa automticamente cdlPathMustExist. 8192 &H2000& cdlCreatePrompt Especifica, para el cuadro de dilogo de abrir, que si no existe el fichero consulte al usuario antes de crear un archivo que no existe actualmente. Esta advertencia dice : Este Archivo no existe desea crearlo ? y aparecen los botones de ACEPTAR y CANCELAR. Si el usuario pulsa aceptar el CommonDialog se cierra normalmente, si se le pulsa CANCELAR desaparece esta advertencia y el CommonDialog espera a que se le escriba o seleccione otro fichero. Este indicador establece automticamente los indicadores cdlPathMustExist y cdlFileMustExist. 16384 &H4000& cdlShareAware Especifica que se ignoren los errores al compartir archivos. 32768 &H8000& cdlNoReadOnlyReturn Especifica que el archivo devuelto no tenga el atributo de Slo lectura ni est en un directorio protegido contra escritura. Presenta un aviso (tanto en el cuadro de abrir

Pgina 87

como en el cerrar) que impide elegir un fichero de estas caractersticas. Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. Para el cuadro Mostrar Fuentes: Las opciones para valor son: 1 &H1& cdlScreenFonts Hace que el cuadro de dilogo muestre solamente las fuentes de pantalla que admite el sistema. &H2& cdlPrinterFonts Hace que el cuadro de dilogo muestre solamente las fuentes que admite la impresora, especificadas por la propiedad hDC. &H3& cdlBoth Hace que el cuadro de dilogo muestre las fuentes de impresora y de pantalla disponibles. La propiedad hDC identifica el contexto de dispositivo asociado a la impresora &H4& cdlShowHelp Hace que el cuadro de dilogo muestre un botn Ayuda. &H100& cdlEffects Especifica que el cuadro de dilogo permita efectos de tachado, subrayado y color. &H400& cdlANSIOnly Especifica que el cuadro de dilogo slo permita seleccionar las fuentes que utilizan el juego de caracteres de Windows. Si se establece este indicador, el usuario no podr seleccionar una fuente que slo contenga smbolos. &H800& cdlNoVectorFonts Especifica que el cuadro de dilogo no permita seleccionar fuentes vectoriales. &H1000& cdlNoSimulations Especifica que el cuadro de dilogo no permita simulaciones de fuente de interfaz de dispositivo grfico (GDI). &H2000& cdlLimitSize Especifica que el cuadro de dilogo seleccione slo los tamaos de fuente comprendidos en el rango especificado por las propiedades Min y Max.

4 256 1024

2048

4096

8192

16384 &H4000& cdlFixedPitchOnly Especifica que el cuadro de dilogo seleccione slo fuentes de espaciado fijo. 32768 &H8000& cdlWYSIWYG Especifica que el cuadro de dilogo permita seleccionar solamente fuentes disponibles al la vez en la pantalla y en la impresora. Si se establece este indicador, tambin deben establecerse cdlBoth (sume 3 a este nmero) y cdlScalableOnly (sume 131072 a este nmero) 65536 &H10000& cdlForceFontExist Especifica que aparezca un cuadro de mensaje cuando el usuario intente seleccionar una fuente o un estilo que no existan. 131072 &H20000& cdlScalableOnly Especifica que el cuadro de dilogo permita seleccionar solamente fuentes escalables. 262144 &H40000& cdlTTOnly Especifica que el cuadro de dilogo permita seleccionar solamente fuentes TrueType.

Pgina 88

Nota Antes de mostrar el cuadro de dilogo Fuentes, debe establecer cdlScreenFonts, cdlPrinterFonts o cdlBoth en la propiedad Flags. En caso contrario, se producir el error No hay fuentes. (O dicho de otra forma, Flags=1, 2 3) Se pueden poner varias de estas condiciones, poniendo como valor Flags la suma de los valores de cada una de las condiciones a poner. Para el Cuadro de Dilogo Imprimir (Observar seguramente que lo que se describe a continuacin no se cumple siempre. Depende de las impresoras que tenga Vd. instaladas) Las opciones para valor son: 0 1 &H0& cdlAllPages Devuelve o establece el estado del botn de opcin Todas las pginas. &H1& cdlSelection Devuelve o establece el estado del botn de opcin Seleccin. Si no se especifica cdlPageNums ni cdlSelection, el botn de opcin Todas estar seleccionado. &H2& cdlPageNums Devuelve o establece el estado del botn de opcin Pginas. &H4& cdlNoSelection Desactiva el botn de opcin Seleccin. &H8& cdlNoPageNums Desactiva el botn de opcin Pginas y el control de edicin asociado. &H10& cdlCollate Devuelve o establece el estado de la casilla de verificacin Intercalar. &H20& cdlPrintToFile Devuelve o establece el estado de la casilla de verificacin Imprimir a un archivo. &H40& cdlPrintSetup Hace que el sistema muestre el cuadro de dilogo Configurar impresora en lugar de Imprimir. Use este Flag cuando lo que desea es cambiar la impresora predeterminada. &H80& cdlNoWarning Evita que aparezca una advertencia cuando no hay una impresora predeterminada.

2 4 8 16 32

64

128

256

&H100& cdlReturnDC Devuelve un contexto de dispositivo para la impresora seleccionada en el cuadro de dilogo. El contexto se devuelve en la propiedad hDC del cuadro de dilogo. 512 &H200& cdlReturnIC Devuelve un contexto de informacin para la impresora seleccionada en el cuadro de dilogo. Un contexto de informacin proporciona un mtodo rpido de obtener informacin sobre el dispositivo sin crear un contexto de dispositivo. El contexto de informacin se devuelve en la propiedad hDC del cuadro de dilogo. 2048 &H800& cdlShowHelp Hace que el cuadro de dilogo muestre el botn Ayuda 262144 &H40000& cdlUseDevModeCopies Si un controlador de impresora no admite copias mltiples, al establecer este indicador se desactiva el control de edicin de nmero de copias. Si el controlador s admite mltiples copias, al establecer este indicador el cuadro de dilogo almacenar el nmero de copias solicitado en la propiedad Copies.

Pgina 89

524288 1048576

&H80000& cdlDisablePrintToFile Desactiva la casilla de verificacin Imprimir a un archivo. &H100000& cdlHidePrintToFile Oculta la casilla de verificacin Imprimir a un archivo.

Propiedades que afectan al tipo de letra. Las seis propiedades siguientes nos dan las caractersticas especiales de la fuente elegida (negrita, cursiva, etc.). Una vez seleccionado el tipo de letra, el valor de estas propiedades contiene la opcin elegida para la letra (si FontBold=True es que hemos elegido negrita, etc.) FontBold Propiedad Booleana que establece o devuelve que el tipo de letra usado es Negrita. Sintaxis Variable = CD1.FontBold

Los valores de Variable son: True Se ha elegido negrita False (Predeterminado) No se ha elegido negrita.

FontItalic Propiedad Booleana que establece o devuelve que el tipo de letra usado es Cursiva. Sintaxis Variable = CD1. FontItalic

Los valores de Variable son: True si se ha elegido cursiva, False (Predeterminado) en caso contrario. FontStrikethru Propiedad Booleana que establece o devuelve que el tipo de letra usado es Tachada. Sintaxis Variable = CD1. FontStrikethru

Los valores de Variable son: True si se ha elegido tachado, False (Predeterminado) en caso contrario. FontUnderline Propiedad Booleana que establece o devuelve que el tipo de letra usado es Subrayado. Sintaxis Variable = CD1.FontUnderline

Los valores de Variable son: True, si se ha elegido subrayado, False FontName Devuelve el nombre de la fuente elegida. Es una variable tipo String Sintaxis Variable = CD1.FontName (Predeterminado) en caso contrario

(Variable toma el valor del nombre de la fuente. Por ejemplo, Variable = Arial

Pgina 90

En general, deber modificar FontName antes de establecer los atributos de tamao y estilo con las propiedades FontSize, FontBold, FontItalic, FontStrikethru y FontUnderline. Nota En tiempo de ejecucin puede obtener informacin sobre las fuentes disponibles a travs de las propiedades FontCount y Fonts. Lo ver mas adelante FontSize Devuelve de la fuente elegida. Debe ser una variable tipo Integer o Long Sintaxis Variable = CD1.FontSize

donde Variable ser una expresin numrica que especifica el tamao de fuente a utilizar, en puntos. Nota Las fuentes disponibles en Visual Basic varan dependiendo de la configuracin del sistema y de los dispositivos de presentacin e impresin. En las propiedades relacionadas con las fuentes slo pueden establecerse valores para los que exista una fuente. En general, deber modificar FontName antes de establecer los atributos de tamao y estilo con las propiedades FontSize, FontBold, FontItalic, FontStrikethru y FontUnderline. Sin embargo, cuando especifique un tamao inferior a 8 puntos para una fuente TrueType, primero deber establecer el tamao en puntos con la propiedad FontSize, luego especificar la propiedad FontName y despus establecer de nuevo el tamao con FontSize. El entorno operativo Microsoft Windows utiliza una fuente distinta para las fuentes TrueType con un tamao inferior a 8 puntos.

Index Igual que el ya estudiado para otros controles. InitDir Devuelve o establece el directorio de archivos inicial. Sintaxis objeto.InitDir [= cadena]

La sintaxis de la propiedad InitDir consta de las siguientes partes: objeto Nombre que define al CommonDialog cadena Expresin de cadena que especifica el directorio de archivos inicial. Si no se especifica esta propiedad, se utilizar el directorio actual. Left y Top Estas propiedades solamente afectan a la colocacin del icono en el formulario. No afectan a la colocacin del CommonDialog durante la ejecucin. La posicin del CommonDialog en tiempo de ejecucin no puede controlarse. Esta afirmacin de que la posicin del CommonDialog no es controlable es vlida para sistemas a 32 bytes. En VB 4 de 16 bits, el CommonDialog aparece aproximadamente en la parte superior izquierda del formulario que lo contiene. Algunos programadores han optado por poner un formulario para contener solamente al CommonDialog, y as,

Pgina 91

controlando la posicin de ese formulario, poder controlar la posicin (aproximada) en la que aparece el CD. Esto no ocurre para sistemas a 32 bytes, en los que el CD aparece siempre en la parte superior izquierda de la pantalla, independientemente de donde est el formulario que lo contiene.

MaxFileSize Devuelve o establece el tamao mximo del nombre de archivo abierto con el control CommonDialog. Sintaxis objeto.MaxFileSize [= valor]

La sintaxis de la propiedad MaxFileSize consta de las siguientes partes: objeto = Nombre que define al CommonDialog valor = Nmero entero que especifica el tamao mximo del nombre de archivo en bytes. El rango de esta propiedad es 132KB. El valor predeterminado es 256. Name Nombre que define al CommonDialog PrinterDefault Devuelve o establece una opcin que determina si la configuracin elegida por el usuario en el cuadro de dilogo Imprimir se utiliza para modificar la configuracin predeterminada de impresora del sistema. Sintaxis objeto.PrinterDefault [= valor]

objeto = Nombre que define al CommonDialog valor = Expresin booleana que especifica si lo seleccionado por el usuario se utiliza para modificar la configuracin de impresora predeterminada del sistema, segn se indica en Configuracin. Las opciones para valor son: True Las opciones que elija el usuario en el apartado Configurar del cuadro de dilogo Imprimir (seleccin de la impresora, orientacin, etctera) se utilizan para modificar la configuracin de impresora en el archivo WIN.INI del usuario. (En el sistema operativo Windows NT, esta informacin se almacena en el Registro). False Las opciones que elija el usuario no se utilizan para modificar la configuracin de impresora predeterminada del sistema. Utilice esta propiedad, que por defecto est a True, para poner o no poner como impresora predeterminada, la impresora seleccionada con el CommonDialog. Puede por ejemplo, querer imprimir un texto en una impresora determinada, pero solo ese texto, y no quiere cambiar la impresora predeterminada por el hecho de haber seleccionado en este momento otra impresora. Ponga esta propiedad a False (recuerde que por defecto est a True) para que la impresora seleccionada no se quede como impresora por defecto. Tag Lo mismo que se ha explicado para otros controles.

Pgina 92

FIN del tercer captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 93

Visual Basic - Gua del Estudiante Cap. 4


CONTROLES PARA MOSTRAR IMAGENES _____________________________________ Una imagen representa una figura, bien natural (tipo fotografa) o sinttica. Para presentar una imagen es necesario hacerlo sobre un objeto que la admita. Los objetos que admiten una imagen son: Formularios PictureBox Image

Existen mas controles grficos que se irn viendo a lo largo del curso. Estos tres son los mas usados y con los que comenzaremos a trabajar. Para mostrar una imagen en cualquiera de estos objetos, es necesario especificarlo en su propiedad Picture. La forma de especificarle al objeto la imagen que debe presentar puede hacerse de dos formas: En la caja de propiedades, si no se va a variar la imagen durante la aplicacin. Mediante una instruccin para cambiar esta propiedad. La instruccin es la siguiente: Nombreobjeto.Picture = LoadPicture (Path, Fichero) Por ejemplo, si tenemos un formulario llamado Form1 y queremos rellenarlo con una imagen contenida en el fichero de Windows metafile DOLLAR.WMF que se encuentra en el directorio C:\VB\METAFILE\BUSINESS, deberemos ejecutar la instruccin: Form1.Picture = LoadPicture (C:\VB\METAFILE\BUSINESS\DOLLAR.WMF)

Para "descargar" esa imagen de ese formulario, basta con ejecutar la misma instruccin sin fichero alguno: Form1.Picture = LoadPicture ( ) Tambin pueden tomar la imagen desde otro control de imagen, mediante un procedimiento de Intercambio Dinmico de Datos (DDE) (Solo el PictureBox) Puede tambin meter una imagen en una variable, y luego poner en uno de los controles citados anteriormente la imagen guardada en la variable. Este mtodo es muy rpido, ya que no necesita acceder al disco para buscar una imagen, pero emplea mucha memoria RAM, ya que la variable )o variables conteniendo la(s) imgenes estn en la RAM. Para ello debemos declarar una o varias variables tipo Picture, y meter en ellas una imagen mediante el mtodo LoadPicture. Vea en el capitulo 7 (Mtodos Grficos - Mtodo LoadPicture) un ejemplo muy ilustrativo. EL FORMULARIO Ya hemos visto lo que es el Formulario. Simplemente podemos aadir a lo ya dicho, que un formulario tiene la propiedad Picture, con lo que podemos poner como fondo un bit-map, un fichero de icono ( .ICO) o un Metarchivo (.WMF). Un fondo grfico sobre el Formulario puede convertir una aplicacin de buena a excelente. No intente nunca mejorar una aplicacin mediocre con un fondo artstico en un Formulario. CONTROL PICTURE BOX

Pgina 94

Este objeto se encuentra en la caja de herramientas estndar:

Este objeto permite presentar todo tipo de ficheros grficos (.BMP, WMF, .ICO, .CUR) Las dimensiones del PictureBox se establecen en el diseo o mediante programa, variando las propiedades Height y Width. Tambin puede cambiarse su posicin mediante las propiedades Top y Left. Dispone de una propiedad, Align que permite colocarlo adosado a uno de los lados del formulario que lo contiene. El Control PictureBox puede ser destino de los datos de un enlace DDE. (Los datos sern, lgicamente, grficos. Por ello, tiene las propiedades LinkMode, LinkItem, LinkTimeout y LinkTopic. Tambin puede tomar el dato del grfico de una Base de Datos. (A travs de un control Data o un objeto Recordset) Las propiedades de un PictureBox son: Align ClipControls DrawWidth ForeColor LinkMode Negotiate ScaleWidth WhatThisHelp Appearance DataField Enabled Height LinkTimeout Picture TabIndex Width Autoredraw Autosize DataSource DragIcon FillColor FiilStyle HelpContextID Index LinkTopic MouseIcon ScaleHeight ScaleLeft TabStop Tag Backcolor DragMode Font Left MousePointer ScaleMode Top BorderStyle DrawStile Fontransparent LinkItem Name ScaleTop Visible

Un PictureBox puede disponer de los siguientes procedimientos : Click KeyDown Change KeyPress DblClick DragDrop DragOver GotFocus

CONTROL IMAGE Este control se encuentra en la caja de herramientas estndar:

Este control permite presentar todo tipo de ficheros grficos (.BMP, WMF, .ICO, .CUR) El control Image no puede ser destino de una comunicacin DDE. Puede tomar la imagen de una base de datos, bien a travs de un control Data o a travs de un objeto Recordset.

Pgina 95

El control Image utiliza menos recursos del sistema y repinta con ms rapidez que un control PictureBox, pero slo admite una parte de las propiedades, los eventos y los mtodos de PictureBox. Use la propiedad Stretch para determinar si el grfico se escala para que se ajuste al control o viceversa. Poniendo esta propiedad a True el grfico se adaptar a las dimensiones del control Image. Si se pone a False, el control Image tomar las medidas del grfico que contenga. Si el grfico es un bit-map (Fichero .BMP), con la propiedad Stretch a True podemos variar el tamao del bit-map, variando las propiedades Width y Height del control Image, propiedades que se pueden cambiar en tiempo de ejecucin. Si esta propiedad est a False, el tamao del bit-map no cambiar, presentndose solamente una porcin del bit-map, caso que el control Image sea menor que el tamao del bit-map, o sobrar espacio en el control, en caso contrario. Aunque puede colocar un control Image en un contenedor, un control Image no puede actuar como contenedor. Esto se entiende mejor con un ejemplo. Prepare un formulario con un PictureBox y con un control Image. Introduzca dos OptionButton en cada uno de ellos, y otro en otra parte del formulario, fuera de ambos. Ejecute la aplicacin. Los OptionButton colocados dentro del PictureBox se comportan entre ellos independientes de los otros tres OptionButton presentes en el formulario, exactamente igual que si se les hubiera introducido en un Frame. Los controles colocados dentro del control Image cambian formando conjunto con el que se coloc en el formulario, fuera de los dos controles. El PictureBox funciona como un contenedor de esos dos OptionButton que tiene en su interior, mientras que el control Image, no. (Vea el ejemplo del captulo 2, Oficina de cambio de divisas) Un Image es transparente, es decir, deja ver el fondo del formulario en las partes no ocupadas por su grfico. Por lo tanto, no tendran sentido en este control propiedades como Backcolor, FillColor, o FillStyle. Las propiedades de un Image son: Appearance Enabled Name WhatThisHelp BorderStyle Height Picture Width Datafield Index Stretch DataSource Left Tag DragIcon MouseIcon Top DragMode 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), en el inferior ( Align Bottom), en el izquierdo (Align Left) o en el derecho ( Align Right) del formulario que lo contiene. Para no alinearlo con ningn borde basta con poner la propiedad Align a 0-None. Cuando se adosa a uno de los bordes, el tamao del control se ajusta automticamente a la anchura o altura del formulario. Sintaxis NombrePictureBox.Align [= nmero] nmero Un entero que especifica cmo se presenta el control. Puede tomar los siguientes valores :

Pgina 96

0-None

control

igual igual igual a

(Predeterminado cuando el control se coloca en un formulario no MDI). Con este valor, el control mantiene el tamao y la posicin asignada en tiempo de diseo. 1-Top (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. 2-Bottom El control se coloca en la parte inferior del formulario y su anchura es a la anchura del formulario. 3-Left El control se coloca en la parte izquierda del formulario y su altura es a la altura del formulario. 4-Right El control se coloca en la parte derecha del formulario y su altura es la altura del formulario. Se puede usar propiedad Align para crear rpidamente una barra de herramientas o una barra de estado en la parte superior o inferior de un formulario. Cuando un usuario cambie el tamao del formulario, un control con la propiedad Align establecida a 1 2 modificar su tamao de forma automtica para ajustarse a la anchura del formulario. De la misma forma se puede crear barras de herramientas a los lados izquierdo o derecho de un formulario. Si en un formulario hay dos barras de herramientas, una en la parte superior (o inferior) y otra en un lateral, 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. Al ser el PictureBox un contenedor, puede poner un PictureBox en la parte superior de un Formulario, y colocar en este PictureBox varios controles Image, a los que se les puede poner un icono. De esta forma realizamos una barra de herramientas.

Negotiate

(PictureBox solamente) Establece un valor que determina si se muestra un control que puede alinearse cuando un objeto activo del formulario muestra una o ms barras de herramientas. No est disponible en tiempo de ejecucin. La propiedad Negotiate puede tener los valores True o False: True Si el control se alinea en el formulario (la propiedad Align se establece como un valor no cero), el control permanecer visible cuando un objeto activo del formulario muestre una barra de herramientas. False (Predeterminado) El control no se muestra cuando un objeto activo del formulario muestra una barra de herramientas. La barra de herramientas del objeto activo se muestra en lugar del control.

Appearance Autoredraw

(PictureBox e Image) 3D o Flat, como en otros controles (PictureBox solamente)

Permite que el Formulario o PictureBox (El control Image no tiene esta propiedad), mantenga siempre la imagen presente. Si Autoredraw est a False, el control no presentar las imgenes 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. Sintaxis objeto.AutoRedraw [= valor]

Los valores posibles de valor son: Pgina 97

True Activa el redibujado automtico de un control PictureBox. Los grficos y el texto se escriben en la pantalla y en una imagen almacenada en memoria. El control no recibe eventos Paint; se vuelve a dibujar cuando es necesario, usando la imagen almacenada en memoria. False (Predeterminado) Desactiva el redibujado automtico de un control y escribe los grficos y el texto solamente en la pantalla. Visual Basic invoca el evento Paint del control cuando se necesita volver a dibujar dicho control.

Autosize

(PictureBox solamente) Devuelve o establece un valor que determina si el tamao de un control se cambia automticamente para presentar su contenido completo. Sintaxis objeto.AutoSize [= valor]

Los valores posibles de valor son: True El tamao se cambia automticamente para presentar el contenido completo. False (Predeterminado) Mantiene constante el tamao del control. El contenido se recorta cuando excede el rea del control. BackColor (PictureBox solamente) Color de fondo. Igual que otros controles BorderStyle (PictureBox e Image) Tipo de borde. Ninguno o fijo. Igual que otros controles. ClipControls (PictureBox solamente)

Devuelve o establece un valor que determina si los mtodos grficos en eventos Paint vuelven a dibujar el objeto entero o solamente las reas ltimamente expuestas. Tambin determina si el entorno operativo Microsoft Windows crea una zona de recorte que excluya los controles no grficos contenidos en el objeto. En tiempo de ejecucin es de slo lectura. Sintaxis objeto.ClipControls [= booleano]

Los valores posibles de booleano son: True (Predeterminado) Los mtodos grficos de los eventos Paint vuelven a dibujar completamente el objeto. Antes del evento Paint se crea una zona de recorte alrededor de los controles no grficos del formulario. False Los mtodos grficos de los eventos Paint solamente vuelven a dibujar las partes recin expuestas. Antes del evento Paint no se crea una zona de recorte alrededor de los controles no grficos. Los formularios complejos se cargan normalmente ms rpido cuando ClipControls est establecido a False. DataField (PictureBox e Image) Devuelve o establece un valor que indica el nombre del campo de una Base de datos de donde se tomar la imagen a presentar. (Vea controles enlazados a datos)

Pgina 98

Sintaxis

objeto.DataField =NombredelCampo

Para poder presentar una imagen contenida en una base de datos, el control PictureBox o Image deben estar enlazados a una base de datos mediante un control Data. DataSource (PictureBox e Image) Establece un valor que especifica el control Data a travs del cual el control Picture Image se enlaza a una base de datos. No est disponible en tiempo de ejecucin. Ver esto con mas detalles cuando estudie los Objetos enlazados a Datos. DragIcon DragMode

(PictureBox e Image)

Igual que otros controles

DrawMode

(PictureBox solamente) Devuelve o establece un valor que determina el aspecto de la salida de un mtodo grfico.

DrawStyle

(PictureBox solamente) Devuelve o establece un valor que determina el estilo de lnea de la salida de mtodos grficos. Sintaxis objeto.DrawStyle [= nmero] 0 (Predeterminado) Continuo. Rayas. Puntos. Raya-punto. Raya-punto-punto. Transparente. Continuo interior.

Los valores posibles de nmero son: 1 2 3 4 5 6 DrawWidth (PictureBox solamente)

Devuelve o establece la anchura de lnea de lo dibujado con los mtodos grficos. Sintaxis NombredelPictureBox.DrawWidth [= tamao]

tamao Expresin numrica comprendida entre 1 y 32.767 que representa la anchura de la lnea en pixeles. El valor predeterminado es 1, es decir, un pxel de ancho. Enabled (PictureBox e Image) Habilitado. Igual que otros controles. FillColor, FillStyle, Font, Fontransparent, ForeColor (PictureBox solamente) Igual que otros controles. Height, Width , Left, Top (PictureBox e Image)

Pgina 99

Definen el tamao y la posicin del control. En el control Image el tamao puede depender del grfico que se introduzca y del valor de la propiedad Stretch. HelpContextID Index (PictureBox solamente) (PictureBox e Image) Igual que otros controles Igual que otros controles (PictureBox solamente)

LinkItem, LinkMode, LinkTimeout, LinkTopic

Propiedades que afectan al comportamiento de este control como DESTINO de una conversacin DDE. Se estudiar con mas detalles al estudiar el Intercambio Dinmico de Datos. MouseIcon, MousePointer (PictureBox e Image)

MouseIcon Establece un icono de mouse personalizado. (Una vez que comenzamos a estudiar las propiedades grficas, se comenta cmo se puede cambiar el icono de la propiedad MouseIcon de todos los controles) Sintaxis objeto.MouseIcon = LoadPicture(ruta) objeto.MouseIcon = imagen

donde : objeto Nombre del objeto PictureBox o Image ruta Expresin de cadena que especifica la ruta y el nombre del archivo que contiene el icono personalizado. As podemos cargar un icono de los existentes en el disco. Ej. Image1.MouseIcon = LoadPicture("C:\vb\icons\computer\disk05.ico") imagen Propiedad Picture de un objeto Form, de un control PictureBox o de un control Image, o nombre de una variable tipo Picture. De esta forma podemos cargar como un icono el grfico que tengamos en otro objeto o en una variable tipo Picture. Ej. Image1.MouseIcon = Picture1.picture La propiedad MouseIcon proporciona un icono de mouse personalizado que se utiliza cuando el valor de la propiedad MousePointer es 99.

MousePointer devuelve o establece un valor que indica el tipo de puntero de mouse que aparece cuando se pasa el puntero del ratn por encima de un objeto en tiempo de ejecucin. Sintaxis objeto.MousePointer [= valor]

objeto Nombre del objeto PictureBox o Image valor Nmero entero que especifica el tipo de puntero de mouse que aparece, segn se describe mas adelante. Las opciones para valor son: 0 1 2 3 4 5 (Predeterminado) Forma que determine el objeto. Flecha. Cruz (puntero en forma de cruz). Forma de I. Icono (pequeo cuadrado dentro de otro cuadrado). Tamao (flecha de cuatro puntas: norte, sur, este y oeste). Pgina 100

6 Tamao NE SO (flecha doble apuntando al nordeste y al sudoeste). 7 Tamao N S (flecha doble apuntando al norte y al sur). 8 Tamao NO SE (flecha doble apuntando al noroeste y al sudeste). 9 Tamao O E (flecha doble apuntando al oeste y al este). 10 Flecha hacia arriba. 11 Reloj de arena (espera). 12 No soltar. 13 Flecha y reloj de arena. 14 Flecha e interrogacin. 15 Tamao de todo (personalizable en Microsoft Windows NT 3.51) 99 Icono personalizado especificado en la propiedad MouseIcon explicada anteriormente. Name (PictureBox e Image) Nombre del control

Picture

(PictureBox e Image) Devuelve o establece un grfico mostrado en un control. Ya se ha estudiado mas atrs como cambiar la propiedad Picture.

ScaleHeight, ScaleWidth, ScaleLeft, ScaleTop, ScaleMode Propiedades del PictureBox solamente. Todas las propiedades Scale ? ? ? ? afectan a las coordenadas, no a la escala !

ScaleHeight, ScaleWidth Devuelven o establecen el nmero de unidades de medida horizontal (ScaleWidth) y vertical (ScaleHeight) del interior de un objeto al utilizar mtodos grficos o al colocar controles. Sintaxis objeto.ScaleHeight [= valor] objeto.ScaleWidth [= valor] Nombre del Control Expresin numrica que especifica la medida horizontal o vertical.

objeto valor

Nota Las propiedades ScaleHeight y ScaleWidth son distintas de las propiedades Height y Width. ScaleLeft, ScaleTop Devuelven o establecen las coordenadas horizontal (ScaleLeft) y vertical (ScaleTop) de los bordes izquierdo y superior de un objeto al utilizar mtodos grficos o al situar controles. Estas coordenadas estn 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 mtodos grficos, o al situar controles. Sintaxis objeto.ScaleMode [= valor]

Nombre del Control objeto Nombre del Control Pgina 101

valor Nmero entero que especifica la unidad de medida, segn se describe a continuacin. 0 Indica que una o ms de las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop tienen valores personalizados. Se usa entonces una unidad de medida definida por el usuario (User) 1 (Predeterminado) Twip (1440 twips por pulgada lgica; 567 twips por centmetro lgico). 2 Punto (72 puntos por pulgada lgica). 3 Pxel (la unidad mnima de la resolucin del monitor o la impresora). 4 Carcter (horizontal = 120 twips por unidad; vertical = 240 twips por unidad). 5 Pulgada. 6 Milmetro. 7 Centmetro. Utilizando las propiedades relacionadas ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop, puede configurar un sistema de coordenadas completo, con coordenadas positivas y negativas. 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, en ScaleMode se establece automticamente 0. Al establecer en ScaleMode un nmero mayor que 0, ScaleHeight y ScaleWidth cambian a la nueva unidad de medida, y en ScaleLeft y ScaleTop se establece 0. Adems, 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 grfico cambia su tamao para ajustarlo al de un control Image. Sintaxis objeto.Stretch [= lgico]

objeto Nombre del control Image lgico Expresin booleana que especifica si el grfico adapta su tamao, segn se describe a continuacin. True False grfico. El grfico cambia su tamao para ajustarlo al del control. (Predeterminado) El control cambia su tamao para ajustarlo al del

Si Stretch tiene el valor True, al cambiar el tamao del control tambin se cambiar el del grfico que contenga. Cuando aumenta el tamao del control, mantiene las nuevas medidas aunque se le introduzca un grfico de menor tamao. Debe controlarse por programa el tamao del mismo. TabIndex, TabStop (Solo control PictureBox)

Igual que otros controles Tag Top Visible WhatsThisHelpID Width

Comunes a ambos. Igual que resto de controles.

Otros controles que pueden manejar imgenes Pgina 102

IMAGE LIST Este control no est normalmente en la caja de herramientas. Solamente est disponible en la versin de 32 bits. Hay que introducirlo mediante los Herramientas | Controles Personalizados y pertenece al grupo Microsoft Windows Common Controls (COMCTL32.OCX) (Vea Nota 1)

Este control nos permite almacenar varias imgenes. Es, tal como indica su nombre, como un ListBox pero que en vez de contener textos, contiene imgenes. La utilidad de este control es para almacenar en l distintas imgenes, y servirlas desde l a otro control, un PictureBox o un control Image, sin necesidad de tener que acceder a leerlas en el disco, que conllevara una importante prdida de tiempo si el cambio de imgenes debe ser rpido. Este control es necesario para almacenar las imgenes que se mostrarn en los iconos de la barra de herramientas. Ver mas adelante como se realiza una barra de herramientas (La barra de herramientas solo est disponible para la versin de 32 Bits) Un ImageList permite tener varias imgenes dentro de l, pero este control no las presenta. Solamente sirve de almacn para pasarlas rpidamente a otro control ( PictureBox, p.e.) que ser el que las presenta en pantalla. En la siguiente figura, pueden verse las propiedades de un ImageList con varias imgenes cargadas.

Nota 1. El grupo de controles Microsoft Windows Common Controls (COMCTL32.OCX) incluye adems de este los controles TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListView y Slider. Para introducir imgenes en el control ImageList deberemos acceder a sus propiedades, bien mediante F4 y luego haciendo click sobre Personalizado, bien pulsando el botn derecho del ratn sobre el icono del control. Aparecer un cuadro donde podemos insertar imgenes Pgina 103

El tipo de imgenes pueden ser mapas de bits :BMP o iconos .ICO El control ImageList tiene una coleccin llamada ListImages. Esta coleccin contiene todas las imgenes introducidas en el ImageList y las propiedades de cada imagen. Como toda coleccin, ser un array donde podemos elegir uno de sus elementos designndolo por su nombre seguido de su nmero (Index) encerrado entre parntesis. As la imagen nmero 3 ser : ImageList1.Listimages (3) Si tenemos un control Picture llamado Picture1 y queremos poner en su propiedad Picture la imagen cargada en el ImageList1, en su posicin 3, usaramos la expresin : Set Picture1.Picture = ImageList1.ListImages (3) . Picture Observe que tras ListImages ( ) es necesario poner la propiedad Picture, ya que Picture es una propiedad de la coleccin ListImages Como cualquier coleccin, ListImages tiene la propiedad Count, que nos servir para contar el nmero de imgenes que guarda. Numerodeimgenes = ImageList1. ListImages.Count Dado que al guardar imgenes en un ImageList, estas imgenes estn guardadas en la memoria RAM, es fcil realizar una animacin. Para ello necesitamos varias imgenes que poniendo una tras otra, d la sensacin de movimiento. Imaginemos un nmero indeterminado de imgenes dentro de un ImageList, y un control Picture llamado Picture1 donde queremos presentar la animacin. En el procedimiento Timer de un Timer pondramos Static pepe As Integer pepe = pepe + 1 If pepe > ImageList1.ListImages.Count Then pepe = 1 Set Picture1.Picture = ImageList1.ListImages(pepe).Picture Una de las mayores aplicaciones del ImageList es proporcionar imgenes para otros controles. Entre ellos el TOOLBAR Pgina 104

Barra de Herramientas. Control Toolbar Este control permite realizar una barra de herramientas. La barra de herramientas es, como ya conocer, una barra donde existen varios iconos. Estos iconos realizan una determinada funcin. Normalmente se ponen en la barra de herramientas los iconos que representan las acciones mas frecuentes de una aplicacin. Esto facilita la operacin al no tener que desplegar mens para buscar la operacin a realizar. Como el espacio que ocupan los iconos es grande, es tambin bastante normal que no estn representados en la barra de herramientas todas las funciones posibles de la aplicacin, sino como decamos, solamente las mas frecuentes. Pero ocurre que la funcin que para un usuario es muy frecuente, para otro no lo es, por lo que tambin es habitual poder programar los iconos que aparecen en la barra de herramientas. Todo ello lo puede hacer el control Toolbar. Para introducir el Toolbar es necesario que est presente en la caja de herramientas el control personalizado Microsoft Windows Common Controls (COMCTL32.OCX). El control Toolbar es un contenedor de un array de iconos. Estos iconos forman botones sobre los que se puede insertar cdigo en sus procedimientos. A cada botn se le denomina Button y a la coleccin de botones se le denomina Buttons. Cada Button es un elemento de la coleccin Buttons y por lo tanto podemos referirnos a cada uno de ellos por el ndice que tiene dentro de la coleccin. Los iconos de cada uno de los botones del Toolbar debe introducirse previamente en un control ImageList. Como se recordar, un control ImageList es un almacn de imgenes, que podemos usar en cualquier parte de la aplicacin. Una de esas partes es la confeccin de la barra de herramientas. Por lo tanto, es necesario introducir un control ImageList en cualquier aplicacin que use un control Toolbar. Todas las imgenes del Toolbar deben estar en un nico ImageList. Y este ImageList debe estar en el mismo formulario que el Toolbar La barra de herramientas puede realizarse en tiempo de diseo (este sera el caso para cuando no existiese variacin ni eleccin de botones a lo largo de la ejecucin de la aplicacin) o en tiempo de ejecucin (caso que correspondera con una aplicacin que tuviese una barra de men programable o que variase esta barra de men dependiendo de cada operacin que se est ejecutando en la aplicacin). Para realizar la barra de herramientas en tiempo de diseo, basta con visualizar el cuadro de propiedades que aparece pulsando el botn derecho del ratn sobre el control Toolbar. Aparecer un cuadro de dilogo como este :

Pgina 105

Puede ver que en el cuadro ImageList aparece el nombre de un ImageList. Al desplegar la lista aparecern todos los ImageList que existan en el formulario. El ImageList debe estar en el mismo formulario que el Toolbar. Deber elegirse el ImageList que contenga las imgenes de los iconos que queremos introducir en el Toolbar. Este cuadro nos permite tambin introducir la forma que adoptar el puntero del ratn cuando entre en el Toolbar (MousePointer), si el Toolbar aparece por defecto habilitado o deshabilitado (Enabled) y si muestra o no un rtulo programable al pasar el ratn por encima de cada botn del Toolbar. (ShowTips). (El uso de estos pequeos rtulos pueden hacer una aplicacin muy bonita) La propiedad AllowCustomize permite, si es True, cambiar el orden de los botones e introducir separadores (vea evento DobleClick). En el cuadro botones podemos introducir los datos deseados para cada uno de los botones que compondrn la coleccin Buttons.

Para insertar un nuevo botn hay que hacer click sobre Insertar botn e insertar un nuevo botn inmediatamente despus del que figura en la propiedad Index (en la figura del ejemplo, lo insertara en segundo lugar, no en el ltimo lugar como podra creerse). Tambin podemos eliminar un botn haciendo click sobre Eliminar botn.

Pgina 106

El Caption (opcional) es la palabra que figurar debajo del icono del botn. Un botn se identifica por su ndice. ( Toolbar1.buttons(1) ) La propiedad Key es un nombre que se puede aadir a cada botn. Esta propiedad sirve para identificar el botn que se ha pulsado, pero no para nombrar al botn. La propiedad Value es el valor por defecto, con el que aparecer el botn al comienzo de la aplicacin. (Unpressed, no pulsado, Pressed, pulsado). La propiedad Style define el tipo de botn : 0 - Default 1 - Check click) 2 - Button Group Solo uno de los botones del grupo puede estar pulsado. Esta propiedad lleva implcito que los botones que forman un grupo son biestables. Pueden hacerse varios grupos independientes introduciendo un botn que no pertenezca a un grupo (tipos 0, 1, 3 4) entre los dos grupos que se independientes que se pretenden formar El botn se convierte en un separador de anchura fija. El botn se convierte en un separador de anchura variable. Botn monostable. (Se pulsa, pero no se mantiene pulsado) Botn Biestable. (Se mantiene pulsado y se levanta con otro

3 - Separator 4 - PlaceHolder

ToolTipText es el texto que aparecer al lado del botn cada vez que se ponga el cursor del ratn sobre el botn. Para que aparezca debe estar habilitada la propiedad ShowTips. Image es el nmero de la imagen en el ImageList. El control Toolbar tambin puede realizarse en tiempo de ejecucin. Para introducir u botn en el Toolbar hay que crear el botn y aadirlo a la coleccin Buttons de Toolbar. Podemos hacerlo en una sola instruccin : Set NombreBotn = NombreToolbar.Buttons.add ( [Indice], [Key], [Caption], [Style], [Imagen]) NombreBotn puede ser cualquier nombre (es el nombre del objeto botn) NombreToolbar es el nombre del Toolbar Indice es el nmero de orden de ese botn dentro del Toolbar Key es el valor de la propiedad Key del botn. Este valor debe ser nico para cada botn. Style es un nmero del 0 al 4 con el tipo de botn. Vea lista mas arriba Imagen es el nmero de la imagen para ese botn, dentro del ImageList que las contiene. Los botones pueden habilitarse y deshabilitarse usando la propiedad Enabled (True / False). Recuerde que los botones se identifican por su ndice : Toolbar1.Buttons(Indice).Enabled = False Para saber que botn se ha pulsado, puede leerse la propiedad Key : Text1.Text = Button.Key presenta en Text1 el texto introducido en la propiedad Key del ltimo botn pulsado.

Con la lectura de la propiedad Key, y la sentencia Case o If ... Then podemos iniciar la parte de la aplicacin asociada a cada botn. El control Toolbar tiene los siguientes eventos : ButtonClick Pgina 107

Este evento se produce cada vez que se hace click sobre un botn del Toolbar. Pasa como parmetro el ndice del botn pulsado. Podremos saber que botn se ha pulsado mediante sentencias condicionales : Private Sub Toolbar1_ButtonClick(ByVal Button As Button) If Button.Index = 1 Then . . . . If Button.Index = 2 Then . . . . Tambin podramos usar la propiedad Key como se dijo mas atrs. Click Este evento se produce cuando se hace click sobre cualquier botn del Toolbar, pero no pasa parmetros. (No distingue sobre que botn se ha hecho click) Podemos utilizarlo cuando se quiera realizar una operacin comn 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, y la propiedad AllowCustomize est a True. Si se hace doble click sobre un botn se produce solamente el evento click (dos veces). Haciendo doble click en una zona libre de botones, con la propiedad AllowCustomize = True nos permite cambiar el orden de los botones e introducir separadores. Change Se produce solamente cuando se ha realizado algn cambio del orden por el procedimiento anterior. DragDrop, DragOver Igual que cualquier control. MouseMove, MouseUp, MouseDown Igual que el resto de los controles Pasa como parmetro el ndice del botn, la tecla de maysculas, y las posiciones x e y del ratn. Private Sub Toolbar_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

Este control solamente funciona en la versin de VB de 32 Bits. Pero para 16 bits puede hacerse una cosa parecida (y mas sencilla) utilizando un control Picture como contenedor de tantos controles Image como necesitemos. 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, y posiblemente de forma mas sencilla. El control Toolbar NO sirve de contenedor de otros controles, a excepcin de sus botones ! ! !

LA BARRA DE ESTADO Este control es muy parecido a la barra de herramientas, y suele usarse, colocndolo en la parte inferior de la ventana, para indicar el proceso que est en curso en la aplicacin. La barra de estado, control StatusBar se introduce en la caja de herramientas al mismo tiempo que el

Pgina 108

control Toolbar, mediante el control personalizado mltiple Microsoft Windows Common Controls (COMCTL32.OCX). La barra de estado puede albergar hasta 16 paneles, que pueden contener texto o grficos. Tambin pueden contener informacin del Hardware, tal como el estado de la tecla Bloqueo de Maysculas, Bloqueo del teclado numrico, tecla Insert activada, tecla Scroll Lock activada, o mostrar la fecha y la hora La barra de estado puede configurarse como de un solo panel o de mltiples paneles. (Propiedad Style. 0=mltiples paneles, 1= panel nico) Las dimensiones de cada panel pueden configurarse como fijas o ajustadas al tamao del texto o imagen que presentan. Las propiedades pueden establecerse en tiempo de diseo, mediante el siguiente cuadro.

En este control las imgenes no es necesario introducirlas previamente en un ImageList. Pueden introducirse directamente sobre el cuadro de dilogo que sale pulsando el botn derecho del ratn - propiedades - en la ventana correspondiente a paneles. Acepta imgenes tipo Bit-map o .ICO. Los paneles pueden combinar una grfico y un texto. La barra de estado puede realizarse en tiempo de diseo o en tiempo de ejecucin. Para realizarla en tiempo de ejecucin basta con visualizar la ventana de propiedades, muy similar a la del control Toolbar. Para aadir un panel en tiempo de ejecucin basta con aadirlo a la coleccin Panels del control StatusBar mediante la sentencia : Set PanelNuevo [ndice],[key],[Text],[estilo],[grfico] = Nombrebarraestado.Panels.Add.(

Donde PanelNuevo es el nombre con el que se va a conocer ese panel que acabamos de crear. PanelNuevo debe declararse como variable objeto Panel donde sea necesario segn el mbito que le queramos dar. De esta forma, una vez creado, nos podremos referir a ese panel simplemente citndolo por su nombre (En este caso, PanelNuevo)

Pgina 109

Los trminos [ndice],[key],[Text],[estilo],[grfico] creacin del panel se explican a continuacin.

que entran a formar parte en la sintaxis de

Indice - Necesario. Es el ndice que define al panel dentro del StatusBar. Key - Opcional. Es la propiedad Key de ese panel (El contenido de esta propiedad lo podemos leer desde cada panel Variable = statusbar1.Panels(Panel.Index).Key Text - El texto que queremos figure en el panel (Solo si la propiedad Estilo est en sbrText Estilo - Propiedad estilo del panel. 0 - sbrText El panel mostrar el Texto de la propiedad Text de ese panel 1 - sbrCaps El panel muestra el estado de la tecla Bloqueo Maysculas 2 - sbrNum El panel muestra el estado de la tecla Bloq. Nmeros 3 - sbrIns El panel muestra el estado de la tecla Insert 4 - sbrScrl El panel muestra el estado de la tecla Scroll / Lock 5 - sbrTime El panel muestra la hora 6 - sbrDate El panel muestra la fecha Grfico - Es el grfico que va a tener el panel. Este grfico puede obtenerse desde un ImageList, ImageList1.ListImages(n).Picture - o directamente desde el disco duro, mediante el mtodo LoadPicture - LoadPicture("C:\vb\icons\comm\net09a.ico") Si no se pone alguna de las propiedades opcionales intermedias, deben mantenerse las comas separadoras. Como ejemplo, podemos aadir varios paneles de la siguiente forma : Dim PanelNuevo As Panel Dim pepe As Integer Donde deba declararse a efectos del mbito

Set PanelNuevo = statusbar1.Panels.Add(pepe, "Contenido del Key " & Str(pepe), "Texto " & Str(pepe), , LoadPicture("C:\vb\icons\comm\net09a.ico"))

Estos son los controles grficos mas importantes. Ver a lo largo del curso que existen otros, y ms que podr encontrar entre diferentes suministradores de controles, ya que VB ha dejado una puerta abierta para realizar controles a medida. Existen varias empresas de software dedicadas a la fabricacin de controles personalizados, y en el aspecto de controles grficos, podr encontrar una amplia gama de fabricantes y controles. Puede obtener muchos controles en el CD-ROM que acompaa a varias revistas especializadas en programacin VB, y a travs de la red Internet. FIN del cuarto captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 110

Visual Basic - Gua del Estudiante Cap. 5


CONTROLES DE BUSQUEDA DE FICHEROS - PORTAPAPELES MENS - MENUS EMERGENTES CONTROLES DE BUSQUEDA DE FICHEROS Y DIRECTORIOS

DriveListBox, DirListBox Y FileListBox.

Se obtienen directamente de la Caja de Herramientas, en los iconos siguientes:

DriveListBox permite elegir una unidad de disco. DirListBox muestra los directorios existentes en un rbol. FileListBox muestra los ficheros existentes en un determinado directorio.

Tal como indica su nombre, estos controles son listas. Repase el control ListBox para recordar sus propiedades. DriveListBox Este control permite elegir una unidad de disco vlida en tiempo de ejecucin. Utilice este control para mostrar una lista de todas las unidades vlidas del sistema de un usuario. Puede crear cuadros de dilogo 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 tpicas de cualquier control VB respecto a su geometra y color. Las Propiedades mas destacables de este control son : Drive, List, ListCount y ListIndex Drive devuelve el nombre de la unidad de disco seleccionada : Variable = List1.Drive Variable = a : ( c :[MS-DOS_6] D )

Este control se trata de una lista como su nombre indica, y posee las propiedades List, ListCount y ListIndex para permitir al usuario tener acceso a elementos de la lista. List (n) devuelve el texto que define a la unidad colocada en el lugar n. El nmero n comienza por 0. Por ejemplo, en la figura anterior, List1.list(1) devolver c :[MS-DOS_6] ListCount proporciona informacin acerca del nmero de unidades de disco disponibles (En el ejemplo, List1.ListCount ser 3, que corresponde a los tres discos disponibles - disco C :, disco A : y disco D : ) Pgina 111

ListIndex devuelve el ndice del disco seleccionado en la lista (0 para el primero, n-1 para el ltimo) Utilizando el control DriveListBox en combinacin con DirListBox y FileListBox, podr realizar un explorador de ficheros en cualquier disco de su ordenador.

DirListBox. Presenta un cuadro de la siguiente forma:

donde puede verse el rbol completo de un directorio. El DirListBox solamente presenta directorios. No presenta ficheros. Aparte de las propiedades geomtricas de todos los controles, el DirListBox presentas las siguientes propiedades particulares : Path Devuelve o establece la ruta de acceso actual. No est disponible en tiempo de diseo. Sintaxis donde Nombre es el nombre del DirListBox pathname Una expresin de cadena que evala en el nombre de va de acceso del directorio por defecto del DirListBox.. El valor de la propiedad Path es una cadena que indica una ruta de acceso, como C:\WINDOWS\SYSTEM. El valor predeterminado es la ruta de acceso actual Cuando se cambia la propiedad Path en tiempo de ejecucin se genera un evento Change. Nota El valor que devuelve Path es distinto del de List (ListIndex). Path devuelve siempre un mismo camino, bien el que se le haya impuesto mediante esta misma propiedad Path, y si no se le ha impuesto con anterioridad, el que tenga por defecto. List (ListIndex) devuelve el camino completo del directorio seleccionado, y, como era de esperar, cambia cada vez que cambiamos la seleccin del directorio. List, ListCount y ListIndex Al igual que cualquier lista, el DirListBox tiene las propiedades List, ListCount y ListIndex. ListIndex devuelve el valor del ndice del directorio seleccionado. El valor devuelto es cero cuando est seleccionado el primer directorio de los situados al final del rbol, 1 para el siguiente, etc. Toma el valor -1 cuando se selecciona el directorio inmediatamente superior al Nombre.Path [= pathname]

Pgina 112

ltimo nivel, el valor -2 cuando se selecciona el directorio situado 2 niveles jerrquicos por encima del ltimo nivel, etc. ListCount devuelve un valor numrico igual al nmero de directorios existentes en el ltimo nivel, independientemente de los directorios que tuviesen por arriba. List (n) devuelve una cadena de caracteres con el camino completo del elemento cuyo orden sea el sealado entre parntesis. Si en vez de n colocamos el ListIndex nos devolver, logicamente, el camino del elemento seleccionado. FileListBox Esta lista nos presenta los ficheros existentes en un directorio.

Como se puede apreciar, cuando el nmero de ficheros supera el nmero que puede presentar, aparecen automticamente las flechas de scroll verticales. Esta lista de ficheros tiene las siguientes propiedades destacables : Path Devuelve o establece la ruta de acceso de su directorio actual. No est disponible en tiempo de diseo. Este directorio puede ser el que se le haya impuesto mediante esta propiedad Path, o el que tenga por defecto. (El directorio por defecto sera el del ejecutable de la aplicacin) Si le ponemos el nombre por defecto, List1, para todos los ejemplos : variable = List1.Path e.) ListCount Devuelve el nmero total de ficheros que hay en ese directorio. Variable = List1.ListCount ListIndex Devuelve un nmero con el ndice del elemento seleccionado. Como todas las listas, devuelve 1 si no hay ningn elemento seleccionado. El primer elemento de una lista tiene el ndice = 0. Filename Devuelve el nombre del fichero seleccionado. List (n) Devuelve el nombre del fichero que ocupa el lugar n en la lista. Variable = List1.List (5) Variable = nombre del fichero que ocupa el 5 lugar en la lista. Variable = 19 (p. e.) Variable = C:\Archivos de programa\Microsoft Visual Basic32 (p.

Pgina 113

Si en lugar de n ponemos el valor de ListIndex : variable = List1.List (List1.ListIndex) obtendremos el nombre del fichero seleccionado.

Observe que en este ltimo caso, el resultado es el mismo que el de List1. 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 ejecucin. Sintaxis objeto.Pattern [= valor]

La sintaxis de la propiedad Pattern consta de las siguientes partes: objeto : Nombre del Control FileListBox valor: Expresin de cadena que indica una especificacin de archivo, como *.* o *.FRM. La cadena predeterminada es *.*, que obtiene una lista de todos los archivos. Adems de utilizar caracteres comodn, tambin puede especificar varios modelos, separndolos con caracteres punto y coma (;). Por ejemplo, con *.EXE; *.BAT se obtendra una lista con todos los archivos ejecutables y todos los archivos por lotes de MS-DOS. Comentarios La propiedad Pattern juega un papel clave en el diseo de las funciones de examen y tratamiento de archivos de una aplicacin. Puede utilizar Pattern en combinacin con otras propiedades de control de archivos para proporcionar al usuario formas de explorar archivos o grupos de archivos similares. Por ejemplo, en una aplicacin dedicada a iniciar otros programas, podra hacer que slo apareciesen los archivos .EXE en el cuadro de lista de archivos (*.EXE). Al modificar el valor de la propiedad Pattern se genera un evento PatternChange.

Archive, Hidden, Normal, System Devuelven o establecen un valor que determina si un control FileListBox presenta los archivos con los atributos Archive, Hidden, Normal o System. El atributo Archive de un fichero indica si se ha variado ese fichero despus de la ltima copia de seguridad. El atributo Hidden indica si el fichero se trata de un fichero oculto. El atributo Normal indica que el fichero es un fichero normal (No est oculto ni es de sistema). El atributo System de un fichero indica que el fichero es un fichero de sistema. Sintaxis objeto.Archive [= booleano] objeto.Hidden [= booleano] objeto.Normal [= booleano] objeto.System [= booleano] Las sintaxis de la propiedades Archive, Hidden, Normal y System tiene la siguiente partes: objeto :Nombre del FileListBox booleano :Una expresin booleana (True / False) que especifica el tipo de archivos presentados. El valor booleano puede presentar los siguientes valores : Pgina 114

True :(Predeterminado para Archive y Normal) Presenta archivos con el atributo de la propiedad en el control FileListBox. False : (Predeterminado para Hidden y System) Presenta archivos sin el atributo de la propiedad en el control FileListBox. Use estas propiedades para especificar el tipo de archivos a presentar en un control FileListBox, basndose en los atributos de archivos estndar usados en el entorno operativo. La definicin de estas propiedades en el cdigo en tiempo de ejecucin hace que el control FileListBox presente slo aquellos archivos con los atributos especificados. Por ejemplo, en una operacin de buscar y reemplazar se podran presentar solamente archivos del sistema estableciendo la propiedad System a True y las dems propiedades a False. Tambin, como parte del procedimiento de copia de seguridad, se podra establecer la propiedad Archive a True para relacionar solamente aquellos archivos modificados a partir de la ltima copia de seguridad. 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, bien porque haya sido forzado el control correspondiente a tener ese directorio en su propiedad Path, bien porque, al no haberse forzado ninguno, utilice el directorio por defecto. El directorio por defecto es el ltimo que se ha seleccionado por algn procedimiento. Por ejemplo, al arrancar una aplicacin, el directorio por defecto ser el mismo donde se encuentra el ejecutable. Pero si a lo largo de la aplicacin cambiamos el directorio, seleccionando otro mediante un CommonDialog, ese directorio es el que queda por defecto. Asegrese en sus aplicaciones que siempre elige la propiedad Path antes de presentar ficheros o directorios a travs de los controles anteriores, para evitar que pueda mostrarle ficheros de un directorio no deseado. Puede comprobar cual es el directorio actual. La funcin CurDir nos devuelve el directorio actual. Ejemplo : Introduzca una lnea de cdigo con la siguiente sentencia Variable = CurDir Al ejecutarla la variable Variable contendr la informacin : (p. e.)

Variable = C:\Archivos de programa\Microsoft Visual Basic32

Puede darse el caso de que desee conocer el directorio actual de varias unidades de disco. Por ejemplo, puede estar trabajando en el directorio C:\CursoVB\Ejemplos y ser este el directorio actual en el disco C :, 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. Para conocer el directorio actual del disco C : no necesit especificar la unidad, ya que era precisamente la unidad C la unidad actual. Para conocer el directorio actual de la unidad A empleara la expresin : Variable = CurDir (A) Variable tomar entonces el valor Variable = A :\ApVB\Tema1

Pgina 115

Decamos que el disco C era la unidad actual. Tambin podemos cambiar la unidad actual, mediante la sentencia ChDrive seguida de una letra (entre comillas dobles) Ejemplo lo desea, puede ponerlos. Tambin es indiferente que la letra sea mayscula o minscula. ChDrive A cambia la unidad actual a la unidad A. Observe que el parmetro A no tiene que llevar los dos puntos ( : ), aunque si

Tambin podemos forzar a que un directorio sea el directorio por defecto. La sentencia que tendremos que usar en ChDir. Ejemplo : ChDir C :\Windows\System cambiara el directorio actual al especificado. Podemos incluso crear un directorio. Usaremos para ello la sentencia MkDir. Esta sentencia crea el directorio con el nombre indicado, sobre el directorio actual. Si el directorio actual es el C:\VB\Icons y ejecutamos la sentencia : MkDir Varios crearamos el directorio C:\VB\Icons\Varios

Podemos incluso eliminar un directorio. La sentencia para eliminar un directorio es RmDir Cuidado ! Visual-Basic no le advertir que puede borrar algo que no desea. Asegrese muy bien mediante un aviso al usuario cada vez que elimine un directorio. Vamos a ver ahora como podemos ver los nombres de los ficheros existentes en un determinado directorio. Muy sencillo, con un FileListBox. Efectivamente, as podra ser para presentarlos en pantalla. Sin embargo, si deseamos imprimir la lista de ficheros existentes, guardarla en un fichero, etc., tenemos una forma que facilita esta labor. Igual que en DOS. La funcin Dir A esta funcin le debemos aadir como parmetro el criterio de bsqueda, criterio formado por los caracteres o comodines que deseemos. Dir devuelve solamente el nombre de un fichero, por lo que tendremos que repetirla tantas veces como ficheros tenga el directorio. Pero solamente tendremos que introducir el criterio de bsqueda la primera vez. En el siguiente ejemplo, sacaremos por impresora los nombres de los ficheros existentes en el directorio actual : (Este cdigo lo meteremos en el procedimiento click de un botn de comando) fichero = Dir("*.*") Do Until fichero = "" Printer.Print fichero fichero = Dir Loop Printer.EndDoc Le decimos que imprima todos (*.*) Hasta que fichero sea una cadena de longitud cero.. Imprime la variable fichero en la impresora Toma el nombre de otro fichero Vuelve a Do Until ..... Termina la impresin y saca la hoja de la impresora

Ya sabemos sacar el directorio. Vamos a ver que otras cosas se pueden hacer con ficheros. Funcin Kill. A poco Ingls que sepa se habr dado cuenta que esta funcin sirve para quitarse algo de enmedio. Esta funcin borra un fichero del disco. Kill C:\CursoVB\Ejemplos\Ejemplo1.txt borra el fichero Ejemplo1.txt, que se encuentra en el disco C, directorio \ CursoVB\Ejemplos

Pgina 116

Funcin FileCopy. Copia un fichero. La sintaxis de esta funcin es la siguiente : FileCopy Origen, Destino Si tenemos un TextBox llamado Text1 donde vamos a introducir el nombre (con su Path) del fichero origen, otro TextBox donde introduciremos el nombre (con su Path) que queremos dar a la copia, para copiar ese fichero ejecutaremos la sentencia : FileCopy Text1.Text, Text2.Text Si queremos copiar un fichero del disco A, en el directorio CursoVB y de nombre Ejemplo1 al disco y directorio C:\CursoVB\Ejemplos y con el mismo nombre que tena en el disco A, es decir, Ejemplo1, ejecutaremos la sentencia : FileCopy A :\CursoVB\Ejemplo1 , C:\CursoVB\Ejemplos\Ejemplo1 Observe la necesidad de dobles comillas para especificar que es, precisamente lo escrito en el cdigo, lo que indica el origen y el destino. En el caso anterior no llevaba dobles comillas, debido a que era el contenido de un TextBox lo que se usaba para indicar el origen y el destino.

La instruccin Name cambia el nombre de un fichero. No solamente puede cambiar un nombre, puede incluso moverlo de sitio, pero siempre en la misma unidad de disco. La sintaxis de Name es la siguiente : Name nombrerutaantiguo As nombrerutanuevo Donde nombrerutaantiguo es una expresin de cadena que indica el nombre del fichero (con su path) al que se le quiere cambiar el nombre, y nombrerutanuevo es una expresin de cadena que especifica el nombre nuevo y, si se desea mover de directorio, la nueva ubicacin del archivo y la unidad de disco. El nombre y ubicacin especificados en nombrerutanuevo no pueden ser los de un archivo existente. Tanto nombrerutanuevo como nombrerutaantiguo deben encontrarse en la misma unidad de disco. Si la ruta de acceso especificada en nombrerutanuevo existe y es distinta de la ruta de acceso especificada en nombrerutaantiguo, la instruccin Name coloca el archivo en el nuevo directorio o carpeta y cambia el nombre del archivo, de ser necesario. Si nombrerutanuevo y nombrerutaantiguo tienen distintas rutas de acceso y el mismo nombre de archivo, Name coloca el archivo en la nueva ubicacin, sin cambiar el nombre del archivo. Por medio de Name se puede mover un archivo de un directorio o carpeta a otro, pero no se puede mover un directorio o carpeta. Si se utiliza Name con un archivo abierto se produce un error. Antes de cambiar el nombre de un archivo, se debe cerrar. En el ejemplo, 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, aparte de cambiarlo de nombre, le cambiamos de directorio. Name C:\CursoVB\Ejemplos\Ejemplo1 As C :\CursoVB\Ejercic\Prueba1

Existe una funcin que le permite conocer el volumen de un fichero : FileLen. Mediante esta instruccin podr saber, por ejemplo, si un fichero le va a caber en lo que le queda libre de un disquete, el tiempo previsto para enviarlo por mdem, etc. Pgina 117

La sintaxis es la siguiente : Variable = FileLen("C:\CursoVB\Ejemplos\Ejemplo1") Variable tomar un valor numrico igual al nmero de bytes del fichero. Otra funcin para el tratamiento de ficheros es FileDateTime, que le permite conocer la fecha y hora de creacin o de la ltima modificacin de un fichero. La sintaxis es, 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 funcin se obtiene una variable de cadena.) Puede aprovechar esta funcin para borrar o hacer Backup de determinados ficheros que tengan mas de un tiempo de permanencia, sustituir ficheros por versiones mas recientes, etc. Podemos obtener y modificar los atributos de un fichero. Los atributos de un fichero se refieren a si son de solo lectura, ficheros ocultos, de sistema, si ha sido modificado desde la ltima vez que se ha realizado un Backup, Para conocer los atributos de un fichero, utilizaremos la funcin GetAttr. Esta funcin devuelve un nmero, que representa la suma de los atributos de un archivo, directorio o carpeta o una etiqueta de volumen. Sintaxis Variable = GetAttr (nombreruta)

Donde nombreruta es una expresin de cadena que especifica un nombre de archivo, con su Path y unidad de disco. El valor devuelto por GetAttr es un nmero, 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 Descripcin Normal. Slo lectura. Oculto. Archivo de sistema. Directorio o carpeta. El archivo ha sido modificado despus de efectuar la ltima de seguridad. Si la expresin nombreruta representa un directorio, se lo indicar devolviendo el valor 16. Para cambiar un atributo utilizaremos la funcin SetAttr. La sintaxis de esta funcin es la siguiente Sintaxis SetAttr nombreruta , atributos

Donde nombreruta es una expresin de cadena que especifica un nombre de archivo, con su Path y unidad de disco, y atributos es una o varias de las constantes o valores anteriores, cuya suma especifica los atributos de archivo.

Pgina 118

Dado que el valor 16 indica que lo expresado en nombreruta es un directorio, no puede pretenderse darle a ese directorio atributos que solamente se pueden aplicar a un fichero, ni puede pretender darle a un fichero un valor en el que entre el 16 como sumando. Estos casos le producirn un error en tiempo de ejecucin. Si pretende establecer los atributos de un archivo abierto, se producir un error en tiempo de ejecucin. Existe una funcin, que no tiene nada que ver con la anterior, aunque puede parecerlo por su parecido semntico y que tambin devuelve atributos, pero de otro tipo. Esta funcin es FileAttr Funcin FileAttr Devuelve el modo de apertura de un archivo. Logicamente debe referirse a un archivo abierto en el momento de ejecutar esta funcin. Vea para mas detalles la sentencia Open. Sintaxis variable = FileAttr (numerocanal , tipoinformacin)

Donde numerocanal es el nmero del canal de apertura de ese archivo, y tipoinformacin es el tipo de informacin que deseamos de ese fichero. Si tipoinformacin = 1 nos devuelve el modo de apertura del fichero, segn la siguiente lista Valor 1 2 4 8 32 Modo del archivo Entrada Salida Aleatorio Aadir Binario

La Ayuda de VB dice que tipoinformacin puede ser =2 para que FileAttr devuelva informacin sobre el selector de archivos del sistema operativo. Algunas veces la informacin de ayuda de VB promete cosas que, sin dudar de que sean ciertas, son difciles de comprobar. Esta funcin no tiene una gran aplicacin prctica, ya que comprueba la forma en la que hemos abierto un archivo. Informacin que conocemos desde el mismo momento de abrirlo.

Pgina 119

Visual Basic - Gua del Estudiante Cap. 5 Cont.


EL PORTAPAPELES. EL OBJETO CLIPBOARD OBJETO CLIPBOARD Proporciona acceso al Portapapeles del sistema. Sintaxis Clipboard

El objeto Clipboard se usa para manipular el texto y los grficos del Portapapeles. Este objeto puede usarse para permitir que el usuario corte, copie y pegue texto y grficos en la aplicacin. El objeto Clipboard puede contener varias unidades de datos siempre y cuando cada una tenga un formato diferente. Por ejemplo, se puede usar el mtodo SetData para poner un mapa de bits en el Clipboard con el formato CF_BITMAP y despus usar el mtodo SetText con el formato CF_TEXT para poner texto en el Clipboard. Despus se puede usar el mtodo GetText para recuperar el texto o el mtodo GetData para recuperar el grfico. Los datos del Clipboard se pierden cuando se colocan otros datos con el mismo formato en el Clipboard desde el cdigo o mediante un comando de men. SetText Pone una cadena de texto en el objeto Clipboard usando el formato del objeto Clipboard especificado. No acepta argumentos con nombre. Sintaxis Clipboard.SetText datos, formato datos Requerido. Cadena de datos que se va a colocar en el Portapapeles.

formato Opcional. Una constante o valor que especifica uno de los formatos del Portapapeles reconocidos por Visual Basic, como se describe a continuacin : Los valores de formato son: Constante vbCFLink vbCFRTF vbCFText Valor &HBF00 &HBF01 1 Descripcin Informacin de conversacin DDE Formato de texto enriquecido (Predeterminado) Texto

Estas constantes se enumeran en la biblioteca de objetos de Visual Basic (VB) del Examinador de objetos. SetData Pone una imagen en el objeto Clipboard usando el formato grfico especificado. No acepta argumentos con nombre. Sintaxis datos Clipboard.SetData datos, formato Requerido. El grfico que se va colocar en el objeto Clipboard.

Importante. Ver NOTA1 mas adelante formato Opcional. Una constante o valor que especifica uno de los formatos del

Pgina 120

objeto Clipboard reconocidos por Visual Basic, como se describe mas adelante. Si formato se omite, SetData determina el formato grfico automticamente. Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripcin Mapa de bits (archivos .BMP) Metarchivo (archivos .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. El grfico que se va colocar en el objeto Clipboard se define mediante la funcin LoadPicture o la propiedad Picture de los objetos Form, Image o PictureBox. NOTA 1. Esta informacin est obtenida de la ayuda de VB. Observe que dice que el grfico puede ser la propiedad Picture de un Form, Image o PictureBox. NO pretenda hacer esto sino ESTO Clipboard.SetData Picture1.Picture Clipboard.SetData Picture1.Image

NOTA 2. Tambin existe un error en la forma de meter una imagen en el Portapapeles con el mtodo Load Picture. La informacin dice que se introducir de la siguiente forma : Clipboard.SetData LoadPicture(C:FIESTA.BMP) Cuando vaya a introducir un fichero de mapa de bits (.BMP) ES NECESARIO poner que el fichero es del tipo 8 : Clipboard.SetData LoadPicture(C:FIESTA.BMP), 8 ya que si no, el Portapapeles contendr solamente un cuadro negro. Si introduce otro tipo de ficheros, ( .WMF) no es necesario poner el nmero de tipo de fichero. (Observe que esto NO coincide con lo que aporta la informacin de VB.) GetData Devuelve un grfico del objeto Clipboard. No acepta argumentos con nombre. Sintaxis Clipboard.GetData (formato)

formato Opcional. Una constante o valor que especifica el formato grfico de Clipboard, como se describe mas adelante. La constante o valor debe ir entre parntesis. Si formato es 0 o se omite, GetData usa automticamente el formato apropiado. Los valores de formato son: Constante vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor 2 3 8 9 Descripcin Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores

Pgina 121

Si en el objeto Clipboard no hay ningn grfico que coincida con el formato esperado, no se devuelve nada. Si en el objeto Clipboard slo hay una paleta de colores, se crea un DIB de tamao mnimo (1 x 1). GetText Devuelve una cadena de texto del objeto Clipboard. No acepta argumentos con nombre. Sintaxis Clipboard.GetText (formato)

formato Opcional. Un valor o constante que especifica el formato del objeto Clipboard, como se describe mas adelante. La constante o valor debe ir entre parntesis. Los valores de formato son: Constante vbCFLink vbCFText Valor Descripcin Informacin de conversacin DDE (Predeterminado) Texto

&HBF00 1

Si en el objeto Clipboard no hay ninguna cadena de texto que coincida con el formato esperado, se devuelve una cadena vaca (""). Paste Copia datos desde el Portapapeles del sistema en un control contenedor OLE. Sintaxis objeto.Paste

Objeto es el nombre del Panel Contenedor OLE donde se quiere depositar el contenido del Portapapeles. Comentario Para usar este mtodo, defina la propiedad OLETypeAllowed y despus verifique el valor de la propiedad PasteOK. No se puede pegar con xito a menos que PasteOK devuelva True. Si se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLELinked (0) o vbOLEEmbedded (1). Si no se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLENone (3). Este mtodo puede usarse para implementar un comando Edicin Pegar en un men. Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el objeto, el control contenedor OLE elimina cualquier objeto existente en el control. PasteOK Devuelve un valor que determina si el contenido del Portapapeles del sistema se puede pegar en el control contenedor OLE. Sintaxis objeto.PasteOK

Objeto es el nombre del contenedor OLE donde se quiere pegar el contenido del portapapeles. Comentario Cuando el valor de esta propiedad es True, 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. Una vez que un objeto se ha Pgina 122

pegado en el control contenedor OLE, se puede verificar el valor de la propiedad OLEType para determinar el tipo de objeto que ha sido creado. Esta propiedad puede usarse si se quiere que la aplicacin implemente un comando Pegar en un men Edicin. Si PasteOK es False, el comando del men se deshabilita; si no, puede habilitarse. Los comandos de men se habilitan y se deshabilitan estableciendo su propiedad Enabled a True o False, respectivamente. Los objetos se pegan en el control contenedor OLE con el mtodo Paste. Para ofrecer mayor flexibilidad al usuario, presente un cuadro de dilogo Pegado especial cuando el usuario elija el comando Edicin Pegar . (Establezca OLETypeAllowed = 2 y despus use el mtodo PasteSpecialDlg). Cuando se presenta este cuadro de dilogo, el objeto del Portapapeles del sistema se pega basndose en las selecciones del usuario en el cuadro de dilogo. GetFormat Devuelve un entero que indica si un elemento del objeto Clipboard coincide con un formato especificado. No acepta argumentos con nombre. Sintaxis Clipboard.GetFormat (formato)

formato Requerido. Un valor o constante que especifica el formato del objeto Clipboard, como se describe mas adelante. La constante o valor debe ir entre parntesis. Los valores de formato son: Constante vbCFLink vbCFText vbCFBitmap vbCFMetafile vbCFDIB vbCFPalette Valor HBF00 1 2 3 8 9 Descripcin Informacin de conversacin DDE Texto Mapa de bits (archivos .BMP) Metarchivo (archivos .WMF) Mapa de bits independiente del dispositivo (DIB) Paleta de colores

El mtodo GetFormat devuelve True si algn elemento del objeto Clipboard coincide con el formato especificado. Si no, devuelve False. Para los formatos vbCFDIB y vbCFBitmap, la paleta de colores que se encuentre en el Clipboard se usa para presentar el grfico. Clear Borra el contenido del Portapapeles del sistema. Sintaxis Clipboard.Clear

Con Clear se borra todo el contenido del portapapeles, texto y grficos. Copy Copia el objeto de un control contenedor OLE al Portapapeles del sistema. Sintaxis objeto.Copy

Objeto es el nombre del contenedor OLE cuyo contenido queremos copiar Comentario

Pgina 123

Cuando se copia un objeto en el Portapapeles del sistema, todos los datos y la informacin de vinculacin asociados con el objeto se copian en el Portapapeles del sistema. En el Portapapeles del sistema se pueden copiar objetos vinculados y objetos incrustados. Este mtodo puede usarse para implementar un comando Edicin Copiar en un men. EJERCICIO Se propone el siguiente ejercicio, donde pueden verse todas las posibilidades del Portapapeles. Cree un formulario de la siguiente forma :

El grfico que tiene el Picture de la izquierda puede ser cualquiera. El cdigo de este formulario es el siguiente : Option Explicit Private Sub Check1_Click() End Sub Private Sub Command1_Click() Clipboard.SetData Picture1.Image End Sub Private Sub Command2_Click() Dim ClpFmt As Integer Dim Msg As String On Error Resume Next ' Configura el controlador de errores. If Clipboard.GetFormat(vbCFText) Then ClpFmt = ClpFmt + 1 If Clipboard.GetFormat(vbCFBitmap) Then ClpFmt = ClpFmt + 2 If Clipboard.GetFormat(vbCFDIB) Then ClpFmt = ClpFmt + 4 If Clipboard.GetFormat(vbCFMetafile) Then ClpFmt = ClpFmt + 8 Select Case ClpFmt Case 1 Msg = "El Portapapeles slo contiene texto." Case 2

Pgina 124

Msg = " El Portapapeles slo contiene un archivo de mapa de bits." Case 3 Msg = " El Portapapeles contiene texto y un archivo de mapa de bits." Case 5 Msg = " El Portapapeles contiene texto y un archivo DIB." Case 8 Msg = " El Portapapeles contiene solamente un archivo MetaFile." Case 9 Msg = " El Portapapeles contiene texto y un archivo MetaFile." Case Else Msg = "No hay nada en el Portapapeles." End Select Label1.Caption = Msg ' Muestra el mensaje. End Sub Private Sub Command3_Click() Clipboard.Clear End Sub Private Sub Command4_Click() Clipboard.SetText Label2.Caption End Sub Private Sub Command5_Click() Label3.Caption = Clipboard.GetText End Sub Private Sub Command6_Click() Picture2.Picture = Clipboard.GetData() End Sub Private Sub Command7_Click() Picture2.Picture = LoadPicture End Sub Private Sub Command8_Click() Text1.Text = Trim(Text1.Text) If UCase(Right(Text1.Text, 3)) = "BMP" Then Check1.Value = 1 Else Check1.Value = 0 End If If Check1.Value = 1 Then Clipboard.SetData LoadPicture(Text1.Text), 8 Else Clipboard.SetData LoadPicture(Text1.Text) End If End Sub

Pgina 125

Visual Basic - Gua del Estudiante Cap. 5 Cont.


EL EDITOR DE MENUS El Men o Barra de Men es la segunda lnea de cualquier ventana Windows, donde pueden verse distintos nombres. La Barra de Men es un componente de un Formulario. La Barra de Men puede tener tantas palabras como se desee, y sobre cada palabra, puede desplegarse un Men desplegable con mas palabras. Sobre cada una de estas puede a su vez desplegarse otro conjunto de palabras, etc. con lo que se puede conseguir una cantidad de palabras tan grande como necesitemos.

Para cada palabra se produce el evento click. Cada palabra de la Barra de Men lleva anexo un nico procedimiento, que se ejecutar al hacer click sobre la palabra. Pero en las palabras que sirven para desplegar un men no tiene sentido que se ponga ningn cdigo en su procedimiento, ya que estn ah justamente para desplegar otras palabras. Ser en las palabras finales donde se colocar el cdigo correspondiente. En las figuras anteriores pueden verse tres formas distintas de ver el mismo Men. En la primera figura el Men est sin desplegar. En la segunda figura puede verse un rbol de Men largo, desplegado en su totalidad. En la tercera puede verse el Men desplegable de la palabra Archivo de la Barra de Men. Puede apreciarse en este men desplegable una lnea que separa las palabras Guardar Como y SALIR. Esta lnea separadora es muy prctica para separar dos temas distintos dentro de un Men desplegable. Tan distintos como las operaciones de Abrir y Guardar respecto a la ltima orden del men desplegable que es SALIR de la aplicacin. Para crear un men debe usarse el Editor de Men, que se encuentra en la Barra de Men de VB en Herramientas | Editor de mens. Le aparecer el siguiente cuadro. (En principio vaco)

Pgina 126

Cada palabra del men tiene su Caption (La palabra que aparece en el men), su Name (Nombre), y puede tener Index (si existen varias palabras con el mismo Name). Para introducir estas propiedades basta con teclearlas directamente en cada una de las casillas al efecto del cuadro del editor de mens. Para colocar el cursor de escritura en una u otra casilla, puede hacerse bien con el cursor del ratn, bien con el tabulador. Para pasar a la siguiente lnea de edicin (crear una nueva palabra), basta con pulsar ENTER. Existen otras propiedades aparte del Caption y Name que se introducen directamente en las casillas al efecto. HelpContextID Igual que esta propiedad en el resto de los controles, permite introducir un nmero de contexto para la ayuda de Windows. Enabled. Habilitado. Si se quita la marca de esa casilla, esa palabra aparecer por defecto deshabilitada. Esta propiedad puede leerse y cambiarse en tiempo de ejecucin, por lo que esta propiedad puede usarse para deshabilitar ciertas funciones de la aplicacin, dependiendo de la evolucin de la propia aplicacin. La presentacin en el men cuando est deshabilitada es con color plido. Visible. ejecucin. Como su nombre indica, que sea visible o no lo sea. Puede cambiarse en tiempo de

WindowList Indica si esa palabra es la que va a mostrar todos los formularios abiertos en una aplicacin de documentos mltiples (MDI). Al hacer click sobre esta palabra, se desplegar un submen con todos los Caption de los Formularios hijo abiertos en ese momento. Solamente puede existir una palabra en un men con esta propiedad activada. Esta propiedad no puede variarse en tiempo de ejecucin. Para cambiar una de estas propiedades en tiempo de ejecucin, basta con citar por su nombre a esa palabra (por su Name, no por su Caption), e igualar a True o False su valor : nmuDocumentos.Visible = False El nombre usado para nombrar a una de las palabras del men puede ser cualquiera. Sin embargo es prudente usar un nombre que nos pueda identificar, por una parte, que ese nombre corresponde a una de

Pgina 127

las palabras del men, y por otra, a que palabra se refiere. La solucin puede ser cualquiera. El autor de estos apuntes propone poner las letras mnu (o menu - recomiendo no usar acentos e los Names de VB), seguido del Caption de esa palabra. Otras propiedades Shortcut Atajo. Esta propiedad admite varias combinaciones de teclas para acceder al procedimiento click de esa palabra sin necesidad de usar el ratn. Las combinaciones de teclas posibles se muestran haciendo click en la flecha hacia abajo que tiene esa casilla. Se desplegar una lista con todas ellas. Para elegir una de estas combinaciones, basta con hacer click sobre la lnea que la contiene. Esta combinacin de teclas aparecer en el men, al lado de la palabra (Vase figura siguiente, SALIR Ctrl + X) NegotiatePosition. Establece un valor que determina si los controles Menu de nivel superior se muestran en la barra de mens mientras un objeto vinculado o incrustado de un formulario est activo y mostrando sus mens. No est disponible en tiempo de ejecucin. Puede tener los valores 0 (Predeterminado) Ninguno. El men no se muestra en la barra de mens cuando el objeto est activo. 1 Izquierda. El men se muestra a la izquierda de la barra de mens cuando el objeto est activo. 2 Medio. El men se muestra en medio de la barra de mens cuando el objeto est activo. 3 Derecha. El men se muestra a la derecha de la barra de mens cuando el objeto est activo. El men editado con los datos de la figura anterior tendr esta forma en tiempo de ejecucin :

Observe que tiene cuatro palabras en la lnea superior, y que colgando de la primera aparece un men desplegable. Para conseguir un men desplegable fjese en la figura del Editor, en la parte de abajo donde estn todos los Caption de las palabras del men. Observar que algunas de ellas (&Edicion, Documentos, Ayuda - Hay otra que no se v, &Archivo) estn completamente a la izquierda de la ventana, y las dems estn separadas de la parte izquierda por unos guiones. Las palabras que estn completamente a la izquierda son las que figurarn en la barra de men de forma permanente. Las que estn separadas (tabuladas) corresponden a las que aparecern en los mens desplegables. Como es lgico, un men desplegable debe colgar de una palabra de las de la barra de men. La palabra de la que cuelga el submen es la palabra sin tabular inmediatamente anterior. Para tabular las palabras, hay que hacer click en el botn en forma de flecha a la derecha que est sobre la ventana de edicin :

Situandonos sobre una de las lneas ya editadas, y haciendo click sobre el botn con flecha hacia la izquierda, quitamos la tabulacin.

Pgina 128

Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las lneas ya editadas. Podemos hacer varios niveles de submens a base de introducir varias tabulaciones. Al comienzo de este captulo puede ver un ejemplo de ello. Quedan un par de cosas. Una de ellas es el carcter & que est delante de los Caption de Archivo y Edicin. Este carcter nos permite acceder al procedimiento click de esa palabra pulsando la tecla Alt + la tecla correspondiente a la letra que est detrs del carcter &. Justamente la letra que est subrayada en la palabra del men. El carcter & no tiene porqu ir precisamente al comienzo de la palabra. Puede ir en el medio de la palabra. De esta forma se subrayar una letra intermedia. Otra cosa. Puede verse en el men desplegado de la figura anterior una lnea entre Guardar Como y SALIR. Esta lnea, que solamente tiene efectos estticos, se logra introduciendo como Caption un guin ( - ). El editor de mens solamente le permite el guin en una palabra de men desplegable (Tabulada). No se olvide de poner el Name incluso para este guin.

NOTA MUY IMPORTANTE Siempre se recomienda poner la orden de SALIR en la primera palabra de la barra de Men. Bien que esa primera palabra sea Salir o que est en el men desplegable de la primera palabra de la Barra de Men, en este ltimo caso, separada mediante una lnea separadora. (Vea The Windows Interface Guidelines for Software Design, pg.124)

POPUP MENS Un PopUpMen o Men Emergente es un men que despliega en cualquier punto de un Formulario (MDI o normal) con varias opciones. Es normal en los procesadores de texto que se obtenga un men emergente pulsando el botn derecho del ratn, donde aparecen las tres palabras mgicas de Copiar, Cortar y Pegar. 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. Por ejemplo, en el men que hemos editado como ejemplo anteriormente, exista una palabra Edicin, de la que se desplegaba el Submen Copiar, Cortar y Pegar. Si analizamos la edicin realizada, las palabras tenan el siguiente Caption y Name :

Caption Edicin 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 aparecan en el men desplegable. Esas mismas sern las que aparezcan en el PopUpMenu. Para ello utilizaremos el Mtodo PopupMenu. Este mtodo pesenta un men emergente en un objeto MDIForm o Form en la posicin actual del mouse o en las coordenadas especificadas.

La sintaxis de este mtodo es la siguiente :

Pgina 129

NombreFormulario.PopupMenu nombremen, indics, x, y, negrita Donde NombreFormulario es el nombre del formulario donde presentamos el PopUpMenu. Puede omitirse. Nombremen. Este parmetro es requerido. 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. Indics. Parmetro opcional. Un valor o constante que especifica la posicin y el comportamiento del men emergente, como se describe a continuacin : Constante (posicin) vbPopupMenuLeftAlign Valor 0 Descripcin (Predeterminado) El lado izquierdo del men se sita en x. El men emergente se centra en x. El lado derecho del men se sita en x. Valor 0 Descripcin (Predeterminado) Los elementos del men emergente slo reaccionan a los clic del mouse cuando se use el botn primario del mouse. Los elementos del men emergente reaccionan a los clic del mouse cuando usen los botones primario o secundario. Para combinar la los valores de indics de posicin y comportamiento basta con sumar los valores. Nota El parmetro indics no tiene efecto en las aplicaciones que se ejecuten bajo Microsoft Windows versin 3.0 o anteriores. X, y Parmetro(s) opcionales que especifican las coordenadas x e y donde va a aparecer el men emergente. Si no se especifican, aparecer donde est el puntero del mouse. Las unidades de medida de las coordenadas x e y se definen mediante la propiedad ScaleMode. negrita. Parmetro opcional que especifica el nombre de un control men del men emergente para presentar su ttulo en negrita. Si se omite, ningn control del men aparece en negrita. Nota. Este argumento funciona solamente en las aplicaciones que se ejecuten bajo Windows 95. La aplicacin ignora este argumento cuando se ejecute bajo versiones de 16 bits de Windows o Windows NT 3.51 y anteriores. La forma mas habitual de presentar un men emergente es mediante el botn derecho del ratn. Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando se levanta el botn derecho del ratn. Es decir, en el evento MouseUp, con la condicin de que Button=2. Imaginemos que queremos presentar en un men emergente las palabras Cortar, Copiar y Pegar del ejemplo anterior, que colgaban en el men de la palabra Edicin. (Vea mas atrs). Queremos tambin que la palabra Copiar salga resaltada en negrita. Iramos al procedimiento MouseUp del Formulario y escribiramos : Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu mnuEdicion, , , , mnuCopiar End If Pgina 130

vbPopupMenuCenterAlign 4 vbPopupMenuRightAlign 8 Constante (comportamiento) vbPopupMenuLeftButton

vbPopupMenuRightButton se

End Sub Observe que se ha omitido el nombre del Formulario (Opcional), el parmetro indics, y las coordenadas x e y (el men emergente aparecer donde est situado el cursor del ratn). Observe tambin que las comas separadoras de los parmetros hay que colocarlas. Cuando se presenta un men emergente, el cdigo que sigue a la llamada al mtodo PopupMenu no se ejecuta hasta que el usuario elige un comando del men (en cuyo caso se ejecuta antes el cdigo del procedimiento de evento Click) o cancela el men. Adems, slo puede presentarse un men emergente al mismo tiempo; por lo tanto, las llamadas a este mtodo se ignoran si el men emergente est presentado actualmente o si un men desplegable est abierto. Si queremos presentar un men emergente es necesario tener ese men en el men del formulario. El problema puede ser que no queramos que est en la barra de men. No es problema. Ponga la propiedad Visible del elemento del men desde el que se va a desplegar el submen a False. No se ver ya en la barra de men ni esa palabra ni el submen que de ella se despliega. Eso s, las palabras del submen deben tener la propiedad Visible = True. Si les pone esa propiedad a False, no se vern en el men emergente. Puede aprovechar esta circunstancia para hacer mens emergentes con mas o menos elementos, segn las necesidades de su aplicacin. Tambin puede poner la propiedad Enabled a False si as lo precisa. No puede activar la propiedad WindowList en un elemento que forma parte de un men emergente.

FIN del Quinto captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 131

Visual Basic - Gua del Estudiante Cap. 6


INTERCAMBO DINAMICO DE DATOS EL CONTROL PERSONALIZADO MICROSOFT COMM INTERCAMBO DINAMICO DE DATOS (Dinamic Data Exchange) DDE El intercambio dinmico de datos es una utilidad de Windows que utiliza Visual Basic, y nos permite crear aplicaciones que tomen datos una de otras. Para pasar datos de una aplicacin a otra se necesitan al menos, dos aplicaciones (lgico), una que se deje leer, y la otra (u otras), que quieran leer la informacin en aquella. Puede darse el caso que una aplicacin est recibiendo datos de otra aplicacin, y a su vez enve datos a una tercera. A la aplicacin que enva la informacin se le llama aplicacin servidor, y a la que la recibe, aplicacin cliente. La aplicacin servidor debe estar funcionando antes de que la aplicacin cliente le pida la informacin. Si no es as, se generar un error. Los datos a traspasar de una aplicacin a otra pueden ser : Textos, de un Label o un TextBox. Imgenes, de un PictureBox. El origen de un intercambio DDE siempre es un formulario. Dentro de este formulario origen estar el Label, TextBox o PictureBox que contiene la informacin a enviar. Para indicar que un formulario es origen de informacin para un intercambio DDE debemos decrselo en sus propiedades LinkMode y LinkTopic. El destino de un texto ha de ser necesariamente un Label, un TextBox, y el destino de un grfico debe ser un PictureBox. Cuando queremos que uno de estos controles sea el destino de un intercambio DDE debemos indicarlo en sus propiedades LinkMode, LinkTopic, LinkItem, e indicarle el tiempo de espera para un intercambio en la propiedad LinkTimeout.

Propiedad LinkMode Tiene distinta forma si se trata de un control (Label, TextBox y PictureBox) un formulario. Para un formulario tiene dos valores posibles : 0 = None 1= Source No puede existir comunicacin DDE con ese formulario El formulario permite que exista una comunicacin DLL entre uno de sus controles y otra aplicacin.

Si se establece el valor de esta propiedad a 0 en tiempo de diseo, no podr cambiarse en tiempo de ejecucin. Si se establece a 1 en tiempo de diseo, se podr cambiar a 0 y volver a ponerla a 1 en tiempo de ejecucin.

Para un control, la propiedad LinkMode le permite que inicie una conversacin DDE con una aplicacin servidor, (origen), y cmo iniciarla. Tiene 4 valores posibles :

Pgina 132

0=None. 1=Automtico

No existe comunicacin DDE con ese control Los datos se traspasarn desde la aplicacin servidor a este control de la aplicacin cliente cada vez que cambie el dato en la aplicacin servidor (origen) Los datos se traspasarn cuando lo pida la aplicacin cliente (destino), mediante la orden LinkRequest. Cuando existe un cambio en los datos de la aplicacin origen, sta notifica a la aplicacin destino que el dato ha cambiado, pero no le enva el dato nuevo. En el control de la aplicacin destino donde debe llevarse la informacin, se genera el evento LinkNotify, en cuyo procedimiento podremos escribir el cdigo necesario dependiendo de nuestra aplicacin. Para traer la informacin, debe ejecutarse la orden LinkRequest. (Vase mas adelante)

2=Manual

3=Notify

En tiempo de ejecucin, para un control, esta propiedad es de lectura y escritura, es decir, se puede usar para saber que valor tiene esta propiedad en un determinado control, o para forzar esa propiedad a un determinado valor. La sintaxis de esta propiedad es : objeto.LinkMode [= nmero] donde nmero es un entero que especifica el tipo de conexin. (0, 1, 2 3 segn se ha visto) y objeto es el nombre del control. Propiedad LinkTopic Esta propiedad es de lectura y escritura, tanto para los controles como para los formularios. Cuando un control destino quiere establecer una comunicacin DDE llama a la aplicacin origen, y dentro de ella, al formulario que contiene el control cuya informacin debe ser traspasada. (Ntese que la aplicacin origen puede tener varios formularios). Al ese formulario podra llamarle por su nombre, (por su Name), pero no lo hace as. Le llama por un nombre que le debemos poner al formulario en su propiedad LinkTopic. A este nombre se le denomina Tema. La propiedad LinkTopic, para un formulario de origen, devuelve o establece el tema al que el formulario responde en una conversacin DDE. Sintaxis nombredelformulario.LinkTopic [= tema]

Para un control destino, La propiedad LinkTopic contiene el nombre de la aplicacin y el tema, ambos separados mediante el carcter | (carcter 124) Sintaxis nombredelcontrol.LinkTopic [= aplicacionorigen|tema]

El nombre de la aplicacin origen ser el nombre del de proyecto de Visual Basic sin la extensin .VBP (si la aplicacin se est ejecutando en el entorno de desarrollo de Visual Basic), o el nombre de la aplicacin de Visual Basic sin la extensin .EXE (si se ejecuta como un archivo ejecutable independiente). El tema ser el mismo al que responde el formulario donde se encuentra el c ontrol que contiene la informacin a traspasar. ( DDE es una utilidad de Windows. Windows establece que el estndar de un vinculo DDE es Aplicacin | Tema ! elemento. Vase para mas detalles el manual de Windows, enlaces DDE)

Pgina 133

Propiedad LinkItem La propiedad LinkItem solamente la tiene el control destino de la informacin. No la tiene el formulario origen. En esta propiedad deber expresarse el nombre del control origen de la informacin. Esta propiedad es de lectura y escritura, es decir, tanto sirve para saber el nombre del control origen de los datos, como para establecerlo en tiempo de ejecucin. 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.

Propiedad LinkTimeout Devuelve o establece la cantidad de tiempo que un control espera una respuesta a un mensaje DDE. Sintaxis objeto.LinkTimeout [= nmero]

donde nmero es una expresin numrica que especifica el tiempo de espera en dcimas de segundo. El tiempo de respuesta DDE desde aplicaciones origen vara. Use esta propiedad para ajustar el tiempo que un control destino espera la respuesta de una aplicacin origen. Si se usa LinkTimeout de forma correcta se puede evitar la generacin de un error por Visual Basic si una aplicacin origen tarda mucho en responder. Nota La plazo mayor de tiempo que un control puede esperar es 65.535 dcimas de segundo, es decir, sobre 1 hora y 49 minutos. Al establecer LinkTimeout a 1 se indica al control que espere la respuesta en una conversacin DDE durante el mayor plazo de tiempo. El usuario puede forzar que el control deje de esperar presionando la tecla ESC..

Evento LinkNotify Ocurre cuando el origen ha cambiado el dato definido por el vnculo DDE si la propiedad LinkMode del control destino est establecido a 3 (Notificar). Private Sub objeto_LinkNotify([ndice As Integer])

End Sub En este procedimiento se puede escribir el cdigo necesario para nuestra aplicacin, a sabiendas de que este evento se produce cuando cambia la informacin en origen. Posiblemente no quiera depositarlo de inmediato en el control destino, puesto que si fuese as habra puesto la propiedad LinkMode a 1. Cuando quiera colocar el dato en el control destino, puede utilizar el mtodo LinkRequest para obtener el nuevo dato de la fuente.

Mtodo LinkRequest Pide a la aplicacin origen de una conversacin DDE que actualice el contenido de un control Label, PictureBox o TextBox. Sintaxis objeto.LinkRequest

Siendo objeto el nombre del control destino de la aplicacin.

Pgina 134

Objeto es el nombre de un control Label, PictureBox o TextBox involucrado en una conversacin DDE como destino. LinkRequest provoca que la aplicacin origen enve los datos actuales al objeto, actualizando la propiedad Caption si objeto es un control Label, la propiedad Picture si objeto es un control PictureBox o la propiedad Text si objeto es un control TextBox. Si la propiedad LinkMode del objeto est definida como 1 (Automtico), la aplicacin origen actualiza objeto automticamente y LinkRequest no es necesario. Si la propiedad LinkMode del objeto est definida como 2 (Manual) , la aplicacin origen actualiza objeto slo cuando se usa LinkRequest. Si la propiedad LinkMode del objeto est definida como 3 (Notify), el origen notifica al destino que los datos han cambiado invocando el mtodo LinkNotify. El destino debe entonces usar el mtodo LinkRequest para actualizar los datos.

Mtodo LinkSend Transfiere el contenido de un control PictureBox a la aplicacin destino de una conversacin DDE. Sintaxis objeto.LinkSend

Objeto debe ser un control PictureBox de un objeto Form que sea origen de una conversacin DDE. Cuando otras aplicaciones establecen vnculos automticos con un objeto Form de su aplicacin, Visual Basic las notifica cuando el contenido de un control TextBox o Label origen cambia. Sin embargo, Visual Basic no notifica automticamente a una aplicacin destino DDE cuando el valor de la propiedad Picture de un control PictureBox origen cambia. Como la cantidad de datos de un grfico pueden ser muy grande y como no tiene sentido actualizar la aplicacin destino por cada cambio de pxel de la imagen, Visual Basic requiere el uso del mtodo LinkSend para notificar explcitamente a las aplicaciones destino DDE cundo cambia el contenido de un control PictureBox.

Mtodo LinkPoke Transfiere el contenido de un control Label, PictureBox o TextBox a la aplicacin origen de una conversacin DDE. Sintaxis objeto.LinkPoke

Objeto es el nombre del control Label, PictureBox o TextBox involucrado en la conversacin DDE como destino. Si objeto es un control Label, LinkPoke transfiere el contenido de la propiedad Caption al origen. Si objeto es un control PictureBox, LinkPoke transfiere el contenido de la propiedad Picture al origen. Si objeto es un control TextBox, LinkPoke transfiere el contenido de la propiedad Text al origen. Normalmente, en una conversacin DDE la informacin fluye de origen a destino. Sin embargo, LinkPoke permite que un objeto destino suministre datos al origen. No todas las aplicaciones origen aceptan informacin de esta forma; si la aplicacin origen no acepta los datos, se produce un error.

Pgina 135

EL CONTROL PERSONALIZADO MICROSOFT COMM Este control permite la comunicacin de una aplicacin VB con el puerto serie. El control MSComm no est normalmente en la caja de herramientas, por lo que ser necesario introducirlo mediante Herramientas | Controles Personalizados. En el formulario solamente se le ve en tiempo de diseo. El icono que lo representa en la caja de herramientas coincide con el que presenta en el formulario :

Al tratarse de un control personalizado, presenta dos formas de ver las propiedades. Si hacemos click con el botn derecho del ratn sobre el control y vamos a propiedades, nos presenta tres cuadros de configuracin de los tpicos de los controles personalizados. Si seleccionamos el control MSComm y pulsamos F4 , aparecer la caja de propiedades tpica de los controles VB. PRPIEDADES Existen propiedades que pueden establecerse en tiempo de diseo o en tiempo de ejecucin, y otras que solamente se pueden ejecutar o consultar en solamente en tiempo de ejecucin. Se detallan a continuacin las primeras. Las segundas se enumerarn tras estas, aunque se nombran algunas de estas ltimas al explicar cada una de las propiedades del primer tipo. CommPort Indica el nmero del puerto serie usado. Admite los valores de 1 a 255. Cambiando esa propiedad podemos cambiar el puerto de comunicacin que vamos a usar (Un PC tiene normalmente 2 puertos serie : El Com1 y el Com2. Puede tener sin grandes problemas Hardware hasta 4 (Com3 y Com4) Si le damos a ese valor un nmero de puerto inexistente, dar error. Settings Sintaxis Velocidad, Paridad, Bits de informacin, Bits parada

Indica la velocidad, paridad, nmero de bits y bits de stop (parada) que se van a usar en la comunicacin. Los valores posibles para velocidad son : Indica la velocidad en baudios. 50 100 110 300 600 1200 2400 4800 9600 14400 19200 y 28800

Los valores posibles para paridad son : N - No enva bit de paridad ni hace comprobacin de paridad en la recepcin. O - Enva y comprueba paridad, con el criterio de paridad IMPAR E - Enva y comprueba paridad, con criterio de paridad PAR Los valores para el parmetro Bits de Informacin pueden ser : 7 - Se envan / reciben 7 bits por trama de informacin. 8 - Se envan / reciben 8 bits por trama de informacin 5 - Se envan / reciben 5 bits por trama de informacin. Este valor de 5 bits es el tpico del sistema Baudot para transmisin telegrfica (Teletipos) que se ha conservado en las comunicaciones informticas por pura tradicin. Si se eligen 5 bits, los bits de parada se ponen automticamente a 1,5 (Tpico tambin del sistema Baudot.) Pgina 136

Los valores para el parmetro Bits de parada pueden ser : 1 - Se enva un bit de parada 2 - Se envan 2 bits de parada (No es posible programar 1,5 bits de parada. Slo lo hace cuando se programan 5 bits de informacin y lo hace automticamente). Handshaking Especifica el mtodo de control sobre el flujo de informacin. En una comunicacin serie se necesita conocer si el puerto puede enviar informacin (necesita saber si el mdem est preparado para recibirla) y necesita indicarle al mdem que l est preparado para recibir informacin. A este proceso se le denomina Handshaking. (Handshaking = Control de Flujo) (Como sabr por sus conocimientos de ingls, Handshaking significa apretn de manos, ponerse de acuerdo. Y ponerse de acuerdo entre dos terminales que van a comunicarse es establecer las condiciones de control que uno va a tener sobre otro.) El Control de Flujo puede hacerse de dos formas : Una mediante las seales auxiliares del puerto (RTS, CTS, DSR, DTR), que son cables adicionales que tendrn una tensin positiva respecto a los 0V del equipo si esa seal est activada, o una tensin negativa si no lo est. Este tipo de control del flujo de informacin es el tpico para comunicarse el ordenador con un mdem. Existe otra forma de controlar el flujo de informacin : mediante seales especiales que se envan por los dos cables que transportan la informacin. Mediante estas dos seales podemos controlar que el ordenador enve informacin o deje de enviarla. De igual forma, podemos indicarle al mdem que enve o no enve. Estas seales especiales se denominan X-ON y X-OFF. La propiedad Handshaking controla la forma de realizar este proceso. Puede tomar los siguientes valores : 0 - No existe Control de Flujo 1 - Control de Flujo mediante XON - XOFF 2 - Control de Flujo mediante Request To Send (RTS) y Clear To Send (CTS) 3 - Control de Flujo mediante XON - XOFF y RTS - CTS Los tres tipos de Control de Flujo tiene cada uno su aplicacin. InBufferSize Mediante esta propiedad establecemos el tamao del Buffer (almacn de datos) de entrada. Este Buffer sirve para poder recibir datos sin que tenga que intervenir la aplicacin continuamente para controlar el puerto de entrada. Puede conocerse el nmero de caracteres presentes en el Buffer de entrada consultando el valor de la propiedad InBufferCount. OutBufferSize Mediante esta propiedad controlamos el tamao del Buffer de salida. El tamao de los Buffers depender de la aplicacin y de la velocidad de comunicacin. Si la aplicacin tiene muchas cosas que hacer, aparte de controlar el puerto de comunicaciones, se deber poner un Buffer grande. Tanto mas grande cuanta mayor sea la velocidad de transferencia de datos.

Pgina 137

Puede conocerse el nmero de caracteres presentes en el Buffer de salida (los que an estn por transmitir), consultando el valor de la propiedad OutBufferCount.

RThreshold, SThreshold Estas dos propiedades especifican el nmero de caracteres que deben estar presentes en los Buffers de Recepcin y Transmisin respectivamente, para que se produzca el evento OnComm relativo a recepcin y transmisin de caracteres. (Eventos EvReceive y EvSend) Si el valor de una de estas propiedades est a 0, no se produce el evento OnComm correspondiente. El valor que se debe dar a estas dos propiedades depende de la aplicacin y del tiempo que queramos que la aplicacin est atendiendo al puerto de comunicaciones. Concretamente para la propiedad RThreshold debemos pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mnimo), cada vez que reciba un carcter se producir el evento OnComm. (Vea la descripcin de eventos mas adelante). Al producirse este evento, ejecutar el procedimiento asociado a l, lo que har perder tiempo a la aplicacin, impidindole realizar otras funciones. Si se pone un valor muy alto, el puerto no avisar que tiene caracteres recibidos hasta que reciba un nmero igual al programado en esta propiedad, por lo que no podremos procesar los datos recibidos hasta que el buffer tenga ese nmero de caracteres en su interior. En nmero adecuado depender del tipo de aplicacin que vayamos a realizar. En cualquier caso, este nmero ser inferior al nmero programado para la longitud del buffer, ( InBufferSize)

InputLen Por defecto, cuando se lee el Buffer de recepcin, se leen todos los caracteres, quedando el Buffer vaco. Si se le asigna a esta propiedad un valor distinto de 0, cada vez que leamos el Buffer de recepcin leer un nmero de caracteres igual a esa cantidad, permaneciendo los caracteres restantes en el Buffer a la espera de una nueva lectura. Asignndole el valor 0 (Valor por defecto), el buffer se lee completo. ParityReplace Si la comunicacin se realiza con bit de paridad (Par o Impar), en recepcin se comprueba byte a byte la recepcin de la paridad correcta. Si se recibe un Byte que no tiene paridad correcta, lo mas probable es que ese Byte (carcter) se haya recibido defectuoso. Esta propiedad nos permite sustituir un carcter que ha llegado con bit de paridad incorrecto por otro carcter. ( ? predeterminado). Se puede sustituir por una cadena de caracteres (Error, por ejemplo). NullDiscard Cuando se recibe el carcter nulo (00000000) puede ser que no sirva para nada a efectos de nuestra aplicacin, o que este carcter sea un dato mas. Esta propiedad acepta los valores True / False. Si es True se desprecia el carcter Nulo. Si es False, se toma como un carcter mas. CTSTimeout Es el tiempo (en milisegundos) que permanece esperando la seal CTS (Seal CTS - Dispuesto para enviar), seal de entrada al ordenador que debe estar presente antes de que el puerto comience a enviar informacin. El tiempo se mide desde que se pone activa la seal de salida RTS (Peticin de envo). Si se supera este tiempo entre el instante de activacin de la seal RTS y la recepcin de la seal CTS, se produce el evento CTSTO. Poniendo 0 en esta propiedad, se deshabilita, y en estas condiciones no se producir nunca el evento CTSTO. CDTimeout Es el tiempo mximo de espera (en milisegundos) desde que se activa la seal DTR hasta que se recibe la

Pgina 138

seal CD (Carrier Detect - Deteccin de portadora). Este tiempo solamente tendr importancia en ciertas aplicaciones donde se espere recibir CD continuamente. No tendr sentido cuando la aplicacin se queda en espera a recibir una comunicacin, pero sin saber cuando la tiene que recibir. Si transcurre el tiempo programado en esta propiedad, ocurrir el evento CDTO. Poniendo el valor 0 se deshabilita esta propiedad y no se producir nunca el evento CDTO. DSRTimeout Similar a la anterior, pero en vez de esperar la seal CD se espera la seal DSR. Esta propiedad s tiene sentido, ya que si, por ejemplo, estamos conectados con un mdem, y nuestra aplicacin se pone a la espera de recibir alguna llamada, activa la salida DTR, y espera recibir inmediatamente la respuesta de que el mdem est dispuesto, mediante la lnea DSR. Si transcurre el tiempo programado sin recibir la seal DSR se producir el evento DSRTO . Ponindola a 0, se deshabilita esta propiedad y nunca ocurrir el evento DSRTO. RTSEnable Activa (Pone a 1) la seal RTS (Request To Send - Peticin de envo) Esta seal debe ponerse a 1 para indicar al mdem (o al equipo que va a recibir nuestra comunicacin) que deseamos enviar datos. Debe estar activada durante toda la transmisin de datos. Cuando se pone la propiedad Handshaking a 2 (control con RTS / CTS) 3 (Control con RTS / CTS y con X-ON / X-OFF) no debemos preocuparnos de poner a 1 la seal RTS, pues lo hace automticamente el puerto de comunicaciones. Esta propiedad est ah para aplicaciones donde no se emplee ese tipo de Handshaking y necesitemos activar algo antes de transmitir. (Caso por ejemplo de transmisin de datos por radio, donde podemos usar esta seal de salida para activar el PTT (Push To Talk - Pulse para hablar) y poner el transmisor en marcha) DTREnable Activa (Pone a 1) la salida DTR (Data Terminal Ready - Terminal de Datos Listo). Esta seal se emplea para decirle al mdem que el terminal (Ordenador) est preparado para recibir datos. Se hace la misma observacin que para la propiedad anterior respecto a los valores de la propiedad Handshaking Interval Indica el tiempo (en milisegundos) del intervalo entre una y otra comprobacin del estado de recepcin del puerto. El valor mnimo es de 55 ms. El anlisis del puerto de comunicacin no tiene nada que ver con la generacin del evento OnComm. Este evento se producir cuando se cumplan las condiciones para ello, independientemente del tiempo programado en esta propiedad. La comprobacin del puerto cada intervalo de tiempo marcado por esta propiedad solamente afecta a averiguar el estado de las lneas auxiliares CD, DSR y CTS, y para saber el nmero de caracteres existentes en los Buffers de transmisin y recepcin.

Las siguientes propiedades no difieren en nada respecto a otros controles : Left, Name, Index, Top, Tag

Propiedades propias del tiempo de ejecucin PortOpen

Pgina 139

Abre el puerto de comunicacin. Puede tener los valores True (Para abrirlo) y False (Para cerrarlo) Si tenemos un MSComm con Nombre (Name) MSComm1, para abrirlo ejecutaremos la siguiente sentencia : MSComm1.PortOpen = True Para cerrarlo, ejecutaremos : MSComm1.PortOpen = False InBufferCount. Nos permite averiguar cuantos caracteres tenemos en el Buffer de entrada. Con el mismo MSComm anterior, comprobaremos el nmero de caracteres sin leer con la sentencia : caracteressinleer = MSComm1.InBufferCount

OutBufferCount Nos permite conocer cuantos caracteres quedan por transmitir en el Buffer de salida. Emplearemos la sentencia : caracteressinenviar = MSComm1.OutBufferCount

Output Enva caracteres al Buffer de salida. Debe existir un signo igual ( = ) entre Output y lo que se enva al Buffer. Para enviar la frase Curso de Visual Basic ejecutaremos la sentencia : MSComm1.Output = Curso de Visual Basic Si deseamos enviar el contenido de una variable MSComm1.Output = variable Input Lee el Buffer de recepcin. El nmero de caracteres ledos depender del valor de la propiedad InputLen. Cuando la propiedad InputLen tiene el valor 0, el Buffer se lee completo. Si InputLen tiene un valor distinto de 0, se leer un nmero de caracteres igual al valor de esta propiedad. CommEvent Devuelve el evento mas reciente que ha ocurrido para generar el evento general OnComm (Vea mas adelante). Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis NombredelMSComm.CommEvent

Break Devuelve un valor (True / False) que indica que se ha recibido la seal Break.

Pgina 140

variable = MSComm1.Break CDHolding Devuelve el estado de la lnea de control CD (Deteccin de Portadora) Si es True, esa entrada est activada, si es False, la entrada est desactivada. variable = MSComm1.CDHolding CTSHolding Devuelve el estado de la lnea de control CTS (Dispuesto para enviar) Si es True, esa entrada est activada, si es False, la entrada est desactivada. variable = MSComm1.CTSHolding DSRHolding Devuelve el estado de la lnea de control DSR (Data Set Ready ) Si es True, esa entrada est activada, si es False, la entrada est desactivada. variable = MSComm1.DSRHolding EVENTOS DEL MSComm El MSComm tiene varios eventos, pero un solo Procedimiento : el Procedimiento OnComm. Este procedimiento se ejecuta cada vez que se produce alguno de los eventos del MSComm. Esto quiere decir que para escribir el cdigo apropiado en el procedimiento del MSComm ser necesario analizar qu evento se ha producido y colocar, mediante una sentencia If .. Then el cdigo apropiado para cada uno de los eventos que se produzcan. Para averiguar qu evento se ha producido puede hacerse consultando el valor de la propiedad CommEvent.

If CommEvent = ComEvRing Then 'Se ha consultado si el evento particular que ha producido el evento general OnComm 'ha sido el ComEvRing (Se est recibiendo la llamada del telfono). En esta sentencia If Then deberemos colocar el cdigo necesario para que la aplicacin se prepare para recibir una comunicacin a travs del mdem. End If Los eventos del Comm pueden identificarse por una constante o un nmero. La constante, como todas las de Visual Basic, tiene una expresin bastante difcil. Se pone entre parntesis el nmero que identifica a ese evento. Este nmero debe declararse como Integer. Se ejecutar el Procedimiento OnComm cuando ocurra alguno de los siguientes eventos : ComEvCD (5) Cambio en la lnea CD. Para conocer el estado actual de esa lnea (Activado/Desactivado) deberemos invocar la propiedad CDHolding Cambio en la lnea CTS. Igual que la anterior, este evento solamente nos indica que ha existido un cambio. Para averiguar el estado en que se encuentra esta lnea, debemos invocar la propiedad CTSHolding

ComEvCTS

(3)

Pgina 141

ComEvDSR

(4)

Cambio en la lnea DSR. Igual que las anteriores. Debemos invocar la propiedad DSRHolding para averiguar su estado actual. Cambio en la lnea de deteccin de llamada (Ring). Este evento se produce cuando hay un cambio en la lnea Ring (Deteccin de llamada en el mdem) No existe una propiedad para averiguar el estado de la lnea Ring pues no es necesario. Lo importante de esta lnea es que est cambiando, es decir, el telfono est sonando y poco importa que analicemos si la lnea Ring est a 1 o a 0, pues toda llamada telefnica es intermitente. Dependiendo de la UART de su PC, puede que este evento no lo soporte. Cuando se recibe un nmero igual o mayor de caracteres que el indicado en la Propiedad RThreshold Cuando quedan en el bfer de transmisin menos caracteres que los indicados en la Propiedad SThreshold Recibido un carcter de fin de archivo (carcter ASCII 26) .

ComEvRing

(6)

ComEvReceive( 2 )

ComEvSend

(1)

ComEvEOF

(7)

comEventBreak (1001) Se ha recibido una seal de interrupcin. (Break) ComEventCDTO (1007) Tiempo de espera de Deteccin de portadora. La lnea Deteccin de portadora (CD) estuvo baja durante el periodo de tiempo especificado en la Propiedad CDTimeout, mientras se intentaba transmitir un carcter. ComEventCTSTO 1002 Tiempo de espera de Preparado para enviar. La lnea Preparado para enviar (CTS) estuvo baja durante el periodo de tiempo especificado en la propiedad CTSTimeout mientras se intentaba transmitir un carcter. 1003 Tiempo de espera de Equipo de datos preparado. La lnea Equipo de datos preparado (DSR) estuvo baja durante el periodo de tiempo especificado en la Propiedad DSRTimeout mientras se intentaba transmitir un carcter.

ComEventDSRTO

ComEventOverrun

1006 Se sobrepas la capacidad del Buffer de entrada sin haber ledo todos los caracteres. Los caracteres no ledos se han perdido. Debemos aprovechar este evento para solicitar al colateral una repeticin de los datos perdidos. 1008 Desbordamiento del bfer de recepcin. No hay espacio para ms datos en el bfer de recepcin. 1009 Error de paridad. El hardware ha detectado un error de paridad. 1010 Bfer de transmisin lleno. El bfer de transmisin estaba lleno cuando se ha intentado agregar un carcter a la cola de transmisin. Este error es fcil de evitar, analizando el valor de la propiedad OutBufferCount antes de enviar mas datos al buffer de salida.

ComEventRxOver

ComEventRxParity

ComEventTxFull

Pgina 142

ComEventDCB

1011 Error inesperado al recuperar el Bloque de control de dispositivos (DCB) para el puerto. 1004 Error de trama. El hardware ha detectado un error de trama.

ComEventFrame

NOTA ADICIONAL El puerto de comunicaciones. El puerto de comunicaciones de un PC est formado por varias entradas / salidas. El soporte fsico es un conector tipo Sub-D de 9 25 contactos, macho en ambas versiones. Se necesita por tanto un cable con conector Sub-D hembra de 9 o 25 pines para acceder a l. La distribucin de las seales en cada uno de sus pines es la siguiente : GND TxD RxD RTS (Potencial de 0 V.). Transmisin de datos. Es una salida del ordenador. Por ella salen los datos en serie. Recepcin de datos. Es una entrada del ordenador. Por ella entran los datos en serie. Request To Send. Peticin de envo. Es una salida del ordenador. El ordenador pone a 1 esta seal cuando quiere enviar datos. Clear To Send. Dispuesto para enviar. Es una entrada del ordenador. Si est a 1 significa que el ordenador puede enviar datos pues el mdem (o el dispositivo que vaya a recibirlos) est preparado para hacerlo. Data Set Ready. Dispositivo de datos preparado. Es una entrada del ordenador. Le indica que el mdem est encendido y listo para funcionar.

CTS

DSR

DCD o CD Carrier Detect. Deteccin de portadora. Es una entrada del ordenador. Le indica al ordenador que el mdem est detectado seal de audio (tonos) vlida. DTR Data Terminal Ready. Terminal de datos listo. Es una salida del ordenador. Indica que est listo para trabajar. Suele emplearse para indicar al mdem que el ordenador est dispuesto para recibir informacin.

Otra seal (disponible slo en los ordenadores que tengan conector de 25 pines, y no en todos) es la seal RING (timbre del telfono) Es una entrada del ordenador. Le indica que est sonando el timbre de la lnea telefnica del mdem. Disposicin de los pines en el ordenador Dependiendo de si tiene conector de 9 pines o de 25, la distribucin de estas seales fsicamente en el conector es : Conector de 9 pines Pin 3 2 7 Seal TxD RxD RTS Conector de 25 pines Pin 2 3 4

Pgina 143

8 6 5 1 4

CTS DSR GND CD DTR RING Tierra de proteccin

5 6 7 8 20 22 1

FIN del sexto captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 144

Visual Basic - Gua del Estudiante Cap. 7


METODOS GRAFICOS Se denominan mtodos grficas a aquellos mtodos que nos permiten dibujar o representar grficos ya existentes en un objeto, o que nos permiten analizarlos o borrarlos. Los mtodos grficos de que dispone Visual Basic son : Circle, Cls, Line, PaintPicture, Point, Print, y PSet. METODO Line Dibuja lneas y rectngulos en un objeto. El objeto puede ser un Formulario, un control PictureBox o el objeto Printer.

Sintaxis 1

objeto.Line (x1, y1) - (x2, y2), color, BF (Con esta sintaxis trazar una lnea desde las coordenadas absolutas x1,y1 (origen) a las coordenadas tambin absolutas x2,y2. El color de la lnea ser el especificado en color. Los parmetros BF se explican mas adelante.

Sintaxis 2

objeto.Line (x1,y1) - Step (x2,y2), color, BF (Con esta sintaxis trazar una lnea desde las coordenadas absolutas x1,y1 hasta las coordenadas relativas a (x1,y1), x2,y2. Es decir, al poner la palabra Step (paso) antes de las coordenadas finales, le estamos indicando que las coordenadas que siguen a Step son relativas. Relativas respecto a quien?. Relativas a las coordenadas de comienzo de la lnea. Esta ltima expresin hara lo mismo que la siguiente expresin : objeto.Line (x1,y1) - (x1+x2, y1+y2), color, BF

Podemos darnos cuenta por la descripcin anterior que la palabra Step (palabra reservada de Visual Basic) indica que las coordenadas que le siguen son relativas a algo. Veamos la tercera forma de colocar una lnea : Sintaxis 3 objeto.Line Step (x1,y1) - Step (x2,y2), color, BF

Con esta expresin trazar una lnea entre las coordenadas relativas (x1, y1), y las coordenadas relativas (x2,y2). En principio es fcil entender que (x2,y2) son relativas al punto (x1,y1), pero Respecto a quin son relativas las coordenadas (x1,y1) ? Son relativas a la posicin del puntero de dibujo en el instante anterior a ejecutar esta sentencia, es decir al CurrentX, CurrentY que existiese antes de ejecutar la sentencia. En estas expresiones, las coordenadas estarn especificadas en las unidades de medida determinadas por las propiedades ScaleMode o ScaleWidth / ScaleHeight del objeto. En las expresiones anteriores objeto es el nombre del Formulario, PictureBox u objeto Printer sobre el que queremos dibujar. 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. Color es el nmero de color, que se puede poner en cualquiera de las posibles formas que permite VB. Si no se especifica color, pondr el color por defecto, que es el valor de la propiedad ForeColor del objeto. BF es un parmetro opcional. En realidad este parmetro sirve para que en vez de hacer una lnea haga un rectngulo. La expresin : Pgina 145

Form1.Line (x1,y1) - (x2,y2) , RGB(255,0,0), B dibuja un rectngulo entre los puntos (x1,y1) y (x2,y2). La expresin : Picture1.Line (x1,y1) - (x2,y2), RGB (0,255,0), BF dibuja un rectngulo relleno del mismo color de la lnea (en este caso verde) con esquinas en las coordenadas (x1,y1) y (x2,y2) De lo explicado se deduce que si el parmetro 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 rectngulo y adems lo rellena con el mismo color elegido en el parmetro color. No puede usarse solamente la F pues no tiene sentido rellenar de color una figura abierta. Para dibujar lneas unidas, comience la lnea siguiente en el punto final de la lnea anterior. La anchura de la lnea dibujadas depende de la configuracin de la propiedad DrawWidth. Cuando se ejecuta Line, las propiedades CurrentX y CurrentY toman el valor del punto final de la lnea.

METODO Circle Dibuja una circunferencia, crculo, elipse o arco sobre un objeto. Sintaxis objeto.Circle (x, y), Radio, Color, Inicio, Final, Aspecto En la expresin anterior, objeto es el objeto donde se dibujar el circulo. Puede ser, como en el caso de la lnea, un Formulario, un PictureBox o el objeto Printer. Si se omite, se asume que se refiere al Formulario que tenga el enfoque en ese momento. (x, y) son las coordenadas del punto central del crculo, elipse o arco. Las unidades de medida vendrn determinadas por las propiedades ScaleMode o ScaleWidth / ScaleHeight del objeto. Radio Este parmetro es requerido. Indica el radio del crculo, elipse o arco, en el mismo sistema de unidades de medida. Color Este parmetro es opcional. Es el nmero del color, expresado en cualquiera de las formas aceptadas por Visual Basic. Si se omite, se utiliza el valor de la propiedad ForeColor. Inicio, Final Valor opcional. Cuando se dibuja un arco o parte de un crculo o elipse, inicio y fin especifican (en radianes) la posicin inicial y final del arco. El rango de ambas es de - 2 pi radianes a 2 pi radianes. El valor predeterminado de inicio es 0 radianes; el de final es de 2 pi radianes. Nota para los que no aprobaron Matemticas Un circulo completo tiene 2 x pi radianes. Es decir, 2 x 3,1416 radianes equivalen a 360 . Como los datos de ngulos hay que introducirlos en radianes y nosotros normalmente pensamos en grados, emplee esta frmula para convertir grados a radianes : Radianes = Grados x 2 x 3,1416 / 360 Aspecto Este valor nos convertir la circunferencia en una elipse. Recuerde que una elipse es una circunferencia generalizada. Lgicamente, este parmetro es opcional. El valor predeterminado es 1.0, lo que crea un crculo perfecto (no elptico) en la pantalla. Si utilizamos en esta propiedad el valor 2 obtendremos una elipse con el radio horizontal de doble valor que el vertical. Si empleamos 0.5 obtendremos otra elipse, con el radio vertical doble respecto al horizontal.

Pgina 146

Para rellenar la circunferencia y conseguir un crculo, establezca las propiedades FillColor y FillStyle del objeto en el que se dibuja el crculo o elipse. Slo se puede rellenar una figura cerrada. La figuras cerradas son crculo, elipses o porciones de tipo circular (arcos con lneas de radio dibujadas en ambos lados). Los valores de Inicio y Final son siempre positivos. El sentido de cuenta de los ngulos es en sentido contrario a las agujas del reloj. Si le aadimos a Inicio o a Final un signo menos delante, 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 - a Final). Se le pueden poner a ambos y cerramos la figura. Es decir, si queremos que adems de hacer el arco, dibuje los radios, pondremos el signo menos ( -) delante de Inicio y de Final, a sabiendas que VB siempre entender los valores de Inicio y Final como positivos. NOTA. No se le con la informacin que aporta VB para este tema. Est mal !!! Lo expuesto anteriormente NO FUNCIONA para valores de Inicio o Final iguales a 0. Por lo tanto, si queremos hacer un radio en 0 radianes (lnea recta desde el centro a la derecha) deberemos poner una cantidad muy cercana a 0 (0.00000001, p. e.) para que ponga el radio. Puede omitir un argumento opcional en medio de la sintaxis, pero debe incluir la coma del argumento antes de poner el argumento siguiente. Si omite un argumento adicional del final, no utilice comas tras el ltimo argumento que especifique. Cuando se ejecuta Circle, las propiedades CurrentX y CurrentY toman el valor del punto central. METODO Cls Borra los grficos y el texto generados en tiempo de ejecucin de los controles Form, Image o PictureBox. Observe que el objeto Printer no tiene mtodo Cls. Sintaxis objeto.Cls Donde objeto representa un formulario, control Image o PictureBox. Si objeto se omite, se asume que el objeto es el control Form que tenga el enfoque. Cls borra el texto y los grficos generados en tiempo de ejecucin por instrucciones grficas y de presentacin. Los mapas de bits de fondo definidos usando la propiedad Picture y los controles dispuestos en un Form en tiempo de diseo no se ven afectados por Cls. Los grficos y el texto colocados en controles Form, Image o PictureBox mientras la propiedad AutoRedraw es True no se ven afectados si AutoRedraw se establece a False antes de llamar a Cls. Es decir, el texto y los grficos de los controles Form, Image o PictureBox pueden mantenerse manipulando la propiedad AutoRedraw del objeto con el que se trabaja. Despus de llamar a Cls, las propiedades CurrentX y CurrentY del objeto se restablecen a 0.

METODO PaintPicture Presenta el contenido de un archivo grfico (.BMP, .WMF, .EMF, .ICO o .DIB) en un objeto Form, PictureBox o Printer. La imagen deber estar en un Formulario o en un control Image. NO puede usarse este mtodo para dibujar una imagen contenida en un fichero (Vea mas adelante la funcin LoadPicture) Puede sacar mucho partido a la propiedad PaintPicture. Piense solamente que puede volcar una imagen .BMP al objeto Printer (a la impresora). Esto puede permitirle dibujar un logotipo en un listado, factura, etc. Sintaxis objeto.PaintPicture Imagen, x1, y1, anchura1, altura1, x2, y2, anchura2, altura2, Opecod

Pgina 147

La sintaxis del mtodo PaintPicture tiene las siguientes partes: objeto es el objeto donde queremos colocar el grfico. Es opcional. Si se omite, se asume que el objeto es el formulario que tenga el enfoque. Imagen Este parmetro es requerido. Es el origen del grfico que se va a presentar en el objeto. Debe ser la propiedad Picture de un objeto Form, control PictureBox o control Image. Tambin puede ser el contenido de una variable tipo Picture. Es decir, la imagen debe existir en un PictureBox, en un Formulario, en un control Image o en una variable. Si es un control, el que contiene la imagen, puede ponerse invisible (Su propiedad Visible = False) con lo que podemos hacer un almacenillo de imgenes en un formulario sin que molesten a la hora de trabajar x1, y1 Parmetro requerido. Indican las coordenadas destino (eje x y eje y) del objeto en las que se ponemos el origen de la imagen. Las propiedad ScaleMode, o ScaleWidth y ScaleHeight del objeto determinan las unidades de medida que se usan. Recuerde que las coordenadas en VB crecen desde la esquina superior izquierda. Los valores x1 e y1 determinan el punto del objeto donde se colocar la esquina superior izquierda del grfico que vamos a introducir. anchura1 Opcional. Indica la anchura destino de la imagen. La propiedad ScaleMode del objeto determina las unidades de medida que se usan. Si anchura destino es mayor o menor que la anchura origen (anchura2), imagen se ampla o se comprime respecto al original. Si se omite, se usa la anchura origen. altura1 Opcional. Indica la altura destino de la imagen. La propiedad ScaleMode del objeto determina las unidades de medida que se usan. Si altura destino es mayor o menor que la altura origen (altura2), imagen se ampla o se comprime respecto al original. Si se omite, se usa la altura origen. x2, y2 Parmetro opcional. Indican las coordenadas (eje x y eje y) de la zona de recorte dentro de la imagen origen. Esto de la zona de recorte significa que podemos cortarle a la imagen origen un trozo, tanto en sentido vertical como en horizontal. anchura2 Opcional. Indica la anchura de la imagen origen. Este parmetro se usa para establecer la relacin entre la anchura de la imagen final y la anchura de la imagen origen. Si al realizar la copia de la imagen a Objeto, esta nos sale muy grande, podemos, bien rebajar el parmetro anchura1 o aumentar anchura2, puesto que la medida real del ancho de la imagen final estar en relacin directa con el cociente anchura1/anchura2 altura2 Opcional. Lo mismo que para anchura2, pero referido a la altura en este caso. Opecod Opcional. Valor Long o cdigo que se usa slo con mapas de bits. Define una operacin bit a bit (por ejemplo, operador Not o Xor) que se realiza sobre imagen al dibujarla sobre objeto. Para obtener la lista completa de los operadores bit a bit, busque el tema BitBlt en el archivo de Ayuda de Windows SDK (WIN31WH.HLP). NOTA Como caso prctico, el autor de este texto suele guardar la imagen en una variable tipo Picture. Se desconoce el ancho de esa imagen, que vendr dado por la anchura real del Bitmap. Puede conocerse la anchura y altura de la imagen consultando la anchura y altura de la variable : AnchodelaImagen = VariableImagen.Width AlturadelaImagen = VariableImagen.Height Muchas veces, la imagen que se introduce en la variable tipo Picture es distinta en una ocasin u otras, por lo que desconocemos a priori que dato debemos poner a anchura1 y a anchura2. Todo tiene solucin. Con el cdigo siguiente el ancho y alto de la imagen se mantendr constante independientemente de la anchura y altura que tenga el Bitmap original. objeto.PaintPicture Imagen, x1, y1, anchura1, altura1, , , VariableImagen.Width, _ VariableImagen.Height Pgina 148

donde hemos omitido x2, y2 de forma intencionada, pero observe que hemos seguido respetando su sitio con las comas como separadores. El ltimo parmetro, Opecod se ha omitido, pero como es el ltimo, no hace falta dejarle las comas. Pueden omitirse tantos argumentos finales como se desee. Si se omite uno o varios argumentos finales, no se usan comas a partir del ltimo argumento especificado. Si se quiere especificar un argumento opcional, se deben especificar todos los argumentos opcionales que aparecen antes en la sintaxis.

METODO Point Devuelve, como entero Long, el color rojo - verde - azul (RGB) del punto especificado de un objeto Form o control PictureBox. Sintaxis objeto.Point(x, y) donde objeto Opcional. Nombre del Formulario o PictureBox donde se va a analizar el color. Si objeto se omite se asume que el objeto es el formulario que tenga el enfoque. x, y Parmetro requerido. Valores Single que indican las coordenadas horizontal (eje x) y vertical (eje y) del punto segn la propiedad ScaleMode del objeto Form o control PictureBox. Deben colocarse entre parntesis. Estas coordenadas se refieren a las coordenadas del objeto que contiene el grfico, con origen (0,0) en la esquina superior izquierda del mismo. Si el punto definido por las coordenadas x e y est fuera de objeto, el mtodo Point devuelve el valor -1.

METODO Pset Asigna a un punto de un objeto un color especificado. El objeto puede ser un Formulario, un PictureBox o el objeto Printer. Sintaxis objeto.PSet (x, y), Color objeto.PSet Step (x, y), Color

La sintaxis del mtodo PSet tiene las partes siguientes: objeto Opcional. Nombre del objeto (Formulario, PictureBox o Printer). Si se omite objeto, se asume como objeto el Formulario que tenga el enfoque. (x, y) Requeridos. Valores de simple precisin que indican las coordenadas horizontales (eje x) y verticales (eje y) del punto a establecer. Estas coordenadas se refieren a las coordenadas del objeto destino, con origen (0,0) en su esquina superior izquierda. Color Parmetro opcional. Valor entero largo que indica el color RGB especificado para el punto. Si se omite, se utiliza el valor de la propiedad ForeColor. Puede utilizar la funcin RGB o la funcin QBColor para especificar el color. El tamao del punto dibujado depende del valor de la propiedad DrawWidth. Cuando DrawWidth es 1, PSet establece un pxel al color especificado. Cuando DrawWidth es mayor que 1, se centra el punto en las coordenadas especificadas. La forma en que se dibuja el punto depende de los valores de las propiedades DrawMode y DrawStyle. Pgina 149

Cuando se ejecuta PSet, las propiedades CurrentX y CurrentY toman el valor del punto especificado en los argumentos. Vace un pxel con el mtodo PSet especificando las coordenadas del pxel y utilizando el valor de la propiedad BackColor como argumento color.

Como complemento a los Mtodos grficos, bueno ser comentar las formas posibles de introducir colores en VB y otras propiedades que tienen relacin con los mtodos grficos.

NOTA ADICIONAL Colores en Visual Basic. (Este texto es repeticin del expuesto en el capitulo del CommonDialog) Visual Basic acepta para especificar un color, tres procedimientos: Mediante el nmero de color, mediante la sentencia RGB ( rojo, verde, azul ) o mediante la funcin QBColor. Por nmero El nmero que representa el color en VB est formado por la suma de la componente roja, la componente verde y la componente azul. Podramos verlo muy bien en numeracin Hexadecimal: Color = Hex XX YY ZZ Donde ZZ es un nmero Hexadecimal que representa la cantidad del color rojo. El mnimo estara en 0 (H00) y el mximo en 255 (HFF) YY representara la cantidad de color verde y XX la de color azul, ambos con los mismos lmites explicados para el rojo. Por ejemplo: el rojo puro sera: el verde puro sera: el azul puro sera: Hex(0000FF) = 255 Hex(00FF00) = 652280 Hex(FF0000) = 16711680

Una mezcla de un poco de rojo (HB1), otro poco de verde (H56) y otro poco de azul (H1F) dara el siguiente nmero: Hex(1F56B1) = 2053809 Por la sentencia RGB Se puede expresar el color, poniendo simplemente RGB (rojo, verde, azul), donde rojo es un nmero entre 0 y 255 que indica la cantidad de color rojo que se aporta al color, verde un nmero comprendido entre 0 y 255 indicando la cantidad de verde, y lo mismo para azul. Esta es la forma mas sencilla de poner la propiedad color, y con la que mejor controlaremos el mismo.

Mediante la Funcin QBColor Devuelve o establece el cdigo de color RGB correspondiente a un nmero de color. Sintaxis Objeto.QBColor(color)

El argumento color es un nmero entero entre 0 a 15, segn la siguiente lista:

Pgina 150

Nmero Color

Nmero Color

0 1 2 3 4 5 6 7

Negro Azul Verde Aguamarina Rojo Fucsia Amarillo Blanco

8 9 10 11 12 13 14 15

Gris Azul claro Verde claro Aguamarina claro Rojo claro Fucsia claro Amarillo claro Blanco brillante

Ejemplo. Tengamos un Label llamado Label1 y un botn de comando, en cuyo procedimiento click le introducimos el cdigo: Static i As Integer i=i+1 If i = 16 Then i = 0 Label1.caption = i Label1.BackColor = QBColor(i) En el Label podremos ver el color y su nmero de color. FIN DE LA NOTA ADICIONAL SOBRE COLORES EN VB SavePicture (Instruccin) Guarda un grfico de un objeto Form, de un control PictureBox o de un control Image en un archivo. Sintaxis SavePicture imagen, expcadena

La sintaxis de la instruccin SavePicture tiene las siguientes partes: imagen es el nombre del objeto que contiene los grficos que se van a guardar en el archivo, mas su propiedad Picture o Image y expcadena es el nombre del archivo grfico que se va a guardar. Ejemplo: SavePicture Picture1.Picture, "c:\suarez\luis.bmp"

En este ejemplo, guardamos en el fichero LUIS.BPM que est en el directorio C:\SUAREZ el grfico que contiene el PictureBox denominado Picture1 Si un grfico ha sido cargado en la propiedad Picture desde un archivo, en tiempo de diseo o en tiempo de ejecucin, se guarda usando el mismo formato del archivo original. Los grficos de la propiedad Image siempre se guardan como archivos de mapas de bits (.BMP).

LoadPicture (Funcin) Carga un grfico en un objeto Form, un control PictureBox o un control Image. Sintaxis Objeto.LoadPicture ([expcadena])

Donde Objeto es el nombre del Formulario, PictureBox o control Image que se va a rellenar con el grfico, y el argumento expcadena es el nombre del archivo grfico que se quiere cargar. Usando LoadPicture sin argumento se borran los grficos de los formularios y los controles PictureBox e

Pgina 151

imagen. Los formatos grficos reconocidos por Visual Basic incluyen archivos de mapas de bits (.BMP), archivos de icono (.ICO), archivos de longitud codificada (.RLE) y Metarchivo (.WMF). Para cargar grficos para presentarlos en un control PictureBox, Image o como fondo de un formulario, el valor devuelto por LoadPicture debe ser asignado a la propiedad Picture del objeto en el se quiere presentar la imagen. Por ejemplo: Form1.Picture = LoadPicture ("FIESTA.BMP") Imagen1.Picture = LoadPicture ("FIESTA.BMP") Picture1.Picture = LoadPicture (FIESTA.BMP")

Para asignar un icono a un formulario, se asigna el valor devuelto por la funcin LoadPicture a la propiedad Icon del objeto Form: Form1.Icon = LoadPicture ("UNICONO.ICO") Los iconos tambin pueden ser asignados a las propiedades DragIcon de todos los controles excepto los controles Timer y Men. Por ejemplo: Comando1.DragIcon = LoadPicture ("UNICONO.ICO") Para cargar grficos en el Portapapeles del sistema se usa LoadPicture de la forma siguiente: Clipboard.SetData LoadPicture ("FIESTA.BMP") (Vea Captulo del Portapapeles) Puede tambin meter una imagen en una variable, y luego poner en uno de los controles citados anteriormente la imagen guardada en la variable. Este mtodo le permite presentar una imagen muy rpidamente, ya que no necesita acceder al disco para buscar una imagen, pero emplea mucha memoria RAM, ya que la variable (o variables) conteniendo la(s) imgenes estn en la RAM. Para ello hay que declarar las variables como Picture Option Explicit Dim MiVariable1 As Picture, MiVariable2 As Picture Private Sub Form_Load() Set MiVariable1 = LoadPicture("c:\pruebavb\ athena.bmp ") Set MiVariable2 = LoadPicture("c:\list_tel\rr1.bmp") End Sub Private Sub Command1_Click() Picture1.Picture = MiVariable1 End Sub Private Sub Command2_Click() Picture1.Picture = MiVariable2 End Sub Mediante este programa lo que hemos hecho fue guardar dos imgenes en sendas variables, en el momento de cargar el formulario, imgenes que se pasan posteriormente al control Picture1 con los botones de comando Command1 y Command2

DrawMode (Propiedad)

Pgina 152

Devuelve o establece un valor que determina el aspecto de la salida de un mtodo grfico o el aspecto de un control Shape o Line. Sintaxis objeto.DrawMode [= nmero]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print, o los controles Shape o Line, y nmero es un entero que especifica el aspecto, segn la siguiente lista: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Blackness. Not Merge PenInverso del valor 15 (Merge Pen). Mask Not PenCombinacin de los colores comunes del color de fondo y el inverso del Pen. Not Copy PenInverso del valor 13 (Copy Pen). Mask Pen NotCombinacin de los colores comunes al Pen y al inverso de la muestra. InvertInverso del color de muestra. Xor PenCombinacin de los colores en el Pen y en el color de la muestra, pero no de ambos. Not Mask PenInverso del valor 9 (Mask Pen). Mask PenCombinacin de los colores comunes al Pen y a la presentacin. Not Xor PenInverso del valor 7 (Xor Pen). NopNadano hay cambios. De hecho, este valor desactiva el dibujado. Merge Not PenCombinacin del color de muestra y el inverso del color del Pen. Copy Pen (Predeterminado)Color especificado por la propiedad ForeColor. Merge Pen NotCombinacin del color del Pen y el inverso del color de muestra. Merge PenCombinacin del color del Pen y el color de muestra. Whiteness.

Use esta propiedad para producir efectos visuales con controles Shape o Line o al dibujar con mtodos grficos. Visual Basic compara cada pxel de la plantilla de dibujo con el pxel correspondiente del fondo existente y despus aplica operaciones a nivel de bit. Por ejemplo, el valor 7 (Xor Pen) usa el operador Xor para combinar un pxel del dibujo con un pxel del fondo. El efecto exacto de un valor DrawMode depende del modo en el que el color de una lnea dibujada en tiempo de ejecucin se combina con los colores de la pantalla. Los valores 1, 6, 7, 11, 13 y 16 producen los mejores resultados.

DrawStyle (Propiedad) Devuelve o establece un valor que determina el estilo de lnea de la salida de mtodos grficos. Sintaxis objeto.DrawStyle [= nmero]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print sobre el que se va a dibujar, y nmero es un entero que especifica el estilo de lnea, tal como se describe a continuacin: 0 1 2 3 4 5 6 (Predeterminado) Continuo. Rayas. Puntos. Raya - punto. Raya - punto - punto. Transparente. Continuo interior.

Si DrawWidth se define con un valor mayor que 1, los valores de DrawStyle entre 1 y 4 producen una lnea continua (el valor de la propiedad DrawStyle no cambia). Si DrawWidth se define como 1, DrawStyle produce el efecto para cada valor descrito en la tabla anterior.

Pgina 153

DrawWidth (Propiedad) Devuelve o establece la anchura de lnea de lo dibujado con los mtodos grficos. Sintaxis objeto.DrawWidth [= tamao]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print sobre el que se va a dibujar, y tamao es una expresin numrica comprendida entre 1 y 32.767 que representa la anchura de la lnea en pixeles. El valor predeterminado es 1, es decir, un pxel de ancho. Puede incrementar el valor de esta propiedad para aumentar la anchura de la lnea. Si el valor de la propiedad DrawWidth es mayor que 1, los valores de 1 a 4 en la propiedad DrawStyle producirn una lnea continua (el valor de DrawStyle no se modifica). Si se establece 1 en DrawWidth, DrawStyle producir los resultados mostrados en la tabla de esta propiedad. FillColor (Propiedad)

Devuelve o establece el color usado para rellenar formas; FillColor tambin se usa para rellenar crculos y cuadros creados con los mtodos grficos Circle y Line. Sintaxis objeto.FillColor [ = valor]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print sobre el que se va a dibujar, y valor es un valor o constante que determina el color de relleno, con cualquiera de los criterios de VB para definir el color. De forma predeterminada, FillColor est definido como 0 (Negro). Comentarios Excepto en el objeto Form, cuando la propiedad FillStyle se define con su valor predeterminado, 1 (Transparente), el valor de FillColor se ignora. FillStyle (Propiedad)

Devuelve o establece el modelo usado para rellenar controles Shape as como los crculos y los cuadros creados con los mtodos grficos Circle y Line. Sintaxis objeto.FillStyle [= nmero]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print sobre el que se va a dibujar, y nmero es un entero que especifica el estilo de relleno, tal como se describe a continuacin: 0 1 2 3 4 5 6 7 Continuo. (Predeterminado) Transparente. Lnea horizontal. Lnea vertical. Diagonal hacia arriba. Diagonal hacia abajo. Cruzado. Diagonal Cruzada.

Cuando la propiedad FillStyle se define con su valor predeterminado, 1 (Transparente), el valor de FillColor se ignora, excepto en el objeto Form.

Pgina 154

AutoRedraw (Propiedad) Devuelve o establece la salida de un mtodo grfico como grfico persistente. Sintaxis objeto.AutoRedraw [= booleano]

Donde objeto es el nombre del Formulario, PictureBox, objeto Print sobre el que se va a dibujar, y booleano es una expresin booleana que especifica la forma en la que objeto es vuelto a dibujar, tal como se describe a continuacin: True Activa el redibujado automtico de un objeto Form o control PictureBox. Los grficos y el texto se escriben en la pantalla y en una imagen almacenada en memoria. El objeto no recibe eventos Paint; se vuelve a dibujar cuando es necesario, usando la imagen almacenada en memoria. False (Predeterminado) Desactiva el redibujado automtico de un objeto y escribe los grficos y el texto solamente en la pantalla. Visual Basic invoca el evento Paint del objeto cuando se necesita volver a dibujar dicho objeto. Esta propiedad es importante cuando se trabaja con los siguientes mtodos grficos: Circle, Cls, Line, Point, Print y PSet. Al establecer AutoRedraw a True la salida de estos mtodos se vuelve a dibujar automticamente en un objeto Form o en un control PictureBox cuando, por ejemplo, se cambia de tamao al objeto o se vuelve a presentar despus de haber estado oculto por otro objeto. Se puede establecer AutoRedraw en el cdigo en tiempo de ejecucin para alternar entre dibujar grficos persistentes (como color de fondo o cuadrcula) y grficos temporales. Si se define AutoRedraw a False, la salida anterior se convierte en parte del fondo de la pantalla. Cuando AutoRedraw se define a False, los grficos de fondo no se eliminan si se borra el rea de dibujo con el mtodo Cls. Al volver a establecer AutoRedraw a True y despus usar Cls se borran los grficos de fondo.

Pgina 155

CONTROLES ESPECIALES SOLO PARA LA VERSION DE 32 BITS Existen una serie de controles que solamente pueden utilizarse con la versin de Visual Basic de 32 bits. Estos controles permiten realizar aplicaciones con la interface grfica tpica de W95. Control ImageList El Control Image List es un almacn de imgenes para poder usarlas posteriormente en otro control. El control ImageList no presenta directamente las imgenes que almacena. En el Capitulo 4 puede ver mayor informacin respecto a este control.

Barra de Herramientas. Control Toolbar Este control permite realizar una barra de herramientas. La barra de herramientas es, como ya conocer, una barra donde existen varios iconos. Estos iconos realizan una determinada funcin. Normalmente se ponen en la barra de herramientas los iconos que representan las acciones mas frecuentes de una aplicacin. Esto facilita la operacin al no tener que desplegar mens para buscar la operacin a realizar. Como el espacio que ocupan los iconos es grande, es tambin bastante normal que no estn representados en la barra de herramientas todas las funciones posibles de la aplicacin, sino como decamos, solamente las mas frecuentes. Pero ocurre que la funcin que para un usuario es muy frecuente, para otro no lo es, por lo que tambin es habitual poder programar los iconos que aparecen en la barra de herramientas. Todo ello lo puede hacer el control Toolbar. Para introducir el Toolbar es necesario que est presente en la caja de herramientas el control personalizado Microsoft Windows Common Controls (COMCTL32.OCX). El control Toolbar es un contenedor de un array de iconos. Estos iconos forman botones sobre los que se puede insertar cdigo en sus propiedades. A cada botn se le denomina Button y a la coleccin de botones se le denomina Buttons. Cada Button es un elemento de la coleccin Buttons y por lo tanto podemos referirnos a cada uno de ellos por el ndice que tiene dentro de la coleccin. Los iconos de cada uno de los botones del Toolbar debe introducirse previamente en un control ImageList. Como se ha visto, un control ImageList es un almacn de imgenes, que podemos usar en cualquier parte de la aplicacin. Una de esas partes es la confeccin de la barra de herramientas. Por lo tanto, es necesario introducir un control ImageList en cualquier aplicacin que use un control Toolbar. Todas las imgenes del Toolbar deben estar en un nico ImageList. La barra de herramientas puede realizarse en tiempo de diseo (este sera el caso para cuando no existiese variacin ni eleccin de botones a lo largo de la ejecucin de la aplicacin) o en tiempo de ejecucin (caso que correspondera con una aplicacin que tuviese una barra de men programable o que variase esta barra de men dependiendo de cada operacin que se est ejecutando en la aplicacin). Para realizar la barra de herramientas en tiempo de diseo, basta con visualizar el cuadro de propiedades que aparece pulsando el botn derecho del ratn sobre el control Toolbar. Aparecer un cuadro de dilogo como este :

Pgina 156

Puede ver que en el cuadro ImageList aparece el nombre de un ImageList. Al desplegar la lista aparecern todos los ImageList que existan en el formulario. El ImageList debe estar en el mismo formulario que el Toolbar. Deber elegirse el ImageList que contenga las imgenes de los iconos que queremos introducir en el Toolbar. Este cuadro nos permite tambin introducir la forma que adoptar el puntero del ratn cuando entre en el Toolbar MousePointer) si el Toolbar aparece por defecto habilitado o deshabilitado (Enabled) y si muestra o no un rtulo programable al pasar el ratn por encima de cada botn del Toolbar. (ShowTips). La propiedad AllowCustomize permite, si es True, cambiar el orden de los botones e introducir separadores (vea evento DobleClick). En el cuadro botones podemos introducir los datos deseados para cada uno de los botones que compondrn la coleccin Buttons.

Para insertar un nuevo botn hay que hacer click sobre Insertar botn e insertar un nuevo botn inmediatamente despus del que figura en la propiedad Index (en la figura del ejemplo, lo insertara en segundo lugar, no en el ltimo lugar como podra creerse). Tambin podemos eliminar un botn haciendo click sobre Eliminar botn.

Pgina 157

El Caption (opcional) es la palabra que figurar debajo del icono del botn. Un botn se identifica por su ndice. ( Toolbar1.buttons(1) ) La propiedad Key es un nombre que se puede aadir a cada botn. Esta propiedad sirve para identificar el botn que se ha pulsado, pero no para nombrar al botn. La propiedad Value es el valor por defecto, con el que aparecer el botn al comienzo de la aplicacin. (Unpressed, no pulsado, Pressed, pulsado). La propiedad Style define el tipo de botn : 0 - Default Botn monostable. 1 - Check Botn Biestable. 2 - Button Group Solo uno de los botones del grupo puede estar pulsado. Esta propiedad lleva implcito que los botones que forman un grupo son biestables. Pueden hacerse varios grupos independientes introduciendo un botn que no pertenezca a un grupo (tipos 0, 1, 3 4) entre los dos grupos que se independientes que se pretenden formar 3 - Separator El botn se convierte en un separador de anchura fija. 4 - PlaceHolder El botn se convierte en un separador de anchura variable. ToolTipText es el texto que aparecer al lado del botn cada vez que se ponga el cursor del ratn sobre el botn. Para que aparezca debe estar habilitada la propiedad ShowTips. Image es el nmero de la imagen en el ImageList. El control Toolbar tambin puede realizarse en tiempo de ejecucin. Para introducir u botn en el Toolbar hay que crear el botn y aadirlo a la coleccin Buttons de Toolbar. Podemos hacerlo en una sola instruccin : Set NombreBotn = NombreToolbar.Buttons.add ( [Indice], [Key], [Caption], [Style], [Imagen]) NombreBotn puede ser cualquier nombre (es el nombre del objeto botn) NombreToolbar es el nombre del Toolbar Indice es el nmero de orden de ese botn dentro del Toolbar Key es el valor de la propiedad Key del botn. Este valor debe ser nico para cada botn. Style es un nmero del 0 al 4 con el tipo de botn. Vea lista mas arriba Imagen es el nmero de la imagen para ese botn, dentro del ImageList que las contiene. Los botones pueden habilitarse y deshabilitarse usando la propiedad Enabled (True / False). Recuerde que los botones se identifican por su ndice : Toolbar1.Buttons(Indice).Enabled = False Para saber que botn se ha pulsado, puede leerse la propiedad Key : Text1.Text = Button.Key presenta en Text1 el texto introducido en la propiedad Key del ltimo botn pulsado. Con la lectura de la propiedad Key, y la sentencia Case o If ... Then podemos iniciar la parte de la aplicacin asociada a cada botn. El control Toolbar tiene los siguientes eventos : ButtonClick Este evento se produce cada vez que se hace click sobre un botn del Toolbar. Pasa como parmetro el ndice del botn pulsado. Podremos saber que botn se ha pulsado mediante sentencias condicionales : Pgina 158

Private Sub Toolbar1_ButtonClick(ByVal Button As Button) If Button.Index = 1 Then . . . . If Button.Index = 2 Then . . . . Tambin podramos usar la propiedad Key como se dijo mas atrs. Click Este evento se produce cuando se hace click sobre cualquier botn del Toolbar, pero no pasa parmetros. Podemos utilizarlo cuando se quiera realizar una operacin comn 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, y la propiedad AllowCustomize est a True. Si se hace doble click sobre un botn se produce solamente el evento click (dos veces). Haciendo doble click en una zona libre de botones, con la propiedad AllowCustomize = True nos permite cambiar el orden de los botones e introducir separadores. Change Se produce solamente cuando se ha realizado algn cambio del orden por el procedimiento anterior. DragDrop, DragOver Igual que cualquier control. MouseMove, MouseUp, MouseDown Igual que el resto de los controles Pasa como parmetro el ndice del botn, la tecla de maysculas, y las posiciones x e y del ratn. Private Sub Toolbar_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

Este control solamente funciona en la versin de VB de 32 Bits. Pero para 16 bits puede hacerse una cosa parecida (y mas sencilla) utilizando un control Picture como contenedor de tantos controles Image como necesitemos. 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, y posiblemente de forma mas sencilla. El control Toolbar NO sirve de contenedor de otros controles, a excepcin de sus botones ! ! ! LA BARRA DE ESTADO Este control es muy parecido a la barra de herramientas, y suele usarse, colocndolo en la parte inferior de la ventana, para indicar el proceso que est en curso en la aplicacin. La barra de estado, control StatusBar se introduce en la caja de herramientas al mismo tiempo que el control Toolbar, con el control personalizado Microsoft Windows Common Controls (COMCTL32.OCX). La barra de estado puede albergar hasta 16 paneles, que pueden contener texto o grficos. Tambin pueden contener informacin del Hardware, tal como el estado de la tecla Bloqueo de Maysculas, Bloqueo del teclado numrico, tecla Insert activada, tecla Scroll Lock activada, o mostrar la fecha y la hora La barra de estado puede configurarse como de un solo panel o de mltiples paneles. (Propiedad Style. 0=mltiples paneles, 1= panel nico) Pgina 159

Las dimensiones de cada panel pueden configurarse como fijas o ajustadas al tamao del texto o imagen que presentan. En este control las imgenes no es necesario introducirlas previamente en un ImageList. Pueden introducirse directamente sobre el cuadro de dilogo que sale pulsando el botn derecho del ratn propiedades - en la ventana correspondiente a paneles. Acepta imgenes tipo Bit-map (.BMP) o .ICO. Los paneles pueden combinar una grfico y un texto. La barra de estado puede realizarse en tiempo de diseo o en tiempo de ejecucin. Para realizarla en tiempo de diseo basta con visualizar la ventana de propiedades, muy similar a la del control Toolbar. Para aadir un panel en tiempo de ejecucin basta con aadirlo a la coleccin Panels del control StatusBar mediante la sentencia : Set nombobjeto = Nombrebarraestado.Panels.Add.( [ndice],[key],[Text],[estilo],[grfico]) Un panel puede eliminarse en tiempo de ejecucin mediante la sentencia : StatusBar1.Panels.Remove (n) O simplemente puede hacerlo invisible StatusBar1.Panels(3).Visible = False La Barra de Estado puede servir para presentar informacin acerca del proceso de la aplicacin (para eso se ha pensado), pero tambin puede servir para introducir comandos como si se tratase de varios botones de comandos. La Barra de Estado tiene varios eventos, entre ellos el evento click. Eso s, se produce el mismo evento click independientemente del panel sobre el que hayamos picado con el ratn. Solamente queda conocer el panel sobre el que se ha hecho click y, mediante sentencias condicionales If ... End If aadir el cdigo necesario dependiendo del panel que se haya pulsado. En el ejemplo siguiente, la operacin a realizar es escribir en un Label la operacin que se desea realizar : If Panel = StatusBar1.Panels(1) Then label1.Caption = "Salir" If Panel = StatusBar1.Panels(2) Then label1.Caption = "informacin" If Panel = StatusBar1.Panels(3) Then label1.Caption = "En Ejecucin" If Panel = StatusBar1.Panels(4) Then label1.Caption = "Imprimiendo" If Panel = StatusBar1.Panels(5) Then label1.Caption = "Esperando" La Barra de estado tiene muchas aplicaciones y propiedades. Avanzar en ellas se deja a la necesidad del alumno. PROGRESS BAR Es similar al control Gauge, pero mas bonito. Tiene las mismas propiedades y se trabaja con l de la misma forma que con el Gauge.

Para introducir el ProgressBar en la caja de herramientas debe seleccionarse en Herramientas | Controles Personalizados el conjunto Microsoft Windows Common Controls 5.0 (Este conjunto incorpora tambin los controles TabStrip, Toolbar, StatusBar, TreeView, ListView, ImageList y Slider.

Pgina 160

Las propiedades mas destacables del ProgressBar son : Max Min Value Para indicar el valor a fondo de escala Para indicar el valor a mnimo El valor de esta propiedad es el que se indicar grficamente en el ProgressBar.

FIN del sptimo captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 161

Visual Basic - Gua del Estudiante Cap. 8


FICHEROS EN VISUAL BASIC Existen tres tipos de ficheros donde podremos almacenar y leer datos: - Secuenciales - Aleatorios (Random) - Binarios Cada uno de ellos tiene sus aplicaciones y particularidades. FICHEROS SECUENCIALES Este tipo de ficheros nos permite guardar informacin de cualquier longitud. En este tipo de ficheros, la informacin se guarda colocando un carcter tras otro. La forma de leerlos es, igualmente, carcter tras carcter. (Byte tras byte). Son los mas sencillos de manejar, y los utilizados para guardar texto en ASCII. Permiten guardar datos en un fichero con un determinado nombre, "machacando" la informacin de otro posible fichero que ya estuviese en el disco con el mismo nombre, o aadir la informacin nueva a continuacin de la ya existente. Para abrir un fichero secuencial para guardar informacin, debemos ejecutar la siguiente instruccin: Open Nombrefichero For Output As # Numerocanal De esta forma, si ya exista un fichero llamado Nombrefichero, sobreescribiremos dicho fichero perdiendo la informacin que contuviese. Es la forma tpica de hacerlo cuando modificamos un texto. Para aadir la nueva informacin tras la ya existente, deberemos abrirlo con la siguiente instruccin: Open Nombrefichero For Append As # Numerocanal Numerocanal debe ser un nmero comprendido entre 1 y 255. Representa el nmero del canal por donde introduciremos los datos. Normalmente se llama tambin nmero de archivo. No puede haber mas de un archivo abierto con un nmero de archivo determinado. Para cerrar un fichero secuencial, basta con ejecutar la instruccin: Close # Numerocanal Si no se especifica Numerocanal (la instruccin Close a secas) se cerrarn todos los ficheros abiertos actualmente. Para introducir la informacin, pueden emplearse dos mtodos: Print y Write Print Introduce la informacin de forma secuencial, byte tras byte tal como se coment. Sirve para guardar textos. Por ejemplo si deseamos guardar en ese fichero el contenido de una caja de texto llamada Text1, basta con ejecutar la siguiente instruccin: Print #1, Text1.Text El texto queda en el fichero en caracteres ASCII, que se pueden leer con el Type de MS-DOS o mediante el Bloc de Notas de Windows.

Pgina 162

Cuando los datos se han introducido con la instruccin Print, es decir, cuando hemos introducido texto letra tras letra, la forma de acceder a ese texto es muy sencilla: Se abre el archivo con la instruccin Open Open Nombrefichero For Input As # Numerodecanal Se utiliza la instruccin Input o Line Input para sacar los datos del fichero. La instruccin Input tiene en este caso la siguiente sintaxis: Input (Numero de caracteres, # Numero de canal) Por ejemplo, Input (1, #1) extrae un carcter del fichero abierto como #1. El nmero mximo de caracteres a extraer de un golpe mediante la instruccin Input est limitado a 65.534. Ver un poco mas adelante la propiedad LOF de los ficheros secuenciales. LOF devuelve un valor igual a la longitud total del fichero. Si ejecutamos la instruccin : Input (LOF(1), #1) LOF(1)=longitud del fichero #1

leeremos el fichero de una nica vez. Este procedimiento puede ahorrarle cierto tiempo a la hora de la lectura. (Por lo dicho anteriormente, 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.534 bytes. Tenga esto presente cuando vaya a leer un fichero que no sabe que longitud tiene. Para curarse en salud, le recomiendo que lea los ficheros secuenciales carcter a carcter. Input(1,#X) pues tarda poco mas que leyndolo de un golpe. Slo se utilizar la instruccin Input con archivos abiertos en modo Input o Binary. (Se vern a continuacin) A diferencia de la instruccin Input #, (la veremos a continuacin, pues es la instruccin que deber utilizar para leer archivos escritos con la instruccin Write ), Input devuelve todos los caracteres que lee, incluyendo puntos y coma, retornos de carro, avances de lnea, comillas y espacios iniciales. Existe una instruccin, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres). Puede ahorrar un poco de memoria usando esta instruccin en lugar de Input. Nota Se proporciona otra funcin (InputB) para su uso con datos de byte incluidos en archivos de texto. En lugar de especificar el nmero de caracteres a devolver, nmero especifica el nmero de bytes. INSTRUCCION LINE INPUT La instruccin Line Input se utiliza para extraer una lnea completa. Tiene la siguiente sintaxis: Line Input # Nmero de canal, Variable Mediante esta instruccin se extrae una lnea completa (los caracteres delimitados entre dos retornos de carro), y se le asigna esa cadena a Variable La instruccin Line Input # lee un carcter cada vez en un archivo hasta que encuentra un retorno de carro (Chr(13)) o una secuencia retorno de carro-continuacin de lnea (Chr(13) + Chr(10)). Las secuencias de retorno de carro-continuacin de lnea no se tienen en cuenta y no

Pgina 163

se aaden a la cadena de caracteres. Cuando lea un archivo mediante Line Input # y lo quiere presentar en un TextBox o en el Printer, deber introducirlos para evitar que le salga todo el texto en una nica lnea. Con lo que se ha explicado, ya puede realizar un pequeo edito de textos. Este sencillo editor tiene un TextBox llamado TBTexto, donde podemos escribir el texto que queramos (con la propiedad MultiLine = True y ScrollBars = Vertical), tres botones llamados BAbrir (1), (2 a y b) y (3), para abrir el fichero y poner su contenido en TBTexto, y dos BGuardar para guardar, uno abriendo el fichero For Append y el otro abrindolo For Output. En este ltimo, al guardar el texto borramos el contenido que del fichero, si ya existiera. En el primero, lo anexamos al final del mismo . Para conocer el nombre del fichero, ponemos un CommonDialog llamado CD1, con un filtro CD1.Filter = Ficheros de Texto |*.txt Para abrir el fichero, y depositar su contenido en TBTexto pondremos este cdigo en BAbrir : Private Sub BAbrir1_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.filename For Input As #1 VarTexto = Input(LOF(1), #1) 'leemos todo el fichero de un golpe Close #1 TBTexto = VarTexto End Sub Cuando el fichero es mayor de 64 kilobytes, el leerlo de un golpe puede dar problemas. Mejor dicho, no funciona. Deberemos leerlo en ese caso, carcter a carcter o lnea a lnea. Para leer carcter a carcter : Private Sub BAbrir_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.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 VarTexto = Input(1, #1) 'leemos el fichero carcter a carcter TBTexto = TBTexto & VarTexto 'vamos aadiendo los caracteres ledos a TBTexto Loop Close #1 End Sub (NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carcter a carcter eterniza la aplicacin. - Meter un texto en un TextBox o en un Label es una operacin que tarda cierto tiempo. Si esa operacin hay que hacerla una vez por carcter, puede tardar mucho tiempo. Para evitar esto, cuando vaya a leer un fichero carcter a carcter, mtalo primero en una variable y luego realice un volcado nico de esa variable al TextBox o Label) Y podemos hacerlo tambin leyendo lnea a lnea con Line Input

Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.filename For Input As #1

Pgina 164

Do Until EOF(1) Line Input #1, VarTexto 'leemos el fichero Lnea a Lnea TBTexto = TBTexto & VarTexto & vbCrLf 'vamos aadiendo las lneas ledas a TBTexto '(Hay que introducir un retorno + avance de lnea con cada lnea (vbCrLf), ya que VarTexto no contiene los retornos ni avances de lnea. Loop Close #1 Los Botones de Guardar tienen el cdigo : Private Sub BGuardar_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Output As #1 Print #1, TBTexto.Text Close #1 End Sub O para el caso de abrir con For Append Private Sub BGuardar2_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Append As #1 Print #1, TBTexto.Text Close #1 End Sub Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial. INSTRUCCIN WRITE La otra forma de introducir datos en un fichero secuencial es Write. Mediante esta instruccin, no se puede introducir texto, sino datos, aunque esos datos sean de texto. Write Puede introducir varias informaciones, que posteriormente se podrn leer de forma separada con la instruccin Input #. Esta forma de introducir datos en un fichero secuencial permite realizar un fichero con distintos datos que se pueden leer en el propio fichero, puesto que se guardan en ASCII, y leerlos mediante el programa de una forma muy sencilla. Hacemos, en realidad, una pequea base de datos. (Ver a lo largo de su vida profesional que lo de pequea no es cierto, 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 instruccin Write es escribir estos datos en un fichero secuencial, utilizando una coma como separador entre los distintos datos. Un fichero secuencial con datos introducidos mediante la instruccin Write tendr esta forma : Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Miguel de Cervantes,El Qijote,Editorial YY,5000,27 Observe que el contenido de este fichero se diferencia algo de una simple sucesin de

Pgina 165

caracteres. Tiene varias partes separadas por una coma. Cada una de ellas es un dato. Imaginemos una aplicacin, con la que introducimos datos de libros. La aplicacin es un nico formulario donde podemos introducir la informacin mediante varios TextBox. Existe un Botn de comando con el siguiente cdigo: Private Sub Command1_Click() TITULO = LIBRETBTITULO.Text AUTOR = LIBRETBAUTOR.Text EDITORIAL = LIBRETBEDITORIAL.Text PRECIO = LIBRETBPREC.Text EXISTENCIAS = LIBRETBEX.Text Donde LIBRETBTITULO, LIBRETBAUTOR, Etc. son los nombres de los TextBox Ha ledo los datos de los TextBox. Ya estn el las variables TITULO, AUTOR, Etc. Ahora los metemos en el fichero con la instruccin Write. El nombre del fichero ser el que hayamos puesto en el TextBox LIBRETBFICHERO, y lo guardar en el directorio C :\cursoVB Open TBNombreFichero.Text For Append As #1 Write #1, TITULO, AUTOR, EDITORIAL, PRECIO, EXISTENCIAS Close #1 End Sub Si introduce los datos del ejemplo anterior, se crear un fichero que tiene esta apariencia: Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Si realizamos otra introduccin de datos, con la segunda lnea del ejemplo anterior, los datos existentes en ese fichero no se borrarn, dado que lo hemos abierto con Append. Quedar de la siguiente forma: Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Miguel de Cervantes,El Qijote,Editorial YY,5000,27 Que pasara si leemos este fichero con la instruccin Input o Line Input # vista anteriormente ? Pues simplemente que lo leeramos tal como est, con sus comas y comillas dobles. No sera la forma mas adecuada, ya que lo que queremos es obtener sucesivos datos de autores, ttulos, editoriales, precios y existencias. Para sacar estos datos debemos leerlos con la instruccin Input #. Esta instruccin saca los datos que hemos metido, es decir, elimina las comillas y la coma que servan de separadores. En nuestro ejemplo, podramos hacerlo de esta forma, aprovechando los mismos TextBox: Private Sub Command2_Click() ' Limpiamos los TextBox LIBRETBTITULO.Text = "" : LIBRETBAUTOR.Text = "" : LIBRETBEDITORIAL.Text = "" LIBRETBPREC.Text = "" : LIBRETBEX.Text = "" 'Abrimos el fichero Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) ' Introducimos una parada para poder leer datos

Pgina 166

DETENERSE = True Input #1, TIT, AUT, NED, PRE, EXS LIBRETBTITULO.Text = TIT LIBRETBAUTOR.Text = AUT LIBRETBEDITORIAL.Text = NED LIBRETBPREC.Text = PRE LIBRETBEX.Text = EXS ' Refrescamos los TextBox Refresh ' Esto produce una pequea 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. Como en el fichero no se guarda ninguna referencia al respecto, lo nico que importa es que el nmero de variables para la lectura sea igual al nmero de variables que se utiliz para la escritura, y que el orden de las variables sea correcto. Si por ejemplo, el nmero de variables usadas en la introduccin de datos fuese distinta al nmero de variables usado en la lectura, Visual Basic nos dara un error. Observe tambin que se ha introducido un temporizador. Sirve para ver los sucesivos ttulos que tenemos en nuestra base de datos tan sui generis. Se ha pretendido presentar unos datos de esta pequea base de datos sin complicarnos mucho la vida. Mas adelante veremos como presentarlos de una forma correcta. Este tipo de ficheros no es el mas adecuado para construir grandes bases de datos, es complicado manejar ficheros de mas de unas pocas lneas, por lo que para tener muchos datos, este tipo de ficheros no es recomendable. Sin embargo, para tener una lnea nica, o un nmero bajo de lneas de datos, este tipo de fichero Simplifica notablemente las aplicaciones. Tiene adems una gran ventaja : podemos verlo con un procesador de textos ASCII (Block de Notas, por ejemplo) y cambiarle los datos con ese mismo procesador. Piense en los tpicos archivos .INI que acompaan a casi todas las aplicaciones informticas para la personalizacin de las mismas y ver la utilidad de estos sencillos ficheros secuenciales. En esta pequea aplicacin mostrbamos las informaciones sucesivamente segn las bamos leyendo del fichero. Interrumpamos momentneamente la lectura para presentar cada informacin durante un instante, ya que como tenemos cinco datos distintos en cada registro y cinco TextBox para presentarlos, deberemos presentar una informacin tras otra. Esto no parece en principio una solucin prctica para una base de datos, donde lo que interesa es disponer de todos los datos para usarlos cuando sea necesario. Esto nos lleva a crear una matriz para albergar todos los datos de la base, ya que los ficheros secuenciales se leen y se les tiene que extraer toda la informacin de un golpe, ya que no permiten ir a leer hacia atrs. Por lo tanto, si deseamos disponer de todos los datos, deberemos guardarlos en la memoria, en una matriz. Imagnese que estamos tratando datos de varios miles de libros en el ejemplo anterior. Si la informacin de cada campo es medianamente extensa, no tendramos memoria RAM suficiente en el ordenador para albergarlos. Esto nos lleva a pensar en otro tipo de archivo que veremos a continuacin, los Random (aleatorios), que permiten leer solamente los

Pgina 167

registros que nos interesan. Pero volvamos a nuestra aplicacin de librera, donde hemos hecho una variacin, los campos PRECIO y EXISTENCIAS los vamos a tratar ahora como nmeros (Integer). Tambin se ha introducido otro campo tipo texto, para introducir la edicin. El fichero creado tras introducir varios libros qued de la siguiente forma : "EL RODABALLO","GUNTER GRASS","PLANETA",1995,2000,12 " VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21 "EL NOMBRE DE LA ROSA","UMBERTO ECO","AGUILAR ",28,1000,21 "ENCICLOPEDIA DEL VB","CEBALLOS","RAMA",CUARTA,1200,23 "LA GRANJA ANIMAL","ORWELL","DESTINO",45,12000,78 "LA PASION TURCA","ANTONIO GALA","PLANETA",SEGUNDA,2500,25 "LA METAMORFOSIS","KAFKA","PLAZA&JANES", 4,3400,101 "VB4 PARA WINDOW S95","GARY CORNELL","MCGRAWHILL",1,6500,25 Observe que los dos ltimos campos (correspondientes a PRECIO y EXISTENCIAS) no estn entre comillas, pues no se trata de texto, sino de nmeros. (Observe tambin la gran ventaja de tener una base de datos con datos completamente legibles) Se han introducido alguna variaciones en el programa. Entre ellas, se crea una matriz de variables de 5 x n (n=nmero de registros). Tambin se le aaden unos botones para poder recorre toda la base de datos. La interfaz grfica qued de la siguiente forma :

El programa necesita que le introduzcamos el nombre del fichero que alberga la base de datos. Por sencillez no se ha usado ningn CommonDialog y se introduce directamente el nombre de este fichero en un TextBox llamado TBNombreFichero El fichero anterior podemos leerlo tal y como indicbamos antes :

Pgina 168

Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) Input #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS Donde las variables TITULO, AUTOR, EDITORIAL y EDICION sern del tipo String y PRECIO y EXISTENCIAS sern de tipo numrico. Podemos saberlo, ya que en una lnea cualquiera del fichero anterior : " VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21 los cuatro primeros parmetros van entre comillas dobles, ya que son datos tipo texto, y los dos ltimos van sin comillas, como corresponde a datos numricos. Pero existe otra forma mejor (al menos un poco mas complicada) para leer estos datos, y evitar el problema que tenamos antes de tener que hacer un temporizador para poder ver, aunque solo sea un momento, los datos. Podemos meter los datos a una matriz que tenga tantas columnas como datos (campos) (en el ejemplo 6, cuatro String y dos numricos), y tantas filas como apuntes (registros) tengamos. Para ello, antes de nada debemos definir un tipo de variable, mediante la instruccin Type. Parece que no nos basta con los tipos de variable que trae VB (Long, String, Integer ...) y es cierto. La variable que necesitamos no es de ningn tipo de esos. Est compuesta por varias secciones, y cada una de ellas puede ser de un tipo distinto. Este tipo de definiciones debe hacerse en un mdulo (Vase instruccin Type en la ayuda de VB), por lo que se ha creado un mdulo llamado LIBREMD2.BAS, con el siguiente cdigo : Type REGISTROLIBRO AUTOR As String TITULO As String EDITORIAL As String EDICION As String PRECIO As Integer EXISTENCIAS As Integer End Type Esto es lo que se llama DEFINIR una variable. Es como hacerse un traje a medida. Y dese cuenta de que es un tipo de variable (REGISTROLIBRO) formado por varias partes (AUTOR, TITULO, Etc.) Observe que DEFINIR una variable NO es lo mismo que DECLARAR En el apartado de Declaraciones del General del formulario declaramos las variables, entre ellas una variable, REGISTROLIBROS, de la cual decimos que va a ser una matriz mediante los parntesis que la acompaan, y adems declaramos que va a se similar a REGISTROLIBRO ya definida en el mdulo. Dim NR As Integer Dim REGISTROLIBROS() As REGISTROLIBRO Dim NRP As Integer Observe que al usar parntesis al declarar la variable REGISTROLIBROS le estamos diciendo a VB que esa variable ser un Array, y adems que es una variable del tipo REGISTROLIBRO, tipo de variable que ya conoce, puesto que se la hemos definido en un mdulo. En el ejemplo preparado podemos escribir y leer datos. Veamos de nuevo como se escriben El cdigo del procedimiento click del botn BIntroducir1 es : Private Sub BIntroducir1_Click()

Pgina 169

TITULO = LIBRETBTITULO.Text AUTOR = LIBRETBAUTOR.Text EDITORIAL = LIBRETBEDITORIAL.Text EDICION = LIBRETBEDICION.Text PRECIO = Val(LIBRETBPREC.Text) EXISTENCIAS = Val(LIBRETBEX.Text)

TextBox para introducir el ttulo autor editorial edicin precio existencias

(Observe que para introducir el precio y las existencias se transform el contenido del TextBox a un valor numrico mediante la instruccin Val.) Open "C:\cursoVB\" + LIBRETBFICHERO.Text For Append As #1 Write #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS Close #1 End Sub Tras reiteradas entradas, el fichero de la BD qued como se vio anteriormente. Al leer los datos, lo primero es que no conocemos el nmero de registros existentes. Como cada registro va en una lnea del fichero, si contamos el nmero de retornos de carro (Chr(13)) obtendremos el nmero de registros. Esta operacin es la primera que se realiza en el procedimiento click del botn LEER : Private Sub Command2_Click() LIBRETBTITULO.Text = "" Pone todos los TextBox en blanco LIBRETBAUTOR.Text = "" LIBRETBEDITORIAL.Text = "" LIBRETBEDICION.Text = "" LIBRETBPREC.Text = "" LIBRETBEX.Text = "" NR = 0 NR=nmero de registros Abre el fichero, lo lee entero y cuenta el nmero de retornos de carro. Existirn tantos apuntes (registros) como retornos de carro existan, ya que cada registro ocupa una lnea. Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) A = Input(1, #1) If A = Chr(13) Then NR = NR + 1 Loop Close #1 Presenta en LNumFich el nmero de registros LNumFich.Caption = Str(NR) + " Registros)" 'Redimensionamos la matriz de REGISTROLIBROS a NR elementos.. ReDim REGISTROLIBROS(1 To NR) Volvemos a abrir el fichero Open TBNombreFichero.Text For Input As #1 Leemos los registros del 1 al NR, y cada campo del fichero lo vamos asignando a los elementos que componen la matriz. For I = 1 To NR

Pgina 170

Input #1, REGISTROLIBROS(I).TITULO Input #1, REGISTROLIBROS(I).AUTOR Input #1, REGISTROLIBROS(I).EDITORIAL Input #1, REGISTROLIBROS(I).EDICION Input #1, REGISTROLIBROS(I).PRECIO Input #1, REGISTROLIBROS(I).EXISTENCIAS Next I Close #1 NOTA.- Estas lneas podramos heberlas puesto en una lnea nica : Input#1,REGISTROLIBROS(I).TITULO,REGISTROLIBROS(I).AUTOR,_ REGISTROLIBROS(I).EDITORIAL,REGISTROLIBROS(I).EDICION,_ REGISTROLIBROS(I).PRECIO, REGISTROLIBROS(I).EXISTENCIAS

NRP = Nmero del Registro Presentado. Lo hacemos igual a 1 para presentar, de momento, el nmero 1 NRP = 1 LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End Sub Copiamos este cdigo de presentacin de datos y lo llevamos a las flechas de incrementar o disminuir el nmero del registro a presentar. Private Sub BMas1_Click() NRP = NRP + 1 If NRP > NR Then protegemos que salga error de NRP fuera de intervalo MsgBox "No existen mas registros en esta direccin" NRP = NR Else LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End If End Sub Esta es la de incrementar. La de disminuir es igual, pero restando 1 a NRP Las flechas dobles llevan al registro 1 y al ltimo. Tienen este cdigo Private Sub BMas2_Click() NRP = NR LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR

Pgina 171

LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End Sub Observe que es muy sencillo trabajar con ficheros secuenciales para bases de datos. El inconveniente es la cantidad de memoria necesaria para la matriz de datos. Tambin tienen un gran inconveniente: solamente se pueden leer de hacia adelante. Un fichero secuencial hay que leerlo de una sola vez. Esto que no es ningn inconveniente para un fichero de texto, o incluso para un fichero de datos que leemos una nica vez, es un problema cuando leemos un dato situado en un punto de ese fichero, y luego tenemos que leer un dato colocado en una posicin anterior. En este caso, deberemos terminar de leerlo, y volver a comenzar por el principio. Este es un gran inconveniente para hacer bases de datos con ficheros secuenciales. No solamente hemos visto una forma de crear una base de datos, sino que hemos visto como movernos a lo largo de los registros. Ver esto con mucho mas detalle cuando demos bases de datos. Este tipo de bases de datos son la Tipo Texto que ver mas adelante. Propiedades de los ficheros Secuenciales: EOF Indica el fin del fichero (End Of File). EOF ser False hasta que encuentre el final del fichero secuencial. 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, para ir extrayendo con la instruccin Input o Line Input los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF) LOC Devuelve la posicin de lectura/escritura actual en un archivo abierto. La sintaxis de esta propiedad es: LOC (Numero de canal) la informacin devuelta para un archivo secuencial es la posicin de byte actual en el archivo, dividida por 128. LOF Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open. Sintaxis LOF(numeroarchivo)

Ejemplo Long = LOF (1) Observaciones funcin SEEK Devuelve la posicin actual de lectura/escritura de un archivo abierto con la instruccin Open. Sintaxis Seek(nmeroArchivo) Para obtener la longitud de un archivo que no est abierto utilice la FileLen. (Vala mas abajo)

Pgina 172

Observaciones Seek devuelve un valor entre 1 y 2,147,483,647 (equivalente a 2^31-1) inclusive. Para archivos abiertos en modo Output, Append o Input, Seek devuelve la posicin de byte en la que se va a ejecutar la siguiente operacin. El primer byte de un archivo est en la posicin 1, el segundo en la posicin 2 y as sucesivamente.

Pgina 173

FICHEROS ALEATORIOS (RANDOM) Un fichero aleatorio es un conjunto de registros, todos ellos de la misma longitud, que nos permite guardar varias colecciones de datos. Tal como habamos visto en los ficheros secuenciales, el almacenar una serie de colecciones de datos en un fichero secuencial era muy fcil, pero bastante difcil de almacenarlas en la memoria cuando el nmero de estas colecciones superaba una cierta cantidad. Los ficheros aleatorios permiten almacenar informacin en registros que pueden ser fcilmente ledos, pudiendo leer los registros uno a uno, sin necesidad de leerlos todos. En los archivos secuenciales, la informacin de varios datos podamos introducirla mediante la instruccin Write, y conseguamos un registro de la forma: (Recurdese el ejemplo de los datos de un libro) "Ttulo","Autor","Editorial","Edicin","Precio","Existencias" Si desebamos guardar la informacin de muchos libros, no haba mucho problema para guardarla, pero s para almacenarla en memoria para poder usarla luego. Tenamos que leer todo el fichero, y extraer de l la coleccin de informaciones y guardarlas en una matriz. Cambiar una informacin dentro del fichero secuencial tambin implica una complicacin adicional, ya que debemos rehacer el fichero completo, pues un fichero secuencial no permite remendar el trozo que queremos cambiar. Los ficheros aleatorios nos permiten guardar una informacin similar a la anterior, referida a cualquier nmero de libros, y para leerla no es necesario leer todo el fichero, sino simplemente acceder a los registros que nos interesen. Tambin permite realizar el cambio de un registro de una forma sencilla, sin alterar los dems. Todo esto tiene un precio: En los archivos secuenciales, podamos introducir informaciones de cualquier longitud. En los archivos aleatorios cada dato tiene una longitud asignada, longitud que no se puede sobrepasar, y si la informacin que debemos almacenar tiene menos que la longitud preestablecida, perderemos esa capacidad sobrante. Para abrir un fichero aleatorio debemos emplear la expresin: Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro Nombrefichero es el nombre que queremos dar al fichero Numerocanal es el nmero del canal (nmero de fichero) que puede ser de 1 a 255 LogitudRegistro es la longitud total del registro. Un fichero aleatorio (Random), una vez abierto, puede utilizarse para leer o escribir datos. Para escribir datos en un fichero aleatorio, primero debemos definir el registro, es decir, en el caso de los libros visto anteriormente, un registro va almacenar los datos del titulo, autor, editorial, etc. Para "saber" como se colocan estos datos dentro del registro ser necesario definirlo. Podemos hacerlo con la instruccin Type en un mdulo: Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para existencias.

Pgina 174

End Type Observe la diferencia de esta definicin con la que hacamos en los ficheros secuenciales. En aquellos no ponamos la longitud de cada seccin. Aqu es necesario, ya que la longitud de un registro (y tambin de cada campo) es fija. Ya una vez definido como es Registro, podemos decir que una variable es del tipo definido para Registro, es decir : Dim MiVariable as Registro

Entonces MiVariable ya puede almacenar los datos de Titulo, Autor, Editorial, Edicin, Precio y Existencias, colocando un dato tras otro, sin ninguna separacin, en el mismo orden que lo habamos definido para Registro. No es necesario utilizar separaciones ya que el programa sabe que longitud tiene cada dato y el orden de colocacin. Lo sabe porque se lo hemos dicho al definir Registro. Si los datos a introducir son : Titulo : Autor : Editorial : Edicin : Precio : Existencias : Gua del Estudiante Luis Surez Bernaldo Ediciones XX 2 3500 25

el registro correspondiente a este libro tendr una forma mas o menos as : Gua del Estudiante///////////Lus Surez Bernaldo//////////Ediciones XX///2////350025/ donde se ha sustituido el carcter nulo por una barra ( / ) con el fin de hacerlo visible en el texto. Si se molesta en contar los caracteres que tiene el registro observar que son 88, 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 (Ttulo, Autor, etc.) Para hablar con propiedad, a esas partes que componen el registro lea vamos a llamar CAMPOS. Un Registro est formado por varios Campos, y cada Campo contiene una informacin. Imagnese que introducimos otro libro. El primer campo de ese nuevo registro se colocar en el fichero inmediatamente despus del ltimo campo existente, sin ningn tipo de separacin. No hace falta esa separacin, pues VB conoce donde finaliza un registro y comienza otro, ya que la longitud total del registro se le ha introducido en la instruccin para abrir el fichero, 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, 128 caracteres) LongitudRegistro deber ser igual o mayor que la suma de caracteres de cada uno de los campos declarados en la instruccin Type, que tambin reproducimos : Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para existencias.

Pgina 175

End Type Deber ser igual o mayor, o estrictamente igual ? La respuesta es igual o mayor. Pero si declaramos en la instruccin Open que el registro es mayor que la suma de los caracteres de todos los campos que lo componen, estaremos perdiendo espacio de disco duro, tanto como la diferencia entre lo declarado en la instruccin Open menos la suma de los caracteres de cada uno de los campos. Y esa cifra, multiplicada por el nmero de registros existentes. Por lo tanto debe declararse en la instruccin Open exactamente la suma de los caracteres de todos los campos. En el ejemplo anterior era bastante fcil, ya que todos los campos eran del tipo String (cadena de caracteres) y cada carcter ocupa un byte. La cosa se complica si uno o varios de los campos son de tipo numrico, porque nos obligar a recordar cuantos bytes ocupa un integer, un Long, etc. Si hubisemos declarado en la instruccin Type Precio as Long, Existencias as Integer deberamos tener en cuenta que un Long (nmero entero entre 2.147.483.648 y 2.147.483.647, inclusive) ocupa 4 bytes y un integer (nmero entero entre 32.768 y 32.767) ocupa 2 bytes. Se reproduce a continuacin la longitud en Bytes de cada uno de los tipos de datos. No se moleste en aprendrsela de memoria, pues en la Ayuda de Visual Basic puede encontrarla como Resumen de tipos de datos. Pero fjese 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 puede tomar 256 valores y ocupa solamente un Byte.

Tipo de Dato Byte Boolean Integer Long(entero largo) Single(coma flotante Simple precisin) Double(coma flotante Doble Precisin) Currency Date Object String (longitud variable) String (longitud fija) Variant (con nmeros) Variant (con caracteres)

Ocupa 1 byte 2 bytes 2 bytes 4 bytes 4 bytes 8 bytes 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. Y echando nmeros para saber la longitud real de la variable y no perder ningn byte del disco duro desaprovechndolo sin informacin. No habr algo que nos lo facilite ? S, lgicamente. La instruccin LEN LEN nos da la longitud de un texto (Var=Len (Hola que tal), 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, 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 declaracin del registro mediante la instruccin Type debe hacerse en la seccin de

Pgina 176

declaraciones de un Mdulo. Esta instruccin Type en realidad lo que est haciendo es definir un nuevo tipo de variable, (una variable definida por el usuario) que servir de muestra para que en otra parte del programa le digamos, mediante una instruccin Dim, que tal variable es del tipo definido anteriormente mediante la instruccin Type. Por lo tanto, debemos declarar una variable en la parte que corresponda del programa, dependiendo del mbito que se le quiera dar a esa variable, diciendo que ser del tipo de la declarada mediante la instruccin Type. Usando la declaracin de Registro del ejemplo anterior, vamos a retomar el ejemplo de la biblioteca. Declararemos (posiblemente en la seccin de declaraciones del formulario) una variable que llamaremos p.e. REGLIBROS de la siguiente forma : Dim REGLIBROS as Registro A partir de este momento, el programa sabe que REGLIBROS es una variable que tiene 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias) y que cada campo tiene los caracteres especificados en la instruccin Type. Ahora nos cabe una pregunta Cuantos registros tiene un fichero Random? La respuesta es sencilla. Basta conocer la longitud del fichero mediante la instruccin LOF si el fichero ya est abierto, o con la instruccin FILELEN si no lo est, y dividir el dato obtenido con cualquiera de las dos instrucciones anteriores por el valor LongitudRegistro. Escribir datos en un fichero Random. Instruccin Put Una vez abierto el fichero Random podemos leer y escribir datos en l. Para escribir datos utilizaremos la instruccin Put. La sintaxis de Put es la siguiente: Put # Numerocanal , NumeroRegistro, Variable Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se escribir ser el siguiente al ltimo registro escrito. NumeroRegistro es el nmero del registro que queremos escribir, y Variable es el contenido de ese registro. Siguiendo con nuestro ejemplo de biblioteca, Variable tiene en este caso el nombre REGLIBROS, que no es un String ni un Integer, sino una variable definida por el usuario ya que la declaramos con Dim REGLIBROS as Registro. Por lo tanto, la variable REGLIBROS contendr los mismos campos que habamos declarado para Registro en la instruccin Type. Recuerde : Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3 End Type

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para existencias.

Luego REGLIBROS tendr 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias), cada uno de una longitud determinada, la definida en la instruccin Type. Antes de introducir REGLIBROS en el fichero habr que decir que valor tiene. Pero cada campo que lo compone tendr un valor. Podramos hacer una aplicacin en la que, a travs de varios TextBox, le introdujsemos los valores de los campos, y el nmero de registro en el cual queremos escribir. El nombre de cada uno de los TextBox para cada uno de los datos es el

Pgina 177

siguiente : Campo Ttulo : TBTITULO Campo Autor : TBAUTOR Campo Editorial : TBEDITORIAL Campo Edicin :TBEDICION Campo Precio : TBPRECIO Campo Existencias : TBEXISTENCIAS La aplicacin deber introducir en cada campo el valor (string) existente en cada uno de esos TextBox. El valor de la variable REGLIBROS lo compondremos de la siguiente forma : REGLIBROS.Titulo = TBTITULO.Text REGLIBROS.Autor = TBAUTOR.Text REGLIBROS.Editorial = TBEDITORIAL.Text REGLIBROS.Edicion = TBEDICION.Text REGLIBROS.Precio = TBPRECIO.Text REGLIBROS.Existencias = TBEXISTENCIAS.Text (Si se hubiese omitido alguna de estas igualdades, el campo correspondiente contendra el valor nulo) De esta forma, REGLIBROS ya tiene un valor que se puede escribir en el fichero mediante la instruccin Put.

Pgina 178

El formulario de esa aplicacin tendr esta forma :

Observe que ya se le han introducido otros controles (TextBox para introducir el nombre del fichero, otro para el nmero de registro, botones para leer, escribir, abrir el fichero (EXAMINAR), un par de botones para subir o bajar el nmero de registro y un botn para salir de la aplicacin. El TextBox para introducir el nombre del fichero se llama TBNOMBREFICHERO y en el que debemos introducir el nmero de registro a leer o escribir TBLEERESCR. El Botn EXAMINAR cierra cualquier fichero que pudiese estar abierto, abre el fichero indicado en TBNOMBREFICHERO, calcula el nmero de registros y escribe este nmero en el Label con nombre LNUMFICH. El cdigo de su procedimiento Click es el siguiente : Private Sub BEXAMINAR_Click() Close Open TBNOMBREFICHERO For Random As #1 Len = 88 LONGITUDFICH = LOF(1) NUMREGS = LONGITUDFICH / 88 LNUMFICH.Caption = NUMREGS End Sub

Cierra cualquier fichero abierto Abre el fichero deseado Obtiene su longitud Calcula el N. de registros Pone ese N. en el Label

Veamos como se escribe un registro. Analicemos el cdigo del procedimiento click del botn ESCRIBIR Private Sub BESCRIBIR_Click() REGISTROLIBRO.Titulo = TBTITULO.Text REGISTROLIBRO.Autor = TBAUTOR.Text variable REGISTROLIBRO.Editorial = TBEDITORIAL.Text REGISTROLIBRO.Edicin = TBEDICION.Text REGISTROLIBRO.Precio = TBPRECIO.Text REGISTROLIBRO.Existencias = TBEXISTENCIAS.Text Put #1, Val(TBLEERESCR), REGISTROLIBRO End Sub

Se asignan los valores de cada uno de los campos de la REGISTROLIBROS

Se escribe el registro

Observe que el N. de registro es el valor que figure en el TextBox TBLEERESCR

Pgina 179

Leer datos en un fichero Random. Instruccin Get Para leer los datos de un fichero Random utilizaremos la instruccin Get. Su sintaxis es la siguiente : Get # Numerocanal , NumeroRegistro, Variable Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se leer ser el siguiente al ltimo registro ledo. La Instruccin Get leer un registro completo. Ese registro contendr varios campos, y seguramente nos interesar conocer el valor de cada campo dentro de ese registro. Variable es una variable que contendr todos los campos. En nuestra aplicacin de biblioteca, Variable tiene por nombre REGISTROLIBRO (El mismo que tena para la instruccin Put de escribir. Es pura comodidad del programador. Puede tener cualquier otro nombre) Para obtener el contenido de cada campo, realizaremos un proceso similar al empleado para la escritura, pero al revs. En nuestra aplicacin, pretendemos poner el contenido de cada campo en los mismos TextBox que se utilizaron para escribirlos. Veamos el contenido del procedimiento click del botn LEER Private Sub BLEER_Click() Get #1, Val(TBLEERESCR), REGISTROLIBRO Lee el registro completo TBTITULO.Text = REGISTROLIBRO.Titulo Obtiene el valor del campo Titulo TBAUTOR.Text = REGISTROLIBRO.Autor Autor, Editorial, Edicin, Precio TBEDITORIAL.Text = REGISTROLIBRO.Editorial y Existencias y los pone en los TBEDICION.Text = REGISTROLIBRO.Edicin TextBox correspondientes a cada TBPRECIO.Text = REGISTROLIBRO.Precio dato TBEXISTENCIAS.Text = REGISTROLIBRO.Existencias End Sub Funciones e instrucciones aplicables a los ficheros Random. Funciones Seek y Loc. En los ficheros Random tienen especial importancia las funciones Seek y Loc. Mediante la Funcin Loc podemos conocer la el ltimo registro manipulado, bien por lectura, escritura. Si abrimos el fichero y no se ha hecho ninguna lectura o escritura de registros, el nmero devuelto por la funcin Loc es 0. La sintaxis de la funcin Loc es : Variable = Loc (Numerocanal) Variable tomar un valor igual al nmero del registro escrito o ledo por ltima vez. Mediante la Funcin Seek podemos conocer el prximo registro que ser manipulado en una operacin de lectura o escritura. Si abrimos el fichero y no se ha hecho an ninguna operacin de lectura o escritura, Seek devuelve el valor 1. La sintaxis de la funcin Seek es : Variable = Seek (Numerocanal) ATENCION

Pgina 180

Seek puede ser una funcin (lee un Dato) o una instruccin (fuerza un dato) ! ! ! Instruccin Seek La instruccin Seek establece el prximo registro a leer o escribir en un fichero Random. Sintaxis Seek (Numerocanal), posicin posicin es el nmero de registro que se va a leer o escribir en la siguiente operacin. No acepta el 0 como nmero de registro, el mas bajo debe ser el 1. Si se intenta forzar a la posicin 0 dar un error. Funciones de los ficheros Random: EOF Devuelve un valor que indica si se ha llegado al final de un archivo. Sintaxis EOF(Numerocanal)

En archivos Random, EOF devuelve False hasta que se haya ejecutado una instruccin Get y no haya podido leer el registro completo, en cuyo caso devolver True. La funcin EOF no suele emplearse en ficheros Random, ya que en estos nos movemos a base de registros, y es muy fcil controlar cuantos registros existen en el fichero y en que registro nos encontramos o nos vamos a mover, mediante las funciones LOF, LOC y SEEK

LOF

( Lenght Of File ) Devuelve la longitud de un fichero . Sintaxis Variable = LOF(Numerocanal)

Mediante la funcin LOF podemos conocer el nmero de registros existentes en un fichero Random, dividiendo el valor devuelto por LOF por la longitud del registro declarada en la instruccin Open (LEN = longitud) N. Registros = LOF / longitud

Recuerde

Para obtener la longitud de un archivo que no est abierto utilce la funcin FileLen.

Pgina 181

FICHEROS BINARIOS Un fichero binario es una sucesin de bytes, uno tras otro, que puede almacenar cualquier tipo de informacin. Cuando se explicaban los ficheros secuenciales, decamos que eran los mas adecuados para introducir informacin de un texto, con los Random podamos realizar una base de datos de forma sencilla, a base de controlar los registros y sus campos. Con un fichero binario podemos almacenar cualquier informacin. (texto y cualquier tipo de datos) . Para abrir un fichero secuencial se abre utilizando la instruccin : Open Nombrefichero For Binary As # Numerocanal Como siempre en VB, Numerocanal puede ser un nmero comprendido entre 1 y 255, que define ea fichero. No pueden existir al mismo tiempo 2 ficheros abiertos con el mismo Numero de canal. Nombrefichero es el nombre completo del fichero, con su Path. Una vez abierto un fichero se binario, podemos leer o escribir datos en l. Para escribir uno o varios caracteres en un fichero binario, usaremos la instruccin Put. Put # Numerocanal, Posicin, Variable Donde Posicin es el Byte donde comenzar la escritura, y Variable es el nombre de la variable que contiene el dato a escribir. Este dato puede ser un byte o varios bytes. Para escribir varios bytes podemos hacerlo de dos formas : - Si se puede conocer de antemano el nmero de bytes a escribir, puede declararse Variable como un string de ese nmero de caracteres mediante la instruccin Dim, por ejemplo : Dim Variable As String * numero de bytes y en este caso siempre escribir el nmero de bytes declarado. Cuidado ! Si los datos a introducir sobrepasan el nmero de bytes declarados para Variable, los datos sobrantes no se escribirn en el fichero. Si los datos a escribir en el fichero fuesen menos que los declarados para Variable, la diferencia se rellenar con el byte nulo ( 0 ). - Si no se conoce de antemano el nmero de bytes a escribir, podemos declarar la variable sin especificar el nmero de bytes que tiene, y de esta forma se escribirn todos los bytes que componen la variable : Dim Variable As String Pero en este caso debemos volver a decir Cuidado !, si no conocemos el nmero de bytes que vamos a escribir, puede que machaquemos parte de la informacin que ya tenemos en el fichero, pues la instruccin Put va a colocar los bytes que componen Variable en la posicin especificada por Posicin y siguientes, hasta que quepa toda la cadena de bytes que le queremos introducir. Si la posicin en la que introducimos esos bytes es una posicin intermedia, y no controlamos bien el nmero 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, es muy probable que perdamos esa informacin al introducir la nueva.

Si se omite el dato Posicin, se tomar como byte de inicio de la escritura el siguiente al

Pgina 182

ltimo usado por la instruccin Put. Si quiere omitir este dato, debe conservar las comas que lo separan : Put # Numerocanal, , Variable Qu pasar si el dato Posicin indica una posicin mayor que la que tiene realmente el fichero ? Simplemente que rellenar las posiciones intermedias que se formarn con un byte (puede verlo con el Block de Notas ) Un fichero binario es, como se deca al principio, una sucesin de bytes, que no tiene ningn tipo de separacin entre bytes. Cada dato (byte o conjunto de bytes) que introduzcamos en un fichero binario se escribir en el fichero tal y como se introducen. Machacando informacin ya existente si no se controla bien donde se mete. Por lo tanto, aunque parece que los ficheros binarios pueden ser mucho mas verstiles que los secuenciales y los Random, exigen mucho mas control que los anteriores. Limite el uso de este tipo de ficheros a las aplicaciones en que sea realmente imprescindible. Para leer datos de un fichero binario, utilizaremos la instruccin Get. Get # Numerocanal, Posicin, Variable Donde Posicin es el nmero del primer byte ledo, que como en el caso de Put, si se omite, tomar como valor el byte siguiente al usado en la ltima instruccin Get. Variable es el nombre de una variable que contendr los datos ledos. Pueden leerse uno o varios Bytes, pero ahora surge un pequeo problema. Como le decimos cuantos bytes debe leer ? Sencillamente los especificados al declarar la variable . Imaginemos que la declaracin de la variable fue : Dim Variable As String * 10 Con Variable declarada de esta forma, leer 10 bytes a partir del byte Posicin. (Incluido) De esta forma, siempre leeremos un nmero determinado de caracteres (10 en el caso del ejemplo). Esta es una limitacin para el uso de Get. Esta funcin viene muy bien en aquellas aplicaciones en las que tenemos que extraer un nmero fijo de bytes (En la prctica, 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 nmero de caracteres, y otra vez otro. Ese problema lo tenemos resuelto con la instruccin Input. Podemos leer caracteres de un fichero secuencial mediante la instruccin Input : Variable = Input (Numero de bytes, # Numerocanal) Mediante la instruccin Input podemos leer el nmero de caracteres que queramos, pero no podemos controlar el byte de comienzo. Por lo tanto deberemos ayudarnos de la instruccin Seek para posicionar el puntero de lectura encima del primer byte que queramos leer : Seek (Numerocanal), Nmero del primer Byte a leer Por ejemplo, si queremos leer 35 bytes de un archivo binario, abierto con el nmero de canal 1, comenzando por el byte 48 (el 48 ser el primer byte ledo), ejecutaremos las dos siguientes instrucciones : Seek (1), 48 Variable = Input (35, #1)

Pgina 183

Variable contendr ahora los 35 bytes deseados. Al igual que se hizo para los ficheros secuenciales y Random, vamos a ver con un ejemplo prctico como se manejan los ficheros binarios. El formulario del ejemplo tiene esta forma :

Con el botn ABRIR se abre el fichero deseado. Si no existe en el disco, lo crea, ya que la instruccin Open Nombrefichero For Binary As # Numerocanal intenta abrir un fichero existente llamado Nombrefichero, y si este no existe, lo crea. Si existe el fichero, presenta todo su contenido en el TextBox inferior, para poder tener una referencia de que lugar ocupan los distintos caracteres (un fichero binario puede guardar cualquier byte, por lo que si abre un fichero generado con cualquier programa puede ser que muchos de los bytes no contengan informacin de un carcter, por lo que le recomendamos haga esta prctica con un fichero creado por la misma prctica) El botn CERRAR cierra el fichero. SALIR sale de la aplicacin. El TextBox superior (variable) sirve para introducir la variable a escribir en el fichero, o para presentar la variable leda en caso de lectura . El TextBox posicin sirve para indicar la posicin del primer byte. Posicin por defecto presenta la posicin que se extrae mediante la funcin Seek cada vez que se hace una lectura o escritura en el fichero. Longitud de la variable permite introducir esa longitud, para leer mediante la instruccin Input. El botn ESCRIBIR escribe el dato Variable en el fichero, LEER (GET) lee un nico byte, y LEER (INPUT) lee una cadena de caracteres, de longitud la especificada en el TextBox Longitud de la variable. Se enumera a continuacin el cdigo de cada uno, dejando para las explicaciones del profesor en clase, o el estudio del alumno, la interpretacin de cada una de susu partes. FORMULARIO. Option Explicit DECLARACIONES Obliga a declarar todas las variables Pgina 184

Dim LONGVAR As Integer Dim COMIENZA As Long Dim TESTO As String Dim pospordef As Long

Se declara la variable LONGVAR Se declara la variable COMIENZA Se declara la variable TESTO Se declara la variable pospordef

BOTON ABRIR Private Sub BABRIR_Click() CD1.ShowOpen CD1 es un CommonDialog para buscar el fichero Open CD1.filename For Binary As #1 Abre el fichero indicado en CD1 TESTO = Input(LOF(1), #1) Lee de un golpe el fichero y lo mete en la variable TESTO TBFICHERO.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.BackColor = RGB(255, 0, 0) Dim escribe As String escribe = TBVAR1.Text Put #1, Val(TBVAR3), escribe byte pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub BOTON LEER (GET) Private Sub BLEER_Click() TBVAR2.BackColor = RGB(255, 0, 0) TBVAR2.Text = "1" If Seek(1) >= LOF(1) Then Seek #1, 1 End If Dim TEXTO As String * 1 If TBVAR3.Text <> "" Then COMIENZA = Val(TBVAR3.Text) TBVAR3 ElseIf Lvar5.Caption <> "" Then COMIENZA = Val(Lvar5.Caption) Else COMIENZA = Seek(1) End If Get #1, COMIENZA, TEXTO TBVAR1.Text = TEXTO pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub

La instruccin Close cierra todos los ficheros abiertos

Pone el TB long. De la variable en rojo Declara la variable escribe como string, sin limitacin Pasa el contenido de TBVAR a la variable escribe Instruccin Put. Val(TBVAR3) es la posicin del 1er Analiza donde qued el puntero del fichero y pone este valor en la etiqueta Lvar5

Pone en rojo el TB TBVAR2 (long. de la variable) e indica que la longitud leda es 1 Si est al final del archivo pone el puntero en la posicin 1 Declara la variable TEXTO de un byte Si se le ha indicado donde tiene que comenzar le dice que comience en la posicin indicada en si no, si existe posicin por defecto le indica que comience en la posicin por defecto si no pone el puntero en la posicin 1 (byte 1) lee un byte y lo presenta en TBVAR1 busca la nueva posicin por defecto y pone ese valor en Lvar5

BOTON LEER (INPUT) Private Sub BLLERINPUT_Click() TBVAR2.BackColor = RGB(255, 255, 255) Pone TBVAR2 en blanco LONGVAR = Val(TBVAR2.Text) pasa el valor para long. de variable a LONGVAR If TBVAR3.Text <> "" Then si ese valor existe (TBVAR3 es distinto de nada)

Pgina 185

COMIENZA = Val(TBVAR3.Text) Seek (1), COMIENZA End If Dim TEXTO As String TEXTO = Input(LONGVAR, #1) TBVAR1.Text = TEXTO pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub BOTON SALIR Private Sub BSALIR_Click() End End Sub

la variable COMIENZA toma ese valor coloca el puntero en ese valor Declara la variable TEXTO sin limitacin Lee LONGVAR bytes del canal 1 y los pasa a TEXTO y lo presenta en el TB TBVAR1 analiza la nueva posicin por defecto y la presenta en Lvar5

Sale de la aplicacin.

Private Sub TBVAR2_Change() TBVAR2.BackColor = RGB(255, 255, 255) en End Sub

Vuelve a color blanco si introducimos un dato este Text Box

FIN DE LA APLICACIN PARA MANEJO DE FICHEROS BINARIOS

Funciones y propiedades aplicables a todos los ficheros


DIR Devuelve el nombre de un archivo, directorio o carpeta que concuerda con el patrn o atributo de archivo especificado o la etiqueta de volumen de una unidad de disco. Sintaxis Dir[(nombreruta[, atributos])]

nombreruta Expresin de cadena que especifica un nombre de archivo. Puede incluir el directorio o carpeta y la unidad de disco. Si no se encuentra nombreruta, devuelve Null. atributos Constante o expresin numrica, cuya suma especifica atributos de archivo. Si se omite, devuelve todos los archivos normales que satisfacen el nombreruta. El argumento atributos tiene estas constantes y valores: Constante vbNormal vbHidden vbSystem vbVolume vbDirectory Valor 0 2 4 8 16 Descripcin Normal. Oculto. Sistema Etiqueta de volumen; si se especifica se ignoran todos los atributos Directorio o carpeta.

En Microsoft Windows, Dir permite el empleo de los caracteres comodn '*' (mltiples caracteres) y '?' (un solo carcter) para especificar varios archivos. La primera vez que se llama a la funcin Dir se debe especificar el nombreruta, de lo contrario se produce un error. Si adems se especifican atributos de archivo, se debe incluir el nombreruta. Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener ms nombres de archivo que coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos. Cuando no hay ms nombres de archivo coincidentes, Dir devuelve una cadena de caracteres

Pgina 186

de longitud cero. Cuando se devuelve una cadena de longitud cero, en las siguientes llamadas se debe especificar nombreruta o se producir un error. Se puede cambiar el nombreruta sin haber obtenido todos los nombres de archivo que coinciden con el nombreruta actual. Sin embargo, no se puede llamar a la funcin Dir. FILECOPY Copia un archivo. Sintaxis FileCopy fuente, destino

fuente Expresin de cadena que especifica el nombre de un archivo a copiarse puede incluir el directorio o carpeta y la unidad de disco.. destino Expresin de cadena que especifica el nombre del archivo de destino se puede incluir el directorio o carpeta y la unidad de disco. Si intenta utilizar la instruccin FileCopy en un archivo abierto actualmente, se produce un error. FILEDATATIME Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por ltima vez. Sintaxis Variable = FileDateTime(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo. Se puede incluir el directorio o carpeta y la unidad de disco. FILELEN Devuelve la longitud de un archivo en bytes. Sintaxis Variable = FileLen(nombreRuta) El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Si el archivo especificado est abierto cuando se llama la funcin FileLen, el valor devuelto representa el ltimo tamao de ese archivo cuando se guard la ultima vez en el disco. Para obtener la longitud de un archivo abierto, utilice la funcin LOF. GETATTR Devuelve un nmero, que representa los atributos de un archivo, directorio o carpeta o una etiqueta de volumen. Sintaxis Variable = GetAttr(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se 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 Constante Descripcin

Pgina 187

0 1 2 4 16 32

vbNormal vbReadOnly vbHidden vbSystem vbDirectory vbArchive

Normal. Slo lectura. Oculto. Archivo de sistema. Directorio o carpeta. El archivo ha sido modificado despus de efectuar la ltima copia de seguridad.

SETATTR Establece los atributos de un archivo. Sintaxis nombreRuta atributos SetAttr nombreRuta;atributos

Expresin de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Constante o expresin numrica cuya suma especifica los atributos de archivo.

Las constantes y valores de atributos son los mismos que para la instruccin GetAttr Si se trata de establecer los atributos de un archivo abierto, se producir un error en tiempo de ejecucin.

FREEFILE Devuelve el siguiente nmero de archivo disponible para ser usado con la instruccin Open. Sintaxis FreeFile[(nmerodeintervalo)]

El argumento nmerodeintervalo especifica el intervalo desde el que el siguiente nmero de archivo libre se va a devolver. Se especifica 0 (predeterminado) para devolver un nmero de archivo en el intervalo 1 a 255, inclusive. Se especifica 1 para devolver un nmero de archivo en el intervalo 256 a 511. Observaciones Se usa FreeFile cuando se necesita proveer un nmero de archivo y se quiere asegurar que el nmero de archivo no est ya en uso. FIN del octavo captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 188

Visual Basic - Gua del Estudiante Cap. 9


EL DRAG & DROP (Arrastrar y Soltar) LA FUNCION SHELL LA FUNCION COMMAND PARA PASAR PARAMETROS EL DRAG & DROP (Arrastrar y Soltar)

El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello se toma algo de una parte de la interface grfica, mediante la operacin de colocar el puntero del ratn y pulsar su botn izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botn izquierdo del ratn se desliza (se arrastra) el puntero del ratn hasta el punto de la interface grfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en el punto de destino se suelta el botn del ratn y se deja caer lo que habamos tomado en el punto de origen. El efecto de tomar algo de un control le denominaremos DragOver, y el efecto de dejar caer le denominaremos DragDrop. El Drag & Drop tiene un efecto visual muy didctico. Pero NO HACE otra cosa. Es decir, no toma nada del control origen ni lo suelta al llegar a destino. Esa accin de tomar algo en el origen o soltarlo al llegar al destino debemos realizarla mediante cdigo en los eventos adecuados ( MouseDown, DragOver , DragDrop), dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el mtodo Drag.

PROPIEDAD DragMode Es una propiedad de lectura y escritura. Devuelve o establece un valor que determina si se usa el modo de arrastre manual o automtico en una operacin de arrastrar y soltar. Sintaxis NombreControlOrigen.DragMode [= nmero] Donde nmero puede tomar los valores 0 (Manual) 1 (Automtico). El valor predeterminado es el 0. Cuando esta propiedad est a 0 (Manual) se debe emplear el Mtodo Drag para iniciar una operacin Drag & Drop. Si est a 1, la operacin de arrastrar y soltar se inicia automticamente cada vez que hacemos click sobre el botn izquierdo del ratn, teniendo el puntero del mismo sobre el control. Los controles contenedores OLE slo se arrastran automticamente cuando no tienen el enfoque. Parece en principio mas prctico tener esta propiedad a 1. Sin embargo la realidad es distinta. Se controla mucho mejor el Drag & Drop poniendo esta propiedad a 0 (Manual), pese a que en este caso deberemos utilizar el mtodo Drag para iniciar el proceso. El poner esta propiedad en automtico conlleva tambin el hecho de que el control no toma el foco haciendo click sobre l, ya que no sabe si lo que quiere hacer es llevarle el foco o iniciar una operacin de Drag & Drop.

PROPIEDAD DragIcon Devuelve o establece el icono que se presenta como puntero del ratn durante una operacin de arrastrar y soltar. Sintaxis NombreControlOrigen.DragIcon [= icono] Donde Icono es cualquier referencia a un icono vlido. Esta propiedad va a marcar el icono que aparezca durante la operacin Drag & Drop desplazndose a lo largo de la ventana. Si no se especifica esta propiedad, el desplazamiento se expresa mediante un

Pgina 189

rectngulo del tamao del control origen, cosa que resulta bastante desagradable en cualquier aplicacin. Debe ponerse por lo tanto un icono en esta propiedad. El valor de esta propiedad puede establecerse en tiempo de diseo, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecucin. En este caso, la referencia a un icono vlido puede darse igualando el valor de esta propiedad a un icono ya existente en la aplicacin (NCO. DragIcon = Form1.Icon pondra como icono el del formulario Form1, NCO. DragIcon = Text1.DragIcon pondra el mismo icono de Text1 para esta propiedad), o cargndolo mediante la funcin LoadPicture : (NCO.DragIcon = LoadPicture (C :\Iconos\Icono1.ICO) El archivo que se cargue debe tener la extensin .ICO y formato de icono. Para Nota. Cuando quiera colocar un icono animado en la propiedad DragIcon (una hoja de papel que oscila al moverse, una hoja de papel que se destruye - ejemplos tomados de W95-), debe usar varios iconos en secuencia. Por lo tanto debe cambiar la propiedad DragIcon a lo largo del tiempo que dura el arrastre. 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). Dado que el cambio debe ser rpido, no es conveniente acceder al disco (mediante la funcin LoadPicture) cada vez que tiene que cambiar la imagen del icono. Como para simular un movimiento tan sencillo son suficientes pocas imgenes, (8 por ejemplo) puede crear otras tantas variables tipo Picture, cargar las imgenes al comienzo de la aplicacin (con la funcin LoadPicture) y cuando necesite el movimiento animado del icono, cargar las 8 imgenes secuencialmente desde esas variables, para simular el movimiento NCO.DragIcon = Variable1 NCO.DragIcon = Variable2 ...... NCO.DragIcon = Variable8 Esto le ocupar mas memoria. Es el precio a pagar por la rapidez y la buena presentacin de una aplicacin. METODO Drag Inicia, termina o cancela una operacin de arrastre de cualquier objeto excepto los controles Line, Menu, Shape o Timer. Sintaxis NombreControlOrigen.Drag TipoAccin NombreControlOrigen es el nombre del control donde se inici la operacin Drag & Drop. TipoAccin es un valor o una constante que especifica la accin a realizar, segn se describe a continuacin : Constante vbCancel vbBeginDrag vbEndDrag Valor 0 1 2 Descripcin Cancela la operacin de arrastre. Inicia el arrastre del objeto. Termina el arrastre y suelta el objeto.

Si se omite TipoAccin, la accin predeterminada es iniciar el arrastre del objeto. El uso del mtodo Drag para controlar una operacin de arrastrar y soltar slo se requiere cuando la propiedad DragMode del control origen tiene el valor Manual (0). Sin embargo, Drag puede usarse con objetos cuya propiedad DragMode tenga el valor 1 (o vbAutomatic). En versiones anteriores de Visual Basic, Drag era un mtodo asncrono y las instrucciones siguientes se ejecutaban incluso aunque la accin de arrastre no hubiera terminado. En Visual Basic versin 4.0, Drag

Pgina 190

es un mtodo sncrono y las instrucciones siguientes no se ejecutan hasta que la accin de arrastre no haya terminado. Usando el mtodo Drag puede controlar exactamente cuando quiere que se produzca el inicio del Drag & Drop y el final. El autor de esta Gua del Estudiante vuelve a recomendar que ponga la propiedad DragMode = 0 (Manual). Entre otras razones por la siguiente : Cuando tenemos la propiedad DragMode de un TextBox a 1 (automtico) ese TextBox no podr coger el foco, (al menos de forma fcil) y si lo consigue no puede seleccionar el texto que tiene actualmente, ya que VB no puede saber si lo que est ocurriendo es que queremos seleccionar el texto o si deseamos iniciar la operacin D & D. Como decamos al principio, el Drag & Drop solamente es una manifestacin visual de algo que se est produciendo, pero ese algo deberemos programarlo. Por ejemplo, es muy tpico llevar un dato de una casilla a otra (de un TextBox a otro p.e.) mediante una operacin D & D. El dato debemos llevarlo a una variable que nos permita, al final de la operacin, introducir ese dato en el TextBox final. (No olvide declarar la variable en el lugar correspondiente para que sea vlida en ambos controles). La accin de llevar el dato a la variable debemos hacerla en el procedimiento mas adecuado. Puede ser por ejemplo, el procedimiento MouseDown del control origen, ya que cualquier operacin de D & D comienza haciendo click en el control origen. Si tiene la propiedad DragMode de ese control en Manual, en el momento de hacer Click, ese control toma el foco y, caso de un TextBox, puede arrastrar con el ratn para cambiar el texto, cosa que no podra hacer si pone DragMode=1.

EVENTO DragOver Cuando una operacin de arrastrar y soltar est en progreso y el cursor del ratn pasa por encima de un control o un formulario, se produce el evento DragOver de ese control o formulario. Dependiendo si se trata de un Formulario convencional, un Formulario MDI o un control, el procedimiento DragOver captura distintos parmetros : Private Sub Form_DragOver(origen As Control, x As Single, y As Single, estado As Integer) Private Sub MDIForm_DragOver(origen As Control, x As Single, y As Single, estado As Integer) Private Sub Control_DragOver([ndice As Integer,]origen As Control, x As Single, y As Single, estado As Integer) Donde : origen = Control que se est arrastrando. O dicho de forma mas ortodoxa, control en el que se inici la operacin de Drag & Drop. Dentro de este procedimiento puede hacer referencia a sus propiedades y mtodos con este argumento. Por ejemplo, Source.Visible = False. Caso de que el Control Origen fuese parte de un array de controles, el Index de ese control se tiene en ndice x, y Nmero que especifica la posicin horizontal (x) y vertical (y) actual del puntero del mouse dentro del control o formulario destino. Estas coordenadas se expresan siempre en trminos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop. estado Entero que nos indica el estado de transicin del control que se est arrastrando en relacin al formulario o control destino: 0 = Entra. Este valor se produce en el instante en el que entra el cursor del ratn a este control o Formulario. Se genera tambin en el control origen en el instante que se pulsa el botn del ratn, inicindose de esta forma el D & D. 1 = Deja Este valor se produce cuando el cursor sale del control o Formulario. 2 = Sobre Este valor se produce cuando el cursor se est moviendo sobre el control o el Formulario destino. Pgina 191

Mediante el parmetro origen (completado con ndice si el origen se trata de un array) podemos conocer el control desde el que se inici la operacin de Drag & Drop. Debemos tener siempre presente que el procedimiento DragOver se realiza cada vez que pasamos por encima de un control o formulario durante una operacin de Drag & Drop, independientemente que ese control o formulario sea o no sea origen ni destino de esa operacin. Puede emplearse el procedimiento DragOver para comprobar si ese valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando, si el valor que llevamos est dentro de los mrgenes que admite la aplicacin, etc. Es muy llamativo por ejemplo, cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los mrgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es tpico poner la seal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratn. (Como el control origen se pasa como parmetro al procedimiento DragOver con el nombre Origen basta con poner Origen.Dragicon = ..... ) Recuerde en este caso que al abandonar ese control debe restaurar el icono original. 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, dependiendo de los valores u otros factores de la aplicacin. En el siguiente ejemplo, se declaran 6 variables tipo Picture que van a almacenar seis iconos distintos : En General - Declaraciones Dim pepe as string Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture Dim Icono4 As Picture, Icono5 As Picture, Icono6 As Picture El Form1.Load se cargan los valores de estas variables con seis iconos existentes en el disco. El icono asignado al control origen (Text1) es Icono4. Set icono1 = LoadPicture("C:\vb\icons\dragdrop\drag1pg.ico") Set Icono2 = LoadPicture("C:\vb\icons\dragdrop\drag2pg.ico") Set Icono3 = LoadPicture("C:\vb\icons\dragdrop\drag3pg.ico") Set Icono4 = LoadPicture("C:\vb\icons\dragdrop\drop1pg.ico") Set Icono5 = LoadPicture("C:\vb\icons\dragdrop\dragfldr.ico") Set Icono6 = LoadPicture("C:\vb\icons\dragdrop\dropfldr.ico") Text1.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.DragIcon = icono1 Al salir de Text1 se recupera el icono original If State = 1 Then Source.DragIcon = Icono4

EVENTO DragDrop Ocurre cuando se completa una operacin de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botn del mouse o utilizar el mtodo Drag con su argumento accin establecido a 2 (Drop). Dependiendo de si soltamos sobre un Formulario convencional, Formulario MDI o Control, este evento captura los siguientes parmetros : Private Sub Form_DragDrop(origen As Control, x As Single, y As Single) Private Sub MDIForm_DragDrop(origen As Control, x As Single, y As Single) Private Sub Control_DragDrop([ndice As Integer,]origen As Control, x As Single, y As Single) Estos parmetros son idnticos a los del Procedimiento DragOver ya comentados

Pgina 192

Utilice un procedimiento de evento DragDrop para controlar qu ocurre tras completarse una operacin de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo lugar o copiar un archivo de un lugar a otro, depositar un valor sobre un control etc. Recuerde que la operacin Drag & Drop no hace otra cosa que lo que se puede ver en la interface grfica. Debe poner en este Procedimiento (DragDrop) el cdigo necesario para que se realice la operacin deseada. FIN DEL DRAG & DROP

LA FUNCION SHELL La funcin Shell se utiliza para ejecutar un programa ajeno a la aplicacin que se est ejecutando. Imaginemos que tenemos una aplicacin Visual Basic que necesita, por ejemplo, establecer una comunicacin telefnica, y que esa comunicacin telefnica nos la realiza un programa desarrollado en C++ , llamado MARCADOR.EXE que funciona perfectamente y no queremos desaprovechar. Imaginemos que ese programa tiene la posibilidad de introducirle el nmero telefnico que debe marcar como un parmetro. Este parmetro se le introduce, supongamos, aadiendo el nmero al nombre del programa ejecutable. Por ejemplo: MARCADOR.EXE 1234567 En nuestra aplicacin Visual Basic introduciremos una lnea invocando la funcin Shell seguida del nombre (y Path) del ejecutable y del parmetro que le vamos a introducir al ejecutable: Shell "C:\VB\MARCADOR.EXE 080" Mediante esta lnea, lo que hacemos es ejecutar el programa MARCADOR.EXE e introducirle como parmetro el nmero a marcar. Resultado: el programa MARCADOR.EXE llama al nmero 080 (Bomberos), y una vez establecida la llamada podemos pasarle a ese Organismo datos o lo que nuestra aplicacin haga. Veamos que dice la Ayuda de VB respecto a la Funcin Shell: Ejecuta un programa ejecutable. 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 lnea de comando requeridos; puede incluir directorio o carpeta y unidad de disco. Tambin puede ser el nombre de un documento que se ha asociado con un programa ejecutable. estiloDeVentana es el nmero correspondiente al estilo de la ventana en la cual se va a ejecutar el programa. En Microsoft Windows, si se omite estiloDeVentana, el programa se inicia minimizado con enfoque. El argumento con nombre estiloDeVentana tiene estos valores: Constante vbHide vbNormalFocus vbMinimizedFocus Valor 0 1 2 Descripcin Se oculta la ventana y se pasa el foco a la ventana oculta. La ventana recupera el foco y vuelve a su posicin y tamao original. La ventana se muestra como un icono con foco. Pgina 193 Variable = Shell ( rutaDeAcceso [, estiloDeVentana] )

vbMaximizedFocus vbNormalNoFocus vbMinimizedNoFocus Comentarios

3 4

La ventana se maximiza con foco. La ventana vuelve al tamao y posicin ms recientes. La ventana activa actual permanece activa. 6 La ventana se muestra como un icono. La ventana activa actual permanece activa.

Si la funcin Shell ejecuta con xito el archivo nombrado, devuelve la identificacin de la tarea (ID) del programa iniciado. La ID de la tarea es un nmero exclusivo que identifica el programa en ejecucin. Este nmero debe ser un Long. Si la funcin Shell no puede iniciar el programa nombrado, ocurrir un error. Si desea conocer el ID de la tarea, realice una aplicacin con un botn (cmbCalculadora) y un label (label1). Ponga en ese botn en su procedimiento click, el siguiente cdigo. - Observe que esta aplicacin inicia la calculadora de Windows Private Sub cmbCalculadora_Click() Dim variable As Long variable = Shell("C:\windows\calc.exe", 1) label1.Caption = Str(variable) End Sub Posiblemente lo nico que le importe sea el ejecutar esa aplicacin, sin dar mayor importancia al ID de la tarea. Utilice una lnea con la siguiente expresin : Shell ("C:\windows\calc.exe"), 1 (Observe en las dos formas de ejecutar la funcin Shell, que la colocacin de los parntesis y la coma separadora es distinto. El programa a ejecutar puede ser un programa Windows caso anterior de la calculadora) o un programa DOS. Nota La funcin Shell ejecuta otros programas de manera asncrona. Esto quiere decir que no se puede esperar que un programa iniciado con Shell termine su ejecucin antes de que se ejecuten las instrucciones que siguen a la funcin Shell en la aplicacin. Esto es un gran inconveniente de la funcin Shell. Excepto en contadas ocasiones, siempre es necesario conocer cuando se ha terminado de ejecutar el programa iniciado mediante Shell. Y no es ese el nico problema. La mayora de los programas DOS que se ejecutan con Shell no se cierran automticamente. Esto significa que si podemos evitar el uso de Shell debe evitarse. Pero si es completamente necesario, tampoco pasa nada. Pero hay que controlar, tanto la terminacin del proceso DOS como su cierre. Podemos usar para ello APIs. No las hemos explicado todava. Por eso, y adelantar un poco como se trabaja con ellas, vamos a presentar, sin grandes explicaciones, lo que hay que hacer para poder detectar que se ha terminado de ejecutar el programa DOS y para cerrarlo. Ver mas APIs mas adelante. El programa DOS elegido para este ejemplo es el popular ARJ.EXE, un compresor de datos que, sin nimo de publicidad, es uno de los mejores que existen. Pero trabaja solamente en DOS. Se utiliza un Procedimiento que he llamado ExecCmdNoFocus, para detectar que el proceso abierto para comprimir o descomprimir ha finalizado, y proceder a cerrarlo. La declaracin de las Apis y Constantes (En la seccin de Declaraciones de un Mdulo) es la siguiente: Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As _ String, ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal _ bInheritHandle As Long, ByVal dwProcessID As Long) As Long Pgina 194

Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, 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 Mdulo anterior o en el formulario. Variar el tipo de declaracin de las APIs: Public Sub ExecCmdNoFocus(ByVal CmdLine As String) (CmdLine es el parmetro que le vamos a pasar cuando invoque este procedimiento). 'Este procedimiento inicia un proceso en DOS y espera a que termine 'Una vez terminado este proceso, cierra la ventana, que se mostrar minimizada y sin foco Declaramos las variables locales en ese procedimiento Dim hProcess As Long 'handle del proceso donde se invoca la funcin Shell Dim RetVal As Long 'Valor donde la funcin GetExitCode coloca el resultado Dim winHwnd As Long ' manipulador de la ventana que contenga el Caption Finalizado - ARJ Dim RetValls As Long 'valor de retorno de PostMessage hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine, _ vbMinimizedNoFocus)) Do GetExitCodeProcess hProcess, RetVal Sleep 100 'en este apartado comprueba si est abierta la ventana "Finalizado - ARJ" winHwnd = FindWindow(vbNullString, "Finalizado - ARJ") If winHwnd <> 0 Then RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 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. En el procedimiento ExecCmdNoFocus se analiza si esa ventana est presente (prueba de que ARJ ya ha terminado, pues antes de terminar tiene otro Caption). Para llamar a ese procedimiento hay que citarle por su nombre ( ExecCmdNoFocus) que como lo hemos declarado Public en un Mdulo, podemos llamarle desde cualquier parte de la aplicacin. Debemos pasarle el parmetro CmdLine, que ser el programa que vamos a ejecutar con Shell y los parmetros adicionales que este programa necesite (En este caso, el programa es ARJ.EXE y a continuacin debe indicrsele el nombre del archivo ya comprimido, a continuacin a para que aada mas ficheros a ese archivo, y a continuacin el nombre de ese fichero o ficheros a aadir : El parmetro CmdLine del procedimiento es todo lo que va entre parntesis. ExecCmdNoFocus ("C:\DirA\ARJ.EXE a C:\DirB\Fichero1.Ext") NO se preocupe si no lo entiende ahora. Es difcil.

Pgina 195

LA FUNCION COMMAND En el ejemplo anterior usbamos un ejecutable realizado en C++ para marcar un nmero telefnico que le introducamos como parmetro. Podemos hacer eso en una aplicacin VB? La respuesta debe ser SI. Usaremos para ello la funcin Command. Esta funcin nos devuelve el parmetro introducido tras el nombre del ejecutable realizado en VB, cuando iniciamos la aplicacin VB mediante la lnea de comandos de Windows (lnea Archivo | Ejecutar del Men de Windows 3.xx o lnea Ejecutar de W95), o desde otra aplicacin utilizando la funcin Shell. Veamos tambin en este caso lo que dice la Ayuda de VB: Command (Funcin) Devuelve parte del argumento de la lnea de comandos utilizada para lanzar Microsoft Visual Basic o un programa ejecutable desarrollado con Visual Basic.

Cuando se inicia Visual Basic desde la lnea de comandos, la parte de la lnea de comandos que sigue a /CMD se pasa al programa como un argumento de la lnea de comandos. En el siguiente ejemplo, cmdlineargs representa la informacin de argumento devuelta por la funcin Command. VB /CMD cmdlineargs En las aplicaciones desarrolladas con Visual Basic y compiladas en un archivo .EXE, Command devuelve los argumentos que aparezcan en la lnea de comandos tras el nombre de la aplicacin. Por ejemplo: MyApp cmdlineargs En la ventana Cdigo, puede usted cambiar el texto devuelto por Command eligiendo Opciones del proyecto en el men Herramientas. Veamos con un par de ejemplos como se pueden usar estas dos funciones: Marcador Telefnico Esta aplicacin debe marcar un nmero telefnico. El nmero a marcar se le pasar como parmetro tras el nombre de la aplicacin. La aplicacin ya compilada se llamar MARCADOR.EXE. Para marcar un nmero debemos poner, en la lnea de Comando de Windows: Marcador.exe 1234567 o como ya sabemos, introducirle el parmetro mediante una llamada con la funcin Shell desde otra aplicacin: Shell Marcador.exe 1234567 Como no vamos a realizar llamada alguna, sino comprobar que esto puede funcionar, nuestra pequea aplicacin tendr solamente un Label llamado FRMARCADORL1 donde presentaremos el nmero a marcar. Todo el cdigo necesario se lo metemos en el procedimiento Activate del formulario: Private Sub Form_Activate() FRMARCADORL1.Caption = Command End Sub Tambin podemos pasar parmetros a un ejecutable, mediante el Drag & Drop de Windows. Hemos visto mas atrs como podemos hacer Drag & Drop en una aplicacin VB. Pero como comentbamos, el D&D no es una funcin de VB, sino de Windows. Y Windows lo utiliza en su Explorador de Windows para pasar como parmetro a una aplicacin el nombre del fichero que Pgina 196

arrastremos hacia el icono que representa a esa aplicacin. Como estoy seguro que se ha liado, vamos con un ejemplo. Si Vd. hace un editor de textos (Editor.EXE) que soporta un formato determinado (por ejemplo el RichTextFormat RTF), para ejecutar su programa y meterle como parmetro el nombre del fichero Carta.RTF de forma que al arrancar lea directamente el fichero Carta.RTF, basta con ir al Explorador de Windows, abrir la carpeta que contenga Carta.RTF, arrastrar el nombre de ese fichero y llevarlo al icono que representa a Editor.EXE, que imaginemos que le ha preparado un acceso directo. Suelte el botn del ratn y su editor se ejecutar, y adems, le meter como parmetro el nombre del fichero Carta.RTF (con su Path correspondiente) Si Ud. haba previsto la captura del Command tal como se explic mas atrs, y ha preparado su aplicacin para que tome el contenido de Command y entienda que tiene que abrir y cargar ese fichero, su aplicacin Editor.EXE cargar automticamente ese fichero. Observe que esta es la forma de trabajar de los procesadores de texto usados normalmente (Word, WordPerfect, Write, etc.)

FIN del noveno captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 197

Visual Basic - Gua del Estudiante Cap. 10


INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI ) Lo que se va a explicar en este captulo 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 estn 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 mltiples. En programacin, a este tipo de aplicaciones las denominamos MDI Para crear una aplicacin MDI debe hacerse mediante un Formulario Padre al que se le aaden tantos Formularios Hijo como documentos tengamos. Al formulario padre le denominamos Formulario MDI, y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En esta Gua del Estudiante se usarn indistintamente una u otra denominacin. La nica diferencia entre un formulario normal y un formulario Hijo es que ste tiene la propiedad MDIChild a true. Para realizar una aplicacin 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 aplicacin. 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 aplicacin 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 aplicacin de documentos mltiples. (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 extensin a un formulario hijo, cuando las dimensiones de ste superan las de aquel.

Pgina 198

Aparte de estas propiedades que diferencian un Formulario MDI de un Formulario normal, los Formularios MDI presentan otras particularidades. Insercin de Controles Solamente podrn introducirse en un formulario MDI aquellos controles que tengan la propiedad Align. (Picture, Data, DBGrid) y solo permiten que se presenten con alineacin 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. Lnea de Men. Cuando existe la lnea de Men en un Formulario MDI y en el Formulario Hijo que introduzcamos en l, la lnea de men del Formulario MDI se sustituye por la lnea de men del Formulario Hijo introducido. Barra de Ttulo. La Barra de Ttulo del Formulario MDI se conserva siempre. Pero si el Formulario Hijo insertado dentro de l est maximizado (ocupa toda la extensin del Formulario MDI), a la barra de ttulo se le aadir la barra de Ttulo del Formulario Hijo entre parntesis. 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 segn las necesidades de la aplicacin. Este sera el caso de una aplicacin con varias pantallas, todas ellas colocadas sobre una pantalla fija (Formulario MDI) del que se aprovecha quizs alguna parte como parte comn de toda la aplicacin (Men, Ttulo, Barra de herramientas montada sobre un Picture, etc.) Puede tambin darse el caso de introducir un nmero indeterminado de ventanas iguales para realizar varias veces la misma funcin, 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 nmero de documentos que vamos a editar) Para el primer caso, ser necesario crear cada una de las ventanas, e introducirlas y quitarlas segn pida la aplicacin. 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 aplicacin 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 definicin 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 rplica de una clase. Puede ser la rplica 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 vara una propiedad de una Instancia, no se altera el valor de esa propiedad en la Clase ni en ninguna de las restantes Instancias. Despus de toda esta teora, podemos saber como se crea una Clase de un formulario ? O dicho de manera mas coloquial, Cmo se crea un Formulario para poder hacer varias fotocopias de l ? La respuesta es obligatoriamente mas sencilla que la teora. Con el formulario vaco que tengamos en el proyecto (Insertemos un Formulario si fuese necesario) pongmosle 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 saldrn igualmente con esa propiedad a True. Pongmosle un nombre y ya est creada la clase. Supongamos que ese nombre es FormularioHijo Pgina 199

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 aplicacin, 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 declaracin 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, 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 mtodo Show un formulario no solamente se muestra, sino que tambin se carga en la memoria si no estuviese previamente cargado. Por lo tanto podamos habernos ahorrado la instruccin anterior para cargarlo Load MiVentana Es muy prctico 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. Sera prudente distinguir un formulario de otro mediante su Caption, es decir mediante su barra de ttulo. 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

Pgina 200

Referencias a los Formularios. ActiveForm y Me


Si queremos nombrar un Formulario Hijo dentro de una aplicacin 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 aplicacin no sabra a cual de ellas nos referimos. Si el cdigo 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 ratn sobre cualquiera de sus partes, hasta que activamos otro formulario. Es sencillo reconocer cual es el formulario activo pues tiene su barra de ttulo con el color vivo. Cada vez que hacemos una operacin 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 operacin con el texto desde un botn colocado en el formulario padre (poner en negrita el texto seleccionado), haramos 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 botn donde hemos puesto el botn 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 solucin es nombrarle mediante Me. Me siempre se refiere al formulario que contiene al procedimiento donde est esa palabra. Por lo tanto, si tenemos un botn en el formulario hijo con la instruccin : Me.RTB1.SelBold = True Me se refiere concretamente a ese formulario.

Colocacin de los Formularios Hijo - Mtodo ARRANGE


Mediante el mtodo Arrange podemos distribuir los formularios hijo dentro del formulario padre. Pueden colocarse en cascada, mosaico horizontal, mosaico vertical o como iconos. Sintaxis NFMDI.Arrange distribucin donde NFMDI = Nombre del Formulario MDI distribucin puede tomar los siguientes valores o constantes : Constante vbCascade vbTileHorizontal vbTileVertical VbArrangeIcons Valor 0 1 2 3 Descripcin 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.

Pgina 201

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.

Posicin de los Formularios en el Eje Z - Mtodo ZOrder


Cuando tenemos varios formularios hijo, unos ocultan a los otros. Mucho mas si los formularios estn maximizados. Podemos colocar un formulario hijo en la parte frontal del montn de formularios (para que se vea completamente) o llevarle a la posicin mas atrs mediante el Mtodo ZOrder.

Sintaxis NFH.ZOrder posicin Donde NFH = Nombre del Formulario Hijo posicin 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 mtodo que no solamente se puede emplear con formulario hijo, sino con cualquier instancia. Puede emplearlo tambin con cualquier control. Pero lea detenidamente la Ayuda de este mtodo, ya que no todos los controles la admiten.

Mostrar los Formularios existentes mediante el Men -- Propiedad WindowList


Al explicar el Editor de mens 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 Ttulo) de todos los formularios hijo cargados en ese instante en la aplicacin. Pueden estar incluso minimizados. FIN del dcimo captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 202

Visual Basic - Gua del Estudiante Cap. 11


El Objeto Printer
El objeto Printer le permite comunicarse con una impresora del sistema (inicialmente la impresora predeterminada). Este es uno de los Objetos de VB que no tiene representacin grfica en la pantalla, tanto en tiempo de diseo como de ejecucin. El objeto Printer gestiona el envo de informacin a la impresora, tanto para imprimir textos como grficos. Para Visual Basic el objeto Printer es como otro objeto cualquiera. Si queremos imprimir algo en la impresora, debemos escribir el cdigo VB necesario para escribirlo en el objeto Printer, lo mismo que si estuvisemos escribiendo en un formulario. Lo mismo que para escribir en un formulario, escribamos el cdigo Form1.Print "ABCD" Para escribir en el objeto Printer el cdigo ser: Printer.Print ABCD Para enviar grficos al objeto Printer se procede de igual forma que si estuvisemos dibujando en un formulario Form1.Circle (200, 150), 50, , , , 0.5 Esta instruccin dibuja una elipse centrada en el punto x=200, y=150 del formulario Form1 Esta instruccin dibuja una elipse centrada en el punto x=200, y=150 del objeto Printer

Printer.Circle (200, 150), 50, , , , 0.5

Parece en principio algo raro hablar de las coordenadas x e y del objeto Printer. Posiblemente porque el objeto Printer es un objeto que no podemos ver. Pero imaginemos que el objeto Printer es una hoja de papel. La misma hoja que aparecer escrita una vez que le enviemos el texto (o los grficos) que queremos imprimir. Esa hoja de papel tendr unas dimensiones que deberemos indicar al objeto Print. La forma de indicarle las dimensiones del papel varan dependiendo del driver de impresora usado. El driver de la impresora sabr que el papel que tiene es un DIN A4, DIN A3, etc., que tiene unas medidas prefijadas. Centrmonos en lo mas habitual, una impresora que tenga un papel DIN A4 cuyas medidas son 210 x 297 mm. El driver de impresora sabe que ese es el tamao de su papel. Ahora solamente nos falta que nuestra aplicacin lo sepa tambin. Para ello vamos a indicarle mediante un par de sentencias las medidas de ese papel : ScaleWidth y ScaleHeight Si le decimos : Printer.ScaleWidth = 2100 : Printer.ScaleHeight = 2970

le estamos diciendo a nuestro programa que el papel mide 2100 unidades de ancho y 2970 unidades de alto. (Estamos suponiendo que el papel est colocado en posicin vertical). Si tiene 2100 unidades de ancho, y el ancho real del papel es de 210 mm, nuestra unidad de medida ser de 0,1 mm. Es decir, le decimos a nuestro programa que el papel tiene 2100 dcimas de milmetro de ancho, y 2970 dcimas de milmetro de alto. La precisin con la que podemos colocar un punto sobre el papel ser por tanto 0,1 mm. Podramos hacerla mayor (0,01 mm.) si pusisemos Printer.ScaleWidth = 21000 y Printer.ScaleHeight = 29700. Pgina 203

Para el trabajo ordinario de imprimir listados o dibujar grficos tipo barras, es mas que suficiente una precisin de 0,1 mm. Si lo que queremos es un dibujo mas exacto (Dibujar fotolitos de circuitos impresos, p.e. ) esta precisin de 0,1 mm. no nos bastara, debiendo llegar a una precisin del orden de 0,01 mm. Pero todo ello est condicionado por el nmero de p.p.i. (puntos por pulgada) que nuestra impresora es capaz de dar. Nota.- Una impresora tiene unos mrgenes sobre los que no puede escribir. Por lo tanto, cuando decamos que el papel tiene 210 mm. de ancho, en realidad ya estamos cometiendo un pequeo error, ya que la impresora no puede escribir en todo el ancho, pues los 2 - 3 mm de cada lado no lo imprime. Deberemos entonces poner las propiedades ScaleWidth y ScaleHeight del Printer de acuerdo con la superficie real de escritura de nuestra impresora. Le adelanto que no le va a ser fcil enterarse de qu mrgenes deja sin imprimir. Le recomiendo que imprima una lnea desde Printer.CurrentX=0 a Printer.CurrentX= (un nmero superior a Printer.Scalewidth). Mida con un escalmetro el ancho real de la impresin. El objeto Printer almacenar toda la informacin sin pasarla a la impresora hasta que se le enve la instruccin Printer.EndDoc o se le enve un salto de pgina mediante la instruccin Printer.NewPage. El objeto Printer, al igual que otros objetos de Visual Basic tiene sus propiedades y mtodos. 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. Algunos valores de la propiedad pueden no tener efecto, o varios valores distintos de la propiedad pueden tener todos el mismo efecto. Los valores fuera del rango aceptado pueden producir error. Para obtener ms informacin, vea la documentacin del fabricante del controlador concreto. ColorMode Devuelve o establece un valor que determina si una impresora de color imprime en color o en blanco y negro. No disponible en tiempo de diseo. Sintaxis Printer.ColorMode [= valor]

Valor puede ser un nmero o una constante de VB. Si es un 1 (o la constante vbPRCMMonochrome) imprimir en blanco y negro (normalmente en escala de grises). Si es 2, o la constante vbPRCMColor imprimir en color. El valor predeterminado depende del controlador de la impresora y de la configuracin actual de la impresora. Las impresoras en blanco y negro ignoran esta propiedad. Copies Devuelve o establece un valor que determina el nmero de copias que se van a imprimir. Sintaxis Printer.Copies [= nmero]

Donde nmero debe ser una expresin numrica que especifique el nmero de copias que se van a imprimir. Este valor debe ser un entero. El valor por defecto es 1.

Pgina 204

CurrentX CurrentY Devuelven o establecen las coordenadas horizontal (CurrentX) o vertical (CurrentY) para un mtodo grfico o de impresin. No disponible en tiempo de diseo. Sintaxis Para forzar las coordenadas del cursor de escritura del objeto Printer : Printer.CurrentX [= x] Printer.CurrentY [=y]

Para conocer las coordenadas del cursor de escritura del objeto Printer Posx = Printer.CurrentX Comentarios Las coordenadas se miden a partir de la esquina superior izquierda del objeto. El valor de la propiedad CurrentX es 0 en el borde izquierdo de un objeto, y el valor de la propiedad CurrentY es 0 en el borde superior. Las coordenadas se expresan en las unidades de medida definidas por las propiedades ScaleHeight y ScaleWidth. Si se han introducido estas propiedades (como recomendbamos mas atrs), la propiedad ScaleMode se pone automticamente a User. Si no se establecen, ScaleMode puede estar en Twips, Point, Pixeles, caracteres, .... unidades que supongo le sern mucho mas difcil de controlar que si Vd. dice desde el principio que el papel de su impresora tiene unas medidas de 2100 por 2970 (Printer.ScaleWidth = 2100, Printer.ScaleHeight = 2970) Hacindolo de esta ltima forma, cuando queramos dibujar una lnea entre dos puntos de nuestro papel DIN A4 bastar con medir las coordenadas de inicio y final de lnea, eso s, usando como unidad de medida la dcima de milmetro. Por ejemplo, una lnea a 5 mm del borde superior, que comience a 20 mm. Del borde izquierdo y termine a 10 mm del borde derecho, se dibujara con la siguiente instruccin : Printer.Line (200,50) - (2870,50) Si queremos escribir datos en una columna, que est a 30 mm. de la parte izquierda de la hoja, comenzaremos a escribir cada fila de esa columna con un CurrentX de 300. Para ello primero fijaremos el punto de inicio mediante CurrentX y a continuacin usaremos el mtodo Print : Printer.CurrentX = 300 : Printer.CurrentY = (lo que corresponda a esa fila) Printer.Print MiVariable donde MiVariable contiene el dato a escribir CurrentX y CurrentY se quedan con los valores establecidos por el ltimo mtodo grfico o mtodo Print usado. Cuando se est dibujando sobre el objeto Printer, los mtodos grficos Circle y Line establecen los siguientes valores para CurrentX y CurrentY : Circle El centro del objeto. Line El punto final de una lnea. El mtodo Print establece como CurrentX la coordenada correspondiente a la parte derecha de la ltima letra impresa. Como CurrentY depende de si ha terminado la sentencia Printer.Print MiVariable con punto y coma ( ;) o sin el. En el primer caso, CurrentY es el mismo que tena antes de realizar ese mtodo. En el segundo caso, avanza automticamente una lnea. Cuando se enva la instruccin EndDoc establece los valores de estas propiedades a 0, 0. NewPage establece igualmente los valores 0, 0. Posy = Printer.CurrentY

Pgina 205

DeviceName Devuelve el nombre del dispositivo permitido por un controlador. Esta propiedad es solo de lectura Sintaxis Printer.DeviceName

Cada controlador de impresora acepta uno o ms dispositivos por ejemplo, HP LaserJet III es un nombre de dispositivo. DrawMode Devuelve o establece un valor que determina el aspecto de la salida de un mtodo grfico. Vea la Ayuda de VB para mayor detalle. DrawStile Devuelve o establece un valor que determina el estilo de lnea de la salida de mtodos grficos. Sintaxis Printer.DrawStyle [= nmero]

El nmero especifica el estilo de lnea : 0 1 2 3 4 5 6 Observaciones Si DrawWidth se define con un valor mayor que 1, los valores de DrawStyle entre 1 y 4 producen una lnea continua (el valor de la propiedad DrawStyle no cambia). Si DrawWidth se define como 1, DrawStyle produce el efecto para cada valor descrito en la tabla anterior. DrawWidth Devuelve o establece la anchura de lnea de lo dibujado con los mtodos grficos. Sintaxis Printer.DrawWidth [= tamao] (Predeterminado) Continuo. Rayas. Puntos. Raya - punto. Raya - punto - punto. Transparente. Continuo interior.

tamao es una expresin numrica comprendida entre 1 y 32.767 que representa la anchura de la lnea en pixeles. El valor predeterminado es 1, es decir, un pxel de ancho. Comentarios Puede incrementar el valor de esta propiedad para aumentar la anchura de la lnea. Si el valor de la propiedad DrawWidth es mayor que 1, los valores de 1 a 4 en la propiedad DrawStyle producirn una lnea continua (el valor de DrawStyle no se modifica). Si se establece 1 en DrawWidth, DrawStyle producir los resultados mostrados en la tabla de esta propiedad.

Pgina 206

DriverName Devuelve el nombre del controlador de un objeto Printer. Esta propiedad es solo de lectura Sintaxis Printer.DriverName

Cada controlador tiene un nombre nico. Por ejemplo, el DriverName de varias impresoras Hewlett-Packard es HPPCL5MS. El DriverName es normalmente el nombre de archivo del controlador sin la extensin. Duplex Devuelve o establece un valor que determina si las pginas se imprimen por los dos lados (si la impresora tiene esta caracterstica). No disponible en tiempo de diseo. Sintaxis Printer.Duplex [= valor]

Donde valor es un valor o constante que especifica el tipo de impresin, tal como se describe a continuacin Constante bPRDPSimplex vbPRDPHorizontal vbPRDPVertical Valor 1 2 3 Descripcin Impresin en una sola cara con la orientacin actual. Impresin en dos caras con vuelta de pgina horizontal. Impresin en dos caras con vuelta de pgina vertical.

Con impresin a doble cara horizontal, la parte superior de ambas caras de la hoja estn en el mismo borde de la hoja. Con impresin a doble cara vertical, la parte inferior de una pgina est en el mismo borde de la hoja que la parte superior de la pgina siguiente. Vase el grfico existente en la ayuda de VB para la propiedad Duplex FillColor Devuelve o establece el color usado para rellenar formas; FillColor tambin se usa para rellenar crculos y cuadros creados con los mtodos grficos Circle y Line. Sintaxis Printer.FillColor [ = valor]

Donde valor es un valor o constante que determina el color de relleno. El valor puede introducirse como RGB o con las constantes QB color ejemplos FillColor = QBColor(8) FillColor = RGB (255,0,0) El color predeterminado es el 0 (Negro).

FillStyle Devuelve o establece el modelo usado para rellenar dibujos (crculos y los cuadros creados con los mtodos grficos Circle y Line. Sintaxis printer.FillStyle [= nmero]

Donde nmero Un entero que especifica el estilo de relleno, tal como se describe a

Pgina 207

continuacin Valor 0 1 2 3 4 5 6 7 Descripcin Continuo. (Predeterminado) Transparente. Lnea horizontal. Lnea vertical. Diagonal hacia arriba. Diagonal hacia abajo. Cruzado. Diagonal Cruzada.

Cuando la propiedad FillStyle se define con su valor predeterminado, 1 (Transparente), el valor de FillColor se ignora. Font Devuelve o establece el objeto Font (letra) del objeto Printer. Este objeto Font tiene a su vez sus propiedades (Name, Size, Bold, Italic ... ) Podemos forzar la fuente a usar por el objeto Printer con un CommonDialog, igualando la propiedad Name del objeto Font del Printer a la propiedad FontName del CommonDialog Printer.Font.Name = CD1.FontName Podemos averiguar que fuente est usando el objeto Printer : Tipofuente = Printer.Font.Name

FontCount Devuelve el nmero de fuentes disponibles para el dispositivo de presentacin actual o la impresora activa. (Devuelve un nmero) Es solamente de lectura. Sintaxis FontName Devuelve el nombre de la fuente que est usando el objeto Printer Sintaxis nombredelafuente = Printer.Fontname numerodefuentes = 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 presentacin actual o la impresora activa. Sintaxis Printer.Fonts(ndice)

La propiedad Fonts funciona de forma conjunta con la propiedad FontCount, que devuelve el nmero de nombres de fuente disponibles para el objeto. Las fuentes disponibles en Visual Basic varan de acuerdo con la configuracin del sistema, y los dispositivos de presentacin y

Pgina 208

de impresin. Use las propiedades Fonts y FontCount para obtener informacin sobre las fuentes disponibles para pantalla o impresora. Por ejemplo, si queremos ver en Label1 todas las fuentes disponibles para el objeto Printer, estableceremos el siguiente cdigo : For i = 1 To Printer.FontCount Label1.Caption = Label1.Caption + " " + Printer.Fonts(i) Next i FontSize Devuelve o establece el tamao de la fuente a utilizar para el texto mostrado en un control o en una operacin de dibujo o impresin en tiempo de ejecucin. Sintaxis Printer.FontSize [= puntos]

Donde puntos es una expresin numrica que especifica el tamao de fuente a utilizar, en puntos. Puede utilizar esta propiedad para dar al texto el tamao que desee. El valor predeterminado lo determina el sistema. Para cambiar este valor, especifique el nuevo tamao de la fuente en puntos. El valor mximo de FontSize es 2160 puntos. Nota Las fuentes disponibles en Visual Basic varan dependiendo de la configuracin del sistema y de los dispositivos de presentacin e impresin. En las propiedades relacionadas con las fuentes slo pueden establecerse valores para los que exista una fuente. (El objeto Printer acepta tanto Font.Size como FontSize) FontBold, FontItalic, FontStrikethru y FontUnderline Devuelve o establece los estilos de fuente en los siguientes formatos: Negrita, Cursiva, Tachada y Subrayada. Printer.FontBold [= lgico] Printer.FontItalic [= lgico] Printer.FontStrikethru [= lgico] Printer.FontUnderline [= lgico] p.e Printer.FontBold = True escribira con letra negrita

Para el objeto Printer, el establecimiento de estas propiedades no afecta al texto ya escrito, solamente para lo que se escriba despus de cambiar la propiedad. Aprovecha esta facilidad para cambiar de letra a lo largo de un documento. En general, deber modificar la propiedad FontName antes de establecer los atributos de tamao y estilo con las propiedades FontSize, FontBold, FontItalic, FontStrikethru y FontUnderline. Sin embargo, cuando especifique un tamao inferior a 8 puntos para una fuente TrueType, primero deber establecer el tamao en puntos con la propiedad FontSize, luego especificar la propiedad FontName y despus establecer de nuevo el tamao con FontSize. El entorno operativo Microsoft Windows utiliza una fuente distinta para las fuentes TrueType con un tamao inferior a 8 puntos. Printer acepta FontBold Font.Bold, FontItalic Font.Italic ....

Pgina 209

FontTransparent Devuelve o establece un valor que determina si el texto y los grficos de fondo de un objeto Printer, se muestran en el espacio situado entre los caracteres. Sintaxis Printer.FontTransparent [= lgico]

La modificacin de FontTransparent en tiempo de ejecucin no afecta a los grficos ni el texto ya dibujados en un objeto Printer . ForeColor Devuelve o establece el color de escritura para impresoras en color. El cambio de color afecta solamente al texto que se enve despus de realizar el cambio.

hDC Devuelve un controlador proporcionado por el entorno operativo Microsoft Windows para el contexto de dispositivo de un objeto. Sintaxis Printer.hDC

Esta propiedad es un controlador de contexto de dispositivo del entorno operativo Windows. El entorno operativo Windows se encarga de la presentacin del sistema asignando un contexto de dispositivo al objeto Printer. 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. Nota El valor de la propiedad hDC puede cambiar en tiempo de ejecucin, as que no se debe almacenar en una variable. En su lugar, use la propiedad hDC cada vez que lo necesite. Height Width Devuelven o establecen las dimensiones del objeto Printer. No estn disponibles en tiempo de diseo. Sintaxis Printer.Height [= nmero] Printer.Width [= nmero]

Donde nmero indica las dimensiones del papel configurado para el dispositivo de impresin. No disponibles en tiempo de diseo. Si se establecen en tiempo de ejecucin, los valores de estas propiedades se utilizarn en lugar del de la propiedad PaperSize. Para el objeto Printer, estas propiedades se miden siempre en twips. Si establece las propiedades Height y Width para un controlador de impresora que no admite su uso, no se producir ningn error, y el tamao del papel continuar siendo el mismo. Es mas recomendable utilizar la propiedad PaperSize para establecer las dimensiones del papel. !!!

Orientation Devuelve o establece un valor que indica si los documentos se imprimen con orientacin vertical u horizontal. No disponible en tiempo de diseo.

Pgina 210

Sintaxis

Printer.Orientation [= valor]

valor es un valor o constante que determina la orientacin de la pgina, segn se describe a continuacin : Constante vbPRORPortrait Valor 1 Descripcin Los documentos se imprimen con el lado ms corto arriba. Los documentos se imprimen con el lado ms largo arriba.

vbPRORLandscape

Page Devuelve el nmero de pgina actual. Sintaxis Variable = Printer.Page Variable contiene el nmero de la pg. actual

Visual Basic mantiene un contador de pginas impresas desde el inicio de la aplicacin o desde la ltima vez que se utiliz la instruccin EndDoc en el objeto Printer. Este contador comienza por uno y se incrementa en uno cada vez que: Se utiliza el mtodo NewPage. Se utiliza el mtodo Print y el texto a imprimir no cabe en la pgina actual. Nota La salida de los mtodos grficos que no quepa en la pgina actual no genera una pgina nueva, sino que se recorta para ajustarla a la zona de impresin de la pgina. PaperBin Devuelve o establece un valor que indica la bandeja predeterminada para la alimentacin de papel durante la impresin. No disponible en tiempo de diseo. Sintaxis Printer.PaperBin [= valor]

valor es un valor o constante que especifica la bandeja predeterminada, segn se describe a continuacin : Constante Valor Descripcin vbPRBNUpper vbPRBNLower vbPRBNMiddle vbPRBNManual vbPRBNEnvelope vbPRBNEnvManual vbPRBNAuto 1 2 3 4 5 6 7 Utilizar papel de la bandeja superior. Utilizar papel de la bandeja inferior. Utilizar papel de la bandeja intermedia. Esperar a la insercin manual de cada hoja. Utilizar sobres del alimentador de sobres. Utilizar sobres del alimentador de sobres, pero esperar a la insercin manual. (Predeterminado) Utilizar papel de la bandeja predeterminada actual. Utilizar papel del alimentador por traccin. Utilizar papel del alimentador de papel pequeo. Utilizar papel de la bandeja de papel grande. Utilizar papel del alimentador de gran capacidad. Utilizar papel del cartucho de cassette adjunto.

vbPRBNTractor 8 vbPRBNSmallFmt 9 vbPRBNLargeFmt 10 vbPRBNLargeCapacity 11 vbPRBNCassette 14

No todas las opciones estn disponibles en todas las impresoras. Consulte la documentacin de la impresora para obtener descripciones ms especficas de estas opciones.

Pgina 211

PaperSize Devuelve o establece un valor que indica el tamao de papel para la impresora actual. No disponible en tiempo de diseo. El valor predeterminado es el establecido en la configuracin de la impresora en Windows. Con esta propiedad no se debe jugar alegremente. El valor que se le d a esta propiedad ser el tamao de ese papel ficticio que comentbamos mas atrs. Sintaxis Printer.PaperSize [= valor]

valor es un valor o constante que especifica el tamao del papel, segn se describe a continuacin Constante Valor Descripcin vbPRPSLetter vbPRPSLetterSmall vbPRPSTabloid vbPRPSLedger vbPRPSLegal vbPRPSStatement vbPRPSExecutive vbPRPSA3 vbPRPSA4 vbPRPSA4Small vbPRPSA5 vbPRPSB4 bPRPSB5 vbPRPSFolio vbPRPSQuarto vbPRPS10x14 vbPRPS11x17 vbPRPSNote vbPRPSEnv9 vbPRPSEnv10 vbPRPSEnv11 vbPRPSEnv12 vbPRPSEnv14 vbPRPSCSheet vbPRPSDSheet vbPRPSESheet vbPRPSEnvDL vbPRPSEnvC3 vbPRPSEnvC4 vbPRPSEnvC5 vbPRPSEnvC6 vbPRPSEnvC65 vbPRPSEnvB4 vbPRPSEnvB5 vbPRPSEnvB6 vbPRPSEnvItaly vbPRPSEnvMonarch vbPRPSEnvPersonal vbPRPSFanfoldUS vbPRPSFanfoldStdGerman vbPRPSFanfoldLglGerman vbPRPSUser 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 29 30 28 31 32 33 34 35 36 37 38 39 40 41 256 Carta, 8 x 11 . Carta pequea, 8 x 11 . 3 Tabloide, 11 x 17 . Libro, 17 x 11 . Legal, 8 x 14 . Declaracin, 5 x 8 . Ejecutivo, 7 x 10 . A3, 297 x 420 mm A4, 210 x 297 mm A4 pequeo, 210 x 297 mm A5, 148 x 210 mm B4, 250 x 354 mm B5, 182 x 257 mm Folio, 8 x 13 . Cuarto, 215 x 275 mm 10 x 14 . 11 x 17 . Nota, 8 x 11 . Sobre #9, 3 7/8 x 8 7/8 . Sobre #10, 4 1/8 x 9 . Sobre #11, 4 x 10 3/8 . Sobre #12, 4 x 11 . Sobre #14, 5 x 11 . Hoja tamao C Hoja tamao D 26 Hoja tamao E Sobre DL, 110 x 220 mm Sobre C3, 324 x 458 mm Sobre C4, 229 x 324 mm Sobre C5, 162 x 229 mm Sobre C6, 114 x 162 mm Sobre C65, 114 x 229 mm Sobre B4, 250 x 353 mm Sobre B5, 176 x 250 mm Sobre B6, 176 x 125 mm Sobre, 110 x 230 mm Sobre monarca, 3 7/8 x 7 . Sobre, 3 5/8 x 6 . Doblado estndar EE.UU., 14 7/8 x 11 . Doblado estndar alemn, 8 x 12 . Doblado legal alemn, 8 x 13 . Definido por el usuario

Pgina 212

Al establecer las propiedades Height o Width automticamente vbPRPSUser en PaperSize. Port

de una impresora, se establece

Devuelve el nombre del puerto a travs del cual se enva un documento a una impresora. Sintaxis puertousado = Printer.Port

El sistema operativo determina el nombre del puerto, como por ejemplo LPT1: o LPT2:. PrintQuality Devuelve o establece un valor que indica la resolucin de la impresora. No disponible en tiempo de diseo. Sintaxis Printer.PrintQuality [= valor]

valor es un valor o una constante que especifica la resolucin de la impresora, segn se describe a continuacin : Constante vbPRPQDraft vbPRPQLow vbPRPQMedium vbPRPQHigh Valor -1 -2 -3 -4 Descripcin Resolucin borrador Resolucin baja Resolucin media Resolucin alta

Adems de los valores negativos predefinidos, tambin puede indicarse en valor un nmero positivo de puntos por pulgada, como por ejemplo 300. El valor predeterminado depende del controlador de la impresora y de su configuracin actual. El efecto de estos valores vara segn la impresora y el controlador. En ciertas impresoras, algunas opciones, o todas ellas, pueden producir el mismo resultado. ScaleHeight, ScaleWidth Estas propiedades ya se comentaron mas atrs. Es completamente necesario entender estas propiedades para poder manejar y dominar el objeto Printer. ! Devuelven o establecen el nmero de unidades de medida horizontal (ScaleWidth) y vertical (ScaleHeight) del interior del papel donde vamos a volcar la informacin del objeto Printer. Sintaxis Printer.ScaleHeight [= valor] Printer.ScaleWidth [= valor]

Donde valor es una expresin numrica que especifica la medida horizontal o vertical. Este valor va a determinar el nmero de unidades de medida que tiene el papel, NO su medida. Es decir, podemos decir, mediante estas propiedades, que el papel tiene 2100 unidades de ancho y 2970 unidades de alto. Si el papel es un DIN A4 (Medidas 210 x 297 mm) esa unidad de medida sera precisamente una dcima de milmetro. Podramos haber elegido otros valores, con lo que esa unidad de medida ya no seran dcimas de mm. Sera una unidad de medida cualquiera, pero el papel seguira siendo DIN A4 y seguira teniendo las mismas medidas reales.

Pgina 213

ScaleLeft, ScaleTop Devuelven o establecen las coordenadas horizontal (ScaleLeft) y vertical (ScaleTop) de los bordes izquierdo y superior de un objeto al utilizar mtodos grficos o al situar controles. Sintaxis Printer.ScaleLeft [= valor] Printer.ScaleTop [= valor]

donde valor es una expresin numrica que especifica la coordenada horizontal o vertical. El valor predeterminado es 0. Con estas propiedades y las relacionadas ScaleHeight y ScaleWidth, puede configurar un sistema de coordenadas completo, con coordenadas positivas y negativas. 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, en ScaleMode se establece automticamente 0. Al establecer en ScaleMode un nmero mayor que 0, ScaleHeight y ScaleWidth cambian a la nueva unidad de medida, y en ScaleLeft y ScaleTop se establece 0. Adems, los valores de CurrentX y CurrentY cambian para reflejar las nuevas coordenadas del punto actual. Resumindolo en palabras mas sencillas. Si, con las medidas de los ejemplos anteriores (ScaleWidth = 2100, ScaleHeight = 2970) ponemos Printer.ScaleLeft = - 1050 estamos diciendo que la coordenada horizontal absoluta en la parte izquierda de la hoja es de -1050. Si el ancho del papel es de 2100, la coordenada X absoluta del eje central del papel ser entonces 0. Y la coordenada X de la parte derecha del papel ser + 1050. Por lo tanto, si ejecutamos el mtodo grfico : Printer.Circle (0,1000), 300 dibujar un circulo de radio 300, 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. Si hubisemos puesto Printer.ScaleTop = - 1500 estaramos diciendo que la coordenada Y absoluta de la parte superior del papel es - 1500. En ese caso, el crculo anterior se colocara a una distancia de 2500 (2500 = 1000 + 1500) del borde superior del papel. ScaleMode Devuelve o establece un valor que indica la unidad de medida de las coordenadas de un objeto al utilizar mtodos grficos, o al situar controles. Sintaxis Printer.ScaleMode [= valor]

donde valor es un nmero entero que especifica la unidad de medida, segn se describe a continuacin

0 1 2 3 4 5

User. Indica que una o ms de las propiedades ScaleHeight, ScaleWidth, ScaleLeft y ScaleTop tienen valores personalizados. (Predeterminado) Twip (1440 twips por pulgada lgica; 567 twips por centmetro lgico). Punto (72 puntos por pulgada lgica). Pxel (la unidad mnima de la resolucin del monitor o la impresora). Carcter (horizontal = 120 twips por unidad; vertical = 240 twips por unidad). Pulgada.

Pgina 214

6 7

Milmetro. Centmetro.

Recomendacin del autor de esta Gua del Estudiante . Una vez mas recomiendo que controle la posicin de los mtodos grficos y mtodo Print fijando las unidades de medida mediante ScaleHeight, ScaleWidth, (Si le es prctico, emplee ScaleLeft y ScaleTop para que le coincida el punto central del papel con las coordenadas 0,0 y as usara coordenadas positivas y negativas) y cada vez que escriba o dibuje, coloque el cursor de escritura mediante las propiedades CurrentX y CurrentY

TrackDefault Devuelve o establece un valor que determina si el objeto Printer apunta siempre a la misma impresora, o si la impresora a la que apunta cambia cuando se modifica la impresora predeterminada en el Panel de control del sistema operativo. No disponible en tiempo de diseo. Sintaxis Printer.TrackDefault [= lgico]

Donde lgico es una expresin booleana que determina la impresora a la que apunta el objeto Printer, segn se describe a continuacin. 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. False El objeto Printer contina apuntando a la misma impresora cuando se modifica la impresora predeterminada en el Panel de control del sistema operativo. Al modificar el valor de la propiedad TrackDefault mientras se realiza un trabajo de impresin, se enva una instruccin EndPage implcita al objeto Printer. TwipsPerPixelX, TwipsPerPixelY Devuelve el nmero de twips per pixel de un objeto medido horizontal ( TwipsPerPixelX) o verticalmente (TwipsPerPixelY). Sintaxis Printer.TwipsPerPixelX Printer.TwipsPerPixelY

En general, las rutinas del API de Windows requieren las medidas en pxels. Puede utilizar estas propiedades para convertir rpidamente las dimensiones sin cambiar el valor de la propiedad ScaleMode de los objetos. Zoom Devuelve o establece el porcentaje en que se ampla o reduce el resultado impreso. No est disponible en tiempo de diseo. Sintaxis Printer.Zoom [= numero]

Donde numero es una expresin numrica que evala en el porcentaje de ajuste de la salida impresa. El valor predeterminado es 0, que especifica que la pgina impresa aparece con su tamao normal. Comentarios

Pgina 215

El valor de la propiedad Zoom ajusta el tamao de la pgina impresa, en un factor de Zoom/100, en relacin con el tamao aparente de la salida impresa. Por ejemplo, una pgina de tamao carta impresa con Zoom establecido como 50 contiene tantos datos como una pgina de tamao 17 por 22 pulgadas, porque el texto y los grficos impresos se reducen a la mitad de su altura y anchura originales.

El objeto Printers (Coleccin de objetos Printer) La coleccin Printers le permite consultar las impresoras disponibles de forma que pueda especificar la impresora predeterminada de la aplicacin. Por ejemplo, se puede querer saber cual de las impresoras disponibles usa un controlador de impresoras determinado. El siguiente cdigo comprueba todas las impresoras disponibles para saber la primera impresora cuya orientacin de pgina sea vertical: Dim X As Printer For Each X In Printers If X.Orientation = vbPRORPortrait Then ' la define como predeterminada. Set Printer = X ' Sale del bucle. Exit For End If Next Usando la instruccin Set se designa una de las impresoras de la coleccin Printers como impresora predeterminada. El ejemplo anterior designa la impresora identificada por la variable de objeto X, como impresora predeterminada de la aplicacin. Nota Si la coleccin Printers se usa para especificar una impresora concreta, como Printers(3), slo se puede tener acceso a sus propiedades de modo lectura. Para leer y escribir las propiedades de una impresora concreta, primero se tiene que definir como impresora predeterminada de la aplicacin. METODOS DEL OBJETO PRINTER Circle Dibuja un crculo, elipse o arco sobre un objeto. No acepta argumentos con nombre. Sintaxis Printer.Circle Step (x, y), radio, color, inicio, final, aspecto

Vea una explicacin completa de este mtodo en el captulo 7 Mtodos Grficos. EndDoc Termina una operacin de impresin enviada al objeto Printer, liberando el documento al dispositivo de impresin o a la cola. Sintaxis Printer.EndDoc

Si EndDoc se invoca inmediatamente despus del mtodo NewPage, no se imprime la pgina en blanco adicional.

KillDoc

Pgina 216

Termina inmediatamente el trabajo de impresin actual. Sintaxis Printer.KillDoc

Si el Administrador de impresin del sistema operativo controla el trabajo de impresin (el Administrador de impresin est ejecutndose y la impresin en segundo plano est activada), KillDoc elimina el trabajo de impresin actual y la impresora deja de recibir datos. Si el Administrador de impresin no est controlando el trabajo de impresin (la impresin en segundo plano est desactivada), puede que algunos o todos los datos se enven a la impresora antes de que KillDoc pueda tener efecto. En este caso, el controlador de la impresora inicializa la impresora en cuanto puede y termina el trabajo de impresin. Line Dibuja lneas y rectngulos en un objeto. No acepta argumentos con nombre. Sintaxis Printer.Line Step (x1, y1) - Step (x2, y2), color, BF

Vea este mtodo mas ampliamente en el captulo 7 Mtodos Grficos.

NewPage Termina la pgina actual y avanza a la pgina siguiente en el objeto Printer. Sintaxis Printer.NewPage

NewPage avanza a la pgina siguiente y restablece la posicin de impresin en la esquina superior izquierda de la nueva pgina. Cuando se le llama, NewPage incrementa la propiedad Page del objeto Printer en 1.

PaintPicture Presenta el contenido de un archivo grfico (.BMP, .WMF, .EMF, .ICO o .DIB) en un objeto Printer. No acepta argumentos con nombre. Sintaxis Printer.PaintPicture imagen, x1, y1, anchura1, altura1, x2, y2, anchura2, altura2, opecod Puede ver mas informacin acerca de este mtodo en el captulo 7 Mtodos Grficos

Print Imprime texto en el objeto Printer. Sintaxis Printer.Print lista_salida

Donde lista_salida es una expresin o lista de expresiones a imprimir. Si se omite, se imprimir una lnea en blanco. En el argumento lista_salida puede poner un texto directamente (Printer.Print Hola) o una

Pgina 217

variable (Printer.Print Textoaescribir). Puede tambin introducir algunas funciones de cadena como la siguiente: Spc(n) Se utiliza para insertar caracteres espacio en la salida, donde n es el nmero de espacios a insertar. Puede introducir tambin Tabuladores : Tab(n) Se utiliza para situar el punto de insercin en un nmero de columna absoluto, donde n es el nmero de columna. Utilice Tab sin argumentos para situar el punto de insercin en la lnea siguiente, al principio de la zona de impresin. Nota.- El uso de los tabuladores puede traerle mas problemas que ventajas. Los pasos de tabulacin dependen de cada impresora, y lo que es peor, de la programacin de la propia impresora. Por lo tanto, al usar Tab no controlamos del todo la posicin de las columnas. Es mucho mas prctico (y seguro) usar Printer.CurrentX y Printer.CurrentY para posicionar el puntero de escritura del Objeto Printer. Al terminar de imprimir Cualquier carcter o tabulador, el objeto Printer generar un Retorno de Carro y un Avance de Lnea, excepto que terminemos el mtodo Print con un punto y coma : Las instrucciones : Printer.Print Hola Printer.Print Qu tal ? Hola Qu tal ? Si pusisemos Printer.Print Hola ; Printer.Print Qu tal ? Hola Qu tal ? Nota Debido a que el mtodo Print imprime normalmente con caracteres de espaciado proporcional, es importante recordar que no hay relacin entre el nmero de caracteres impresos y el nmero de columnas de anchura fija que tales caracteres ocupan. Por ejemplo, una letra ancha, como W, ocupa ms de una columna de anchura fija, mientras que una letra estrecha, como I, ocupa menos. Para tener en cuenta los casos en el que se utilizan caracteres con una anchura mayor que la media, deber asegurarse de que las columnas de las tablas se encuentren lo bastante lejos unas de otras. Como alternativa, puede utilizar en la impresin una fuente de anchura fija (como Courier) para hacer que cada carcter utilice slo una columna. Para controlar perfectamente el punto donde se escribir el siguiente carcter, utilice las propiedades CurrentX y CurrentY. Es mucho mas prctico que usar, por ejemplo, el Tabulador Tab(n) Si usa Tab(n) con una determinada impresora, puede verse con la desagradable sorpresa que en otra impresora no funciona de la misma forma. Como al desarrollar una aplicacin nunca sabe sobre que impresora va a imprimir, es mejor que no utilice Tab(n), sustituyndolo por CurrentX. Mtodo TextWidth

generarn la siguiente salida por impresora :

la salida por impresora sera :

Pgina 218

Puede conocer la anchura que va a ocupar un texto en la impresora. (o en un Formulario, en un Picture) usando el Mtodo TextWidth AnchodelTexto = Printer.TextWidth (Textoaescribir) Donde AnchodelTexto es una variable tipo Long que indicar el ancho (en las unidades de medida definidas para el objeto Printer - Twips, Pixels, mm, o como siempre recomendar, las establecidas mediante ScaleWidth y ScaleHeight) y Textoaescribir es una variable tipo String que contiene el texto a escribir. Si la cadena de texto cuya longitud de impresin queremos analizar contiene retornos de carro, TextWidth devuelve la anchura de la lnea ms larga. Mediante este mtodo puede escribir columnas de datos, mucho mejor que usando el Tab(n). Suponga que quiere escribir en una columna, los datos Dato(1), Dato(2), ....Dato(N) que son nmeros. Quiere escribirlos de tal forma que la parte derecha del nmero quede alineada, como hacemos casi siempre para poder sumarlos con facilidad. Supongamos que hemos establecido las Propiedades Printer.ScaleWidth = 21000 y Printer.ScaleHeight = 29700. Damos por hecho que el papel es un DIN A-4 (210 x 297 mm) por lo que estamos usando, como unidad de medida en ambas coordenadas la centsima de mm. 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. del margen izquierdo del papel), deberemos calcular la longitud de cada cifra, y poner, como inicio de escritura de esa cifra 5000 - ancho : Haramos un bucle mas o menos como este : Dim Ancho as Long For I = 1 To N Ancho = Printer.TextWidth (Str(Dato(I))) Printer.CurrentX = 5000 - Ancho Printer.CurrentY = K +(300 * I) Printer.Print Str(Dato(I)) Next I Ancho ser una variable Long Imprimiremos N datos Calculamos el ancho (para el Printer) de cada dato. Lo restamos a 5000 para que queden alineados por atrs. La coordenada Y ser una constante K mas 3 mm

Observe que el ancho de una determinada cadena de caracteres no tiene porqu ser la misma para un Formulario que para el Printer. Depender del tipo de fuente y del tamao de esa fuente que usemos en cada caso. Por eso, debe poner siempre Printer.TextWidth, Form1.TextWidth, etc. Mtodo TextHeight Este mtodo es idntico al anterior, pero relativo a la altura. No vamos a alargar la explicacin dada la similitud con el anterior. Este mtodo nos permite separar adecuadamente las lneas de un escrito. Es muy til sobre todo cuando utilizamos distintos tipos de letra dentro del mismo escrito. Mtodo PSet Asigna a un punto de un objeto Printer un color especificado. No acepta argumentos con nombre. Sintaxis Step Printer.PSet Step (x, y), color Opcional. Palabra reservada que especifica que las coordenadas son relativas

Pgina 219

a la posicin grfica actual proporcionada por las propiedades CurrentX y CurrentY. (x, y) Requeridos. Valores de simple precisin que indican las coordenadas horizontales (eje x) y verticales (eje y) del punto a establecer. color Opcional. Valor entero largo que indica el color RGB especificado para el punto. Si se omite, se utiliza el valor de la propiedad ForeColor. Puede utilizar la funcin RGB o la funcin QBColor para especificar el color. El tamao del punto dibujado depende del valor de la propiedad DrawWidth. Cuando DrawWidth es 1, PSet establece un pxel al color especificado. Cuando DrawWidth es mayor que 1, se centra el punto en las coordenadas especificadas. La forma en que se dibuja el punto depende de los valores de las propiedades DrawMode y DrawStyle. Cuando se ejecuta PSet, las propiedades CurrentX y CurrentY toman el valor del punto especificado en los argumentos. Vace un pxel con el mtodo PSet especificando las coordenadas del pxel y utilizando el valor de la propiedad BackColor como argumento color. FIN del decimoprimer captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 220

Visual Basic - Gua del Estudiante Cap. 12


FUNCION DoEvents
Cede el control de la ejecucin al sistema operativo, para que ste pueda procesar otros eventos. Tambin nos permite conocer el nmero de formularios abiertos en una aplicacin.

Sintaxis

DoEvents Cede el control al sistema operativo variable=DoEvents variable contendr un nmero indicando el nmero de formularios abiertos en este momento.

Sintaxis

La funcin DoEvents devuelve tambin el nmero de formularios abiertos por una versin nica de Visual Basic, como la versin estndar de Visual Basic. DoEvents devuelve 0 en el resto de las aplicaciones. El control no se devuelve hasta que el sistema operativo haya terminado de procesar los eventos en cola y que (slo para Microsoft Windows) se hayan enviado todas las teclas en la cola SendKeys. Si partes de su cdigo consumen demasiado tiempo de procesamiento, use peridicamente DoEvents para ceder el control al sistema operativo, de manera que eventos como la entrada por el teclado o los clics del mouse (ratn) se puedan procesar sin grandes retrasos. Utilice esta funcin sobre todo, cuando tenga bucles demasiado largos que puedan interrumpir la entrada de datos por teclado o ratn. Precaucin Asegrese de que el procedimiento que ha cedido el control con DoEvents no se ejecute de nuevo desde una parte diferente del cdigo antes de que regrese la primera llamada a DoEvents. Esto podra causar resultados impredecibles. Adems, no use DoEvents si existe la posibilidad de que otras aplicaciones interacten con el procedimiento, de formas imprevistas, durante el tiempo en ste ha cedido el control.

EJEMPLO Para explicar la funcin DoEvents se ha preparado un pequeo ejercicio con un formulario principal (Form1) y dos formularios auxiliares, estos ltimos solamente a efectos de contar, mediante DoEvents el nmero de formularios abiertos.

Pgina 221

Se declara la variable PARAR como booleana en las declaraciones del Form1 El botn COMENZAR introduce un bucle que no parara nunca. Tambin pone Label1 de color Verde. Private Sub Command1_Click() Label1.BackColor = RGB(0, 255, 0) Do While PARAR = False N=N+1 If N = 1000 Then 'Cada vez que N=1000 ejecuta la funcin DoEvents. DoEvents N=0 End If Loop End Sub En el formulario Form1, al que previamente le hemos puesto la propiedad KeyPreview a True, se le ha puesto este cdigo en su procedimiento KeyPress: Private Sub Form_KeyPress(KeyAscii As Integer) PARAR = True Label1.BackColor = RGB(255, 255, 0) End Sub Si no hubisemos puesto DoEvents en una parte del bucle del contador, nunca se podra acceder al Procedimiento KeyPress del formulario, pues el programa lo nico que hara ser dar vueltas en el bucle indefinidamente. El botn ROJO tiene este cdigo: Private Sub Command2_Click() PARAR = True Label1.Caption = DoEvents Label1.BackColor = RGB(255, 0, 0) End Sub

'Aqu comprobamos los Formularios que tenemos 'abiertos en este momento.

Pgina 222

Lo mismo ocurrira con el botn ROJO. Al estar el programa haciendo el bucle continuamente, nunca podramos entrar el Procedimiento Click de este botn. Los botones FORM2, cierra Form2, FORM3, cierra Form3, lo nico que hacen es mostrar u ocultar Form2 y Form3 a efectos de poder comprobar cuantos formularios tenemos abiertos. Private Sub Command4_Click() Form2.Show End Sub Private Sub Command6_Click() Form2.Hide End Sub Private Sub Command5_Click() Form3.Show End Sub Private Sub Command7_Click() Form3.Hide End Sub Por ltimo SALI nos saca del programa. Observe que si no hubisemos puesto DoEvents en el medio del bucle, tampoco podramos salir del programa, puesto que el sistema operativo no podra comprobar que hemos hecho Click en este botn. Private Sub Command3_Click() End End Sub Realice esta pequea prctica con la lnea DoEvents del botn COMENZAR activada y desactivada (Con una comilla simple). Preprese para, en este ltimo caso, detener la aplicacin pulsando Ctr-Pausa, pues de otra forma no la podr detener.

Pgina 223

(El siguiente tema ha sido tomado parcialmente de las pginas de Mundo Visual - Visual Basic.)

Presentacin Modal de formularios. Ventana modal


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, y exige que se realice alguna gestin sobre ella antes de permitir que otra parte de la aplicacin tome de nuevo el foco. La actuacin que generalmente exige un formulario o ventana es ocultarse. Para ver esto, cree una aplicacin con dos formularios. El primero (Form1) puede ser el formulario donde se realizan todas las operaciones de la aplicacin. El segundo (Form2) puede ser el tpico formulario donde se presenta la informacin del fabricante de la aplicacin, al que se accede normalmente desde el men, con la palabra Acerca de... Cree un men en el primer formulario con esa palabra y ponga este formulario como formulario inicial de la aplicacin. En el procedimiento click de este men ponga el siguiente cdigo : Form2.Show 1 El 1 detrs de la expresin Show indica que el formulario Form2 debe mostrarse de forma Modal, lo que significa que no se podr volver a operar con ningn elemento de Form1 hasta que se oculte o descargue el formulario Form2. Ponga en este Form2 el tpico botn de Aceptar, cuyo cdigo puede ser simplemente : Me.Hide Ejecute la aplicacin y comprobar como se comporta un formulario mostrado como Modal. Lo dicho para un formulario puede aplicarse para otro tipo de ventanas. El MessageBox y la ventana del CommonDialog son dos ejemplos de ventanas modales. Veamos la primera :

La caja de Mensajes. MessageBox o MsgBox


Las cajas de mensajes o MessageBox, tienen una funcin clara, que es la de mostrar una determinada informacin, aviso, o pregunta para que el usuario tenga conocimiento de ella y acte. Hay 2 formas diferentes de mostrar informacin: 1 - El aviso es s, que tiene por objetivo mostrar una informacin de inters. 2 - El aviso con espera de respuesta, que muestra una informacin esperando que el usuario seleccione una de las respuestas posibles para que el programa la trate. Una caja de mensaje, puede ser por ejemplo, la instruccin MsgBox "Hola". Por defecto, la caja de mensaje ser similar a esta:

Debe darse cuenta de algunas cosas: En primer lugar el mensaje, "Hola" que se escribe a continuacin de la palabra MsgBox, tambin debe darse cuenta del botn Aceptar que tiene el Focus de la ventana activa y que slo hay ese botn, y por ltimo el ttulo de la ventana.

Pgina 224

Podemos modificar estos parmetros para alcanzar nuestros objetivos, por eso, vamos a escribir ahora este cdigo: MsgBox "Hola", ,"Ejemplo" . El resultado es:

Como podemos apreciar en el cdigo, la caja de mensaje posee un ttulo Ejemplo y el mensaje, pero es posible que deseemos escribir un mensaje en varias lneas con salto de prrafo. Nada tan fcil como este cdigo por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", , "Ejemplo". El resultado es:

Habr observado en la expresin anterior que se ha utilizado vbCrLf (Visual Basic Carriage Return Line Feed, VB retorno de carro y avance de lnea) Vea mas adelante la aclaracin de esta expresin. Con ella logramos introducir un salto de lnea. Supongo que se habr percatado de que entre el mensaje y el ttulo de la ventana, hemos escrito dos comas, esto es porque entre las comas, debe ir un nmero que representar el icono a mostrar. Existen cuatro iconos diferentes adems de la posibilidad de no mostrar ninguno. Los iconos son:

Estos iconos corresponden a los siguientes mensajes: Mensaje crtico. Mensaje de pregunta. Mensaje exclamativo. Mensaje de informacin. (Slo en W32. En Windows 3.xx dispone de otros diferentes, aunque con el mismo significado) Para mostrar el icono en cuestin o para que Visual Basic lo entienda, es necesario escribir lo siguiente: Mensaje crtico. Mensaje de pregunta. Mensaje exclamativo. Mensaje de informacin. VbCritical VbQuestion VbExcalamqtion VbInformation 16 32 48 64

Note que es lo mismo insertar VbCritical o 16.

Pgina 225

Vamos a ver un ejemplo aadiendo un icono al ltimo ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion , "Ejemplo" El resultado es:

Ahora bien, es posible que queramos mostrar algn otro botn que o bien no sea el de Aceptar o que adems del botn de Aceptar haya ms botones. Para este propsito, tenemos los siguientes parmetros: Aceptar Aceptar y Cancelar Anular, Reintentar, Ignorar S, No y Cancelar S y No Reintentar y Cancelar Aplicacin modal vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbApplicationModal 0 1 2 3 4 5 0 (Es la caja de mensaje sin icono)

La forma de hacer esto es sumar al parmetro del icono que queremos mostrar el valor de los botones que deseamos que aparezcan. As por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo , "Ejemplo" El resultado es:

An as, es posible que deseemos que el Focus lo adquiera otro un botn determinado. Por ejemplo, en este caso el Focus lo tiene el botn S, pero es posible que deseemos que lo tenga el botn No por ejemplo. Esto se consigue con los siguientes parmetros: Primer botn predeterminado vbDefaultButton1 0 Segundo botn predeterminado vbDefaultButton2 256 Tercer botn predeterminado vbDefaultButton3 512 Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo + vbDefaultButton2, "Ejemplo" El resultado es:

Pgina 226

Si no se seala el botn predeterminado, Visual Basic seleccionar el primer botn. En caso de seleccionar como predeterminado un botn que no existe, (por ejemplo el tercero), Visual Basic seleccionar el primero. Ahora bien, si decidimos mostrar un mensaje esperando una respuesta, o queremos saber que botn ha pulsado el usuario, esto lo podemos conseguir mediante el siguiente cdigo 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 siguiente cdigo: Dim Resp As Integer Resp = MsgBox("Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo + vbDefaultButton2, "Ejemplo") If Resp = 6 Then MsgBox "Ha pulsado SI" Else MsgBox "Ha pulsado NO" End If Tiene el resultado siguiente:

Si pulsamos el botn S obtendremos una accin, y si pulsamos el otro botn otra accin. Ahora bien, para elegir o seleccionar un evento o accin, el usuario debe saber combinar los cdigos, sabiendo que un MsgBox posee la siguiente sintaxis principal: Pgina 227

MsgBox Mensaje, Botones, Ttulo de la ventana

InputBox
El InputBox o caja de entrada es otra de las partes ms utilizadas para la interaccin del usuario con la aplicacin. Es importante que el usuario interacte con la aplicacin para ser el protagonista de esta. El InputBox nos permite sacar una caja donde el usuario pasar un parmetro, valor o dato para que el programa lo trate y lo ejecute. El mensaje que quiere que aparezca se realiza de forma casi idntica al MessageBox. Puede escribirse varias lneas de texto seguidas por la constante de Visual Basic vbCrLf o salto de lnea o prrafo. La sentencia es: Val = InputBox (Mensaje, Titulo, ValorPredeterminado)

Val almacenar el texto escrito por el usuario, que puede ser una cantidad, cadena string, etc. Por ejemplo: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo") MsgBox "Su nombre es: " & Val Tiene como resultado:

(El usuario teclea el nombre - Mundo Visual - y hace click en Aceptar. A continuacin se muestra el MsgBox - 2 lnea del cdigo anterior )

Ahora bien, podemos determinar un texto predeterminado a la caja de entrada, como por ejemplo: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual") MsgBox "Su nombre es: " & Val Obtendremos como resultado:

Pgina 228

Es importante determinar que si el usuario elige el botn Cancelar, el programa devolver una cadena de caracteres igual a 0, es decir, Val ="". La caja de entrada puede ser sin embargo ms personalizada mediante dos parmetros como son la posicin de la ventana de entrada de datos en la pantalla. Estos parmetros se ponen a continuacin del ValorPredeterminado. Por ejemplo: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual", 1200, 1400) Situar la ventana en el eje de las X a 1200 Twips (posicin horizontal) y la Y a 1400 twips (posicin vertical).

Salto de pgina
En versiones anteriores de Visual Basic, la forma de realizar un salto de pgina en un TextBox era cambiando la propiedad Multiline a True y escribiendo una constante string cualquiera con valor igual a Chr$(13) & Chr$(10), es decir salto de prrafo. Con la versin Visual Basic 4.0, se usa una constante vbCrLf que realiza esta funcin. Repaso: Hemos visto en este captulo el uso de MsgBox, y InputBox, los cuales nos van a servir de gran utilidad en nuestros proyectos Visual Basic. Reitero mi agradecimiento a Mundo Visual http://www.ciudadfutura.com/visualbasic/ FIN del decimosegundo captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 229

Visual Basic - Gua del Estudiante Cap. 13


EL CONTROL RICH TEXT BOX El control RichTextBox es una caja de texto con mas prestaciones que el TextBox. Este control solamente est implementado en la versin de 32 bits. No est normalmente en la caja de herramientas, por lo que habr que ir a Herramientas | Controles Personalizados. 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, lmite mximo del TextBox. Aparte de estas, tiene otras caractersticas respecto a la forma de guardar y leer el texto en un fichero, que le convierten en una herramienta muy til para el diseo de aplicaciones en las que haya que introducir documentos de texto. Propiedades El RichTextBox tiene todas las propiedades del TextBox, y adems otras que son las que le dan las caractersticas excepcionales a este control. Las tres siguientes propiedades son idnticas para ambos controles : SelLenght Devuelve o establece el nmero de caracteres seleccionados. Los caracteres seleccionados son aquellos que se ponen en vdeo inverso cuando arrastramos con el ratn.

SelStart Devuelve o establece el nmero del carcter de comienzo del texto seleccionado. SelText Devuelve o establece la cadena de caracteres seleccionados. Si no hay ningn carcter seleccionado devuelve la cadena (cadena vaca)

Pgina 230

En el ejemplo, el texto seleccionado es ejemplo nos permitir, texto que hemos seleccionado con el ratn. Las propiedades anteriores tomarn estos valores para ese texto seleccionado : SelLenght = 21 SelStart = 5 (Recuerde que el espacio tambin es un carcter) (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 ratn y analizar ese texto seleccionado, o seleccionar el texto dndole 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 tamao, su color, etc. Usemos para ello las siguientes propiedades, que solamente las tiene el RichTextBox : SelBold, SelItalic, SelStrikethru, SelUnderline Estas propiedades son del tipo Booleano (True/False) y nos permitirn poner el texto seleccionado en Negrita, Cursiva, Tachada y Subrayada respectivamente. Por ejemplo, RTB.SetBold = True pondr el negrita el texto seleccionado. RTB.SelItalic = True pondr en cursiva el texto seleccionado. RTB.SelStrikethru = True pondr en tachado el texto seleccionado. RTB.SelUnderline = True pondr en subrayado el texto seleccionado. ( RTB = Nombre del control RichTextBox ) Si el texto seleccionado est en la parte final del texto, o si el cursor de escritura est al final del escrito y no se ha seleccionado ningn texto, la propiedad elegida permanecer vigente para la escritura que se realice a partir de ese punto. SelFontName Esta propiedad devuelve o establece el nombre de la fuente en el texto seleccionado. P.e. RTB1.SelFontName = Arial Devuelve o establece el tamao de la fuente en el texto seleccionado. P.e. RTB1.SelFontSize = 10

SelFontSize

Al igual que las otras propiedades, si el texto seleccionado est al final del texto, o si el cursor de escritura est al final del escrito, la propiedad elegida permanecer vigente para la escritura que se realice a partir de ese punto. Pero el RichTextBox tiene propiedades exclusivas. SelRTF Devuelve o establece el texto (en formato .RTF) de la seleccin actual de un control RichTextBox. No est disponible en tiempo de diseo. Sintaxis NombredelRTB.SelRTF [= cadena] Donde cadena es una expresin de cadena en formato .RTF. Esta propiedad es equivalente a la propiedad SelText y funciona de forma idntica, pero en este caso el texto reemplazado o devuelto mediante la propiedad SelRTF est en formato RTF. Esta propiedad devuelve una cadena de longitud cero ("") si no hay texto seleccionado en el control. Puede utilizar la propiedad SelRTF junto con el Mtodo Print para escribir archivos .RTF. En el siguiente ejemplo, el cdigo abre un fichero (mitexto1.rtf) y guarda en l el texto seleccionado en el control RichTextBox1 Pgina 231

Open "mitexto.rtf" For Output As 1 Print #1, RichTextBox1.SelRTF Close 1 TextRTF Devuelve o establece el texto de un control RichTextBox, incluido todo el cdigo .RTF. Sintaxis objeto.TextRTF [= cadena] Donde cadena es una expresin de cadena con formato .RTF. Al establecer la propiedad TextRTF se reemplaza el contenido completo de un control RichTextBox por la nueva cadena. Puede utilizar la propiedad TextRTF junto con el Mtodo Print para escribir archivos .RTF. Cualquier procesador de textos capaz de leer texto codificado en formato RTF puede leer el archivo resultante. OTRAS PROPIEDADES El RichTextBox tiene otras propiedades, unas similares a las del resto de controles, otras con ciertas particularidades. Appearance Plano o tridimensional, como en el resto de los controles. AutoVerbMenu Propiedad Booleana que indica si se presenta un men emergente cuando el usuario hace click con el botn derecho del ratn. El men emergente muestra los comandos tpicos de cortar, copiar y pegar. Si esta propiedad est a True muestra el men. False no lo muestra. Sintaxis NombredelRichTextBox.AutoVerbMenu = True / False BorderStyle Sin borde o con borde (None o Fixed Single) BulletIndent Devuelve o establece la cantidad de sangra utilizada en un control RichTextBox cuando SelBullet se establece a True. Sintaxis NombredelRichTextBox.BulletIndent [= entero] donde entero es un entero que determina la cantidad de sangra. Estas propiedades utilizan las unidades de modo de escala del objeto Form que contiene el control RichTextBox. NOTA. Hay que establecer la propiedad BulletIndent antes de establecer como True la propiedad SelBullet. Por ejemplo : RTB1.BulletIndent = 2500 RTB1.SelBullet = True Estas dos lneas de cdigo realizan una sangra de 2500 (en las unidades en las que estemos midiendo el Formulario que contiene al RichTextBox) y convierte en vieta el prrafo que estuviese seleccionado. La propiedad BulletIndent devuelve Null si la seleccin abarca mltiples prrafos con distintos ajustes de margen. SelBullet Devuelve o establece un valor que determina si un prrafo del control RichTextBox que contiene la seleccin actual o el punto de insercin tiene el estilo de vieta. No est disponible en tiempo de diseo. Pgina 232

Si queremos activar (o desactivar) el estilo de vieta en un prrafo, usaremos la sintaxis : NombreRichTextBox.SelBullet = True / False Si activamos el estilo vieta, aparecer un punto a la izquierda del prrafo. Si queremos leer la propiedad, es decir, si queremos saber si un prrafo tiene estilo de vieta, usaremos la siguiente sintaxis : Variable = NombreRichTextBox.SelBullet En este caso podemos tener tres valores : Null. La seleccin abarca ms de un prrafo y contiene una mezcla de estilos de vieta y no vieta. True. Los prrafos de la seleccin tienen estilo de vieta. False. La prrafos de la seleccin no tienen estilo de vieta. DisableNoScroll Devuelve o establece un valor que determina si estn 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. Enabled Propiedad Booleana. Activa o desactiva el RichTextBox FileName Esta propiedad devuelve o establece el nombre del fichero .RTF cargado en el RichTextBox. Si ejecutamos la lnea de cdigo : RTB1.Filename =C :\CursoVB\Mitexto.rtf lo que ocurrir es que nuestra aplicacin cargar el fichero C :\CursoVB\Mitexto.rtf en el RichTextBox RTB1. Es decir, hace lo mismo que el Mtodo LoadFile (Vea mas abajo). Slo puede especificar los nombres de archivos de texto o archivos .RTF vlidos para esta propiedad. Le recomendamos que para cargar un texto en un RTB use siempre el mtodo 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 un control pierde el enfoque. Sintaxis NombreRTB.HideSelection = True / False Variable = NombreRTB.HideSelection para establecer la propiedad para leerla

Si la propiedad HideSelection est a True, el texto seleccionado no aparece resaltado cuando el control pierde el enfoque. Si est en False, el texto seleccionado aparece resaltado cuando el control pierde el enfoque.

Pgina 233

Puede usar esta propiedad para indicar el texto resaltado mientras otro formulario o cuadro de dilogo tiene el enfoque; por ejemplo, en una rutina de revisin ortogrfica. 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 nmero mximo de caracteres que puede contener. Si se pone a 0 (Predeterminado) admite cualquier nmero 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 lneas. Si est a False, una solo. OLEDragMode OLEDropMode Estas dos propiedades son similares a la DragMode de otros controles. Se vern con mas detalle al estudiar el Drag & Drop. RightMargin Devuelve o establece el margen derecho del texto en un control RichTextBox. Sintaxis NombredelRichTextBox.RightMargin [ = valor] Donde valor es una expresin numrica que especifica el espacio en Twips desde el margen derecho del texto al margen derecho del control. Esta propiedad se utiliza para impedir que la lnea de texto sobrepase el margen derecho del RichTextBox Cuando esta propiedad tiene el valor 0 (predeterminado), las lneas de escritura pueden superar el lmite del RichTextBox. Si se le da un valor bajo (1 por ejemplo), las lneas se ajustan al ancho del RTB, introduciendo retornos de carro automticos. ScrollBars 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 lneas, bien porque hay pocos caracteres por lnea, las barras de desplazamiento estn desactivadas. Las barras de desplazamiento pueden desactivarse mediante la propiedad DisableNoScroll. SelAlignment Devuelve o establece un valor que controla la alineacin de los prrafos de un control RichTextBox. No est disponible en tiempo de diseo. Sintaxis NombreRTB.SelAlignment [= valor] valor = Un entero o una constante que determina la alineacin del prrafo, como se describe a continuacin. Los valores admitidos para valor son: Constante Null rtfLeft Valor Ninguno. 0 Descripcin La seleccin actual abarca ms de un prrafo con distintas alineaciones. (Predeterminado) Izquierda. El prrafo se alinea a lo largo del Pgina 234

rtfRight rtfCenter

1 2

margen izquierdo. Derecha. El prrafo se alinea a lo largo del margen derecho. Centro. El prrafo se centra entre los mrgenes izquierdo y derecho.

La propiedad SelAlignment determina la alineacin de todos los prrafos que tienen texto en la seleccin actual o del prrafo que contiene el punto de insercin si no hay texto seleccionado. Para distinguir entre los valores de Null y 0 al leer esta propiedad en tiempo de ejecucin, use la funcin IsNull con la instruccin If...Then...Else. Por ejemplo: If IsNull(RichTextBox1.SelAlignment) = True Then ' Cdigo que se ejecuta cuando la seleccin es mixta. ElseIf RichTextBox1.SelAlignment = 0 Then ' Cdigo que se ejecuta cuando la seleccin est alineada a la izquierda. ... End If SelProtected Devuelve o establece un valor que determina si est protegida la seleccin actual. No est disponible en tiempo de diseo. Sintaxis NombreRTB.SelProtected [ = valor ] valor es un valor de tipo Variant que determina si la seleccin actual est protegida, como se describe a continuacin Valor Null True False Descripcin La seleccin contiene un mezcla de caracteres protegidos y no protegidos. Todos los caracteres de la seleccin est protegidos. Ninguno de los caracteres de la seleccin est protegido.

El texto protegido tiene igual apariencia que el texto normal, pero el usuario final no puede modificarlo. Es decir, el texto no se puede cambiar en tiempo de ejecucin. Esto le permite crear formularios con el control RichTextBox y tener zonas que pueda modificar el usuario final. SelCharOffset Devuelve o establece un valor que determina si el texto del control RichTextBox aparece en la lnea base (normal), como un superndice sobre la lnea base o como un subndice por debajo de la lnea base. No est disponible en tiempo de diseo. Sintaxis NombreRTB.SelCharOffset [= desplazamiento] desplazamiento = un entero que determina a qu distancia de la lnea base del texto se separan los caracteres de la seleccin actual o que siguen al punto de insercin, como se describe a continuacin. Los valores de desplazamiento son: Valor Null Descripcin Ninguno. La seleccin tiene una mezcla de caracteres con desplazamientos diferentes. 0 Normal. (Predeterminado) Todos los caracteres aparecen en la lnea base de texto normal. Entero positivo Superndice. Los caracteres aparecen por encima de la lnea base en el nmero de twips especificado. Entero negativo Subndice. Los caracteres aparecen por debajo de la lnea base en el nmero de twips especificado.

Pgina 235

SelTabCount, SelTabs Devuelven o establecen el nmero de tabulaciones y las posiciones absolutas de tabulacin de texto de un control RichTextBox. No estn disponibles en tiempo de diseo. Sintaxis NombreRTB.SelTabCount [= contador] NombreRTB.SelTabs(ndice) [= ubicacin] Las sintaxis de las propiedades SelTabCount y SelTabs constan de las siguientes partes: NombreRTB Nombre del RichTextBox contador Un entero que determina el nmero de posiciones de tabulacin del prrafo o los prrafos seleccionados o en el prrafo o los prrafos que siguen al punto de insercin. ndice Un entero que identifica una tabulacin especfica. La primera ubicacin de tabulacin tiene un ndice cero (0). La ltima ubicacin de tabulacin tiene un ndice igual SelTabCount menos 1. ubicacin Un entero que especifica la ubicacin de la tabulacin designada. Las unidades empleadas para expresar posiciones de tabulacin estn determinadas por el modo de escala del objeto Form u otro objeto que contenga el control RichTextBox . De forma predeterminada, al presionar TAB mientras escribe en un control RichTextBox el enfoque pasa al siguiente control del orden de tabulacin, segn especifica la propiedad TabIndex. Un modo de insertar una tabulacin en el texto consiste en presionar CTRL+TAB. Sin embargo, a los usuarios habituados a trabajar con procesadores de texto la combinacin de teclas CTRL+TAB puede resultarles extraa. Puede activar el uso de la tecla TAB para insertar una tabulacin en un control RichTextBox si cambia temporalmente la propiedad TabStop de todos los controles del objeto Form a False mientras el control RichTextBox tenga el enfoque. Por ejemplo: Private Sub RichTextBox1_GotFocus() ' Pasa por alto los errores de controles sin la propiedad TabStop. On Error Resume Next ' Desactiva el cambio de enfoque al presionar TAB. For Each Control In Controls Control.TabStop = False Next Control End Sub Restablezca la propiedad TabStop de los otros controles cuando el control RichTextBox pierda el enfoque.

METODOS DEL CONTROL RichTextBox El control RichTextBox cuenta con unos mtodos especiales para abrir un fichero y guardar el texto que contiene un poco especiales. Estos mtodos (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 mtodos Open Nombrefichero For Input / Output vistos en el captulo de ficheros. METODO SaveFile Guarda el contenido de un control RichTextBox en un archivo. Sintaxis NombredelRTB.SaveFile(nombre_ruta, tipo_archivo)

Pgina 236

Donde nombre_ruta (Parmetro requerido) es una expresin 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 continuacin : 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 parmetro, 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 mtodo SaveFile, puede utilizar la funcin 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 (Parmetro requerido) es una expresin 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 continuacin 0 1 rtfRTF rtfText El archivo cargado debe ser un archivo .RTF vlido. El control RichTextBox carga cualquier archivo de texto.

Al cargar un archivo con el mtodo 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. Tambin puede usar la funcin 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 especfica en el texto de un control RichTextBox. Sintaxis Variable = NombreRTB.Find (cadena, inicio, fin, opciones) Donde : cadena (Necesario) inicio (Opcional)

Una expresin de cadena que desea buscar en el control. Un ndice de caracteres de tipo Integer que determina dnde comienza Pgina 237

fin

(Opcional)

Opciones (Opcional)

la bsqueda. Cada carcter del control tiene un ndice entero que lo identifica de forma nica. El primer carcter de texto del control tiene un ndice 0. Un ndice de carcter de entero que determina dnde termina la bsqueda. Una o ms valores o constantes utilizadas para especificar caractersticas opcionales, como se describe a continuacin. Descripcin

Valor 1

Constante rtfWholeWord

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 maysculas y minsculas de la cadena especificada adems del texto de la cadena. 8 rtfNoHighlight Determina si una coincidencia aparece resaltada en el control RichTextBox. Puede combinar mltiples opciones si utiliza el operador Or. Si se encuentra el texto buscado, el mtodo Find resalta el texto especificado y devuelve un nmero con la posicin del primer carcter resaltado. Si no se encuentra el texto especificado, el mtodo Find devuelve 1. Si utiliza el mtodo Find sin la opcin 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 mtodo Find slo buscarn el texto resaltado hasta que se mueva el punto de insercin. El comportamiento de bsqueda del mtodo Find vara segn la combinacin de valores especificados para los argumentos inicio y fin. Esta tabla describe los comportamientos posibles: Inicio Especificado Fin Especificado Comportamiento de bsqueda

Busca desde la ubicacin inicial especificada hasta la ubicacin final especificada. Especificado Omitido Busca desde la ubicacin inicial especificada hasta el final del texto del control. Omitido Especificado Busca desde el punto de insercin actual hasta la ubicacin final especificada. Omitido Omitido Busca en la seleccin actual si el texto est seleccionado o en todo el contenido del control si no hay texto seleccionado.

METODO GetLineFromChar Devuelve el nmero de la lnea que contiene una posicin de carcter especificado en un control RichTextBox. Sintaxis Variable = NombreRTB.GetLineFromChar (pos_carcter) Donde pos_carcter (Requerido) es un entero largo que especifica la posicin del carcter cuya lnea desea identificar. El ndice del primer carcter del control RichTextBox es 0. Utilice el mtodo GetLineFromChar para averiguar qu lnea del texto de un control RichTextBox contiene una determinada posicin de carcter. Es posible que necesite hacerlo porque puede variar el nmero de caracteres de cada lnea, lo que hace muy difcil averiguar qu lnea del texto contiene un determinado carcter, identificado por su posicin en el texto. METODO SelPrint Enva texto con formato de un control RichTextBox a un dispositivo de impresin.

Pgina 238

Sintaxis NombreRTB.SelPrint(hdc) 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 mtodo SelPrint slo enviar el texto seleccionado al dispositivo de destino. Si no hay texto seleccionado, se enviar el contenido completo del control RichTextBox al dispositivo. El mtodo SelPrint no imprime texto desde el control RichTextBox. En su lugar, enva una copia del texto con formato a un dispositivo que pueda imprimirlo. Por ejemplo, puede enviar el texto al objeto Printer utilizando cdigo 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 mtodo 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 imprimiendo algo como una cadena de longitud cero. METODO Span Selecciona texto en un control RichTextBox basndose en un conjunto de caracteres especificado. Sintaxis NombreRTB.Span juego_caracteres, hacia_adelante, negado donde : juego_caracteres (Requerido) Una expresin de cadena que especifica el juego de caracteres que se va a buscar al ampliar la seleccin, basndose en el valor de negado. hacia_adelante (Opcional) Una expresin booleana que determina en qu sentido se mueve el punto de insercin, como se describe mas adelante. Negado (Opcional) Una expresin 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 insercin actual o desde el principio de la seleccin actual hacia delante, hacia el final del texto. False Selecciona texto desde el punto de insercin actual o el principio de la seleccin actual hacia atrs, hacia el principio del texto. Los valores para negado son: True Los caracteres incluidos en la seleccin son los que no aparecen en el argumento juego_caracteres. La seleccin se detiene en el primer carcter encontrado que aparece en el argumento juego_caracteres. False (Predeterminado) Los caracteres incluidos en la seleccin son los que aparecen en el argumento juego_caracteres. La seleccin se detiene en el primer carcter encontrado que no aparece en el argumento juego_caracteres. El mtodo Span se utiliza principalmente para seleccionar fcilmente una palabra o una frase en el control RichTextBox. Si el mtodo Span no encuentra los caracteres especificados basndose en los valores de los argumentos, el punto de insercin o la seleccin actual permanece sin cambios. Pgina 239

El mtodo Span no devuelve datos. METODO Upto Mueve el punto de insercin hasta el primer carcter (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 expresin de cadena que especifica el conjunto de caracteres que se va a buscar al mover el punto de insercin, basndose en el valor de negado. hacia_adelante (Opcional) Una expresin booleana que determina en qu sentido se mueve el punto de insercin, como se describe en Valores. negado (Opcional) Una expresin 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 insercin hacia delante, hacia el final del texto. Mueve el punto de insercin hacia atrs, 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 insercin. False (Predeterminado) Los caracteres especificados en el argumento juego_caracteres se utilizan para mover el punto de insercin.

El Portapapeles y el RichTextBox
Imagnese 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 solucin 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, adems del texto limpio y puro, la informacin del tipo de letra, tamao, color, etc. tpicas del formato RTF. Para ello debemos indicarle al portapapeles en qu formato queremos guardarlo. La lnea de cdigo : Clipboard.SetText RTB1.SelRTF, vbCFRTF guarda en el portapapeles el texto seleccionado en ese momento. La lnea Clipboard.SetText RTB1.TextRTF, vbCFRTF guarda en el portapapeles todo el contenido del RichTextBox (llamado RTB1 en los ejemplos) en formato RTF Las lneas : Clipboard.SetText RTB1.SelRTF, vbCFText Clipboard.SetText RTB1.TextRTF, vbCFRTF Pgina 240

guardarn, respectivamente, el texto seleccionado y todo el texto de RTB1, en formato de texto plano (el texto ASCII solamente) APENDICE Constantes del control RichTextBox Constante Valor Descripcin

Propiedad Appearance rtfFlat 0 Uniforme. Pinta sin efectos visuales. rtfThreeD 1 (Predeterminado). 3D. Pinta con efectos tridimensionales. Mtodo 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 maysculas y minsculas de la cadena especificada adems del texto de la cadena. Determina si una coincidencia aparece resaltada en el control RichTextBox.

Mtodos LoadFile y SaveFile rtfRTF 0 (Predeterminado) RTF. El archivo cargado debe ser un archivo .RTF vlido (mtodo LoadFile) o el contenido del control se guarda en un archivo .RTF (mtodo SaveFile). rtfText 1 Texto. El control RichTextBox carga cualquier archivo de texto (mtodo LoadFile) o el contenido del control se guarda en un archivo de texto (mtodo SaveFile). Propiedad MousePointer rtfDefault 0 (Predeterminado) La forma est determinada por el objeto. rtfArrow 1 Flecha. rtfCross 2 Cruz (cursor en forma de cruz). rtfIbeam 3 Cursor en forma de I. rtfIcon 4 Icono (cuadrado pequeo dentro de un cuadrado). rtfSize 5 Tamao (flecha de cuatro puntas que seala al norte, sur, este y oeste) rtfSizeNESW 6 Tamao NE-SO (flecha de dos puntas que seala al nordeste y al sudoeste). rtfSizeNS 7 Tamao N S (flecha de dos puntas que seala al norte y al sur). rtfSizeNWSE 8 Tamao NO, SE. rtfSizeEW 9 Tamao EO (flecha de dos puntas que seala al este y al oeste). rtfUpArrow 10 Flecha hacia arriba. rtfHourglass 11 Reloj de arena (espere). rtfNoDrop 12 No colocar. rtfArrowHourglass 13 Flecha y reloj de arena. rtfArrowQuestion 14 Flecha y signo de interrogacin. rtfSizeAll 15 Ajustar todo. rtfCustom 99 Icono personalizado especificado por la propiedad MouseIcon. Propiedad Selalignment rtfLeft 0 (Predeterminado) Izquierda. El prrafo se alinea a lo largo del margen izquierdo. rtfRight 1 Derecha. El prrafo se alinea a lo largo del margen derecho. rtfCenter 2 Centro. El prrafo se centra entre los mrgenes izquierdo y derecho. Propiedad Scrollbars rtfNone 0 rtfHorizontal 1 rtfVertical 2

(Predeterminado) Ninguna. Slo barra de desplazamiento horizontal. Slo barra de desplazamiento vertical. Pgina 241

rtfBoth

Barras de desplazamiento horizontal y vertical.

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 exiga. El Formato de Texto Enriquecido pretende ser un nexo de unin 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, tamao, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto, guardado en ASCII y RTF
Este es un texto utilizado para explicar el Formato de Texto Enriquecido (RTF). El Formato de Texto Enriquecido es un formato de intercambio de textos entre distintos procesadores. Es, en esencia, una idea para crear una forma comn de intercambiar textos. El RTF guarda los datos codificados en ASCII, es decir, el fichero resultante es legible plenamente ya que los caracteres que utiliza son ASCII, pero lleva una determinada codificacin para poder cambiar de letra, de tamao, etc. Puede guardar grficos tal como lo hara cualquier procesador de textos. Fin

{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss MS Sans Serif;}} {\colortbl\red0\green0\blue0;} \deflang1034\pard\plain\f2\fs17 Este es un texto utilizado para explicar el Formato de Texto Enriquecido (RTF). El Formato de \par Texto Enriquecido es un formato de intercambio de textos entre distintos procesadores. Es, en \par esencia, una idea para crear una forma com\'fan de intercambiar textos. \par El RTF guarda los datos codificados en ASCII, es decir, el fichero resultante es legible plenamen\par te ya que los caracteres que utiliza son ASCII, pero lleva una determinada codificaci\'f3n para poder \par cambiar de letra, de tama\'f1o, etc. \par Puede guardar gr\'e1ficos tal como lo har\'eda cualquier procesador de textos. \par Fin \par \par \par }

Estos textos de guardaron desde un RichTextBox. Algunas lneas estn truncadas, pues en el RTF original eran mas largas que las de este texto. Puede observarse que codifica los acentos, los saltos de lnea, etc., pero todo ello usando caracteres ASCII plenamente legibles. MUY IMPORTANTE

Pgina 242

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.

FIN del decimotercer captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 243

Visual Basic - Gua del Estudiante Cap. 14


La Ayuda de Windows .
LA AYUDA DE WINDOWS Toda aplicacin bien terminada debe tener una ayuda. Cualquier aplicacin realizada en Visual Basic puede tenerla, usando para ello los recursos que brida Windows. La presentacin de la ayuda podra hacerse mediante un formulario, donde se presentan distintos ficheros segn las necesidades del usuario. Sin embargo esta forma de presentar la ayuda nunca llegar a ser tan completa como la que brinda Windows, y el trabajo a desarrollar para igualar la presentacin de Windows sera laborioso. Solucin : utilizar los recursos de Windows. El recurso de Windows es el programa WINHELP.EXE Todas las ayudas de aplicaciones Windows se muestran mediante este programa. Windows dispone de otra utilidad, el programa HC.EXE ( Help Compiler) que puede adaptar el fichero .RTF donde escribir la ayuda, a un formato capaz de ser interpretado por el WINHELP.EXE Lo vamos viendo todo paso a paso. Antes de comenzar a explicar como se realiza una ayuda Windows vamos a comentar el formato de archivos RTF. Este formato posiblemente le sea familiar debido a que el control RichTextBox puede guardar y leer ficheros en ese formato. Las siglas RTF vienen precisamente de Rich Text Format, en castellano, Formato de Texto Enriquecido. 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 exiga. El Formato de Texto Enriquecido pretende ser un nexo de unin 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, tamao, 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 tamao de las letras a tamao mas grande, mas pequeo, etc.

El Objeto App.

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 tamao de las letras a tamao mas grande, mas pequeo, etc.

Fin Texto 1

Pgina 244

Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las lneas para poder mostrarlas en una hoja, ya que RTF utiliza lneas sin retornos de carro. Se han seccionado las lneas terminndolas con un guin bajo y comenzando en la lnea siguiente tambin con un guin 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; \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 aadiendo una serie de datos respecto al tipo de letra, codifica los acentos, las ees, y hasta incluye, tomndolo del ordenador, el nombre del operador que lo ha escrito. Estas informaciones tambin 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 informacin adicional, lo archiva con caracteres ASCII. La utilidad que tiene Windows para presentar las ayudas utiliza precisamente este formato RTF. Por ello, debemos disponer de un procesador de textos que pueda guardar el texto escrito en este formato. (Word, WP5, WP6 y otros) Los ejemplos de estos apuntes se han realizado en Word. Antes de decidirnos a escribir el fichero de ayuda debemos pensar muy bien lo que vamos a poner en l. Pensemos ante todo a que personas va dirigida la aplicacin, sus posibles conocimientos de informtica y de otros temas que estarn relacionados con la aplicacin. Es decir, planifiquemos la ayuda antes de comenzar a hacerla. Para acceder a la ayuda, Windows ofrece la posibilidad de pulsar F1 . Nuestras aplicaciones deben sacar la ayuda pulsando F1. Lo podrn hacer mediante otros procedimientos. Comencemos por lo mas sencillo, una ayuda de una nica pgina. Pgina 245

Escriba el texto de ayuda con Word y gurdelo en formato RTF, en cualquier directorio, pero preferentemente en uno que no se mezcle con otros ficheros para poder localizarlo mejor. Cree si es necesario un directorio exclusivo para la ayuda. Imaginemos que lo creamos y es el C :\DIRAYUDA, donde guardamos el fichero de ayuda con el nombre AYUDA1.RTF Este archivo no lo puede utilizar directamente el programa WINHELP.EXE. Hay que compilarlo. Para ello utilizamos el compilador HC.EXE. Este compilador no es una herramienta Windows, por lo que tendr que ir al DOS y ejecutarlo. El programa HC.EXE se encuentra en el directorio C :\ ..... \VB\HC Pero al compilador HC.EXE hay que suministrarle la informacin para que pueda trabajar. Esa informacin se la damos en un fichero que le pasaremos como parmetro, que debe tener extensin .HPJ y que meteremos en el mismo directorio donde tengamos el fichero de ayuda AYUDA1.RTF Este fichero estar editado en ASCII puro. Puede editarlo con el EDIT de MS-DOS o con el Block de Notas de Windows. Imaginemos que lo vamos a llamar FICHAYUD.HPJ y como se dijo, se meter en el mismo directorio donde est el fichero de ayuda. (C :\DIRAYUDA) El nombre que decida para este fichero con extensin .HPJ ser el que tenga el fichero de ayuda (Que se obtendr de la compilacin y tendr por extensin .HLP) Tendr, de momento, dos lneas. [FILES] AYUDA1.RTF Vayamos al directorio C :\ ...... \VB\HC (en MS-DOS) y tecleemos HC C:\DIRAYUDA\ FICHAYUD.HPJ La compilacin no suele dar problemas sobre todo en un fichero de ayuda tan simple de una nica pgina. Al compilar, obtenemos un fichero con el mismo nombre que el fichero .HPJ y extensin .HLP, (FICHAYUD.HLP en nuestro caso) que lo dejar en el directorio donde estuviera el programa HC.EXE. (Posiblemente el C :\VB\HC) Debe moverlo a otro directorio donde no estorbe y lo podamos localizar sin problemas. Movmoslo al C :\DIRAYUDA Vayamos a nuestra aplicacin VB y abramos el men de Herramientas | Opciones para sacar el cuadro de Opciones. Vaya a la pestaa de Proyecto y busque el directorio y nombre del fichero .HLP haciendo click sobre el cuadrado con tres puntos (...) que est a la derecha del TextBox de Archivo de Ayuda. Se le abrir un CommonDialog para buscarlo. NOTA : Para evitar liarse con los directorios, es medida siempre prudente llevarse el compilador de ayudas HC.EXE al directorio donde tengamos el fichero .RTF y el .HPJ.

Pgina 246

Haga click en Aceptar y ejecute la aplicacin. Pulse F1. SORPRESA ! Tenemos en pantalla la ventana de ayuda de Windows con el fichero que habamos escrito. F1 ha invocado a WINHELP.EXE y este programa present el fichero de ayuda asociado con el proyecto. Observe que el texto se adapta a las dimensiones de la ventana. Y si supera en vertical las dimensiones de la ventana, aparecen barras de scroll verticales. Puede de esta forma recorrer todo el fichero de ayuda. Sin embargo este procedimiento no sera el mas indicado para una informacin de ayuda extensa. Deberemos poner varias pginas. Si lo hacemos as, al pulsar F1 siempre aparecer la pgina 1. Si aparece siempre la pgina 1, pongamos en esta primera pgina el ndice de temas, y en las pginas sucesivas cada uno de los temas. Ya veremos como acceder a cada una de las pginas haciendo click sobre la lnea del ndice que contiene el ttulo del tema deseado. Tal y como lo hace con cualquier aplicacin Windows. Volvamos al editor Word y abramos el fichero que habamos creado de una pgina, y adale mas pginas introduciendo avances de pgina manuales (Se introducen con Control + Intro) Imaginemos que tenemos esta configuracin del fichero :

INDICE 1 - Introduccin a la aplicacin 2 - Acceso a la Base de Datos 3 - Introduccin de datos 4 - Lectura de datos --------------salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Introduccin a la Aplicacin Esta aplicacin est realizada para . . . . . . . . . . -------------salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Pgina 247

Acceso a la Base de Datos Para abrir la Base de datos . . . . . . . . . -------------salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Introduccin de datos Para introducir datos . . . . . . . . . . . . -------------salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Lectura de datos Para leer los datos . . . . . . . . . . . . . . . .

Ya tenemos hecho un fichero de ayuda con varias pginas. No es suficiente esto, ya que WINHELP.EXE , pulsando F1, solamente nos mostrar la pgina 1. Debemos hacer algo para, una vez en la pgina 1, que nos estar mostrando el ndice, poder acceder a cada una de las pginas haciendo click sobre la lnea del ndice que contiene el tema de inters. Para ello debemos poner un identificador a cada una de las pginas. Este identificador debe ser nico, es decir, no pueden existir dos pginas con el mismo identificador. Para introducir un identificador en una pgina, una vez que tenga el fichero de ayuda terminado, sitese con el cursor al comienzo del ttulo de la primera pgina (despus del ndice), justamente al lado de Introduccin a la Aplicacin . 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. Haga click sobre Aceptar. Le aparecer en la parte inferior de la pantalla un cuadro para introducir el identificador de esa pgina. Repita el proceso para todas las pginas insertndoles una Nota al pi a cada una. Al final obtendr este resultado : INDICE 1 - Introduccin a la aplicacin 2 - Acceso a la Base de Datos 3 - Introduccin de datos 4 - Lectura de datos - - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - -

Pgina 248

Introduccin a la Aplicacin

Esta aplicacin est realizada para . . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de pgina manual # Acceso a la Base de Datos Para abrir la Base de datos . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin de datos Para introducir datos . . . . . . . . . . . . -------------------# Lectura de datos salto de pgina manual ---------------------------------------------

Para leer los datos . . . . . . . . . . . . . . . . EN ESTA PARTE DE LA PAGINA VERA UNA SEPARACION QUE PONE, A LA IZQUIERDA Todas las notas al pie
# #

Introduccin Acceso # Meterdatos # Leerdatos (Observe que estamos simulando la ventana de Word. Donde ve - - salto de pgina manual - entienda que estamos simulando lo que Vd. ve en la ventana real) En la parte inferior puede ver los identificadores que se han asociado a cada pgina. Qu podemos hacer para asociar estos identificadores a las lneas correspondientes del ndice ? Muy sencillo, y es el siguiente paso que debe hacer : Volvamos a la primera pgina del documento Word, donde tenemos el ndice. INDICE 1 - Introduccin a la aplicacin 2 - Acceso a la Base de Datos 3 - Introduccin de datos 4 - Lectura de datos Habr observado en las aplicaciones Windows que para seleccionar un tema hay que poner el puntero del ratn sobre la lnea deseada, que est en color verde, y en ese momento el puntero se convierte en una mano. En nuestra aplicacin ocurrir lo mismo. Seleccione todas las lneas que quiere asociar a cada uno de los identificadores (Una a una o todas a la vez, dependiendo de como las tenga dispuestas), y vaya al men Formato | Fuentes . Le aparecer el cuadro de dilogo. Vaya al TextBox Subrayado de ese cuadro de dilogo y elija Doble.

# #

Introduccin Acceso # Meterdatos # Leerdatos Pgina 249

Al ponerles doble subrayado, le aparecern en la ayuda de color verde, y el puntero se le transformar en una mano cuando lo ponga encima de una de esas lneas. Pero todava queda asociarlas a cada uno de los identificadores. Para ello tiene que llevar el puntero del ratn justamente al final de cada una de las lneas. Al hacer click el puntero de escritura se coloca en ese punto. Tiene que escribir a continuacin de cada lnea el nombre del identificador que corresponda. Pero lgicamente no querr que se vea en la pantalla de ayuda. Por lo tanto debe hacerlo invisible. Para escribir un texto invisible en Word hay que pulsar las teclas Control + Maysculas + O. Pulse las tres al mismo tiempo y a continuacin escriba el nombre del identificador que corresponda. No ver lo que escribe pues para eso est escribiendo con texto invisible. Puede visualizarlo mediante el botn

del editor Word. Ver tambin todos los caracteres de control del documento. Si lo prefiere, vaya al men Herramientas | Opciones y sobre la pestaa Ver seleccione Texto oculto. Proceda de igual forma con todas las lneas del ndice. Cuando termine, guarde el documento en formato RTF y complelo de la forma explicada mas atrs. Posiblemente ahora le salgan errores de compilacin, pues el compilador comprueba que todos los identificadores se corresponden en el ndice y en las pginas. Si le falta algn pie de pgina o un salto de carro manual le dar error. Tambin le dar un error, mejor dicho una observacin, indicndole que hay prrafos ocultos. Es lgico, ha detectado los textos ocultos que contiene el fichero. Ni caso. Le habr creado el archivo .HLP y le sugiero que lo pruebe, movindolo al directorio C :\DIRAYUDA y ejecutando la aplicacin. Pulse F1 y le saldr la pgina con el ndice y las lneas del ndice en verde. Si lo ha hecho todo perfectamente, al seleccionar una y otra lnea le aparecer la pgina correspondiente. Ya tenemos una ayuda de varias pginas ! Ventanas Emergentes Es posible que dentro de la informacin presentada en cualquiera de las pginas anteriores, exista una palabra o frase que quisiera explicar con mas detalles. Habr observado en las ayudas de Windows que algunas frases dentro de las pginas de ayuda estn en verde, y al acercar el puntero del ratn a ellas se convierte en una mano. Para poder hacer lo mismo en nuestra ayuda, volvamos al documento Word. Pgina 250

INDICE 1 - Introduccin a la aplicacin 2 - Acceso a la Base de Datos 3 - Introduccin de datos 4 - Lectura de datos - - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin a la Aplicacin Esta aplicacin est realizada para . . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de pgina manual # Acceso a la Base de Datos Para abrir la Base de datos . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de pgina manual - - - - - - - - - - - - - - - - - - - - - - - # Introduccin de datos Para introducir datos . . . . . . . . . . . . -------------------# Lectura de datos salto de pgina manual ---------------------------------------------

Para leer los datos . . . . . . . . . . . . . . . .

Observe unas palabras que estn subrayadas. Imagnese que esas palabras tienen un significado que queremos explicar con mayor detalle. Puestos en nuestro caso, queremos explicar con mas detalle lo que es una aplicacin, una Base de Datos, introducir y leer. Pretendemos que, al hacer click sobre una de estas palabras se abra, dentro de la ventana de ayuda, otra ventana con la explicacin de lo que es esa palabra concreta. Por lo tanto, debemos introducir esas informaciones a base de introducir nuevas pginas en el documento Word donde editamos el fichero de ayuda. Adalas de la misma forma insertndoles un pie de pgina y el identificador deseado, de la misma forma que se explic mas atrs. Recuerde que el identificador debe ser nico. Una vez terminado de introducir todas las nuevas pginas, vaya a las palabras o frases que quiere explicar con el texto de esas pginas, seleccinelas y deles el atributo de subrayado simple (Hgalo de forma similar a cuando hizo lo del subrayado doble, pero esta vez SIMPLE) Introduzca inmediatamente despus de la palabra o frase un texto oculto con el nombre del identificador seleccionado para la pgina deseada en esa palabra. Guarde el documento Word y vuelva a compilar como anteriormente. Ejecute la aplicacin y compruebe como vamos avanzando en el tema de las ayudas de Windows. Si repasamos las propiedades de los controles, seguro que se acuerda de la propiedad HelpContextID que tenan la mayora de los controles VB. En aquel momento decamos que esa propiedad que establece un nmero de contexto asociado para este control. Este nmero se aplica para determinar la ayuda interactiva asociada a este control. Ha llegado el momento de sacarle partido a esa propiedad. Podemos usar la tecla F1 para acceder al ndice de la ayuda de una aplicacin y movernos a lo largo de la ayuda seleccionando una u otra informacin. A veces resulta prctico seleccionar directamente la ayuda correspondiente a la funcin de un control. Para poder hacer esto, asociaremos una de las pginas del
# #

Introduccin Acceso # Meterdatos # Leerdatos Pgina 251

documento Word anterior al nmero que figura en la propiedad HelpContextID. Cuando ese control tenga el foco, al pulsar F1 saldr como pgina por defecto la pgina asociada mediante la propiedad HelpContextID. Para establecer esta relacin vayamos al fichero con extensin .HPJ que serva para introducir los datos al Help Compiler. En nuestro caso se llamaba FICHAYUD.HPJ y tena por el momento, solamente dos lneas. [FILES] AYUDA1.RTF En estas dos lneas le introducamos el nombre del fichero de ayuda [FILE]. Aadamos ahora en otro apartado [MAP] la relacin entre los identificadores de pgina y los nmeros de contexto de la propiedad HelpContextID de cada uno de los controles que la tengan activada (valor distinto a 0). Se escribir el nombre del identificador de pgina, y separado por un espacio o un tabulador, el nmero de contexto : [MAP] Identificador1 Identificador2 Identificador3 Identificador4

1 2 3 4

En este caso, cuando un control que tiene en su propiedad HelpContextID el nmero 3 tiene el foco, al pulsar F1 aparecer como pgina por defecto la correspondiente a la explicacin con identificador nombre Identificador3. Lo mismo ocurrir con el resto de los identificadores. Aada a su aplicacin 4 TextBox y asgneles los valores 1, 2, 3 y 4 a sus propiedades HelpContextID. Vuelva a compilar la ayuda y ejecute la aplicacin. Vaya pasando el foco de uno a otro TextBox y comprobndolo. Puede que las ayudas que quiera aportar a cada uno de los controles sea muy breve, 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. Y que esas ayudas breves sean muy numerosas y tal vez cambiantes de un usuario a otro. Esto complicara su fichero de ayuda original, al que debera introducir muchas pginas nuevas. Puede editar estas pequeas ayudas en otro documento Word, de la misma forma que se ha descrito, y darle un determinado nombre (AYUDA2.RTF para nuestro ejemplo) y aadirlo como otro fichero en la lista [FILES]. Colquelo tras el fichero anterior, pues el que lleva el ndice debe ser el primero que figure en la lista. Debe aadir la relacin entre los nombres de identificador que haya puesto en ese nuevo fichero y los nmeros de contexto de cada control. El fichero FICHAYUD.HPJ queda de momento con la siguiente forma : [FILES] AYUDA1.RTF AYUDA2.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4

1 2 3 4

Este procedimiento de acudir rpidamente a la ayuda de un determinado control puede que no sea el ideal, ya que en una aplicacin, siempre tiene el foco algn control. Si ese control que ahora mismo tiene el foco tiene activado el HelpContextID, y el usuario pulsa F1, con la intencin de ir a ver cualquier cosa no relacionada con el control que tiene actualmente el foco, se ver sorprendido con que aparece una informacin que nada tiene que ver con la esperada (ndice). En cualquier caso, siempre podr ir al ndice haciendo click en el botn CONTENIDO de la ventana de ayuda, pero en principio no est bien que le Pgina 252

aparezca en pantalla una informacin no esperada. Tiene solucin, incluya en el men (palabra Ayuda) o en un control Image con el smbolo ? una llamada al programa WINHELP.EXE, pasndole como parmetro el nombre del fichero de ayuda. Esto lo podemos hacer mediante la funcin SHELL SHELL WINHELP.EXE C:\DIRAYUDA\FICHAYUD.HLP , 1 (Vea funcin Shell. No se olvide del 1 final, pues si no lo pone la ayuda le saldr minimizada. Puede poner tambin un 4) Tambin puede utilizar para este fin el CommonDialog. Introduzca un CommonDialog en su aplicacin y ponga en su propiedad HelpFile el nombre del fichero de ayuda. La propiedad HelpCommand de este CommonDialog debe estar puesta a 3 para que comience mostrando el ndice de la ayuda. En estas condiciones, en vez de acudir a la funcin Shell para ejecutar el WINHELP.EXE, ejecute CommonDialog.ShowHelp. Vea con mas detalles las propiedades del CommonDialog, pues le permite presentar otras funciones de la ayuda de Windows (Ayuda de la Ayuda, etc.) Titulo de la ventana de Ayuda Habr observado que la ventana de ayuda tiene, en la barra de ttulo el siguiente texto : Ayuda de Windows. Si deseamos personalizarlo y poner el nombre de nuestra aplicacin, basta con aadir un par de lneas al fichero FICHAYUD.HPJ. Las correspondientes al apartado [OPTIONS]. Este apartado debe ir en primer lugar del fichero, y puede llevar la informacin de la barra de ttulo y el CopyRight. Estos dos parmetros se introducen de la siguiente forma : [OPTIONS] TITLE= Nuestra Aplicacin VB - Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1.RTF AYUDA2.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4

1 2 3 4

El dato introducido en la lnea COPYRIGHT sale en el men de la pantalla de ayuda, en Ayuda | Versin.

Grficos en la ventana de Ayuda. Si necesita introducir un grfico en la ventana de ayudas puede hacerlo de dos formas : - Introducirlo en el fichero Word. Esta opcin es recomendable si el grfico es muy pequeo. - Introducirlo directamente desde un fichero .BMP .WMF (Metarchivo). Recomendable grfico es grande. Este mtodo se denomina de referencia a un grfico.

cuando el

Para introducirlo por el primer procedimiento, inserte el grfico en el texto Word y proceda como siempre. Para introducirlo por el segundo mtodo, tiene tres posibilidades : Introducir el grfico en el centro de la ventana de ayuda, introducirlo a la izquierda con texto a su derecha o a la derecha con texto a su izquierda.

Pgina 253

Se supone que el grfico est en un fichero llamado GRAFICO1.BMP en el directorio C:\DIRAYUDA. Vayamos al documento Word, y en el sitio donde desee introducir el grfico inserte la(s) lnea(s) : {bmc c:\dirayuda\grafico1.bmp}Le colocar este grfico en medio de la ventana de ayuda, y este texto inmediatamente debajo del grfico. o {bml c:\dirayuda\grafico1.bmp}Le colocar este grfico a la izquierda de la ventana de ayuda, y este texto a la derecha del grfico. o {bmr c:\dirayuda\grafico1.bmp}Le colocar este grfico a la derecha de la ventana de ayuda, y este texto a la izquierda del grfico. Se han resaltado en negrita las tres opciones. Recuerde la llaves donde se encierra la posicin y el nombre (y path) del grfico. Debe tener cuidado al introducir grficos, ya que el compilador (HC.EXE) trabaja en DOS, y me da la impresin de que no utiliza mas que los primeros 640 Ks. de memoria. Con un grfico de 470 Ks. usado en la preparacin de estos apuntes fue incapaz de compilarlo, dando error de memoria insuficiente. (Y no es que el Ordenador no tenga RAM suficiente) Historial La Ayuda de Windows nos permite recordar todas las pginas sobre las que se hizo una consulta. Esto puede ser muy til, pues tenemos muy accesible los temas que hemos consultado, para poder realizar una nueva lectura de los mismos si fuese necesario. Para obtener la ventana de historial, basta con hacer click en la barra de men de la ventana de Ayuda en Opciones | Mostrar Ventana de Historial. Pero para que se pueda mostrar el historial, es necesario darle un nombre a las pginas, y ser ese nombre el que figure en la ventana de historial. Ese nombre es distinto del identificador de pgina, aunque no hay ningn problema porque sea el mismo. Ponga como nombre de la pgina una palabra que identifique esa pgina de una forma nica. Para poner el nombre a la pgina, vaya al comienzo de cada pgina e introduzca una nota al pi de la misma forma que cuando pona el identificador. En este caso el smbolo a introducir en la Marca personal es el $. 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 pgina usando como criterio de bsqueda ciertas palabras que ponemos como clave. Por ejemplo, si queremos que aparezca nuestra pgina de ejemplo que habla de Acceso a la Base de Datos, cuando el usuario busca una de las siguientes palabras : Tablas, Base, Registro, y a la de Lectura de Datos cuando busque Obtener, Leer y Visualizar Volvamos al editor Word, a las dos pginas nombradas y al lado de las notas al pi anteriores, introduzca otra, esta con la Marca personal K. En la parte inferior de la pantalla, donde pone el nombre de la nota al pie, ponga introduzca las palabras clave para cada una de ellas, separadas con una coma. Salve el fichero RTF y vuelva a compilar. Ejecute la aplicacin y saque la Ayuda. Observar que el botn Bsqueda de la ventana de ayuda est habilitado. Haga click en este botn y ver que esas palabras ya figuran en la lista. Usar los Grficos de la Ayuda como enlaces a pginas Lo mismo que hacamos con las palabras, bien las del ndice, a las que con un subrayado doble les introducamos un enlace a una pgina, o con cualquier palabra o frase de una pgina, que mediante un Pgina 254

subrayado simple les introducamos un enlace a una ventana emergente, lo mismo podemos hacer con la referencia a un grfico. (Vea un poco mas arriba, las referencias a los grficos del tipo {bmc c:\dirayuda\grafico1.bmp} ) Si seleccionamos esa referencia y le ponemos el atributo de doble subrayado, al acercar el puntero del ratn a ese grfico (en la ayuda) nos mostrar una mano, y haciendo click sobre el grfico sacar la pgina correspondiente. Si le ponemos el atributo de subrayado simple, nos sacar una ventana emergente. Eso s, en cualquiera de los dos casos, deberemos poner, a continuacin de la referencia al grfico, con texto invisible, el indicador de pgina que especifique la pgina o ventana emergente que queremos mostrar. Pginas en secuencia Si tenemos una ayuda muy larga y la queremos leer toda, con lo que sabemos deberamos ir al ndice y desde all acceder a la pgina 1, leerla, volver al ndice, acceder a la pgina 2, leerla, volver al ndice .... Para evitar este proceso, y acceder secuencialmente a cada una de las pginas, podemos asignar a cada una de las pginas un cdigo de secuencia, que podr estar formado por caracteres alfanumricos. Este cdigo de secuencia ser el que marque el orden de aparicin de las pginas. Pero el orden de aparicin ser segn el cdigo ASCII de los caracteres que formen ese cdigo, comenzando por la izquierda. Por lo tanto puede ocurrirle la paradoja de que aparezca primero la pgina 100 que la 65. Es decir, si los cdigos estn formados por nmeros aparecern primero todas las pginas que comiencen por 1, aunque el valor numrico de una de ellas sea superior a otra que comience por 2, 3, 4, ... Para asignar este cdigo de secuencia deberemos introducir otra nota al pi para cada pgina, en este caso con la marca personal + (signo mas). Tambin deberemos indicarle al WinHelp que deseamos sacar los botones (<<) y (>>) para desplazarnos por las pginas. Esto se consigue aadiendo una nueva seccin al archivo .HPJ que se denomina [CONFIG] y le introduciremos en esta seccin la expresin BrowseButtons() El fichero FICHAYUD.HPJ quedar de la siguiente forma :

[OPTIONS] TITLE= Nuestra Aplicacin VB - Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1.RTF AYUDA2.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 [CONFIG] BrowseButtons() Encabezado de pginas Habr observado en la ayuda de Visual basic que una o dos lneas en la parte superior de la ventana de ayuda se conservan all continuamente aunque nos desplacemos hacia abajo mediante los cursores de desplazamiento. Esas lneas son el Encabezado de pgina. Para conseguir esto en nuestra ayuda deberemos escribir las lneas que queramos que se conserven como encabezado de pgina al principio de cada pgina, seleccionarlas con el cursor del ratn y abrir el men Formato | Prrafo (Se supone que est utilizando el procesador de texto Microsoft Word) donde le aparecer un cuadro de dilogo con dos solapas, Sangra y Espacio y Presentacin. Elija Presentacin y dentro de esta solapa, active la casilla Conservar con el Siguiente. Las lneas que hubiera seleccionado se le conservarn como Encabezado de pgina. Pgina 255

1 2 3 4

VENTANAS MULTIPLES Con frecuencia es til emplear varias ventanas para mostrar la informacin de una aplicacin. El ejemplo que tenemos mas a mano es el de la Ayuda de Visual Basic. Cuando tenemos seleccionada la ayuda de un control, se pueden observar al menos dos palabras que nos llevan a una segunda ventana : Propiedades y Eventos. Cuando elegimos una de estas informaciones aparece una segunda ventana que nos muestra la informacin pedida, sin perder la informacin que tenemos en la primera ventana. Esta segunda ventana se comporta de manera idntica a la primera, en cuanto a llamadas a otras pginas o a mens emergentes. Para poder presentar esta segunda ventana es necesario primero definirla. Para ello volvamos a nuestro fichero .HPJ y le aadiremos un nuevo apartado : WINDOWS, donde introduciremos el nombre de la nueva ventana, el ttulo de la misma (El ttulo que aparecer en su parte superior), y, entre parntesis, su posicin y dimensiones. El fichero .HPJ quedar de la siguiente forma, tras introducirle dos nuevas ventanas : [OPTIONS] TITLE= Nuestra Aplicacin VB - Fichero de Ayuda COPYRIGHT= Nombre del Autor(a) [FILES] AYUDA1.RTF AYUDA2.RTF [MAP] Identificador1 Identificador2 Identificador3 Identificador4 [CONFIG] BrowseButtons() [WINDOWS] Pgina 256

1 2 3 4

Ventana2 = Titulo de esta Ventana, (PosicinX, PosicinY, DimensinX, DimensinY) Ventana3 = Titulo de esta Ventana, (PosicinX, PosicinY, DimensinX, DimensinY) Para llevar la informacin a una de estas ventanas, en vez de a la ventana principal, se aadir tras el identificador de la pgina que queremos enviar a la nueva ventana el smbolo > y a continuacin el nombre de la ventana. El Objeto App Introducimos aqu un nuevo objeto Visual Basic. El objeto App es un objeto global al que se accede con la palabra clave App. (No se le. El objeto App no es ni mas ni menos que un conjunto de datos acerca de la aplicacin) Determina o especifica informacin sobre el ttulo de la aplicacin, la ruta de acceso de su archivo ejecutable y los archivos de Ayuda, y si est ejecutndose una instancia anterior de la aplicacin. Este objeto tiene solamente propiedades. No tiene ni Eventos ni Mtodos. Una de sus propiedades es HelpFile, propiedad que es de lectura y escritura. Es decir, podemos obtener el nombre del fichero de ayuda de una aplicacin consultando el valor de esa propiedad del Objeto App. En el ejemplo siguiente introducimos el nombre del fichero de ayuda en el Label1 Label1.caption= App.HelpFile Como la propiedad HelpFile tambin es de escritura, se puede cambiar en tiempo de ejecucin el fichero de ayuda. Piense lo til que puede resultar esto para cambiar el idioma de la ayuda de una aplicacin. Para ello basta con imponer el nombre (con su Path) del nuevo fichero de ayuda : App.HelpFile = "C:\ ..... \ ..... \ nuevaayuda.hlp" (Vea un poco mas adelante mas informacin sobre el Objeto App) Otros Compiladores de Ayuda (HCP.EXE, HCW.EXE, ...) En este captulo hemos citado como compilador del fichero de ayuda al programa HC.EXE que habitualmente se encuentra en el directorio C :\ . . . . \ VB\HC. Este compilador trabaja perfectamente con ficheros .RTF creados con las versiones primeras del Word. Si Ud. realiza los ficheros .RTF con el Word para Windows95 (Word 6.0), no habr tenido ningn problema con lo descrito anteriormente. Si tiene Word de office97 (W97) habr observado que al compilar la ayuda con el HC.EXE le sale un error. No se preocupe. Es que el fichero RTF creado por W97 es distinto del creado por W95, lo cual, aparte de dar una idea de como se trabajan los temas de compatibilidad entre procesadores que deberan ser compatibles, nos obliga a buscar otro compilador de ayudas. No lo intente con el HCP.EXE. Tampoco vale. Busque por Internet un fichero llamado HCW.EXE, compilador que tiene adems la ventaja de que trabaja en Windows. Usa el mismo fichero .HPJ y acepta los ficheros .RTF creados con W95 y W97 El aspecto de este compilador de ayudas es el siguiente :

Pgina 257

Aparte de este compilador, existen otros que funcionan de forma similar. No vamos a explicar cada uno de los compiladores que podamos encontrar, que como se dijo hay bastantes y ( creo que) shareware. Lo importante es que todo lo dicho respecto a la edicin de los ficheros :RTF y .HPJ sigue siendo vlida para estos compiladores. Existen algunos compiladores que tambin crean el fichero .HPJ. Es comprensible no intentar examinar uno a uno en esta Gua del Estudiante.

Pgina 258

El Objeto App
Este objeto, como se dijo mas atrs, es el objeto Visual Basic que contiene diversas informaciones acerca de la Aplicacin. Alguna de estas informaciones se le pueden introducir al proyecto en tiempo de diseo, 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 dilogo Opciones de EXE. Para ver este cuadro proceda de la misma forma que si fuese a crear un archivo .EXE de la Aplicacin, Haga click en Archivo | Crear Archivo EXE de la Barra de Men, y una vez que le aparezca el cuadro de dilogo para introducir el nombre, haga click en OPCIONES. Estas informaciones son las Propiedades del objeto App. Este objeto no tiene Mtodos ni Eventos. Comments (Propiedad) Devuelve o establece una cadena que contiene comentarios sobre la aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.Comments Se establece esta propiedad en tiempo de diseo 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 aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.CompanyName Se establece esta propiedad en tiempo de diseo usando el cuadro de Opciones de EXE. Visual Basic toma por defecto el nombre de la compaa con que se carg VB. EXEName (Propiedad)

Devuelve el nombre raz (sin la extensin) del archivo ejecutable que se est ejecutando actualmente. Si se utiliza en el entorno de desarrollo, devuelve el nombre del proyecto. Sintaxis 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 informacin de los archivo de la aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.FileDescription

Se establece esta propiedad en tiempo de diseo usando el cuadro Opciones de EXE.

HelpFile (Propiedad) Ya comentada mas atrs. Especifica el nombre (con su Path) del fichero de ayuda. Se introduce en tiempo de diseo en el cuadro de Opciones. Puede cambiarse en tiempo de ejecucin.

hInstance (Propiedad) Pgina 259

Devuelve el controlador de la instancia de la aplicacin. Sintaxis App.hInstance Para aplicaciones hechas en 16 bits, el nmero devuelto es un integer. Para las hechas en 32 bits, un Long. 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 informacin de derechos de autor sobre la aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.LegalCopyright Esta propiedad se establece en el cuadro de dilogo Opciones de EXE. LegalTrademarks (Propiedad) Devuelve o establece un valor de tipo String que contiene informacin de marca registrada sobre la aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.LegalTrademarks Establezca esta propiedad en tiempo de diseo usando el cuadro de dilogo Opciones de EXE.

Major Minor (Propiedades)

Devuelven o establecen el nmero mayor (menor) de la versin del proyecto. Es de slo lectura en tiempo de ejecucin. Sintaxis App.Major App.Minor

El valor de estas propiedades estn dentro del rango 0 a 9999. Proporcionan informacin sobre la versin de la aplicacin en ejecucin. Se establecen en tiempo de diseo usando el cuadro de dilogo Opciones de EXE. Path (Propiedad) Especifica la ruta de acceso del archivo .VBP de proyecto cuando se ejecuta la aplicacin desde el entorno de desarrollo o la ruta de acceso del archivo .EXE cuando se ejecuta la aplicacin como un archivo ejecutable. Esta propiedad es sumamente til. Cuando se realiza una aplicacin, 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 inicializacin, que deberan estar en el mismo directorio de la aplicacin. Si queremos abrir el fichero MiAplicacion.INI que estar obligatoriamente en el mismo directorio de la aplicacin (aunque no conocemos su nombre), solamente tenemos que poner la lnea de cdigo : Open App.Path & \MiAplicacion.INI For Input as # 1, sin importarnos cual es el nombre real de ese directorio. PrevInstance (Propiedad) Devuelve un valor que indica si hay ya en ejecucin una instancia anterior de una aplicacin. Pgina 260

Sintaxis App.PrevInstance Puede utilizar esta propiedad en un procedimiento de evento Load para determinar si el usuario ya est ejecutando una instancia de una aplicacin. Dependiendo de la aplicacin, puede ser conveniente que slo haya una instancia de la misma en ejecucin 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 aplicacin en ejecucin. Es de slo lectura en tiempo de ejecucin. Sintaxis App.ProductName Establezca esta propiedad en tiempo de diseo usando el cuadro de dilogo Opciones de EXE. Revision (Propiedad) Devuelve o establece el nmero de revisin de la versin del proyecto. Es de slo lectura en tiempo de ejecucin. Sintaxis App.Revision El valor de la propiedad Revision est dentro del rango 0 a 9999.Esta propiedad proporciona informacin sobre la versin de la aplicacin en ejecucin. Esta propiedad se establece en tiempo de diseo usando el cuadro de dilogo Opciones de EXE. StartMode (Propiedad) Devuelve o establece un valor que determina si una aplicacin se inicia como proyecto independiente o como servidor de automatizacin OLE. De slo lectura en tiempo de ejecucin. Sintaxis App.StartMode = Valor Donde Valor es un nmero o una constante que determina la forma de inicio : Constante vbSModeStandalone vbSModeAutomation TaskVisible (Propiedad) Devuelve o establece un valor que determina si la aplicacin aparece en la lista de tareas de Windows. Sintaxis App.TaskVisible [= booleano] Donde booleano puede tomar los valores True o False : True False (Predeterminado) La aplicacin aparece en la lista de tareas de Windows. La aplicacin no aparece en la lista de tareas de Windows. Valor 0 1 Descripcin (Predeterminado) La aplicacin se inicia como proyecto independiente. La aplicacin se inicia como servidor de automatizacin OLE.

La propiedad TaskVisible slo puede establecerse a False en aplicaciones que no presenten interfaz, como servidores OLE que no contengan o presenten objetos Form. Mientras la aplicacin disponga de interfaz grfica, la propiedad TaskVisible se establece automticamente a True.

Pgina 261

Title (Propiedad) Devuelve o establece el ttulo de la aplicacin que aparecen en la Lista de tareas de Microsoft Windows. Si se modifica en tiempo de ejecucin, los cambios no se guardarn con la aplicacin. Sintaxis App.Title [= valor] Valor ser una expresin de cadena que especifica el ttulo de la aplicacin. La longitud mxima de valor es 40 caracteres. Esta propiedad est disponible en tiempo de diseo en el cuadro de dilogo del comando Crear EXE del men Archivo. Todos estos datos figuran en el archivo de proyecto (.VBP). Puede verse editndolo con el Block de Notas de Windows, e incluso pueden modificarse estas propiedades directamente sobre ese archivo. FIN del captulo decimocuarto de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 262

Visual Basic - Gua del Estudiante Cap. 15 Procedimientos y funciones en VB Procedimiento


Un Procedimiento en Visual Basic es un trozo de cdigo que realiza una determinada tarea. Un procedimiento es el cdigo 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 cdigo tantas veces como sea necesario en los puntos del programa que as lo pidan. Esto nos llevara a escribir lneas y lneas repetidas en nuestras aplicaciones, con el consiguiente incremento de trabajo y del volumen de la aplicacin. Podemos hacer otra cosa mas prctica y elegante. Escribir ese cdigo una sola vez, creando con l un Procedimiento. Este Procedimiento tendr un nombre, y cada vez que queramos que se ejecute ese cdigo bastar con nombrar por ese nombre al Procedimiento. Un procedimiento puede insertarse en un Mdulo 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 cdigo. Para habilitarla, abra la ventana de cdigo del Formulario o Mdulo 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 Procedimiento (Veremos mas adelante la Funcin) 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 Mdulo del programa. Dependiendo de donde se haya insertado el Procedimiento (Formulario o Mdulo), debe citarse de la siguiente forma : Si se ha insertado en un Mdulo, puede citarse solamente por su nombre. Puede citarse tambin por el nombre del mdulo seguido por el nombre del procedimiento, separando ambos por un punto. Si el procedimiento tiene por nombre NombreProcedimiento y se ha insertado en el Mdulo1 puede citarse de las dos formas siguientes en cualquier parte del programa: NombreProcedimiento Pgina 263

Modulo1.NombreProcedimiento Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre. Desde otro Formulario o Mdulo, 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, slo se podr acceder a ese Procedimiento desde el Formulario o Mdulo donde se haya insertado. La caja de opcin (Check) que pone Todas las variables locales como estticas nos va a poner todas las variables declaradas dentro del procedimiento como estticas (No ponen a cero o nulo su valor cuando salimos y volvemos a entrar en ese procedimiento). Puede ahorrarnos un poco de cdigo. El cdigo de los Procedimientos se guarda en el General del Formulario o Mdulo donde se han insertado :

Funciones
Una funcin es una forma especial de realizar un procedimiento. En realidad es un procedimiento al que le pasamos una o varios parmetros con los que realizar una operacin (cualquier operacin, no tiene porqu ser matemtica) y obtendr un resultado de esos parmetros. Este resultado puede leerse desde otra parte de la aplicacin. Para insertar una Funcin se procede de igual forma que para un Procedimiento, pero marcando el botn de opcin Tipo Procedimiento en la caja de dilogo de la figura anterior. El mbito de una Funcin es el mismo que el un Procedimiento. Si se declara Pblica puede usarse en toda la aplicacin. Si se declara Privada, solamente en el Formulario o Mdulo donde se haya insertado. Para llamar a una Funcin son vlidos igualmente los criterios expuestos para los Procedimientos. Parmetros de una Funcin

Pgina 264

Se dijo anteriormente que a una Funcin se le pasan uno o varios parmetros con los que va a realizar alguna operacin. Al declarar la Funcin, hay que decirle el nombre de los parmetros que se le van a pasar, de que tipo son (String, Integer, Boolean, ...) y cmo se le van a pasar ( ByVal, ByRef, ParamArray). Esto hay que introducrselo en la propia declaracin Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) End Function La funcin MiFuncion sabe que debe recibir dos parmetros, y que el primero ser una cadena de caracteres y el segundo un integer. Los nombres Variable1 y Variable2 son los nombres que usa la Funcin internamente. No tienen porqu coincidir con los nombres que tengan las variables que contienen esos valores en otras partes del programa. Una funcin siempre da un resultado. Este resultado se le puede sacar mediante una variable o tomarlo directamente de la funcin. Imaginemos que lo que va a hacer la funcin de este ejemplo es tomar una cadena de caracteres (Variable1) y obtener de ella otra cadena con los caracteres iniciales de la primera, tantos caracteres como nos indique la segunda variable (Variable2) Si, por ejemplo, le passemos los valores : Variable1 = Gua del Estudiante Variable2 = 14 Obtendramos como resultado la cadena Gua del Estud

Ya se habr dado cuenta de que debemos emplear Left para obtener los caracteres iniciales de una cadena. Nuestra funcin quedar de la forma : Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) resultado =Left (Variable1, Variable2) End Function Donde resultado debe ser una variable declarada de tal forma que el mbito de esa variable la haga visible en esta funcin y el la parte del programa donde se va a usar. Para llamar a la funcin, basta con citarla por su nombre y luego tomar el valor de la variable resultado. Esta es una forma de hacerlo. Sin embargo existe otra mas elegante : Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) As String MiFuncion =Left (Variable1, Variable2) End Function (Observe que hemos aadido la expresin As String al final de la declaracin. Esto quiere significa que le estamos diciendo a la funcin que su resultado es un String, y que adems puede obtenerse el resultado de esta funcin usando solamente el nombre de la funcin) En cualquier parte del programa podemos poner : Label1.caption = MiFuncion (Gua del Estudiante, 14) y Label1 tomar como Caption la cadena Gua del Estud Pruebe esto con una pequea aplicacin. En un formulario, ponga un TextBox (Text1) donde va a introducir la cadena original, otro TextBox donde va a introducir el nmero de caracteres a tomar, y un Label (Label1) donde va a ver el resultado. Ponga un Botn de comando (Command1) donde llamar a la funcin. Inserte una funcin (MiFuncion) en ese formulario : Pgina 265

Private Sub Command1_Click() Label1.Caption = MiFuncion(Text1.Text, Val(Text2.Text)) End Sub

Public Function MiFuncion(ByVal Variable1 As String, ByVal Variable2 As Integer) As String MiFuncion = Left(Variable1, Variable2) End Function Puede pensar que para hacer esta cosa tan elemental no merece la pena hacer una funcin. Efectivamente. Bastara con poner en el botn Command1_Click el siguiente cdigo : Label1.Caption = Left(Text1.Text, Val(Text2.Text)) y funcionara igual. Lgicamente, una funcin debe introducirse cuando vaya a realizar un cdigo un poco mas complejo, y sobre todo, cuando se va a repetir en muchos procedimientos. Hemos visto que los parmetros de la funcin pueden pasarse Por Valor ( ByVal), caso del ejemplo anterior, y Por Referencia (ByRef). Cul es la diferencia ? La diferencia es que si le pasa un valor por valor (ByVal) ese valor, aunque lo cambie la funcin internamente, ese cambio no se manifiesta fuera de ella. Si se pasa por referencia (ByRef), y la funcin cambia el valor de esa variable, ese cambio se mantiene fuera de la funcin. Veamos esto de una forma muy sencilla : Vamos a hacer una funcin que multiplica dos nmeros. Pero dentro de la funcin vamos a cambiar uno de esos nmeros, sumndole 2. Una vez realizada la operacin presentamos el valor de los dos factores en dos Label a ver si ha cambiado. Insertemos dos funciones, MultiplicaA y MultiplicaB. En MultiplicaA le introducimos los datos Por Valor y en MultiplicaB por Referencia. Public Function MultiplicaA(ByVal X1 As Integer, ByVal X2 As Integer) As Integer x1 = x1 + 2 MultiplicaA = x1 * x2 End Function Public Function MultiplicaB(ByRef X1 As Integer, ByRef X2 As Integer) As Integer x1 = x1 + 2 MultiplicaB = x1 * x2 End Function Las dos funciones son idnticas, excepto en la forma de pasarle los parmetros. Pongamos un Botn de Comando para multiplicarlo con MultiplicaA y otro con MultiplicaB. Al final del procedimiento click de cada uno de ellos presentamos las dos variables que se pasan a la funcin en sendos Label. Cuando se usa MultiplicaA el valor de X1 (pepe en el CommandButton) se mantiene. 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, juan) Label2 = pepe Label3 = juan End Sub Tras esto, se pone en Lable2 el valor pepe Private Sub Command2_Click() Pgina 266

Dim pepe As Integer Dim juan As Integer pepe = Val(Text1) juan = Val(Text2) Label1 = MultiplicaB(pepe, juan) Label2 = pepe Label3 = juan End Sub Tras esto, se pone en Label2 el valor pepe + 2 (se mantienen el cambio realizado en la funcin MultiplicaB x1 = x1 + 2 No queda ah la cosa. Un valor puede pasarse tambin por ParamArray. En principio parece que esto ya es para nota. No es para tanto. Vamos a ver que sucede cuando queremos realizar una suma. La suma de los importes de varios productos de un ticket de compra. En principio no sabemos cuantos productos va a comprar un cliente, por lo tanto no sabemos a priori cuantos parmetros le tenemos que pasar. Para pode pasar un nmero indeterminado de parmetros 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.Caption = suma End Sub Private Sub Command2_Click() sumacifras 1, 2, 3, 4, 5, 6, 7, 8 End Sub Este cdigo 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 parmetros : Optional Cuando se declara una funcin con un determinado nmero de parmetros, es necesario pasrselos todos. Si no se hace as, VB nos dar un error. Pero puede que algn parmetro no exista siempre. Cuando uno o varios de los parmetros que se pasan a una funcin son opcionales, se le pueden pasar como Optional. Se pueden pasar uno o mas parmetros como Optional. Las condiciones para los parmetros opcionales es que ocupen los ltimos lugares y que sean del tipo Variant Hagamos un ejemplo en el que vamos a poner en un TextBox (TB4) el nombre y apellidos de una persona. El segundo apellido se lo pasamos como Opcional. La declaracin de la funcin ser : Public Function SUMANOMBRES(NOMBRE As String, APE1 As String, Optional APE2 _ As Variant) Debemos detectar si se le ha pasado el parmetro opcional. Usamos para ello IsMissing If IsMissing (APE2) Then TB4.Text = NOMBRE & " " & APE1 Else TB4.Text = NOMBRE & " " & APE1 & " " & APE2 End If End Function

Pgina 267

Los parmetros los tomamos de tres TextBox (TB1, TB2 y TB3, siendo este ltimo el que es opcional. En un botn de comando ponemos este cdigo : Private Sub Command1_Click() If TB3 <> "" Then SUMANOMBRES TB1, TB2, TB3 Else SUMANOMBRES TB1, TB2 End If End Sub Salir de una funcin La forma natural de salir de una funcin es cuando se ejecuta todo su cdigo. Al final siempre tiene la sentencia End Function Se puede salir de una funcin antes de que termine. Por ejemplo, si se cumple una determinada condicin, se puede salir de la funcin mediante la sentencia Exit Function LA FUNCION Main () Tal como se ha visto en el capitulo 2

Funciones API de Windows


Todo lo que hemos visto hasta ahora de funciones se basa en declarar una funcin, ponerle un nombre, declarar los parmetros que se han de pasar y escribir el cdigo correspondiente. Windows dispone de una serie de funciones preescritas (en cdigo mquina) que estn ah para que las aproveche cualquier programa. Estas funciones se llaman API (Interfaz para Programacin de Aplicaciones) y estn en las innumerables DLLs que tiene Windows. Dado que ya estn escritas, y que tienen un cdigo que permite hacer cosas que sera imposible o al menos muy complicado hacerlas con Visual Basic, es muy interesante utilizarlas. Precaucin : Las APIs son distintas para 16 y 32 bits. Cuando estemos desarrollando aplicaciones para poder compilarlas en 16 o 32 bits, debe tomarse la precaucin de usar la Compilacin Condicional que se ver mas adelante. Existe otro inconveniente. Hay APIs para 32 bits que no tienen su homnimo en 16 bits. Dado que estos apuntes tienen logicamente un alcance limitado, y el tema de APIs es enorme, se recomienda recurrir a un libro especfico de APIs. Este no puede ser otro que el siguiente : TITULO API de Win32. Gua del Programador de Visual Basic AUTOR Daniel Appleman. Editorial InforBooks - Barcelona ISBN 84-89700-22-2 Citaremos este libro repetidas veces a lo largo de este captulo. Para usar una funcin API lo primeros que tenemos que hacer es declararla en nuestra aplicacin. La declaracin debe hacerse en la seccin de declaraciones de un formulario o mdulo. En la declaracin debe figurar la librera donde est escrita esa funcin, y el nmero y orden de los parmetros que hay que pasarle. Una declaracin sencilla podra ser la de la funcin API Sleep : Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) En esta declaracin lo que le estamos diciendo es que, en la librera kernel32 est escrita una funcin llamada Sleep (Es el nombre que figura entre comillas en la declaracin) y que le tenemos que pasar un parmetro, concretamente el tiempo que queremos que se pare la aplicacin, expresado en milisegundos. Nos dice la declaracin que el parmetro se le pasa Por Valor (ByVal) y que ese dato debe ser un Long, Pgina 268

es decir, si se lo pasamos como una variable, esa variable debe ser del tipo Long. Una vez declarada esta funcin, en la seccin de declaraciones de un mdulo, podremos acceder a ella en cualquier parte de la aplicacin usando una lnea de cdigo como esta : Sleep (500) Sleep (tiempo) y la aplicacin se detendr media segundo cuando llegue a esa lnea donde tiempo es una variable tipo Long que contiene el tiempo (en milisegundos) que queremos detener el programa.

Esta API es muy sencilla. Por eso comenzamos por ella. La hay mas complicadas. Por ejemplo, la que obtiene el nmero de serie del disco duro : GetVolumeInformation Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal _ lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize _ As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _ lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal _ nFileSystemNameSize As Long) As Long Aqu ya se ha complicado un poco la cosa. Pero tras un anlisis detenido veremos que esa complicacin es slo aparente. En primer lugar vemos que la librera donde est esta funcin es, como en la funcin Sleep, el kernel32 (Kernel = Ncleo). Esto quiere decir que la librera kernel32 contiene varias funciones. Pero qu es la librera kernel32 ? Ni mas ni menos que una DLL llamada kernel32.dll que puede encontrar en el directorio C :\WINDOWS\SYSTEM. En segundo lugar, vemos que el nombre de esta funcin es GetVolumeInformationA, que es lo que figura entre parntesis en la declaracin, y es el nombre que esa dll kernel32 tiene escrito dentro de ella. El nombre GetVolumeInformation que figura como nombre de la funcin, al principio de la declaracin, es el nombre por el que nos vamos a referir a la funcin en nuestra aplicacin. Ese nombre puede cambiarse, cambiando tambin el nombre con el que vamos a llamar a esta funcin a lo largo de nuestra aplicacin. Esto se lo digo solamente a nivel informativo. No lo haga. Su aplicacin no podra ser interpretada por otra persona. No es profesional y quien mas perder por ello es Vd. Le hago especial hincapi en esto, porque es una forma de proteger sus programas por parte de algunos programadores. Pero un analista experto encuentra enseguida el truco. Y algunos no perdonan. Seamos profesionales En tercer lugar, vemos que la declaracin de esta funcin termina con la expresin As Long. Esto significa que esta funcin devuelve un dato, y es concretamente, un Long. Por lo tanto, habr que obtener ese dato que nos devuelve, lo utilicemos o no. Concretamente, esta funcin devuelve un 0 si ha existido algn problema para obtener el nmero del disco, o un nmero distinto de 0 si lo ha obtenido. Las dems constantes deberemos declararlas en el procedimiento donde vamos a usar la funcin (o en otro lugar, si as lo exige el mbito que les queramos dar, pero generalmente, en el mismo procedimiento), e invocar la funcin pasndole los parmetros correctos : En el ejercicio realizado para hacer estos apuntes, este cdigo se meti en el procedimiento click de un botn de comando. Declaramos las variables. Observe que no tienen por qu tener el mismo nombre que en la declaracin de la funcin. Dim volbuf As String Dim sysname As String Dim serialnum As Long Dim sysflags As Long Dim componentlength As Long Dim res As Long volbuf = String(256, 0) sysname = String(256, 0)

esta variable ser la que contenga el nmero del disco lpFileSystemFlags lpMaximumComponentLength

Pgina 269

Estas variables son las que se van a pasar como parmetros a la funcin. La correspondencia entre el nombre del parmetro y cada una de las variables es la siguiente : lpRootPathName Se lo metemos directamente : C :\ - no olvidar la barra \ lpVolumeNameBuffer volbuf nVolumeNameSize Tamao del buffer anterior. Directamente 255 lpVolumeSerialNumber serialnum. Contendr el nmero del disco lpMaximumComponentLength componentlength lpFileSystemFlags sysflags lpFileSystemNameBuffer sysname nFileSystemNameSize Tamao buffer anterior. Directo, 255 res = GetVolumeInformation("C:\", volbuf, 255, serialnum, componentlength, sysflags, _ sysname, 255) If res = 0 Then ' ha ocurrido un error y no puede leer el VOL MsgBox ("Ha ocurrido un error al intentar arrancar la aplicacin.") Else 'lo ha ledo perfectamente VOLUM = Trim(Str(serialnum)) 'convertimos un Long en String 'si tiene menos de 12 caracteres, le aadimos los ceros necesarios por la izquierda If Len(VOLUM) < 12 Then VOLUM = String(12 - Len(VOLUM), "0") & VOLUM ' lo presentamos en el TextBox TBVOL TBVOL.Text = VOLUM End If Podemos presentar en otros TextBox o Label el resto de los parmetros que nos devolvern un dato. Salen, para el PC del autor de estos apuntes : volbuf = MS-DOS_6 componentlength = 255 sysflags = 16390 sysname = FAT Vemos que no es tan complicado operar con funciones API. Esta ltima que hemos visto puede tener utilidad para comprobar si el ordenador en el que se est ejecutando la aplicacin es el mismo para el que se prepar esa aplicacin. Pese a que es algo complicada, hemos podido con ella. Para trabajar con APIs solamente es necesario conocer la sintaxis exacta de la declaracin. Pero parece en principio un poco difcil, a sabiendas de que deben existir varios cientos de APIs. SOLUCION : Que VB nos aporte un chuleta con todas las declaraciones. Esta chuleta no es otro que el Visor de Texto API (API Text Wiever en Ingls). Este es un programa que se distribuye con Visual Basic y que se instala al tiempo que este, formando parte del mismo grupo de programas. Haciendo clic en su icono aparece esta ventana :

Pgina 270

Haciendo Click sobre la palabra Archivo de la Barra de Men, aparecen unos ficheros que contienen las declaraciones de las funciones API : Win32Api.txt Winmmsys.txt Estos dos ficheros son los que suministra Microsoft con VB4. (Para la versin de 32 bits) El primero contiene las declaraciones de las funciones API no relacionadas con el tema multimedia. El segundo contiene las declaraciones de las API relacionadas con este tema de multimedia. Si ha adquirido el libro de Appleman puede tener otro fichero : Api32.txt. El autor de este libro asegura que es mucho mas completo que el fichero que entrega Microsoft. De hecho contiene bastantes mas declaraciones. Error en el fichero Win32Api.txt de la versin en castellano de Visual Basic 4 En las declaraciones de APIs que usan la librera kernel32, se ha traducido el nombre de la librera. Esta es la declaracin que trae para la funcin Sleep : Declare Sub Sleep Lib "ncleo32" Alias "Sleep" (ByVal dwMilliseconds As Long) Como podr darse cuenta, el haber traducido el nombre de la librera llevar a V.B. a buscar una DLL llamada ncleo32 que no existe, y dar error. Estos ficheros estn en ASCII. Puede convertirlos a una base de datos ACCESS y el acceso ser un poco mas rpido. No olvide que tambin le ocupar un sitio respetable en el disco duro de su ordenador. Para obtener una o varias declaraciones, seleccione las funciones en la ventana de arriba del visor, haga click en Agregar y esa funcin le pasar para la ventana de abajo. Una vez que tenga en esa ventana todas las funciones que necesita, haga click en el botn Copiar y las declaraciones completas le pasarn al portapapeles. Una vez que ya sabemos donde se pueden copiar las declaraciones de las APIs, veamos una que nos permitir obtener la hora desde el sistema operativo :

Pgina 271

Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime _ As SYSTEMTIME) Ahora nos surge una duda Qu es SYSTEMTIME ? Es una variable que hay que declararla con la instruccin Type, igual que hacamos con las variables con varios campos en los ficheros tipo Random. Repase este captulo si no lo tiene claro. Para poder declarar esta variable, podemos obtener su declaracin del mismo Visor de Texto API Para ello, en la ventana Tipo API en vez de figurar Declaraciones debe poner Tipos. Busque esta opcin desplegando la ventana con la flecha que tiene a la derecha. Busque ahora la variable cuya declaracin quiere conocer. Repitiendo el proceso anterior, se llevar en el portapapeles la declaracin de la variable : Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Haga un pequeo ejercicio para obtener la fecha y hora usando un API : Para ello debemos introducir un mdulo donde definiremos la variable SYSTEMTIME y donde podemos declarar la funcin GetSystemTime : Mdulo 1 Declaraciones _____________ Option Explicit Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) Ahora en un Formulario, ponemos 8 TextBox (uno para cada datos) y un botn de comando, donde ponemos el siguiente cdigo : Private Sub Command1_Click() Dim Pepe As SYSTEMTIME Pepe es una variable del tipo SYSTEMTIME GetSystemTime Pepe Text1 = Str(Pepe.wYear) Text2 = Str(Pepe.wMonth) Text8 = (Pepe.wDayOfWeek) Text3 = Str(Pepe.wDay) Text4 = Str(Pepe.wHour) Text5 = (Pepe.wMinute) Text6 = (Pepe.wSecond) Text7 = (Pepe.wMilliseconds) End Sub Pgina 272

Este programa nos mostrar la hora (hasta milsimas de segundo), la fecha y el da de la semana. An queda otro apartado en la ventana Tipo API : Las constantes. En muchas declaraciones de funciones API se utilizan constantes, bien numricas o expresiones. El Visor de testo API nos muestra tambin las constantes que nos podemos encontrar en las declaraciones. Vayan un par de Ejemplos Public Const SCROLLLOCK_ON = &H40 ' The scrolllock light is on. Public Const SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege" Este captulo no ha hecho mas que abrir una pequea ventana al mundo de las APIs. Diramos con mas propiedad que solamente ha rozado un captulo tan extenso. Pero unos apuntes no pueden llegar nunca a exponer un tema tan extenso. Cmprese el libro citado anteriormente (cuesta unas 10.000 Pts. Pero sern las 10.000 Pts. mejor gastadas por un programador de VB) y sobre todo, practique. Le recomiendo lo que otras veces : paciencia. Al final salen.. FIN del captulo decimoquinto de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 273

Visual Basic - Gua del Estudiante Cap. 16


(Este Captulo fue escrito por el compaero Juanjo Boza. Gracias, Juanjo)

OLE 16.1. Introduccin.


Hasta ahora hemos visto varias formas de comunicar aplicaciones en Windows (el portapapeles, SendKeys y DDE), todas ellas nos permiten alguna funcionalidad extra entre aplicaciones, pero se quedan bastante cortas frente a lo que puede hacer OLE (Object Linking and Embedding: Vinculacin e incrustacin de objetos). OLE es un estndar desarrollado por Microsoft para la comunicacin entre aplicaciones, incrustacin de objetos de algn tipo dentro de una aplicacin, reutilizacin de cdigo y uso de servicios que ofrece una aplicacin desde otra distinta (a esto se le llama automatizacin OLE). Ejemplos de lo que podemos hacer con OLE son: Introducir un documento de Word o de Excel desde nuestro programa usando el mismo entorno de Word o de Excel (en un formulario de VB). Llamada a Word o Excel (o muchos otros programas) desde nuestra aplicacin con una serie de datos. Uso de alguna caracterstica en particular de Word, por ejemplo el corrector ortogrfico. Insertar un grfico de Excel en un documento de Word. Crear una aplicacin que ofrezca servicios OLE a cualquier otra aplicacin que desee usarlos. OLE no es algo particular de VB, sino de Windows, por lo tanto se puede hacer entre dos aplicaciones que no estn hechas en VB (Delphi , Visual C++, etc.), as como por supuesto Visual Basic. Lo que nos va a permitir VB es usar las capacidades OLE de Windows, e incluso crear aplicaciones OLE que ofrezcan servicios a otras: una calculadora realizada en VB podra ser dotada de caractersticas OLE, para que se pudieran hacer operaciones matemticas desde otro programa que no posea estas caractersticas. Es decir, bsicamente OLE permite dos cosas: Compartir informacin entre aplicaciones distintas, que por tanto tendrn sus documentos en formatos distintos. Incrustaremos o vincularemos objetos de un tipo en objetos de otro (desde Word por ejemplo se puede hacer desde el men Insertar, Objeto, con lo que nos aparece una pantalla para seleccionar el tipo de objeto). Esto es bastante til, ya que con los antiguos programas en MS-DOS compartir datos entre un programa de contabilidad y una hoja de clculo o una base de datos era muy complejo, ya que tenan que tener formatos compatibles, o bien hacer un programa que convirtiera datos de un formato a otro. Usar caractersticas de otras aplicaciones para que no debamos programarlas en la nuestra otra vez (automatizacin OLE). Es importante tener en cuenta que con OLE lo que hacemos es usar capacidades de otras aplicaciones, por lo tanto si nuestra aplicacin quiere usar el diccionario de Word, slo funcionar en los ordenadores donde est instalado Word, adems para poder usar OLE la aplicacin debe estar preparada para ello, es decir podemos usar OLE con Word porque Word est hecho pensado para ofrecer servicios OLE. Adems OLE es mucho ms robusto que DDE a la hora de producirse errores: si usamos una caracterstica de Word, OLE se ocupa de abrir Word si no lo est, realizar las operaciones que sean y al final cerrar Word si no se est usando para nada ms. Como contrapartida OLE tiene como principales inconvenientes que gasta bastantes recursos del sistema, ya que para realizar una sola operacin con Word, se debe cargar completo, no se puede cargar slo una parte (la que nos haga falta) y que las aplicaciones que ofrecen servicios OLE pueden tener errores que no dependen de nuestro programa.

Pgina 274

16.2. Terminologa con OLE.


La vinculacin e incrustacin de objetos (OLE) es una tecnologa que permite que los programadores de aplicaciones basadas en Windows creen aplicaciones que puedan presentar datos de muchas diferentes aplicaciones y permite que los usuarios editen dichos datos desde la aplicacin con la que fueron creados. En algunos casos, el usuario puede incluso editar los datos desde dentro de la aplicacin Visual Basic. Los siguientes trminos y conceptos son fundamentales para comprender el uso de OLE en Visual Basic: Objetos Un objeto hace referencia a una unidad discreta de datos suministrados por una aplicacin. Una aplicacin puede ofrecer muchos tipos de objetos. Por ejemplo, una aplicacin de hoja de clculo puede ofrecer una hoja de trabajo, una hoja de macro, un grfico, una celda o un rango de celdas, todos como tipos diferentes de objetos. Automatizacin OLE Algunas aplicaciones proporcionan objetos que aceptan automatizacin OLE. Visual Basic se puede usar para manipular los datos de estos objetos desde el programa. Algunos objetos que aceptan automatizacin OLE tambin aceptan vinculacin e incrustacin. Clase La aplicacin que proporciona los datos del objeto y el tipo de datos que el objeto contiene determina la clase del objeto. La lista de los nombres de las clases disponibles por la aplicacin se puede obtener seleccionando la propiedad Class en la ventana Propiedades y haciendo clic en el botn "Propiedades". Aplicacin contenedora Una aplicacin que recibe y presenta los datos de un objeto es una aplicacin contenedora. Por ejemplo, una aplicacin Visual Basic que use un control contenedor OLE para incrustar o vincular datos de otra aplicacin es una aplicacin contenedora.

Objetos vinculados Los datos asociados con un objeto vinculado estn almacenados por la aplicacin que suministra el objeto. La aplicacin slo almacena referencias de vinculacin que presentan una instantnea de los datos origen. Cuando se vincula un objeto, cualquier aplicacin que contenga un vnculo con dicho objeto puede tener acceso a los datos del objeto y modificarlos. Por ejemplo, si se vincula un archivo de texto con una aplicacin Visual Basic, el archivo de texto puede ser modificado por cualquier aplicacin vinculada con l. La versin modificada aparece en todos los documentos vinculados con este archivo de texto. En la aplicacin Visual Basic, el control contenedor OLE se usa para crear el objeto vinculado. Objetos incrustados Cuando se crea un objeto incrustado, todos los datos asociados con el objeto estn contenidos en el objeto. Por ejemplo, si una hoja de clculo fuera un objeto incrustado, todos los datos asociados con las celdas estaran contenidos en el control contenedor OLE o en el objeto insertable, incluyendo las frmulas necesarias. El nombre de la aplicacin que ha creado el objeto se guarda de forma conjunta con los datos. Si el usuario selecciona el objeto incrustado mientras trabaja con la aplicacin Visual Basic, la aplicacin de hoja de clculo se inicia automticamente de forma que el usuario pueda editar sus celdas. Cuando un objeto se incrusta en una aplicacin, ninguna otra aplicacin tiene acceso a los datos del objeto incrustado. Los objetos incrustados se pueden usar cuando se quiera que la aplicacin mantenga datos que han sido producidos y mantenidos por otra aplicacin. Servidor OLE Una aplicacin que proporciona sus objetos a otras aplicaciones. Estos objetos se pueden utilizar en aplicaciones de Visual Basic. Tambin se llama servidor de automatizacin OLE.

Pgina 275

Verbo Especifica una accin que puede realizarse sobre un objeto, como editar.

16.3. Uso de OLE. 16.3.1. Ejemplo de OLE con Word.


Veamos primero un pequeo ejemplo del uso de OLE desde fuera de VB, para ello sigamos los siguientes pasos: 1. Creemos un documento nuevo en Word. 2. Elijamos la opcin Objeto del men Insertar. 3. Seleccionar el tipo de objeto que queremos insertar en nuestro documento. En este punto seleccionaremos una imagen de PaintBrush, otras cosas que podemos seleccionar son si vamos a crear un objeto nuevo (en este caso una imagen de PaintBrush) o seleccionar una imagen que ya existe, en este caso seleccionamos una imagen de nuestro disco (c:\windows\logowin.bmp). Tambin podemos elegir otras opciones:

Fig. 16-1. Insertar un objeto OLE en Word. mostrar como icono (ver figura 16-2), en cuyo caso lo que nos aparecer en nuestro documento ser un icono, sobre el que si hacemos doble clic se abre la aplicacin correspondiente (en nuestro caso PaintBrush con la imagen que hayamos elegido). Vincular (ver figura 16-3), con OLE los objetos pueden ser de dos tipos, incrustados o vinculados; incrustados (si no marcamos la casilla de Vincular) significa que el objeto OLE aparece dentro de nuestra aplicacin (de nuestro documento de Word, o en el futuro dentro de nuestro formulario de VB), y se pueden hacer modificaciones del objeto ah mismo (se le llama edicin in-situ) haciendo doble clic sobre el objeto, as este se activa y la mayora de las veces nos cambia la barra de mens para incluir las opciones de la aplicacin en la que Pgina 276

est hecha el objeto (PaintBrush), adems en este caso en nuestra aplicacin (Word) obtenemos una copia del objeto original, pero si cambia el objeto original en nuestra aplicacin no se reflejar; sin embargo si el objeto es vinculado si cambia el objeto original cambia en nuestro documento (o al revs, si cambia en nuestra aplicacin, es el original lo que estamos modificando), adems en el caso de estar vinculado no soporta edicin in-situ, sino que al hacer doble clic sobre el objeto para activarlo y poder modificarlo, se invoca a la aplicacin original en que est hecha el objeto, en nuestro caso PaintBrush, donde se realizan todos los cambios.

. Fig. 16-2. La ventana de insertar objeto.

Pgina 277

Fig. 16-3. Crear objeto desde archivo con la posibilidad de vincular.

Fig. 16-4. Edicin in-situ de un objeto incrustado. Ntese en la figura 16-4. que se est editando una imagen incrustada, ya que aunque nos aparecen opciones de PaintBrush (la paleta de colores y la barra de mens de PaintBrush) estamos dentro de Word Pgina 278

an como indica la barra de ttulo de la ventana. Cuando hayamos terminado de modificar la imagen pinchando con el ratn fuera de la imagen, se desactiva el objeto y Word recupera su aspecto habitual; adems si ahora abrimos la imagen original que insertamos en el documento de Word, vemos que no ha cambiado; sin embargo, si elegimos vincular el objeto y hacemos cambios en l, notaremos que: Al hacer doble click sobre el objeto para editarlo nos pasamos automticamente a PaintBrush, donde hacemos los cambios y al volver se actualiza el documento de Word. La imagen original ha cambiado, as como el documento de Word.

16.3.2. OLE con Visual BASIC.


Ya hemos usado OLE desde fuera de Visual Basic, para poder hacerlo desde VB tenemos varias posibilidades, la primera es usar el control contenedor OLE:

Fig. 16-5. El control OLE en la barra de herramientas. Si seleccionamos el control OLE de la caja de herramientas y lo arrastramos a un formulario, nos aparece la pantalla de la figura 16-2 otra vez para que lo asociemos a un documento de Word, imagen de PaintBrush, vdeo avi,...CUALQUIER documento de cualquier aplicacin que tengamos instalada en nuestro ordenador que soporte OLE. En este momento si pulsamos el botn Cancelar en nuestro formulario habr un control OLE que no est asociado a ningn objeto (a ninguna aplicacin), lo podremos asociar ms tarde en tiempo de diseo sacando el men contextual del control pulsando el botn derecho del ratn sobre el control, o en tiempo de ejecucin mediante cdigo. Del mismo modo que antes podemos elegir vicular o incrustar el objeto, mostrarlo como icono,..pero debemos tener en cuenta que no todas las aplicaciones soportan todas las opciones ni edicin in-situ, para saber que opciones admite una aplicacin para OLE hay que ver la documentacin que venga con la aplicacin en particular. Adems podemos decidir asociarlo en tiempo de ejecucin en vez de en tiempo de diseo, o cambiar esta asociacin ms tarde, para ello lo haremos en tiempo de diseo pinchando con el botn derecho del ratn sobre el objeto OLE, con lo que nos aparece un men emergente contextual del objeto, o en tiempo de ejecucin con las propiedades y mtodos del objeto OLE.

Pgina 279

Fig. 16-6. Un clip avi incrustado en nuestro formulario. En la figura 16-6 podemos ver un clip avi con sonido que se reproduce dentro del formulario. Para ver la diferencia entre objetos vinculados e incrustados en VB, insertemos dos documentos de Word en un formulario y hagamos doble clic en cada uno de ellos, observaremos: En uno de ellos (el documento incrustado) los cambios se harn en el mismo formulario. En el objeto incrustado se invoca a Word para hacer los cambios, y al cerrar el documento se pregunta si se desean grabar los cambios, en caso afirmativo se actualiza el contenido en el formulario de VB. La siguiente vez que ejecutemos el proyecto de VB, el documento vinculado mantiene los cambios realizados, pero el documento incrustado no (no hemos grabado los cambios de ninguna forma).

Pgina 280

Fig. 16-7. Un formulario VB con dos objetos OLE de Word, uno incrustado y otro vinculado. En la figura 16-7 vemos dos objetos Word en un formulario de VB, el primero de ellos est incrustado y el segundo est vinculado, al hacer doble clic sobre el primero se ha activado (in-situ), aparecindonos la regla de Word sobre el documento y dos de las barras de herramientas de Word, el documento se puede editar directamente sobre el formulario, pero no se puede grabar directamente (habr que hacerlo por cdigo); pero si activamos el segundo nos vamos a Word.

16.3.3. Propiedades del control OLE.


Tenemos una gran cantidad de propiedades para controlar el comportamiento de nuestro control OLE:

Pgina 281

Action Su uso est obsoleto, Microsoft lo ha mantenido en esta versin por motivos de compatibilidad con versiones anteriores, ahora se deben usar los mtodos del control OLE equivalentes. AppIsRunning Booleana, devuelva True si la aplicacin que ha creado el control OLE est activa y False en otro caso. AutoActivate Devuelve o establece cuando se activa el objeto OLE, hasta ahora nuestro objeto (videoclip, documento Word, etc.) se activaba cuando el usuario haca doble clic sobre el objeto, esto se puede cambiar dando a esta propiedad los siguientes valores:

Constante

Valor

Descripcin

vbOLEActivateManual
vbOLEActivateGetFocus vbOLEActivateDoubleclick vbOLEActivateAuto

0 El objeto no se activa automticamente, la forma de hacerlo en este caso ser con el mtodo DoVerb 1 El objeto se activa cuando recibe el foco (no todas las aplicaciones lo permiten) 2 El objeto se activa cuando el usuario hace doble clic sobre l 3 El objeto se activa cuando recibe el foco o se hace doble clic sobre l

AutoVerbMenu Propiedad Booleana que devuelve o establece un valor que determina si se muestra un men emergente que contenga los verbos del objeto cuando el usuario hace clic en el control contenedor OLE con el botn secundario del Mouse. Si vale True el objeto no recibe eventos Click ni MouseDown. BackColor, BackStyle, BorderStyle Igual que para todos los controles que tienen estas propiedades. Class A veces se le denomina ID programtico, determina la clase de objeto, segn a que aplicacin est asociado el objeto, normalmente es algo de la forma nombre_de_aplicacin.documento.versin o nombre_de_aplicacin.versin, por ejemplo Excel.Sheet.5 o Excel.Chart.5 Data Devuelve o establece un controlador de un objeto de memoria o de un objeto de interfaz de dispositivo grfico (GDI) que contiene datos con un formato especificado. Esta propiedad se define para enviar datos a la aplicacin que haya creado un objeto. Antes de usar la propiedad Data, se debe definir la propiedad Format para determinar el tipo de datos contenidos en el objeto de memoria u objeto GDI. La lista de los formatos aceptados por un objeto puede obtenerse usando las propiedades ObjectGetFormats y ObjectAcceptFormats. Estableciendo esta propiedad a 0 se libera al memoria asociada con el controlador. Para enviar o recibir datos de una aplicacin es ms fiable y sencillo hacerlo con automatizacin OLE si la otra aplicacin lo permite (con la propiedad Object se puede acceder al objeto, as como con las funciones CreateObject y GetObject. DataSource, DataField Igual que para cualquier control que disponga de estas propiedades (ver captulo 16, el control data). DataText Se usa para enviar o recoger datos de una aplicacin, se usa en combinacin con la propiedad Format para establecer el formato de los datos.

Pgina 282

Si se usa la versin de 16 bits de Visual Basic, la cadena DataText tiene que ser menor que 64K. Si se usa la versin de 32 bits de Visual Basic, la cadena DataText puede ser tan grande como la memoria disponible permita. Es preferible usar automatizacin OLE para el traspaso de datos si la otra aplicacin lo permite. Ej.: Si creamos un formulario con un botn de comando y un control OLE que no asociemos a nada en tiempo de diseo (pulsamos Cancelar cuando nos aparezca la pantalla de insertar objeto), y aadimos el siguiente cdigo a la seccin de declaraciones del formulario: Private Sub Command1_Click () Dim Msg, NL, TB ' Declara variables. TB = Chr(9) ' Carcter Tab. NL = Chr(10) ' Carcter Nueva lnea. ' Crea datos para reemplazar los datos predeterminados de Graph. Msg = TB + "Drew" & TB & "Teresa" & TB & "Bob" Msg = Msg + NL & "Eric" & TB & "1" & TB & "2" & TB & "3" Msg = Msg + NL & "Ted" & TB & "11" & TB & "22" & TB & "33" Msg = Msg + NL & "Arthur" & TB & "21" & TB & "32" & TB & "23" ' Enva el dato utilizando la propiedad DataText. ' Activa MSGRAPH como oculto. Ole1.DoVerb - 3 If Ole1.AppIsRunning Then Ole1.DataText = Msg ' Actualiza el objeto. Ole1.Update Else MsgBox "Graph no est activado." End If End Sub Sub Form_Load () Ole1.Format = "CF_TEXT" ' Establece el formato de archivo como de texto.

Ole1.SizeMode = 2 ' Autosize. Ole1.CreateEmbed "", "MSGRAPH" End Sub Tendremos una aplicacin que asociamos a Microsoft Graph en tiempo de ejecucin, que al pulsar el botn de comando le enviamos datos distintos para que nos muestre el grfico asociado. Para poder hacer esto en general, tendremos que saber que formato de datos acepta la otra aplicaccin. DisplayType Booleana, devuelve o establece si un objeto muestra su contenido (0) o un icono (1). Se puede cambiar en tiempo de diseo o de ejecucin, siempre y cuando no se haya creado an el objeto, a partir de cuyo momento ya no se puede cambiar. FileNumber Se incluye por compatibilidad con la propiedad Action, en su lugar se deben usar los mtodos SaveToFile y ReadFromFile. Devuelve o establece el nmero de archivo en el que se va a guardar o cargar un objeto, o el ltimo nmero usado en una de estas acciones. Format Devuelve o establece el formato cuando se envan y se obtienen datos de una aplicacin que ha creado un objeto. Pgina 283

Para obtener la lista de los formatos de datos aceptados, se usan las propiedades ObjectAcceptFormats, ObjectAcceptFormatsCount, ObjectGetFormats y ObjectGetFormatsCount. Se debe tener en cuenta que a veces la lista de formatos que un objeto admite no es la misma que la lista de formatos que ofrece. Ej: Ole1.Format = "CF_METAFILEPICT" (para fijar el formato como el de los metaarchivos de Windows, esto es, los ficheros de imgenes con extensin WMF). Ntese que el valor de esta propiedad es una cadena de caracteres. HostName Devuelve o establece el nombre del host de la aplicacin Visual Basic leble por usuario, es una cadena de caracteres. Se debe tener en cuenta que no todas las aplicaciones devuelven algo en esta propiedad. LpOleObject Devuelve la direccin del objeto. Se usa cuando se hacen llamadas al API de Windows que requieran la direccin de un objeto OLE. Sl valor es 0 si actualmente no se presenta ningn objeto, si se hace una llamada a una API que a su vez hace llamadas al control contenedor OLE, los resultados son impredecibles. MiscFlags Devuelve o establece un valor que determina el acceso a una o varias caractersticas adicionales del control contenedor OLE. Puede tomar los siguientes valores:

Constante vbOLEMiscFlagMemStorage

Valor 1

vbOLEMiscFlagDisableInPlace 2

Descripcin Provoca que el control use memoria para almacenar el objeto mientras est cargado, esto hace que sea ms rpido que la accin predeterminada del objeto, que es almacenarlo en disco como archivo temporal. Sin embargo, este valor puede usar gran cantidad de memoria para objetos cuyos datos requieran mucho espacio, como mapas de bits. Desactiva el comportamiento predeterminado del control de permitir edicicin in-situ en los objetos que lo acepten. Si un objeto acepta activacin in situ, el valor vbOLEMiscFlagDisableInPlace se puede usar para forzar que el objeto se active en una ventana separada.

Los valores se pueden combinar sumndolos. Object Se usa para controlar un objeto de automatizacin OLE. El uso de esta propiedad es el siguiente: objeto.Object[.propiedad | .mtodo] Para saber que propiedades y mtodos admite el objeto se debe buscar en la documentacin de la otra aplicacin. Ms adelante hablaremos de automatizacin OLE.

Pgina 284

ObjectAcceptFormats Devuelve la lista de formatos que un objeto puede aceptar. Se usa conjuntamente con la propiedad ObjectAcceptFormatsCount, que devuelve el nmero de formatos que acepta el objeto. Es una matriz de cadenas de texto que se pueden usar para fijar el formato de los datos que se envan a una aplicacin (o se reciben) Si el control contenedor OLE no contiene un objeto, cuando se intenta tener acceso a esta propiedad se produce un error. Ej: Si tenemos un formulario con un documento Word vinculado, con el siguiente cdigo enviamos una cadena de texto al documento en formato RTF, para ello el objeto deber antes estar activo (con doble click en el objeto OLE) OLE1.Format = OLE1.ObjectAcceptFormats(1) 'Rich Text Format OLE1.DataText = "hola" Debemos tener en cuenta que esta matriz como es habitual en VB empieza a numerarse en 0. ObjectAcceptFormatsCount Nos devuelve el nmero de formatos que acepta un objeto. Para saber el nombre de cada uno usamos la propiedad anterior. ObjectGetFormats Devuelve una lista de los formatos que el objeto puede proporcionar. Se usa junto con las propiedades ObjectGetFormatsCount y Format para fijar el formato de datos que se reciban de la aplicacin asociada al objeto. Su formato es el mismo que el de la propiedad ObjectAcceptFormats. ObjectGetFormatsCount Devuelve el nmero de formatos que el objeto ofrece para recibir datos de l. ObjectVerbFlags Devuelve el estado del men para cada verbo de la matriz ObjectVerbs. Su uso es el siguiente objeto.ObjectVerbFlags(nmero) donde nmero indica el elemento de la matriz del que queremos saber el estado. Los valores que devuelve son:

Constante vbOLEFlagChecked vbOLEFlagDisabled vbOLEFlagEnabled vbOLEFlagGrayed vbOLEFlagSeparator

Valor &H0008 &H0002 &H0000 &H0001 &H0800

Descripcin El elemento del men est verificado. El elemento del men est deshabilitado (pero no atenuado). El elemento del men est habilitado. El elemento del men est atenuado. El elemento del men es una barra separadora.

El primer verbo de la matriz ObjectVerbs es el verbo predeterminado. El resto de los verbos de esta matriz pueden ser presentados en un men. La matriz ObjectVerbFlags contiene informacin sobre el estado del men (como atenuado, verificado y dems) de cada verbo de la matriz ObjectVerbs. Cuando se presenta un men que contenga los verbos del objeto, comprueba el valor de esta propiedad para ver como se presenta cada elemento.

Pgina 285

ObjectVerbs Devuelve la lista de verbos que un objeto acepta. Su uso es el siguiente: objeto.ObjectVerbs(nmero) ObjectVerbs es una matriz de cadenas distintas de cero. Esta propiedad se usa de forma conjunta con la propiedad ObjectVerbsCount para obtener los verbos aceptados por un objeto. Dichos verbos se usan para determinar la accin que se va a ejecutar cuando un objeto se activa con el mtodo DoVerb. La lista de verbos de la matriz vara de objeto a objeto y depende de las condiciones actuales. Cada objeto puede aceptar su propio juego de verbos. Los siguientes valores representan verbos estndar aceptados por todos los objetos:

Valor 0 -1

-2

-3 -4

-5

-6

Accin La accin predeterminada del objeto. Activa el objeto para edicin. Si la aplicacin que ha creado el objeto acepta edicin in-situ, el objeto se activa dentro de el control contenedor OLE. Abre el objeto en una ventana de la aplicacin distinta. Si la aplicacin que ha creado el objeto acepta activacin in situ, el objeto se activa en su propia ventana. En objetos incrustados, oculta la aplicacin que ha creado el objeto. Si el objeto acepta edicin in-situ, activa el objeto para activacin in-situ y muestra las herramientas de la interfaz de usuario. Si el objeto no acepta activacin in situ, el objeto no se activa y se produce un error. Si el usuario cambia el enfoque al control contenedor OLE, crea una ventana para el objeto y prepara el objeto para ser editado. Si el objeto no acepta activacin por un clic del Mouse se produce un error. Se usa cuando el objeto se activa para edicin para desestimar el registro de los cambios que la aplicacin del objeto puede deshacer.

Estos verbos pueden no estar enumerados en la matriz de propiedades ObjectVerbs. El primer verbo de la matriz ObjectVerbs, ObjectVerbs(0), es el verbo predeterminado. Mientras no se especifique otra cosa, este verbo activa el objeto. El resto de los verbos de la matriz pueden presentarse en un men. Si se considera apropiado presentar el verbo predeterminado en un men, el verbo predeterminado tiene dos entradas en la matriz ObjectVerbs. Las aplicaciones que presentan objetos incluyen normalmente un comando Objeto en el men Edicin. Cuando el usuario elige Edicin Objeto, un men presenta los verbos del objeto. Las propiedades ObjectVerbs, ObjectVerbsCount y ObjectVerbFlags se usan para crear dicho men en tiempo de ejecucin. La lista de verbos que un objeto acepta puede variar, dependiendo del estado del objeto. Para actualizar la lista de verbos que un objeto acepta, se usa el mtodo FetchVerbs. Se debe actualizar la lista de verbos antes de presentarla al usuario. Para presentar automticamente los verbos de la matriz ObjectVerbs en un men emergente cuando el usuario haga clic en un objeto con el botn secundario del Mouse, se debe establecer la propiedad AutoVerbMenu a True.

Pgina 286

ObjectVerbsCount Devuelve el nmero de verbos aceptados por un objeto. Se usa en conjunto con la propiedad ObjectVerbs y el mtodo FetchVerbs. OLEDropAllowed Devuelve o establece un valor booleano que determina si un control contenedor OLE puede ser un destino para operaciones OLE de arrastrar y soltar (drag and drop). Si vale True, al arrastrar un objeto que puede estar vinculado o incrustado, aparece un icono de soltar cuando el puntero del mouse se mueve sobre el control contenedor OLE. Soltar el objeto en el control contenedor OLE tiene el mismo efecto que pegar el objeto desde el Portapapeles del sistema con el mtodo Paste. Si vale False (valor predeterminado) no aparece ningn icono de soltar sobre el control contenedor OLE cuando se arrastra un objeto que puede estar vinculado o incrustado. Arrastrar el objeto en el control contenedor OLE no tiene ningn efecto sobre el control. Se debe tener en cuenta que la propiedad MousePointer determina la forma del puntero del mouse cuando la propiedad OLEDropAllowed es True. Si el valor de la propiedad MousePointer es 0 (predeterminado), Visual Basic mostrar el icono estndar de arrastrar y soltar para la accin que est realizando. El valor de la propiedad OLETypeAllowed debe ser 1 (vbOLEEmbedded) o 2 (vbOLEEither) para mover o copiar el objeto que se puede vincular o incrustar o 0 (vbOLELinked) o 2 para vincular el objeto. Soltar un objeto cuando OLEDropAllowed es True tiene el mismo efecto en los valores de las propiedades Class, SourceDoc y SourceItem que utilizar el mtodo Paste del control contenedor OLE. Si la propiedad OLEDropAllowed se establece como True, el control contenedor OLE no recibe eventos DragDrop o DragOver al arrastrar un objeto, y el valor de la propiedad DragMode no tiene ningn efecto en el comportamiento de arrastrar y soltar del control contenedor OLE. OLEType Indica si el control contenedor OLE contiene un objeto o para determinar el tipo de objeto que contiene. Puede tomar los siguientes valores: Constante vbOLELinked vbOLEEmbedded vbOLENone OLETypeAllowed Devuelve o establece el tipo de objeto que el control contenedor OLE puede contener. Puede tomar los siguientes valores: Constante vbOLELinked vbOLEEmbedded vbOLEEither Valor Descripcin 0 El control contenedor OLE slo puede contener un objeto vinculado. 1 El control contenedor OLE slo puede contener un objeto incrustado. 2 El control contenedor OLE puede contener un objeto vinculado o uno incrustado. Es el valor predeterminado. Valor Descripcin 0 El control contenedor OLE contiene un objeto vinculado 1 El control contenedor OLE contiene un objeto incrustado 3 El control contenedor OLE no contiene ningn objeto.

Parent Como cualquier otro control.

Pgina 287

PasteOK Vale True si el contenido del portapapeles se puede pegar dentro del control contenedor OLE, y False en otro caso. Se puede usar para habilitar o deshabilitar la opcin Pegar de un men de nuestra aplicacin. Picture Igual que para otros controles que tienen esta propiedad devuelve un grfico mostrado en el control. No est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. SizeMode Controla como se presenta el objeto dentro del control contenedor OLE. Puede tomar los siguientes valores: Constante vbOLESizeClip Valor Descripcin 0 El objeto se presenta con su tamao real. Si el objeto es ms grande que el control contenedor OLE, su imagen se recorta por los bordes del control. Es el valor predeterminado 1 La imagen del objeto adapta su tamao para ajustarse al control contenedor OLE. La imagen puede no mantener las proporciones originales del objeto. 2 El control contenedor OLE cambia su tamao para presentar el objeto entero. 3 El objeto cambia su tamao para rellenar el control contenedor OLE tanto como fuera posible manteniendo las proporciones originales del objeto.

vbOLESizeStretch

vbOLESizeAutoSize vbOLESizeZoom

Cuando SizeMode se define como 2 (Automtico) el evento Resize se invoca antes de que el control contenedor OLE cambie automticamente de tamao. Los argumentos alturanueva y anchuranueva del procedimiento de evento Resize indican el tamao de presentacin ptimo del objeto (este tamao viene determinado por la aplicacin que ha creado el objeto), pero se pueden cambiar el tamao del control cambiando los valores de los argumentos alturanueva y anchuranueva del procedimiento de evento Resize.

SourceDoc Devuelve o establece el nombre de archivo que se usa cuando se crea un objeto. Esta propiedad se mantiene por compatibilidad con la propiedad Action de versiones anteriores de Visual Basic. En su lugar se usan los mtodos CreateEmbed y CreateLink. La propiedad SourceDoc se usa para especificar el archivo que se va a vincular cuando se crea un objeto vinculado usando la propiedad Action. La propiedad SourceItem se usa para especificar los datos dentro del archivo vinculado. Cuando se crea un objeto incrustado usando la propiedad Action, si la propiedad SourceDoc se define con un nombre de archivo vlido, se crea un objeto incrustado usando el archivo especificado como plantilla. Cuando un objeto vinculado ha sido creado, la propiedad SourceItem se concatena con la propiedad SourceDoc. En tiempo de ejecucin, la propiedad SourceItem devuelve una cadena vaca ("") y la propiedad SourceDoc devuelve la ruta completa del archivo vinculado, seguida de una exclamacin (!) o una barra diagonal inversa(\) y seguida de SourceItem. Por ejemplo: "C:\EXCEL\PRUEBA.XLS!R1C1:R30C15" SourceItem Pgina 288

Devuelve o establece los datos dentro del archivo vinculado cuando se crea un objeto vinculado. Es de tipo cadena de caracteres. Cuando se usa esta propiedad OLETypeAllowed tiene que ser 0 (Vinculado) o 2 (Cualquiera). La propiedad SourceDoc se usa para especificar el archivo vinculado. Cada objeto usa su propia sintaxis para describir sus unidades de datos. Para definir esta propiedad, se especifica una unidad de datos reconocible por el objeto. Por ejemplo, cuando se vincula con Microsoft Excel, SourceItem se especifica usando una referencia de celda o de rango de celdas como R1C1 o R3C4:R9C22 o un rango con nombre como Beneficios. Para determinar la sintaxis que describe las unidades de datos de un objeto, se debe consultar la documentacin de la aplicacin que ha creado el objeto, tambin se puede ver creando un objeto vinculado en tiempo de diseo usando el comando Pegado especial, una vez que el objeto ha sido creado, se selecciona la propiedad SourceDoc en la ventana Propiedades, en la mayora de los objetos, esta cadena contiene la ruta del archivo vinculado, seguida de una exclamacin (!) o una barra diagonal inversa (\) y la sintaxis de los datos vinculados. TabIndex, TabStop, Tag, Top Igual que para otros controles. UpdateOptions Devuelve o establece un valor que especifica cmo se actualiza un objeto cuando los datos vinculados han sido modificados. Los valores que se pueden usar son los siguientes: Constante vbOLEAutomatic vbOLEFrozen Valor Descripcin 0 El objeto es actualizado cada vez que los datos vinculados cambien. Es el valor predeterminado. 1 El objeto es actualizado cuando el usuario guarda los datos vinculados desde la aplicacin con la que fueron creados. 2 El objeto es solamente actualizado usando el mtodo Update del control contenedor OLE.

vbOLEManual

Cuando los datos del objeto cambian, se produce el evento Updated. Se debe tener en cuenta que no todas las aplicaciones que ofrecen objetos OLE permitirn todas las posibilidades. Verb Devuelve o establece un valor que especifica una operacin que se va a realizar cuando un objeto es activado usando la propiedad Action. Esta propiedad se incluye por compatibilidad con la propiedad Action de versiones anteriores. En su lugar se debe usar el mtodo DoVerb. Visible, WhatsThisHelpID, Width Igual que para otros controles.

16.3.4. Mtodos del control OLE.


Close Cierra un objeto y termina la conexin con la aplicacin que suministr el objeto. Slo es aplicable a objetos incrustados, sobre los objetos vinculados no tiene efecto. Para ver su comportamiento podemos crear un proyecto con dos formularios, en el primero de ellos insertamos una imagen de PaintBrush incrustada, y en el segundo ponemos un botn de comando que al hacer clic sobre l cierra el objeto del primer formulario (en el cdigo del su evento clic pondremos Form1!ole1.close). Al arrancar el programa mostramos los dos formularios, si abrimos el objeto del primer formulario, lo podremos cerrar pulsando el botn del segundo formulario.

Pgina 289

Copy Copia el objeto de un control contenedor OLE al Portapapeles del sistema, el objeto puede ser incrustado o vinculado (la informacin de vinculacin tambin se copia en el portapapeles). Para ello el objeto debe estar activo, o se producir un error de ejecucin. CreateEmbed Crea un objeto incrustado en un control contenedor OLE. Su formato es el siguiente: objeto.CreateEmbed docorigen[, clase donde: docorigen es el nombre del archivo del documento usado como plantilla para el objeto incrustado. Si no se especifica, debe ser una cadena vaca (""). clase es un argumento opcional, que indica el nombre de la clase del objeto incrustado, solamente tiene utilidad si no se especifica un nombre de archivo para docorigen. Antes de usar este mtodo, se debe establecer la propiedad OLETypeAllowed a 1 (Incrustado) o 2 (Cualquiera). Para ver la lista de nombres de clases vlidos disponibles en el sistema, seleccione la propiedad Class en la ventana Propiedades y haga clic en el botn Propiedades. Cuando se usa el mtodo CreateEmbed para crear un objeto incrustado, no es necesario definir las propiedades Class y SourceDoc. Cuando se crea un objeto nuevo, la aplicacin asociada con los nombres de clase (por ejemplo, EXCEL.EXE) tiene que haber sido registrada correctamente en el sistema operativo. (El programa de instalacin de la aplicacin debe registrar la aplicacin correctamente). CreateLink Crea un objeto vinculado en un control contenedor OLE a partir del contenido de un archivo. Su formato es: objeto.CreateLink docorigen [, elemorigen donde docorigen es el archivo a partir del que se crea el objeto y elemorigen especifica los datos dentro del archivo que se va a vincular con el objeto, por ejemplo un rango de celdas en una hoja de Microsoft Excel. Antes de usar este mtodo, se debe establecer la propiedad OLETypeAllowed a 0 (Vinculado) o 2 (Cualquiera). Si se especifican los valores de los argumentos de este mtodo, dichos valores prevalecen sobre los valores de las propiedades SourceDoc y SourceItem, que se actualizan automticamente. Cuando se crea un objeto con este mtodo, el control contenedor OLE presenta una imagen del archivo especificado por la propiedad SourceDoc. Si se guarda el objeto, slo se guardan las referencias de vinculacin porque el control contenedor OLE slo contiene una imagen metarchivo de los datos y no los datos originales actuales. Cuando se crea un objeto nuevo, la aplicacin asociada con los nombres de clase (por ejemplo, EXCEL.EXE) tiene que haber sido registrada correctamente en el sistema operativo. (El programa de instalacin de la aplicacin debe registrar la aplicacin correctamente). Delete Elimina el objeto especificado del control contenedor OLE y libera la memoria asociada con l. Los objetos se eliminan automticamente cuando se cierra el formulario o cuando el objeto se reemplaza por un nuevo objeto.

Pgina 290

DoVerb Abre un objeto para una determinada operacin, como edicin. Su formato es: objeto.DoVerb (verbo) Si no se especifica el parmetro verbo, se ejecuta el verbo predeterminado. El valor de este argumento puede ser uno de los verbos estndar aceptados por todos los objetos o un ndice de la matriz de propiedades ObjectVerbs. Si la propiedad AutoActivate se establece a 2 (Doble clic), el control contenedor OLE activa automticamente el objeto actual cuando el usuario hace doble clic en el control. Cada objeto puede aceptar su propio juego de verbos. Los verbos estndar (aceptados por todos los objetos) se enumeran en la siguiente tabla: Constante vbOLEPrimary VbOLEShow Valor Descripcin 0 La accin predeterminada del objeto. -1 Activa el objeto para edicin. Si la aplicacin que ha creado el objeto acepta activacin in situ, el objeto se activa dentro de el control contenedor OLE -2 Abre el objeto en una ventana de la aplicacin distinta. Si la aplicacin que ha creado el objeto acepta activacin in situ, el objeto se activa en su propia ventana. -3 En objetos incrustados, oculta la aplicacin que ha creado el objeto. -4 Si el objeto acepta activacin in situ, activa el objeto para activacin in situ y muestra las herramientas de la interfaz de usuario. Si el objeto no acepta activacin in situ, el objeto no se activa y se produce un error. -5 Si el objeto acepta activacin in situ, activa el objeto para activacin in situ y muestra las herramientas de la interfaz de usuario. Si el objeto no acepta activacin in situ, el objeto no se activa y se produce un error. -6 Si el objeto acepta activacin in situ, activa el objeto para activacin in situ y muestra las herramientas de la interfaz de usuario. Si el objeto no acepta activacin in situ, el objeto no se activa y se produce un error.

vbOLEOpen

vbOLEHide vbOLEUIActivate

vbOLEInPlaceActivate

vbOLEDiscardUndoState

No todos los verbos de esta tabla pueden enumerados en la matriz de propiedades ObjectVerbs. Drag Igual que para cualquier control que acepte operaciones de arrastrar y soltar (drag and drop) FetchVerbs Actualiza la lista de verbos aceptados por un objeto. Su formato es: objeto.FetchVerbs La lista actualizada de verbos se puede leer usando la propiedad ObjectVerbs. InsertObjDlg Presenta el cuadro de dilogo Insertar objeto. Su formato es: objeto.InsertObjDlg

Pgina 291

Permite que el usuario cree un objeto vinculado o uno incrustado eligiendo el tipo de objeto (vinculado o incrustado) y la aplicacin que proporciona el objeto. Para determinar el tipo de objeto que se puede crear usando este cuadro de dilogo (vinculado, incrustado o cualquiera), se usa la propiedad OLETypeAllowed. Cuando se crea un objeto nuevo, la aplicacin asociada con los nombres de clase (por ejemplo, EXCEL.EXE) tiene que haber sido registrada correctamente en el sistema operativo. (El programa de instalacin de la aplicacin debe registrar la aplicacin correctamente). Move Igual que para cualquier control (para mover un control dentro de un formulario). Paste Copia datos desde el Portapapeles en un control contenedor OLE. Para usar este mtodo, se debe definir la propiedad OLETypeAllowed y verificar el valor de la propiedad PasteOK. Despus de ejecutar el mtodo Paste, la propiedad OLEType es vbOLELinked (0) o vbOLEEmbedded (1), si no se ha ejecutado el mtodo Paste, la propiedad OLEType es vbOLENone (3). Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el objeto, el control contenedor OLE elimina cualquier objeto existente en el control. PasteSpecialDlg Presenta el cuadro de dilogo Pegado especial. Su formato es: objeto.PasteSpecialDlg Se usa para permitir que el usuario pegue un objeto desde el Portapapeles del sistema, presentando al usuario varias opciones, incluyendo si se pega un objeto vinculado o uno incrustado. Para determinar el tipo de objeto que se puede crear usando este cuadro de dilogo (vinculado, incrustado o cualquiera), se usa la propiedad OLETypeAllowed. Si el valor de la propiedad PasteOK es True y Visual Basic no puede pegar el objeto, el control contenedor OLE elimina cualquier objeto existente en el control. ReadFromFile Carga un objeto desde un archivo de datos creado mediante el mtodo SaveToFile. Su formato es: objeto.ReadFromFile numarchivo donde numarchivo es el nmero de un archivo binario abierto por la aplicacin. Refresh Igual que para cualquier control (fuerza el redibujado del objeto) SaveToFile Guarda un objeto en un archivo de datos. Su formato es: objeto.SaveToFile numarchivo donde numarchivo es el nmero de un archivo binario abierto por la aplicacin.

Pgina 292

Este mtodo se usa para guardar objetos OLE. Si el objeto es vinculado ( OLEType = vbOLELinked, 0), en el archivo especificado slo se guarda la informacin de vinculacin y una imagen de los datos. Los datos del objeto se mantienen por la aplicacin que ha creado el objeto. Si el objeto es incrustado (OLEType = vbOLEEmbedded, 1), los datos del objeto se mantienen por el control contenedor OLE y se pueden guardar desde la aplicacin Visual Basic. Un objeto guardado en un archivo de datos puede cargarse con el mtodo ReadFromFile, pero no puede cargarse directamente por la aplicacin asociada al control contenedor OLE (por ejemplo Word no podr recuperar directamente un documento guardado con este mtodo, pero desde la aplicacin VB se podr recuperar con el mtodo ReadFromFile y tratarlo utilizando Word). SaveToOle1File Igual que SaveToFile, pero guarda un objeto en formato OLE 1.0 SetFocus Igual que para cualquier control ShowWhatsThis Igual que para cualquier control Update Obtiene los datos actuales desde la aplicacin que suministra el objeto y presenta dichos datos como un grfico en el control contenedor OLE, es decir, actualiza el contenido del control contenedor OLE desde la aplicacin que suministra el objeto (recordemos que no todas las aplicaciones actualizan solas la informacin). ZOrder Igual que para cualquier control

16.3.5. Eventos del control contenedor OLE.


Click Igual que para cualquier otro control, con la salvedad de que dependiendo de la propiedad AutoActivate se puede activar el objeto al recibir este evento DblClick Igual que para cualquier otro control, con la salvedad de que dependiendo de la propiedad AutoActivate se puede activar el objeto al recibir este evento DragDrop Igual que para cualquier otro control. Se debe tener en cuenta que si la propiedad OLEDropAllowed se establece como True, el control contenedor OLE no recibe eventos DragDrop o DragOver. DragOver Igual que para cualquier otro control. GotFocus Igual que para cualquier otro control, con la salvedad de que dependiendo de la propiedad AutoActivate se puede activar el objeto al recibir este evento KeyDown KeyPress KeyUp LostFocus MouseDown MouseMove

Pgina 293

MouseUp Iguales que para cualquier otro control. ObjectMove Se produce inmediatamente despus de que el objeto dentro de un control contenedor OLE se mueva o ajuste su tamao mientras el objeto est activo. Cuando un usuario mueve o ajusta el tamao de un control contenedor OLE, la aplicacin puede utilizar el evento ObjectMove para determinar si debe cambiar el tamao y la posicin del control. Si el procedimiento de evento ObjectMove no cambia la posicin o el tamao del control contenedor OLE, el objeto dentro del control contenedor OLE vuelve a su posicin original y se informa de su nuevo tamao. Las coordenadas pasadas como argumentos a este evento incluyen el borde del control contenedor OLE. Los eventos ObjectMove y Resize se desencadenan cuando el control contenedor OLE recibe informacin sobre el tamao del objeto que contiene. Sin embargo, el evento Resize no recibe informacin sobre la posicin del control. Si el control contenedor OLE sale del formulario, los argumentos tendrn valores negativos o positivos que representan la posicin del objeto en relacin con la parte superior e izquierda del formulario. El formato del procedimiento asociado a este evento es el siguiente: Private Sub object_ObjectMove(left As Single, top As Single, width As Single, height As Single) donde: left indica la coordenada del borde izquierdo del control contenedor OLE despus de moverse o ajustar su tamao. top indica la coordenada del borde superior del control contenedor OLE despus de moverse o ajustar su tamao. width indica el ancho del control contenedor OLE despus de moverse o ajustar su tamao. height indica la altura del control contenedor OLE inmediatamente despus de moverse o ajustar su tamao. Resize Igual que para cualquier otro control. Updated Se produce cuando los datos del objeto han sido modificados. Este evento puede usarse para determinar si los datos del objeto han sido modificados desde que fue guardado por ltima vez, definiendo una variable global en el evento Updated que indique que el objeto necesita ser guardado; despus de guardar el objeto, se debe reinicializar la variable. El formato del procedimiento asociado a este evento es el siguiente: Sub objeto_Updated (cdigo As Integer) donde cdigo especifica cmo ha sido actualizado el objeto, puede tomar los siguientes valores: Constante vbOLEChanged vbOLESaved vbOLEClosed Valor Descripcin 0 Los datos del objeto han cambiado. 1 Los datos del objeto han sido guardados por la aplicacin que ha creado el objeto. 2 El archivo que contiene los datos del objeto vinculado ha sido cerrado por la aplicacin que ha creado el objeto. 3 El archivo que contiene los datos del objeto vinculado ha sido renombrado por la aplicacin que

vbOLERenamed

Pgina 294

ha creado el objeto.

16.3.6. Mens y aplicaciones con objetos OLE


A estas alturas habremos notado que cuando tenemos un objeto OLE en un formulario de VB y lo activamos, nos aparece la barra de mens del objeto dentro del formulario, cuando el objeto est incrustado; y cuando el objeto OLE deja de estar activo (porque otro control del formulario pase a ser el control activo) desaparece el men del objeto OLE y aparece otra vez el del formulario (si lo tiene, en caso de que no lo tenga no aparece ningn men como es de esperar). Este comportamiento lo podremos controlar con dos propiedades: La propiedad NegotiateMenus de un formulario. Esta propiedad establece un valor que determina si un formulario incorpora los mens de un objeto del formulario en la barra de mens del formulario. No est disponible en tiempo de ejecucin. Los valores que puede tomar son True (predeterminado) que fuerza que cuando un objeto del formulario est activo para edicin, los mens de ese objeto se muestran en la barra de mens del formulario y False, que hace que los mens de objetos del formulario no se muestran en la barra de mens del formulario. Si se decide que aparezcan los mens del objeto activo, podemos determinar si queremos que aparezcan adems algunas opciones de nuestro propio men con la siguiente propiedad. Se debe tener en cuenta que no se pueden negociar mens entre un formulario MDI y un objeto del formulario MDI. La propiedad NegotiatePosition de los elementos de un men de un formulario. Establece un valor que determina si los elementos de nivel superior de un men se muestran en la barra de mens mientras un objeto vinculado o incrustado de un formulario est activo y mostrando sus mens. No est disponible en tiempo de ejecucin. Puede tomar los siguientes valores: Valor 0 1 2 3 Descripcin Ninguno. El men no se muestra en la barra de mens cuando el objeto est activo. Es el valor predeterminado. Izquierda. El men se muestra a la izquierda de la barra de mens cuando el objeto est activo. Medio. El men se muestra en medio de la barra de mens cuando el objeto est activo. Derecha. El men se muestra a la derecha de la barra de mens cuando el objeto est activo.

Si la propiedad NegotiateMenus se establece como False, el valor de la propiedad NegotiatePosition no tendr ningn efecto. Ej:

Pgina 295

Fig. 16-8. El objeto incrustado no est activo

Fig. 16-9. El objeto incrustado est activo. En las figura 16-8 el objeto incrustado no est activo, con lo que en el formulario aparece su propio men, cuyos dos elementos de nivel superior son Men Principal 1 y Men Principal 2. En la figura 16-9 el objeto incrustado (un documento de Word) est activo para edicin, con lo que aparecen las barras de botones de Word (tipo de letra, etc.) y los mens de Word; adems, en la parte derecha del men nos aparece la segunda opcin de nivel superior de nuestro formulario, para ello se marc antes la propiedad NegotiatePosition de este men como 3 (derecha), dejando el primer men con su valor por defecto (0, Pgina 296

es decir no aparecer en el men). Por supuesto la propiedad NegotiateMenus del formulario se dej con su valor por defecto (True).

16.3.7. Ejemplo de una aplicacin.


Consideremos una pequea aplicacin de prueba, que tiene unas funciones muy bsicas: Cargar imgenes en una PictureBox o en un objeto OLE, segn se haya determinado en la barra de mens. Grabar la imagen del PictureBox o del objeto OLE Llevar la imagen del PictureBox al control contenedor OLE y viceversa mediante Drag and Drop El funcionamiento es simple: En el men formato si cuando se elija la opcin de abrir archivo se desea cargar la imagen que se seleccione en la lista de archivos en el PictureBox en el control contenedor OLE (lo mismo para grabar la imagen) Ver figura 16-10.

Fig. 16-10. Aplicacin de ejemplo. En el men archivo se carga la imagen seleccionada en la lista de ficheros, bien en el PictureBox o bien en el control OLE, segn el formato que se haya elegido en el men Formato. Si se hace doble click sobre un archivo sucede lo mismo que si se selecciona la opcin Abrir fichero Mediante Drag and Drop podemos llevar la imagen del PictureBox al control OLE (objeto de PaintBrush), donde se puede modificar el dibujo (edicin in-situ), usando las capacidades de PaintBrush y despus volverlo a llevar al PictureBox El dibujo se puede grabar como objeto OLE o como mapa de bits, teniendo en cuenta que si se guarda como objeto OLE, no se puede cargar directamente en el PictureBox ms adelante. Pgina 297

Tngase en cuenta que por simplificar se ha usado Drag and Drop automtico, con lo que para activar el objeto para edicin no podemos hacer doble click, sino que con el botn derecho del ratn debemos sacar el men contextual del objeto, y elegir la opcin Editar. Obviamente este programa es muy simple, y se enlaza con PaintBrush, que no es muy potente en el tratamiento de imgenes, pero sirve para darnos cuenta de como podemos usar capacidades de otra aplicacin dentro de nuestro formulario. El cdigo de este programa es el siguiente: VERSION 4.00 Begin VB.Form Form1 Caption = "Form1" ClientHeight = 6090 ClientLeft = 465 ClientTop = 945 ClientWidth = 9120 Height = 6780 Left = 405 LinkTopic = "Form1" ScaleHeight = 6090 ScaleWidth = 9120 Top = 315 Width = 9240 Begin VB.VScrollBar VScroll1 Height = 5490 LargeChange = 100 Left = 3900 TabIndex = 6 Top = 0 Width = 240 End Begin VB.HScrollBar HScroll1 Height = 240 LargeChange = 100 Left = 0 TabIndex = 5 Top = 5475 Width = 3915 End Begin VB.PictureBox Picture1 DragIcon = "Form1.frx":0000 DragMode = 1 'Automatic Height = 2790 Left = 4425 ScaleHeight = 2730 ScaleWidth = 4380 TabIndex = 3 Top = 2700 Width = 4440 End Begin VB.FileListBox File1 Height = 2595 Left = 6525 TabIndex = 2 Top = 0 Width = 2340 End Begin VB.DirListBox Dir1 Pgina 298

Height = 2055 Left = 4500 TabIndex = 1 Top = 525 Width = 1890 End Begin VB.DriveListBox Drive1 Height = 315 Left = 4500 TabIndex = 0 Top = 0 Width = 1890 End Begin VB.Label Label1 Height = 240 Left = 4950 TabIndex = 7 Top = 0 Width = 3915 End Begin VB.OLE OLE1 DragIcon = "Form1.frx":0442 DragMode = 1 'Automatic Height = 5490 Left = 0 OLEDropAllowed = -1 'True OLETypeAllowed = 1 'Embedded TabIndex = 4 Top = 0 Width = 3915 End Begin VB.Menu mnuarchivo Caption = "&Archivo" Begin VB.Menu mnuabrir Caption = "&Abrir" End Begin VB.Menu mnuguardar Caption = "&Guardar" End Begin VB.Menu mnusalir Caption = "&Salir" End End Begin VB.Menu mnuformato Caption = "&Formato" Begin VB.Menu mnuaimagen Caption = "&Abrir como imagen" Checked = -1 'True End Begin VB.Menu mnuaole Caption = "A&brir como Objeto OLE" End Begin VB.Menu mnugimagen Caption = "Guardar como &imagen" Checked = -1 'True End Begin VB.Menu mnugOLE Caption = "Guardar como Objeto &OLE" End Pgina 299

End End Attribute VB_Name = "Form1" Attribute VB_Creatable = False Attribute VB_Exposed = False Option Explicit Dim altura As Long, ancho As Long Dim archivo As String Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Function TrataBarra(ByVal ruta As String, ByVal archivo As String) As String If Right(ruta, 1) = "\" Then TrataBarra = ruta & archivo Else TrataBarra = ruta & "\" & archivo End If End Function Private Sub File1_Click() archivo = TrataBarra(File1.Path, File1.filename) End Sub Private Sub File1_DblClick() On Error GoTo fin Picture1.Picture = LoadPicture(archivo) Exit Sub fin: MsgBox Error(Err) End Sub Private Sub HScroll1_Change() OLE1.Left = -HScroll1.Value OLE1.Width = Abs(OLE1.Left) + HScroll1.Width End Sub Private Sub mnuabrir_Click() Dim i As Integer If mnuaimagen.Checked Then Picture1.Picture = LoadPicture(archivo) Else i = FreeFile() Open archivo For Binary As i OLE1.ReadFromFile i Close #i End If End Sub Private Sub mnuaole_Click() If Not mnuaole.Checked Then Pgina 300

mnuaimagen.Checked = False mnuaole.Checked = True End If End Sub Private Sub mnuaimagen_Click() If Not mnuaimagen.Checked Then mnuaole.Checked = False mnuaimagen.Checked = True End If End Sub Private Sub mnugimagen_Click() If Not mnugimagen.Checked Then mnugOLE.Checked = False mnugimagen.Checked = True End If End Sub Private Sub mnugOLE_Click() If Not mnugOLE.Checked Then mnugimagen.Checked = False mnugOLE.Checked = True End If End Sub Private Sub mnuguardar_Click() Dim i As Integer If mnugimagen.Checked Then SavePicture Picture1.Image, archivo Else i = FreeFile() Open archivo For Binary As #i OLE1.SaveToFile i Close #i End If End Sub Private Sub mnusalir_Click() Unload Me End Sub Private Sub OLE1_DragDrop(Source As Control, X As Single, Y As Single) If TypeOf Source Is PictureBox Then OLE1.CreateEmbed TrataBarra(File1.Path, File1.filename) End If End Sub

Private Sub OLE1_Resize(HeightNew As Single, WidthNew As Single) altura = HeightNew ancho = WidthNew VScroll1.Max = altura - OLE1.Height HScroll1.Max = ancho - OLE1.Width End Sub

Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Pgina 301

Dim alt1 As Long, anc1 As Long If TypeOf Source Is OLE Then OLE1.DoVerb (0) OLE1.Copy Picture1.Picture = Clipboard.GetData Picture1.SetFocus End If End Sub Private Sub VScroll1_Change() OLE1.Top = -VScroll1.Value OLE1.Height = Abs(OLE1.Top) + VScroll1.Height End Sub

Pgina 302

Visual Basic Gua del Estudiante Cap. 17


MULTIMEDIA. REPRODUCCION DE SONIDOS E IMGENES Visual Basic dispone de un control para aplicaciones multimedia : el Multimedia MCI MMControl. (Media Control Interface) No est normalmente en la caja de herramientas. Deber introducirlo desde Proyecto | Componentes de la barra de men, y se llama Microsoft Multimedia Control 5.0 (VB5) (MCI32.ocx) Tiene estas formas cuando est en la caja de herramientas y cuando est en el formulario respectivamente.

(Se muestra con los botones activados. Pueden estar desactivados y entonces tienen un color gris plido) Este control es un control OCX. Ha sido diseado para poder reproducir ficheros de sonido, (*.waw), presentar ficheros de vdeo, (*.avi) y otras funciones multimedia. Para habilitar el que puede hacer una u otra funcin hay que indicrselo en su propiedad DeviceType, propiedad que explicaremos sin mas prembulos.

Propiedad DeviceType
Especifica el tipo de dispositivo MCI que se va a abrir. Sintaxis NombredelControlMM.DeviceType = dispositivo$ El argumento dispositivo$ (un String) indica el tipo de dispositivo multimedia que se va a abrir. Puede tomar los valores: AVIVideo, para reproducir ficheros AVI. Lgicamente necesita algo para poder mostrar un fichero de vdeo: el reproductor AVI de Windows. El MMControl se lo presentar automticamente cuando tiene que reproducir un vdeo. CDAudio, para reproducir un disco CD que tengamos en la disquetera. Pasa lo mismo que antes. Deber tener un dispositivo de reproduccin de sonidos en su PC y una unidad de CD DAT, Graba y reproduce cintas DAT. Debe tener una unidad de cinta DAT instalada en su PC. DigitalVideo, MMMovie, Other, Overlay, Scanner, Sequencer, para trabajar con un secuenciador MIDI VCR, Videodisc. Para reproducir videodiscos WaveAudio. Para reproducir un fichero de audio en formato .WAW Esta propiedad no es estrictamente necesario establecerla. No ser necesario cuando tenga que ejecutar un fichero y reconozca la extensin de ese fichero como una extensin asociada a un dispositivo MCI. Ser necesario cuando sea la nica forma de saber que dispositivo tiene que abrir. Es necesario por ejemplo en

Pgina 303

el caso de CDAudio, pues en este caso no va a reproducir ningn fichero, sino un disco, y esta es la nica forma de que lo sepa.

Propiedad Command
Con la propiedad DeviceType el control MCI ya sabe que dispositivo tiene que controlar. Pero no har nada de momento. Para que haga algo debemos introducirle rdenes. Y estas rdenes se le introducen mediante la propiedad Command La primera orden que debemos introducirle es que abra el dispositivo. Mediante el comando Open MMControl.Command = Open Mediante esta sentencia, el control MCI ya est operativo. Depender por supuesto, del estado de otras propiedades, el que ejecute o no otra instruccin. Pero esta es la primera que debe ejecutar para poder trabajar. Por eso es frecuente ver la orden Open en el Load del formulario que contienen al control MCI. Lo contrario a Open ser Close. Cierra el control MCI y por lo tanto cualquier posibilidad de que pueda trabajar. MMControl.Command = Close Observar en el ejemplo siguiente que el dispositivo MCI solo se cierra ejecutando el comando Close. Por ejemplo, cuando sale de la aplicacin con un End, el dispositivo sigue funcionando. Tenga esto en cuenta, pues es muy habitual olvidarse de ello. Ponga el comando Close en el QueryUnload del formulario que lo contiene. Es prudente tambin que antes de Close, le introduzca el comando Stop. Veamos una orden que supongo estar deseoso de usar: Play. Este comando inicia la ejecucin. Si el dispositivo es el CD de audio, se pondr a reproducirlo MMControl.Command = Play Suponga que estamos reproduciendo el CD. Queremos hacer una pausa. El comando adecuado para ello es Pause MMControl.Command = Pause Pero si deseamos parar definitivamente la reproduccin del CD, usaremos el comando Stop MMControl.Command = Stop Y ahora deseamos sacar el CD de la unidad de discos. Para esa funcin usaremos Eject MMControl.Command = Eject Sin darnos cuenta hemos hecho un reproductor de CDs. Seguiremos mas adelante con la propiedad Command. Tiene algunas rdenes mas y las veremos mas adelante. Para comprobar lo dicho anteriormente, vamos a hacer una pequea aplicacin que reproduce un CD.

Pgina 304

El control MCI se llama MMControl1. Vamos a ponerle la propiedad DeviceType como CDAudio. Cuidado ! No existe espacio entre CD y Audio. Si lo pone no funcionar. Lo ver fcilmente pues los botones seguirn desactivados (tal y como los muestra la figura anterior) Esta propiedad puede cambiarla marcando el control y pulsando F4, o haciendo click con el botn derecho, y le aparecer el tpico cuadro de los controles OCX Todava no funciona. Debemos abrir el control. Podemos hacerlo en el Load del formulario : Private Sub Form_Load() MMControl1.Command = "Open" End Sub Inserte el disco de los Tres Tenores en la disquetera y haga click en el tercer botn (Play) Ahora comenzar a darse cuenta para que sirven los controles MCI. Observar que funciona perfectamente con los botones del propio control, sin necesidad de poner los comandos Play, Pause, Stop. Eject, etc. y que los botones se habilitan o deshabilitan dependiendo del estado de ejecucin, pausa, o parada del CD. Esta funcionalidad se activa porque el control MCI tiene las propiedades Autoenable y Enabled a True. Para qu sirven entonces os comandos anteriores ? Imagnese que lo que quiere hacer es una aplicacin muy personalizada. Entonces pondr una serie de botones cada uno con un comando. Y e el procedimiento click de ese botn pone el comando que corresponda. Deber poner el control MCI, pero puede ponerle su propiedad visible = False y ya tiene la personalizacin hecha.

Pgina 305

Ya tenemos un reproductor de CDs personalizado. No es una gran cosa como programa multimedia pero podr ilustrarnos para seguir estudiando el control MCI. Lo botones Prev, Next, Play, Paus y Stop tiene el siguiente cdigo : Private Sub BPrev_Click() MMControl1.Command = "Prev" End Sub Private Sub BNext_Click() MMControl1.Command = "Next" End Sub Private Sub BPlay_Click() MMControl1.Command = "Play" End Sub Private Sub BPausa_Click() MMControl1.Command = "Pause" End Sub Private Sub BStop_Click() MMControl1.Command = "Stop" End Sub El botn Info devuelve la informacin de la pista que hayamos introducido en el TextBox TBTrack, informacin que le introducimos al control MCI con la propiedad Track. El resultado se presenta en los labels inferiores. Private Sub BInfo_Click() Dim MinutosD As Integer, SegundosD As Integer, SegunD As Long Dim MinutosI As Integer, SegundosI As Integer, SegunI As Long Dim MinutosDD As Integer, SegundosDD As Integer, SegunDD As Long

Pgina 306

MMControl1.TimeFormat = 0 Ltracks = MMControl1.Tracks MMControl1.Track = Val(TBTrack) LTrack = MMControl1.Track LLenght = MMControl1.Length SegunDD = Val(LLenght) \ 1000 MinutosDD = SegunDD \ 60 SegundosDD = SegunDD Mod 60 LDDisco = MinutosDD & " min. " & SegundosDD & " seg." LTrackPosition = MMControl1.TrackPosition SegunI = Val(LTrackPosition) \ 1000 MinutosI = SegunI \ 60 SegundosI = SegunI Mod 60 LInicio = MinutosI & " min. " & SegundosI & " seg." LTrackLenght = MMControl1.TrackLength SegunD = Val(LTrackLenght) \ 1000 MinutosD = SegunD \ 60 SegundosD = SegunD Mod 60 LDuracion = MinutosD & " min. " & SegundosD & " seg." LPosition = MMControl1.Position SegunT = Val(LPosition) \ 1000 MinutosT = SegunT \ 60 SegundosT = SegunT Mod 60 LPosicion = MinutosT & " min. " & SegundosT & " seg." Timer1.Enabled = True End Sub Veamos las propiedades usadas en este cdigo : Tracks Track Indica el nmero de pistas (Canciones) de un CD de audio Especifica la pista acerca de la cual van a devolver informacin las propiedades TrackLength y TrackPosition. NO indica la pista que se est reproduciendo actualmente. TimeFormat Especifica el formato de presentacin del tiempo. Vea la ayuda de esta propiedad. En el ejemplo se pone = 0, lo que significa que indicar los tiempos en milsimas de segundo. Length Indica la duracin total del CD. (En el formato dispuesto en TimeFormat) TrackPosition Posicin (en tiempo) del comienzo de la pista (Pista = cancin) respecto al origen del disco. TrackLength Duracin de la pista Position Posicin (en tiempo) de lectura actual respecto al inicio del disco Los botones Comienza en y Solo Esta nos ilustran acerca de la propiedades From y To Private Sub BSoloEsta_Click() MMControl1.Command = "Stop" MMControl1.From = Val(LTrackPosition) MMControl1.To = Val(LTrackPosition) + Val(LTrackLenght) MMControl1.Command = "Play" End Sub From To Especifica el punto (en tiempo) donde comenzar a ejecutarse el prximo comando Play . Especifica el punto (en tiempo) donde terminar la ejecucin. Pgina 307

Por eso, el botn Solo Esta tiene tiempo de origen [Val(LTrackPosition)] y de final [Val(LTrackPosition) + Val(LTrackLenght)] mientras que la de Comienza en solamente tiene tiempo de origen : Private Sub BComienzaen_Click() MMControl1.Command = "Stop" MMControl1.From = Val(LTrackPosition) MMControl1.Command = "Play" End Sub Observe que antes de decirle el tiempo de origen (en que instante debe comenzar), le hemos dado el comando de parar (Stop). Es muy prudente poner esta instruccin cuando debemos estar seguros de que no est ejecutando el CD. Si lo est, lo para. Si no lo est, no pasa nada. Podemos incluso sacar el disco de la disquetera. Veamos el cdigo del botn Expulsar CD Private Sub BExpulsar_Click() MMControl1.Command = "Eject" End Sub El comando Eject no solamente sirve para sacar el CD. Si est fuera lo mete. Puede de esta forma hacer un botn con el cdigo anterior que saque y meta el disco. Para mayor comprensin puede cambiarle el Caption al botn dependiendo si lo que va a hacer es introducir el CD o extraerlo. Pero que pasara si por cualquier circunstancia, no se puede expulsar en ese momento el CD? Podramos saberlo leyendo la propiedad CanEject (Vea Observacin al final de las propiedades CanXxx)

Propiedad CanEject
Determina si el dispositivo MCI abierto puede expulsar su medio. Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis Variable = ControlMM.CanEject El valor devuelto es True si puede expulsar el disco, y False si no lo puede expulsar. Al igual que CanEject, existen otras propiedades que nos indican si se puede realizar en ese momento una determinada operacin. Es muy til analizar estas propiedades antes de proceder a ejecutar una determinada operacin. Por ejemplo, deberamos ver si podemos iniciar la ejecucin de un disco (o de un fichero de sonido) antes de darle el comando Play. Muy sencillo. Leamos el valor de la propiedad CanPlay

Propiedad CanPlay
Determina si el dispositivo MCI abierto es capaz de reproducir. Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis Variable = ControlMM.CanPlay Los valores devueltos son True si puede reproducir, y False si no puede. El valor de CanPlay se recupera mediante MCI_GETDEVCAPS durante el procesamiento de un comando Open.

Propiedad CanRecord
Pgina 308

Determina si el dispositivo MCI abierto puede grabar. Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis Variable = ControlMM.CanRecord Los valores devueltos son True o False, con el mismo criterio de las anteriores.

Propiedad CanStep
Determina si el dispositivo MCI abierto puede avanzar una trama cada vez. Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis Variable = ControlMM.CanStep Los valores devueltos son True o False, segn el criterio de las propiedades anteriores. Comentarios Actualmente, slo los dispositivos MCI MMMovie, Overlay y VCR pueden avanzar de trama en trama. Como no hay ninguna forma de comprobar si un dispositivo puede avanzar paso a paso, los programas establecen el valor de esta propiedad comprobando si el tipo del dispositivo es MMMovie, Overlay o VCR durante el procesamiento de un comando Open. Observacin. Estas propiedades se han probado en el ejercicio que acompaa a este captulo y siempre han devuelto True. Incluso al leer CanPlay con el CD extrado. El autor de esta Gua del Estudiante debe incluirlas, y tambin advertir lo observado. La razn posiblemente est en la gran variedad de equipos multimedia existentes, que posiblemente no funcionen todos de la misma forma. Pero existe otra forma de comprobar el estado del control MCI. La propiedad Mode.

Propiedad Mode
Devuelve el modo actual de un dispositivo MCI que est abierto. Esta propiedad no est disponible en tiempo de diseo y es de slo lectura en tiempo de ejecucin. Sintaxis Variable = ControlMM.Mode Variable puede tomar uno de estos valores o constantes, dependiendo del estado del control. Valor 524 525 526 527 528 529 530 Constante Descripcin mciModeNotOpen El dispositivo no est abierto. mciModeStop El dispositivo est detenido. mciModePlay El dispositivo est reproduciendo. mciModeRecord El dispositivo est grabando. mciModeSeek El dispositivo est buscando. mciModePause El dispositivo est en pausa. mciModeReady El dispositivo est preparado.

El tipo de datos para Variable es Long Podemos de esta forma averiguar el estado del control MCI antes de efectuar cualquier operacin con l. Otra propiedad importante : Wait

Propiedad Wait
Determina si el control Multimedia MCI espera a completar el siguiente comando MCI antes de devolver el control a la aplicacin. Esta propiedad no est disponible en tiempo de diseo.

Pgina 309

Sintaxis ControlMM.Wait = {True | False} Si Wait est a False, el control MCI no espera a que se complete el comando MCI antes de devolver el control a la aplicacin. Si est a True s espera. El valor que asigne a esta propiedad slo se usar con el siguiente comando MCI. Los comandos MCI subsiguientes pasan por alto la propiedad Wait hasta que le asigne otro valor (diferente o idntico).

Propiedad Shareable
Determina si el mismo dispositivo MCI puede estar compartido por ms de un programa. Sintaxis Control.Shareable = {True | False} Si esta propiedad se pone a False ningn otro control o aplicacin puede tener acceso a este dispositivo. Si se pone a True pueden abrir este dispositivo mas de un control o aplicacin. Cuidado. Esta propiedad es mejor que est siempre a False. Si necesita que varios controles abran el mismo dispositivo es que su aplicacin es para nota. Se entiende que lo abran simultneamente. Puede abrir el dispositivo por cuantos controles desee, pero no al mismo tiempo. Para este caso, la propiedad Shareable debe estar a False. Recuerde esta observacin cuando pretenda abrir el control MCI y ste no le haga caso a su comando Open. Pero continuemos con la Propiedad

DeviceType

Nos hemos alargado mucho con el valor CDAudio. Posiblemente porque didcticamente sea la mas divertida. Existen otras y no menos divertidas. Pero tambin existen otras que no podemos explicar en este curso por falta de medios, ya que cada una de estas propiedades exige un determinado Hardware para que puedan funcionar. El valor CDAudio exiga una tarjeta de sonido y unos altavoces. Hoy casi todos los PCs lo tienen. El valor DAT exige tener una unidad de cinta DAT, no muy usual en PCs domsticos o de enseanza. Lo mismo podemos decir de DigitalVideo, MMMovie, Other, Overlay, Scanner, VCR y Videodisc. Nos quedan por lo tanto tres valores estudiables para la propiedad DeviceType que reproducimos de nuevo: AVIVideo, para reproducir ficheros AVI. Lgicamente necesita algo para poder mostrar un fichero de vdeo: el reproductor AVI de Windows. El MMControl se lo presentar automticamente cuando tiene que reproducir un vdeo. Sequencer, para trabajar con un secuenciador MIDI WaveAudio. Para reproducir un fichero de audio en formato .WAW

Realicemos un nuevo ejemplo para ensayar estos tres valores :

Pgina 310

Este es un reproductor de ficheros de sonido Wav, secuenciador MIDI y reproductor de videos Avi. Dispone de teclas para elegir el fichero a reproducir, para ejecutar, y en el caso del secuenciador MIDI, una tecla para parar, una etiqueta para mostrar la duracin del sonido, y una barra de desplazamiento para ver la evolucin de la ejecucin. La forma de reproducir un fichero es idntica en los tres apartados : se elige un fichero con el botn Elegir. (Observe que en vez de poner botones de comando hemos puesto etiquetas para poder cambiarles el color de fondo) Aparece un CommonDialog para elegir el fichero. Se elige y el nombre de ese fichero pasa al Combo que est esa seccin. Se pueden meter tantos ficheros como queramos en el combo. Se elige uno y la etiqueta Ejecutar se pone verde. Ahora se hace click sobre esa etiqueta y se ejecuta el Avi, Wav o Mid correspondiente. Se enumera a continuacin el cdigo de cada uno de los botones (labels) del programa. CD1= CommonDialog Para la reproduccin de ficheros de sonido .Wav Private Sub LElegir_Click() CD1.Filter = "Ficheros Wav |*.WAV" CD1.ShowOpen If CD1.filename <> "" Then ComboSonidos.AddItem CD1.filename End If End Sub Private Sub ComboSonidos_Click() If ComboSonidos.Text <> "" Then LEjecutar.BackColor = RGB(0, 255, 0) Else LEjecutar.BackColor = RGB(255, 0, 0) End If End Sub Private Sub LEjecutar_Click() If LEjecutar.BackColor = RGB(0, 255, 0) Then MMControl1.Command = "Open" MMControl1.DeviceType = "WaveAudio" MMControl1.filename = ComboSonidos.Text MMControl1.Wait = True Pgina 311

Es fundamental poner Wait a True para evitar que ejecute las instrucciones siguientes una tras otra sin esperar a que termine una para que empiece la siguiente. Pruebe a quitar esta lnea. Comenzar la ejecucin (Play), Inmediatamente se parar (Stop) y volver al principio del fichero (Prev) Al estar Wait a True, espera que se termine la ejecucin para parar, y una vez que ha terminado el proceso de parar, se va al principio del fichero . MMControl1.Command = "Play" MMControl1.Command = "Stop" MMControl1.Command = "Prev" End If End Sub Para la reproduccin de Avi Vdeo Private Sub LElegir3_Click() CD1.Filter = "Ficheros Avi |*.AVI" CD1.ShowOpen If CD1.filename <> "" Then ComboAvis.AddItem CD1.filename End If End Sub Private Sub ComboAvis_Click() If ComboAvis.Text <> "" Then LEjecutar3.BackColor = RGB(0, 255, 0) Else LEjecutar3.BackColor = RGB(255, 0, 0) End If End Sub Private Sub LEjecutar3_Click() If LEjecutar3.BackColor = RGB(0, 255, 0) Then MMControl1.Command = "Open" MMControl1.DeviceType = "AviVideo" MMControl1.filename = ComboAvis.Text MMControl1.Wait = True MMControl1.Command = "Play" MMControl1.Command = "Stop" MMControl1.Command = "Prev" End If End Sub Para el secuenciador MIDI Private Sub LElegir2_Click() CD1.Filter = "Ficheros Mid |*.Mid" CD1.ShowOpen If CD1.filename <> "" Then ComboMidi.AddItem CD1.filename End If End Sub Private Sub ComboMidi_Click() If ComboMidi.Text <> "" Then LEjecutar2.BackColor = RGB(0, 255, 0) Else LEjecutar2.BackColor = RGB(255, 0, 0) End If Pgina 312

End Sub Private Sub LEjecutar2_Click() GG1 = Control Gauge If LEjecutar2.BackColor = RGB(0, 255, 0) Then Dim TTotal As Long MMControl1.DeviceType = "Sequencer" ' Si el dispositivo est abierto, lo cierra. If Not MMControl1.Mode = mciModeNotOpen Then MMControl1.Command = "Close" End If ' Abre el dispositivo MMControl1.filename = ComboMidi.Text MMControl1.Command = "Open" MMControl1.Command = "Play" 'Analiza el estado en el que est el control MCI y lo pone en la etiqueta LEstado Select Case MMControl1.Mode Case 524 LEstado = "No est abierto" Case 525 LEstado = "Detenido" Case 526 LEstado = "Reproduciendo" Case 527 LEstado = "Grabando" Case 528 LEstado = "Buscando" Case 529 LEstado = "Pausa" Case 530 LEstado = "Preparado" End Select On Error Resume Next 'Necesario por si el fichero .Mid es de longitud 0

MMControl1.TimeFormat = mciFormatMilliseconds TTotal = MMControl1.Length LDuracion = TTotal / 1000 & " Seg." GG1.Max = TTotal / 1000 End If End Sub Private Sub LParar_Click() MMControl1.Command = "Stop" End Sub Existe un control Timer (Que obviamente no se ve en el programa) con este cdigo : Private Sub Timer1_Timer() TTransc = (CDbl(MMControl1.Position / 1000)) GG1.Value = TTransc Select Case MMControl1.Mode Case 524 LEstado = "No est abierto" Case 525 LEstado = "Detenido" Case 526 LEstado = "Reproduciendo" Pgina 313

Case 527 LEstado = "Grabando" Case 528 LEstado = "Buscando" Case 529 LEstado = "Pausa" Case 530 LEstado = "Preparado" End Select End Sub Este control Timer permite analizar (Cada segundo, pues su propiedad Interval esta puesta a 1000) el estado del control MCI, el tiempo de fichero ejecutado, y actualiza la posicin de la barra del control Gauge (GG1) Espero que el alumno tenga ya conocimientos suficientes de los comandos de VB para entender perfectamente este cdigo. Y con esto hemos visto todo lo que se puede ver en un curso de VB como este, del control MCI. Lo dems ya sera para nota. Como es para nota el conocer que todo esto se puede hacer igual SIN el control MCI. Es decir, CON APIS.

Las APIS de Multimedia


Con este ttulo genrico parece que se van a explicar todas las Apis aplicables a multimedia. Y no puede ser as. El tema sera tan amplio que se saldra del nivel que se quiere dar a esta Gua de Estudiante. Ya se ha citado un libro estupendo acerca de Apis que volvemos a recomendar : API de Win32 - Gua del programador de Visual Basic, de Daniel Appleman editado en espaol por InforBooks. (ISBN 84 89700-22-2). Pero el tema de Apis es tan extenso que no puede abarcarlo todo. Y justamente la parte de multimedia no la toca. Por eso, se est preparando un libro que se dedica exclusivamente a las Apis de Multimedia, y a los formatos de audio / vdeo, en el que participa el autor de esta Gua del Estudiante. No est an editado, ya que se est comprobando con W98 y WindowsNT. El listn est muy alto y no valen las prisas. Lgicamente, tambin se lo recomiendo. En esta ocasin daremos una idea de como se usan las Apis en multimedia, con un ejemplo que puede ser bastante completo para empezar. Y que no garantizamos que funcione mas que con VB5 y W95. Hecha esta aclaracin continuamos. Hagamos una pequea aplicacin para reproducir CDs, ficheros WAV y ficheros MIDI (MID). Esta aplicacin lleva un control de volumen de la seal del CD. No se han puesto mas controles de volumen para las otra fuentes.

Pgina 314

Este programa tiene un mdulo para hacer las declaraciones de las Apis y el formulario de la figura. Vayamos al mdulo con las declaraciones : Option Explicit Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long Declare Function mciSendCommand Lib "winmm.dll" Alias "mciSendCommandA" (ByVal _ wDeviceID As Long, ByVal uMessage As Long, ByVal dwParam1 As Long, ByVal dwParam2 _ As Any) As Long Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal _ lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, _ ByVal hwndCallback As Long) As Long Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal _ lpszSoundName As String, ByVal uFlags As Long) As Long Declare Function auxSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal _ dwVolume As Long) As Long Declare Function auxGetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, lpdwVolume _ As Long) As Long Se han destacado en negrita los nombres de las funciones. Mediante estas declaraciones le estamos diciendo a nuestro programa qu DLL tiene que usar ( winmm.dll) y qu funciones de ella vamos a usar.

Continuemos con los procedimientos del formulario. Observe que las explicaciones al cdigo estn en letra cursiva. Option Explicit Dim NombreFicheroMIDI As String Dim NombreFicheroWav As String Dim VolCDIzd As Long Dim VolCDDch As Long Declaraciones en la seccin de declaraciones

Veamos como ejecutar un CD desde el principio. Usamos para ello la funcin mciSendString, que como casi indica su nombre, enva una cadena al dispositivo MCI Private Sub cmdPlay_Click() Dim Resultado As Long Resultado = mciSendString("Open cdaudio alias cd wait", 0&, 0, 0) Al poner alias cd estamos diciendo que, a partir de ahora, ese dispositivo abierto (el cdaudio) Pgina 315

se llama cd, y podemos referirnos a l por ese nombre a lo largo de toda la aplicacin. Resultado = mciSendString("Play cd", 0&, 0, 0) Aqu le hemos mandado la orden de que se ponga a ejecutar (Play) el dispositivo cd, que el programa ya sabe que es el cdaudio abierto por la instruccin anterior. Los parmetros 0&,0,0 son los que completan la funcin, que como no los vamos a usar, se ponen a cero (incluso un string 0&) End Sub El procedimiento anterior ejecuta el CD desde el principio. Podemos empezar en un Track distinto (ojo, aqu un Track no significa una cancin, sino una divisin del disco que no tiene porqu coincidir con una cancin) Private Sub BPlayCD2_Click() Dim Resultado As Long Dim PistaActual As Integer Resultado = mciSendString("Open cdaudio alias cd wait", 0&, 0, 0) If TBPista = "" Then TBPista = "1" TBPista es un TextBox para meter la pista inicial If TBHasta <> "" Then TBHasta es otro TB para meter la pista final Usamos los comandos From y To igual que con el control MCI Resultado = mciSendString("Play cd From " & Str(TBPista) & " To " & Str(TBHasta), 0&, 0, 0) Else Resultado = mciSendString("Play cd From " & Str(TBPista), 0&, 0, 0) End If End Sub Mediante este procedimiento, iniciamos el cd en el Track introducido en TBPista, y se parar en el Track introducido en TBHasta (Si no le ponemos nada en este TB ejecuta el CD hasta el final. Para detener la ejecucin del CD usamos este procedimiento : Private Sub cmdStop_Click() Dim lRet As Long lRet = mciSendString("Stop cd wait", 0&, 0, 0) lRet = mciSendString("Close cd", 0&, 0, 0) End Sub

Primero lo paramos Y cerramos la sesin

Observe que siempre llamamos cd a la sesin de ejecucin del CD, ya que le pusimos ese nombre con el alias. Veamos ahora como podemos ejecutar un fichero Wav. De dos formas, con dos funciones distintas. La primera, con la funcin sndPlaySound. Private Sub BPlayWav_Click() On Error Resume Next Dim iResult As Integer Seleccionamos el fichero a reproducir mediante el CommonDialog CD1 cd1.Filter = "Ficheros Wav |*.Wav" cd1.ShowOpen NombreFicheroWav se declar como String en el formulario. NombreFicheroWav = cd1.filename iResult = sndPlaySound(NombreFicheroWav, 0) En el parmetro 0 (uFlags en la declaracin),Se puede poner cualquier nmero. End Sub No se ha previsto parar la ejecucin de los ficheros Wav, debido a que generalmente son muy cortos (se emplean normalmente para sonidos de pequea duracin, debido a su gran tamao) Otra forma de ejecutar un Wav es mediante la funcin mciExecute

Pgina 316

Private Sub BPlayWav2_Click() Dim Resultado As Long cd1.Filter = "Ficheros Wav |*.Wav" cd1.ShowOpen NombreFicheroWav = cd1.filename Resultado = mciExecute("Play " & NombreFicheroWav) End Sub Veamos ahora como podemos interpretar una secuencia MIDI (Ficheros *.Mid). Tambin con mciExecute Private Sub BPlayMIDI_Click() On Error Resume Next Dim iResult As Integer cd1.Filter = "Ficheros Mid |*.Mid" cd1.ShowOpen NombreFicheroMIDI = cd1.filename NombreFicheroMIDI se declar en la seccin de declaraciones del formulario para que su mbito sea toda la aplicacin, ya que necesitamos el nombre del fichero que se est ejecutando para poder pararlo, operacin que realizamos en otro procedimiento iResult = mciExecute("Play " & NombreFicheroMIDI) End Sub Para parar la ejecucin del fichero MIDI (Aqu s hay que preverlo, ya que con muy pocos Kas podemos tener mucho tiempo de msica) Private Sub BPararMIDI_Click() On Error Resume Next Dim iResult As Integer iResult = mciExecute("Stop " & NombreFicheroMIDI) End Sub

Vayamos ahora al tema del volumen, que afecta solamente al CD, tal como se cit al comenzar. Private Sub HScroll1_Change() HSCroll1 es el control de volumen HScroll2.Max = HScroll1.Value - Int(HScroll1.Value / 10) HScroll2.Min = -HScroll1.Value + Int(HScroll1.Value / 10) VolCD VolCD es el procedimiento de cambiar el volumen al CD End Sub Private Sub HScroll2_Change() HScroll2 es el control de Balance HScroll2.Max = HScroll1.Value - Int(HScroll1.Value / 10) HScroll2.Min = -HScroll1.Value + 1 VolCD End Sub El valor mximo de HScroll2 se cambia de un instante a otro. Se hace igual al valor actual de HScroll1 menos un 10%. Lo mismo para el valor mnimo. Vayamos a estudiar la forma de cambiar el volumen. Lo haremos con la funcin auxSetVolume. Esta funcin controla la entrada auxiliar de audio de la tarjeta de sonido. Recordemos la declaracin de la funcin auxSetVolume Declare Function auxSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal _ dwVolume As Long) As Long

Pgina 317

El parmetro uDeviceID es el ID del dispositivo que queremos variar su volumen. Para el caso del CD es el valor 1.. El parmetro dwVolume es un nmero compuesto por 4 Bytes. Los dos primeros Bytes corresponden al volumen del canal de la izquierda, y los otros dos, al canal de la derecha. El valor de esos 4 bytes puede ir desde el mnimo (0) hasta el mximo (&HFFFF = 65535). Tiene cierta complicacin el enlazar los dos valores, ya que el dato hay que metrselo en decimal. Como complemento a auxSetVolume tenemos auxGetVolume que nos devuelve el valor actual del volumen. (No se usa en el ejemplo) Declare Function auxGetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, lpdwVolume _ As Long) As Long Si quisiramos conocer el volumen del CD, haramos un procedimiento parecido a este. Public Sub VerVolumen Dim iResult As Long, lpdwVolumen as Long iResult = auxGetVolume (1, lpdwVolumen) Label1 = lpdwVolumen En Label1 presentar el valor del volumen End Sub Haga una prctica con esto y observar lo difcil que es controlar este nmero en decimal. No lo es tanto en Hexadecimal, por lo que podra aadir esta conversin : Label1 = Hex(Val(label1) Y tendra ese dato en hexadecimal, donde ya podr apreciar la variacin de los dos canales Vayamos al procedimiento que cambia el volumen en el ejemplo Public Sub VolCD() Procedimiento de cambio de volumen Dim iResult As Long Dim L1 As String, L2 As String, L3 As String, L4 As String If HScroll2.Value < 0 Then VolCDDch = HScroll1.Value + HScroll2.Value Else VolCDDch = HScroll1.Value End If If HScroll2.Value > 0 Then VolCDIzd = HScroll1.Value - HScroll2.Value Else VolCDIzd = HScroll1.Value End If Como el valor mximo de HScroll no puede pasar de 31.000 y pico, y nece sitaramos 65535, se pone como valor mximo esta cantidad dividida por 4. Ahora multiplicamos por 4 para que el valor sea el correcto. VolCDDch = VolCDDch * 4 - 1 VolCDIzd = VolCDIzd * 4 - 1 L1 = Hex(VolCDDch) L2 = Hex(VolCDIzd) Las variables L1 y L2 son Strings que contienen el valor hexadecimal del volumen derecho y del volumen izquierdo. La variable L3, tambin String, es la concatenacin de L1 y L2 L3 = L1 & L2 Y L4 ser un String con ese valor hexadecimal convertido a dec imal L4 = CDec("&H" & L3) iResult = auxSetVolume(1, Val(L4)) End Sub

Pgina 318

Esta forma de sumar dos nmeros (Ojo, que no es sumar, sino concatenar) no tiene porque ser la nica. Pero son matemticas, no Visual Basic. Existe otras funciones para el volumen de las otras fuentes de sonido midiOutSetVolume y waveOutSetVolume respectivamente para las salida del secuenciador MIDI y la reproduccin de ficheros Wav. Las correspondientes para ver el volumen actual son midiOutGetVolume y waveOutGetVolume. Aqu lo dejamos. El alumno tiene en la multimedia una ventana abierta a la investigacin.

FIN del captulo decimosptimo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Septiembre de 1998

Pgina 319

Visual Basic - Gua del Estudiante - Capitulo 18


CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS - EL OBJETO ERROR OPTIMIZACION DISTRIBUCION DE APLICACIONES Una vez que conocemos gran parte del Visual Basic, y que seguramente habremos hecho alguna aplicacin, es momento de pararnos en una de las cosas que un programador nunca debe olvidar: Un programa no solo debe funcionar, sino que debe funcionar bien. Parece que esta afirmacin carece de sentido o que al menos es una afirmacin gratuita. Sin embargo es un defecto muy comn entre programadores noveles, quizs por la alegra que da el trabajo terminado, olvidarse de algo tan fundamental como la calidad del programa, y perder por ello la alegra que da el trabajo bien hecho. Cuando terminamos un programa, lo normal es que no funcione bien. Mucho antes de terminarlo ya habremos tenido la sorpresa de que Visual Basic ha detectado un error y detiene la ejecucin del programa. Iremos corrigiendo los errores elementales que van apareciendo, errores de sintaxis, ficheros que ya estaban abiertos, End If que nos faltaban, etc. Y el programa parece que ya puede funcionar hasta el final. El programa debe entrar entonces en la fase de correccin de errores y optimizacin.

Correccin de Errores.
Denominamos Correccin de errores al proceso de la programacin en la que se analizan y corrigen los errores existentes en el cdigo o en el funcionamiento del programa. Podemos por tanto dividir los errores en errores de cdigo y errores de funcionamiento. Es un error de cdigo, por ejemplo, la siguiente lnea de programa: Open A:\MiFicher.Txt For Input as #1 Habr notado el error de bulto consistente en que A:\MiFicher.Txt debe ir entre comillas dobles. Este tipo de error se detecta generalmente al ejecutar el cdigo. En este caso, Visual Basic nos dar el mensaje de error Error de Sintaxis nada mas terminar de escribir la lnea. Errores como este, o el tpico If sin End If seguro que se los ha encontrado repetidas veces y no vamos a ahondar mas en ellos. Se corrige el error sintctico en el momento y el problema queda resuelto. Pero volvamos a la lnea de cdigo anterior, esta vez ya bien escrita: Open A:\MiFicher.Txt For Input as #1 Al estar escrita correctamente, esta lnea no nos puede dar error de sintaxis. Pero, Que ocurre cuando estamos ejecutando el programa que contiene esa lnea, y en el momento de ejecutarla no tenemos metido un disquete en la unidad A:? O piense lo que ocurrira si tenemos un disquete en A:, pero no existe en l el fichero MiFicher.Txt. No existe ningn error de sintaxis. El programa puede funcionar correctamente si, en el momento de la ejecucin de esa lnea, tenemos un disco en la unidad A: y ste contiene un fichero llamado MiFicher.Txt. Sin embargo no puede funcionar si no tenemos metido el disquete, o si este no tiene el mencionado fichero. En cualquiera de estos dos ltimos casos se produce un Error de Ejecucin. Existen dos tipos de errores de ejecucin: Errores Interceptables y Errores que no se pueden interceptar. Los errores interceptables son aquellos que Visual Basic conoce. Los dos errores anteriores son de este tipo. Son errores no interceptables, aquellos que Visual Basic no puede detectar. No porque no los conozca, sino porque el propio error deja sin trabajar a Visual Basic o incluso al sistema operativo. Afortunadamente el sistema operativo est muy protegido, pero no por

Pgina 320

ello dejan de ocurrir estos errores. Recuerda la frase El programa xxx ha causado un error de proteccin general en el Mdulo..... Bueno, acaba de producir un error No Interceptable. No solamente existen estos errores, tambin hay errores no catalogados y aplicables solamente al programador. Piense en un bucle infinito. Un bucle infinito es una secuencia de instrucciones tal como: Do While n < 2000 n=n+1 If n = 1000 then n = 0 Loop Podr advertir que este bucle no se termina nunca, ya que n no podr alcanzar nunca el valor 2000 ya que cada vez que llega a 1000 le cambiamos su valor a 0. Este tipo de error, mas normal de lo que parece, ni lo detecta VB ni produce una cada del sistema operativo. Sin embargo es un error, pero en este caso ser el propio programador quien se tenga que dar cuenta de l, ya que VB no puede ayudarnos debido a que el cdigo, lnea a lnea, est perfectamente escrito. Vemos por tanto que VB solamente nos ayudar en los errores de sintaxis, durante el tiempo de diseo, y los errores interceptables en tiempo de ejecucin.

Errores Interceptables. Veamos lo que dice la ayuda de VB para este tema: Los errores interceptables pueden producirse cuando est ejecutando una aplicacin, tanto en el entorno de Visual Basic como en modo autnomo. Algunos de estos errores pueden ocurrir tambin en tiempo de diseo o en durante la compilacin. Un error interceptable es, como decamos anteriormente, un error que Visual Basic conoce. Para conocerlos, VB dispone de un objeto que vamos a ver a continuacin. El Objeto Error

Objeto Error
Contiene informacin sobre errores en tiempo de ejecucin. El Objeto Error tiene Propiedades y Mtodos. Las propiedades del objeto Error las establece quien genera el error. Por ejemplo, si el error se genera durante la ejecucin, ser VB quien genera las propiedades del objeto Error. Pero puede ser tambin el programador quien genere el error. Lo veremos mas adelante Al objeto Error se le designa por Err Las propiedades del Objeto Error son: Description, HelpContext, HelpFile, LastDLLError, Number, Source

Propiedad Description
Devuelve o establece una cadena descriptiva asociada a un error. Sintaxis Variable = Err.Description Err.Description = Cadena descriptiva del error

Veremos un ejemplo mas adelante.

Pgina 321

Propiedad HelpContext
Devuelve o establece el identificador de contexto de un tema para un archivo de Ayuda de Microsoft Windows. Sintaxis Err.HelpContext [= id_contexto] Variable = Err.HelpContext

Esta propiedad y la siguiente le permiten presentar automticamente la ayuda cuando se produce un error.

Propiedad HelpFile
Devuelve o establece la ruta completa del archivo de Ayuda de Microsoft Windows que debe mostrarse al producirse el error. Sintaxis Err.HelpFile = C:\MiCarpeta\MiFicherodeAyuda.Hlp

Tambin puede leer el valor de esta propiedad: Variable = Err.HelpFile Cuando se especifica un archivo de Ayuda de Microsoft Windows en HelpFile, se le llama automticamente cuando el usuario presiona el botn Ayuda (o la tecla F1) del cuadro de dilogo del mensaje de error. Si la propiedad HelpContext contiene un identificador de contexto vlido para el archivo especificado, se mostrar automticamente el tema correspondiente. Si no se especifica nada en HelpFile, aparecer el archivo de Ayuda de Visual Basic.

Propiedad LastDLLError
Devuelve un cdigo de error de sistema producido por una llamada a una biblioteca de vnculos dinmicos (DLL). Slo aparece en los sistemas operativos Microsoft Windows de 32 bits.

Propiedad Number
Esta es la propiedad mas importante del Objeto Error. Por ello es la propiedad predeterminada. Permite conocer el nmero del error producido. Tambin nos permite establecer el nmero de error, cuando nos interesa provocar un error mediante cdigo, con el mtodo Raise Number es una variable tipo Long !!! Sintaxis Variable = Err.Number

Al ser la propiedad predeterminada, no es necesario poner Number. La siguiente lnea es operativamente igual a la anterior: Variable = Err Source Devuelve o establece el nombre del objeto o aplicacin que ha generado el error originariamente. Sintaxis Variable = Err.Source Err.Source = expresin_cadena

Pgina 322

Vea en la ayuda de VB la explicacin (muy ilustrativa) de esta propiedad.

El Objeto Error tiene solamente dos mtodos:

Mtodo Clear
Borra los valores de todas las propiedades del objeto Err. Sintaxis Err.Clear

Puede utilizar Clear para borrar explcitamente el objeto Err una vez que se ha tratado un error. Visual Basic llama al mtodo Clear automticamente siempre que se ejecuta alguna de las instrucciones siguientes: Cualquier tipo de instruccin Resume Exit Sub, Exit Function, Exit Property Cualquier instruccin 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 instruccin Exit Sub. En ese momento, desaparecen todas las propiedades del Objeto Error.

Mtodo Raise
Genera un error en tiempo de ejecucin. Sintaxis Err.Raise(Nmero, Origen, Descripcin, ArchivoAyuda, ContextAyuda)

Los argumentos de Raise se describen a continuacin. Nmero Requerido. Entero de tipo Long que identifica la naturaleza del error. Origen Opcional. Expresin de cadena que indica el objeto o aplicacin que ha generado originariamente el error. Descripcin Opcional. Expresin de cadena que describe el error. ArchivoAyuda Opcional. Ruta del archivo de Ayuda de Microsoft Windows en el que se encuentra la informacin sobre el error. ContextoAyuda Opcional. Identificador de contexto que especifica el tema del archivo indicado en ArchivoAyuda que contiene la informacin de ayuda del error. Todos los argumentos son opcionales, excepto Nmero. Sin embargo, si utiliza Raise sin especificar algunos argumentos, y si los valores de las propiedades del objeto Err no se han borrado, tales valores se conservarn para el error actual. Decamos al principio del Objeto Error que sus propiedades las establece quien las gener. Con el Mtodo Raise se genera un error. Y vea que se pueden establecer sus propiedades.

Control de los errores


Ya sabemos que herramienta usa Visual Basic para detectar errores. Vamos a ver ahora como usarla. Pero veamos previamente lo que es en Visual Basic una Rutina. No se extrae si alguien le llama Label o Etiqueta. En otros lenguajes se llama as, incluso en Q-Basic, donde no existan los controles Visual Basic llamados etiquetas, se usaba esta denominacin. En Visual Basic no podemos usarla, para no confundirla con el control. Una Rutina es un trozo de cdigo escrito en un procedimiento, que tiene un nombre. El nombre de la Rutina puede ser cualquiera, y debe terminar con el carcter dos puntos (:) Por ejemplo:

Pgina 323

RutinaErrores: El nombre de la rutina debe ocupar l solo una lnea. Se accede directamente a la rutina cuando citamos su nombre en el cdigo del procedimiento donde est la Rutina. Para citarla, debemos usar ese nombre, quitando el carcter dos puntos final. Podemos llamarla mediante la sentencia GoTo. Veamos un pequeo ejemplo. Es un botn de comando, y un TextBox. Si el TextBox (Text1) mantiene su texto original (Text1) hacemos que el programa pase por la rutina. Si lo hemos variado, hacemos que no pase: Private Sub Command1_Click() If Text1 = "Text1" Then GoTo Rutina Else MsgBox "No pasa por la Rutina" Exit Sub End If Rutina: MsgBox "S pas por la Rutina" End Sub La rutina es en realidad un trozo de cdigo del procedimiento que se ejecutar, bien porque hayamos dirigido all la ejecucin del programa (mediante GoTo) o bien porque el programa pase por la rutina al ejecutarse. Observe el Exit Sub que tiene en la parte Else del If - Then. Si no lo ponemos, el programa pasar por la rutina una vez ejecutada la sentencia condicional If Else - End If, igual que si se tratase de cualquier otra parte del programa. Para evitar que pase por ella, ponemos ese Exit Sub que har que el programa salga del procedimiento sin llegar al final. En el ejemplo anterior, la condicin para que pasase por la rutina era que se cumpliese una determinada condicin en Text1. Para que pase por una rutina, al darse la condicin de que ha ocurrido un error, usaremos la instruccin On Error GoTo

Importante. Cuidado con GoTo


Hay un dicho entre los programadores de Visual Basic. Los programadores se dividen en tres grupos. Los que nunca usan GoTo. Los que usan GoTo sin saber usarla y los que usan GoTo sabiendo usarla, pero de estos ltimos hay muy pocos.

Pgina 324

Instruccin On Error GoTo


Activa una rutina de tratamiento de errores y especifica la ubicacin de la misma en un procedimiento. Tambin puede utilizarse para desactivar una rutina de tratamiento de errores. Sintaxis On Error GoTo Rutina Va a la Rutina especificada On Error Resume Next Pasa del error y contina en la lnea siguiente a la que provoc el error On Error GoTo 0 Desactiva todo el tratamiento de errores que haya activado en el procedimiento actual. Veamos el ejemplo anterior, con la instruccin On error GoTo. Private Sub Command1_Click() On Error Resume Next Con la lnea anterior le decimos que se olvide del error y siga en la lnea siguiente a la que provoc el error If Text1 = "Text1" Then GoTo Rutina Else On Error GoTo 0 La lnea anterior desactiva el tratamiento de errores generado en la lnea segunda (On Error Resume Next). Pruebe a quitar y poner esta lnea (On error GoTo 0) Err.Raise 53 En la lnea 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 lnea On Error GoTo Rutina, el programa sabe que nada mas producirse un error, debe ir a la rutina sealada. En esa rutina tomaremos las medidas adecuadas para que se subsane el error producido. As por ejemplo, si en una lnea le decimos al programa que vaya a leer un fichero de la unidad A:, puede ocurrir que la unidad no tenga metido el disco. O que lo tenga metido pero que no exista el fichero en ese disco. La rutina de correccin de errores debe contemplar cada uno de esos dos casos, y actuar de forma distinta en uno y en otro. Hagamos un ejemplo donde al pulsar un botn (Command2) se busca el fichero Mificher.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.Txt" For Input As #1 Line Input #1, Variable label1.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 ejecucin. El disco no est listo

Pgina 325

Si estuviese metido el disco, pero no tuviera un fichero llamado Mificher.Txt, dara este error: Se ha producido el Error 53 de tiempo de ejecucin. No se ha encontrado el archivo En realidad estos errores no son de programa, sino de una utilizacin incorrecta del programa, ya que debera estar metido el disco, y que contuviese un fichero llamado Mificher.Txt. Pero en programacin hay que prever estas eventualidades. Y lo lgico sera poner un aviso dicindole al usuario que la unidad A: no est preparada (caso 1) o que el disco no contiene el fichero buscado (caso 2)

Instruccin Resume
Hemos visto en el apartado anterior la sentencia On Error Resume Next, de la que decamos que pasaba del error y contina en la lnea siguiente a la que provoc el error. Es as ya que la Instruccin Resume hace desaparecer el error mediante cdigo (Pone Err.Numbber = 0). Si le aadimos Next el programa sigue ejecutndose en la lnea siguiente a la que gener el error. La Instruccin 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 ejecucin contina con la instruccin que lo caus. Puede ocurrir que el error no se haya producido en el mismo procedimiento que contiene la rutina de tratamiento de errores, sino en otro al que se le ha llamado desde este. En este caso, la ejecucin contina en la instruccin del procedimiento que contiene la rutina de tratamiento de errores 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, la ejecucin contina con la instruccin inmediatamente posterior a la que lo caus. Si el error se ha producido en un procedimiento llamado, la ejecucin contina en la instruccin del procedimiento que contiene la rutina de tratamiento de errores (o la instruccin On Error Resume Next) inmediatamente posterior a aqulla desde la que se llam a otro procedimiento. Resume Rutina La ejecucin contina en la rutina citada en la instruccin. La rutina debe encontrarse en el mismo procedimiento que el controlador de errores. Ya que conocemos las instrucciones On Error GoTo y Resume, 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 Activemos la deteccin 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.Txt" For Input As #1 Line Input #1, Variable Label1.Caption = Variable Close #1 RutinaErrores: If Err.Number = 71 Then No hace falta poner Err.Number. Basta con Err MsgBox "La Unidad A no tiene ningn disco. Introduzca uno" Resume Al poner Resume (sin mas) el programa seguir ejecutndose Pgina 326

en la misma lnea que provoc el error. Como hemos intercalado un MsgBox, que lleva implcita una espera a que se le haga click en su botn, durante esa espera el usuario puede cambiar el disco y al reiniciarse el programa en esa lnea, ya puede tener un disco para que no se repita el error. End If If Err = 53 Then Aqu hemos puesto solamente Err MsgBox "El disco A no tiene ningn fichero llamado Mificher.Txt. Ponga el disco correcto" Resume End If End Sub

Ventana de Depuracin. El Objeto Debug


Es momento ahora de hablar de la ventana de depuracin. Esta ventana permite que Visual Basic se comunique con nosotros en tiempo de ejecucin. Es la ventana de Debug. No est presente normalmente en la pantalla, pero se presenta haciendo click en Ver | Ventana de Depuracin de la barra de men de Visual Basic. En esta ventana se presenta lo que escribamos en un objeto preparado para ayudarnos en la correccin de errores, que se llama precisamente Objeto Debug: Este objeto no tiene propiedades y tiene solamente un mtodo: el Mtodo Print En esta ventana podemos presentar otro tipo de datos, por ejemplo el valor de una variable en un determinado momento: Debug.Print MiVariable Veremos en el ejemplo de este captulo una aplicacin de la ventana de depuracin que le dejar claras las ideas. Si queremos que cuando se produzca un error se nos presente en esa ventana, basta con insertar esta lnea de cdigo en la Rutina de Error: Debug.Print Err.Number Debug.Print Err o simplemente

Hemos visto la forma de detectar un error y tomar las medidas oportunas para que el programa siga funcionando. Aqu lo hemos hecho solicitndole una operacin al usuario. En otros casos nos interesar que el programa pase del error, en otras que repita un procedimiento... El programador deber ver en cada caso la respuesta que debe dar el programa a un determinado error. Un programa perfecto es aquel que contempla todas las posibilidades de error y les da solucin a todas. Esto quiere decir, que un programa debera tener en cada procedimiento una llamada a la deteccin de errores (On error GoTo ... ) y una rutina de correccin. El trabajo es grande. La recompensa tambin. Pero un error muy comn entre programadores es autocomprobar sus errores. Realiza un programa y comienza a ejecutarlo intentando descubrir los errores en los que puede caer. Le recomiendo que esa labor la realice un compaero. La persona que realiz el programa sabe

Pgina 327

perfectamente lo que debe hacer. Y an queriendo, le cuesta mucho trabajo cometer errores. Una persona que nunca haya trabajado con el programa, lo que le cuesta trabajo es no cometerlos.

Pgina 328

OPTIMIZACION DE PROGRAMAS
Un programa ser mejor, cuanto mejor cumpla los requisitos del cliente y los requisitos generales que debe cumplir una aplicacin. Estos requisitos pueden resumirse en: - Seguridad - Rapidez - Mnimos recursos del sistema - Ergonoma - Amigabilidad - Facilidad de programacin de parmetros Para que un programa sea Seguro es necesario que no falle, lo que se consigue mediante una depurada tcnica de control de errores. Cuando el programa hace uso de una Red de Area Local, es necesario determinar correctamente las exclusiones mutuas entre usuarios, protecciones de informacin, etc. La rapidez se consigue mediante el programa y con los recursos de la mquina. Para conseguir rapidez en una aplicacin deben tenerse en cuenta estos detalles: Declare todas las variables, optimizando el tipo de dato a los datos reales que vaya a contener. No abuse de bucles anidados. No redibuje ni emplee el mtodo Refresh durante un proceso en el que necesite rapidez. La ejecucin del cdigo es ms rpida si est en un nico procedimiento que si utiliza llamadas a otros procedimientos. Los accesos a bases de datos (ya se vern) emplean mucho tiempo. Ah s merece la pena optimizar en lo posible. Pero no merece la pena en la mayor parte de los programas pretender optimizar el software para aquilatar al mximo la rapidez del programa. Sobre todo cuando esa optimizacin nos lleva a pensar que debemos evitar los accesos a disco. El disco flexible (A:) s presenta unos tiempos de acceso que deben evitarse. La lectura del disco A: debera ser solamente para aquellos datos que se traen o se llevan de nuestra aplicacin, nunca para meter o sacar datos necesarios para el funcionamiento de la misma. Para esos datos debe emplearse siempre el disco duro, que tiene tiempos de acceso muy cortos. Los recursos del sistema es un tema que debe mirarse con sumo cuidado. Sobre todo la ocupacin de nuestro programa en la memoria. Para que el programa ocupe el menor espacio posible, debemos tener en cuenta estas reglas: Declarar todas las variables con el tipo de datos optimizado a los datos que van a contener. Una variable sin declarar se convierte automticamente en tipo Variant, que ocupar 16 bytes de memoria. Use preferentemente el tipo de dato Byte, que es el que menos ocupa (1 byte, menos que el boolean) cuando le sea suficiente. Descargue los formularios. Si utiliza la expresin FormX.Hide, el formulario queda en memoria RAM ocupando sitio. Use preferentemente Unload Me con lo que liberar la memoria que ocupaba ese formulario. No se preocupe si lo tiene que volver a cargar a lo largo de la evolucin del programa. Tarda muy poco. Cuando veamos Bases de datos, ver que se libera memoria cerrando los objetos de acceso a datos. No abuse de los Bitmap. Quedan preciosos como fondo de las aplicaciones, pero le pueden estar ocupando 300 400 Ks de RAM. Use en su lugar degradados de color, que tambin quedan muy bonitos y no ocupan memoria. Pgina 329

Ergonoma y Amigabilidad son dos palabras unidas de raz a las aplicaciones con interface grfica. Ergonoma significa que una persona frente a una aplicacin debe sentirse a gusto. Para ello debe crear una interfaz grfica sencilla, con las dimensiones de sus componentes adaptadas al contenido y tamao del formulario que los contiene. Los componentes deben quedar dispuestos el la interface de una manera lgica, buscando la armona de formas. No se debe emplear a fondo con los colores. Los tonos vivos y disparatados que pueden parecerle bien en un principio, terminan cansando al usuario. Use preferentemente tonos apagados, grises, azules o verdes, y estos ltimos ni muy oscuros ni muy chillones. La mejor forma de comprobar la calidad de la interfaz es drsela a juzgar al compaero de trabajo ms prximo. No piense nunca que Vd. tiene la verdad absoluta en este tema. Y no la tiene porque depende del gusto de cada uno. Debe poder variar las dimensiones de los formularios dependiendo de la dimensin de la pantalla (Resolucin de la pantalla). Puede hallar la resolucin actual de la pantalla mediante APIs Dim ancho As Integer, alto As Integer ancho = GetDeviceCaps(Me.hdc, 8) alto = GetDeviceCaps(Me.hdc, 10) Una vez conocido el ancho de la pantalla, reorganice las medidas de cada control: If ancho = 1024 Then With CBP1L1 .Left = 120 .Width = 2412 End With With CBP1L2 .Left = 2640 .Width = 2292 End With No tiene necesidad de complicarse la vida con APIs. Puede hallar el ancho de su pantalla mediante el objeto Screen Ancho = Screen.Width Alto = Screen.Height

La Amigabilidad se defini como la facilidad que tiene un programa para aportar datos o facilidades de operacin al usuario, antes de que este se los pida. Una aplicacin es amigable cuando el usuario, por ejemplo, no tiene que usar el ratn en un proceso de escritura. Se imagina un programa de captura de datos, donde debe sealar con el ratn una a una las casillas donde va a escribir? Esa aplicacin no sera nada amigable. Imagnese sin embargo ese mismo programa, que al terminar de insertar un dato, pulsando ENTER se pasa el foco automticamente a la siguiente casilla por orden lgico de insercin. Esa es una aplicacin amigable. Una aplicacin amigable debe tener necesariamente una ayuda. Y la ayuda que debe usar es precisamente la Ayuda de Windows. Las ayudas deben ser breves, exactas y concisas. No deben liar mas de lo que est al usuario. No deben ser muy extensas. Si necesita explayarse para explicar su aplicacin, haga dos ficheros de ayuda. En VB5 puede usar la propiedad ToolTipText de sus controles. Esto le permite colocar una pequea etiqueta con la operacin que se realiza si hace click en ese control. Es muy prctico y

Pgina 330

muy bonito, pero no abuse de los ToolTipText porque llega a ser farragoso que cada vez que detenemos un instante el cursor de ratn aparezca la tpica etiqueta amarilla. Facilidad de programacin de parmetros Imagnese un programa hecho rgidamente. Es posible que cumpla con las todas las especificaciones pedidas por el cliente. Las cumple hoy. Si maana el cliente incorpora un nuevo producto a su lnea de negocios, ser necesario introducir una reforma en el cdigo de la aplicacin. Pero imagnese la parte peor de este planteamiento. Lo ms probable es que ese programa solamente le sirva al cliente que se lo encarg. Los programas deben ser abiertos, permitiendo que la mayor parte de los parmetros puedan variarse. Para ello es muy prctico emplear ficheros de inicializacin. Un fichero de inicializacin se ejecuta en el Load del formulario Inicial, si va a marcar los parmetros de partida del programa, o puede leerse en cualquier parte del programa para introducir datos a una parte del mismo. Un fichero de inicializacin clsico es el que pone el ttulo (Caption del formulario principal) al programa, le dice en qu carpeta est y como se llama el fichero de ayuda, carpeta donde estn los archivos o las bases de datos del programa, etc. Mediante estos ficheros puede usar el mismo programa para clientes distintos, y personalizrselo en su domicilio mediante estos ficheros. Un fichero de este tipo debe estar en ASCII puro, de manera que se pueda editar con cualquier editor (Bloc de notas, p.e.) y ver todos los parmetros que se introducen. Esta forma de guardarlo nos permite ver cualquier error que pueda contener simplemente editndolo. Podra tener esta forma: ////////////////////////////////////////////////////////////////////////////////////////////////////// estar bien // // cabecera // FICHERO DE INICIALIZACION DEL PROGRAMA PEPE // // // ////////////////////////////////////////////////////////////////////////////////////////////////////// [TITULO] Talleres Pepe. Programa de Recepcin de Vehculos para Reparar [BASEDATOS] C:\Mis Documentos\Bases de Datos\Vehiculos.MDB [USUARIOS] Mara Lpez Gonzlez Jos Surez Martn Andrs Ortiz Gmez Luisa Ortega Cano [TECNICOS] Obdulio Prez Prez Ataulfo Lpez Alvarez Octavio Fernndez Alonso Edelmiro Lpez Arriorta [BASECLIENTES] C:\Mis Documentos\Bases de Datos\Clientes.MDB [FIN DATOS] Siempre debe

indicado en su

Este es un posible fichero de inicializacin. Observe que existen unas lneas donde se introduce entre brackets [ ] el tipo de informacin que va a venir a continuacin. La lnea o

Pgina 331

lneas siguientes a estas lneas contienen una o varias informaciones del tipo especificado entre [ ]. En el ejemplo anterior, la primera lnea de informacin nos aporta el ttulo que va a tener la aplicacin para ese cliente determinado. Para instalar la aplicacin a otro cliente, basta cambiar el contenido de esta lnea, sin tocar para nada el programa. Lo mismo ocurre con la lnea siguiente, que le permite al programa conocer la ubicacin dentro del disco de la base de datos. La lnea [USUARIOS] nos va a permitir introducir varios nombres, que sern los nombres de las personas que manejan el programa. Observe que existe una diferencia fundamental entre las lneas anteriores y esta. En las lneas anteriores, la informacin no cambia a lo largo del tiempo, y si hubiera que realizar algn cambio en una de estas informaciones, sera el programador quien lo realizase. En el apartado [USUARIOS] la informacin es cambiante a lo largo del tiempo. No tendra sentido que tuviese que ir el programador a introducir el dato de un nuevo trabajador cada vez que haya un movimiento en la plantilla de ese taller. Tampoco ser muy prctico que sea el propio cliente el que edite mediante el bloc de notas este fichero. Probablemente cometa un error involuntario que haga que no funcione la aplicacin. La solucin para que el usuario pueda cambiar la informacin de ciertas partes de este fichero, es dotar a la aplicacin de un asistente para que lo realice. Este asistente le permitir cambiar solamente las partes que no afecten al funcionamiento del programa, y se lo permitir hacer de una forma cmoda y sistemtica, de forma que cualquier usuario, por muy pocos conocimientos que tenga, pueda realizarlos. Veamos un procedimiento donde el programa puede interpretar estos datos. Imagine que este fichero con datos se encuentra situado en el mismo directorio de la aplicacin (No obligue nunca a poner la aplicacin en un determinado directorio. No gusta a muchos clientes) Como no sabemos en que directorio va a estar, obtenga este dato del objeto App. Supongamos que el fichero anterior se llama MisDatos.Ini. Veamos el Procedimiento. Este procedimiento deber estar en el formulario inicial, y lo llamaremos desde el procedimiento Form.Load de ese formulario para que se ejecute durante la carga del mismo. Como los datos obtenidos aqu se van a utilizar en otros procedimientos, suponemos que las variables que los contienen se han declarado en el sitio adecuado para cubrir el mbito que deseamos. General Declaraciones Dim BaseDatos1 As String, BaseDatos2 As String Public Sub LeeDatos() Dim LineaEntrada As String, TipoDatos As Byte Open App.Path & "\MisDatos.Ini" For Input As #1 Do Until EOF(1) Line Input #1, LineaEntrada If LineaEntrada = "[TITULO]" Then TipoDatos = 1: GoTo Termina If LineaEntrada = "[BASEDATOS]" Then TipoDatos = 2: GoTo Termina If LineaEntrada = "[USUARIOS]" Then TipoDatos = 3: GoTo Termina If LineaEntrada = "[TECNICOS]" Then TipoDatos = 4: GoTo Termina If LineaEntrada = "[BASECLIENTES]" Then TipoDatos = 5: GoTo Termina If LineaEntrada = "[FIN DATOS]" Then TipoDatos = 0: GoTo Termina If Ucase(Trim(Left(LineaEntrada, 3))) = "REM" Then GoTo Termina La lnea anterior quita los datos de las lneas que comiencen por REM. Observe que se han tomado todas las seguridades para aceptar maysculas y minsculas (Ucase) y que lleven espacios iniciales (Trim) Select Case TipoDatos Case 1 Me.Caption = LineaEntrada Case 2 BaseDatos1 = LineaEntrada Pgina 332

Case 3 ComboUsuarios.AddItem LineaEntrada Case 4 ComboTecnicos.AddItem LineaEntrada Case 5 BaseDatos2 = LineaEntrada End Select Termina: 'Esta rutina no contiene cdigo. Solamente se usa para 'dirigir la ejecucin del programa a este punto desde 'las lneas iniciales y evitar que pase por el Select Case

Loop Close #1 End Sub Al terminar la ejecucin de este procedimiento, tenemos, en la barra de ttulo del programa, la lnea Talleres Pepe. Programa de Recepcin de Vehculos para Reparar , en las variables BaseDatos 1 y 2 los nombres (y Path) de las dos bases de datos, y en los ComboBox ComboUsuarios y ComboTecnicos, los nombres indicados en el fichero de datos. Ya tenemos esos datos disponibles en nuestra aplicacin para lo que haga falta. Es decir, hemos personalizado la aplicacin mediante un fichero de inicializacin.

DISTRIBUCION DE APLICACIONES
Una vez terminado un programa y realizado su correspondiente ejecutable (Fichero .EXE), observaremos con gran asombro que si copiamos ese ejecutable en otro ordenador, lo mas probable es que no funcione. Esto es Visual Basic. La razn para que no funcione es que un programa realizado en VB necesita, lgicamente, el ejecutable, y adems, todas las DLLs y OCX (que contienen los controles y las funciones usadas en el diseo) que estn asociadas al programa. Esto implica que un programa VB no es un programa compacto, sino que est formado por varios ficheros, que deben montarse en el ordenador destino de nuestra aplicacin. Esta tcnica permite ahorrar espacio en el disco, ya que si tenemos dos aplicaciones realizadas en VB, lo mas probable es que compartan varios de estos ficheros DLLs u OCX, de forma que se consigue un ahorro real de disco duro. Pero eso s, a costa de complicar un poco la instalacin y el Registro de Windows. Sera difcil conocer las DLLs y OCX que debemos distribuir con nuestra aplicacin. Pero VB facilita las cosas ya que dispone de un buen asistente (Wizard) para la creacin de discos de distribucin. Y me refiero a la versin 4 de VB. El Wizard de la versin 5 da problemas. Ojo. Este asistente detectar los controles que hemos usado en la aplicacin y por lo tanto las DLLs y OCX necesarios. Primera precaucin. El asistente considera que la aplicacin usa TODOS los controles presentes en la caja de herramientas en el momento de realizar el ejecutable. En la caja de herramientas puede haber muchos controles y nuestro programa utiliza solamente uno de ellos. El asistente distribuira las DLL y OCX necesarios para todos los controles presentes en la caja de herramientas en el momento de la creacin del .EXE Se deben quitar de la caja de herramientas todos los controles no usados en la aplicacin. Por el mismo motivo, se deben quitar todas las Referencias no necesarias. Una vez quitado todo lo que no es necesario, se genera el ejecutable de la aplicacin, que debe estar necesariamente, en el mismo directorio donde est el fichero .VBP.

Pgina 333

Salga de VB y vaya al Asistente para instalar Aplicaciones, que est en el mismo grupo de trabajo que el VB. Para buscar el programa a distribuir, haga click en el botn con tres puntos al lado del cuadro de texto de Archivo de Proyecto. Pantalla Inicial del Asistente para Instalar Aplicaciones. Una vez elegido el proyecto a distribuir, haga click en Siguiente A continuacin le pregunta si quiere distribuir alguno de los motores de bases de datos. Lo veremos mas adelante. Si hubiese empleado alguna base de datos ya le sale marcado el motor correspondiente. Haga click en Siguiente. Ahora le da a elegir entre guardar los ficheros a distribuir en un directorio de su disco duro (o de su Red de Area Local) o en disquetes. La eleccin depende de sus necesidades. Es muy prctico, meterlo en un directorio. No le pedir discos formateados y la ejecucin ser mucho ms rpida. Esta solucin es prctica cuando la distribucin la va a realizar a travs de la Red de Area Local o a travs de Internet. Para realizar la instalacin en el ordenador destino, deber copiar todos los ficheros generados por el asistente en el mismo directorio, y proceder a la instalacin desde ese directorio. Si tiene RAL es comodsimo instalar desde un directorio de un disco del servidor. Si lo que quiere es distribuirla en disquetes, es ms prctico elegir guardar los ficheros en disquetes. Le dir cuantos discos necesita. Le ir pidiendo uno a uno. En el siguiente paso analiza si ha usado algn servidor OLE. En ese caso se lo incluye en los discos de distribucin. En el siguiente paso es cuando le indica las DLLs y OCX que va a distribuir con su aplicacin: Ficheros .DLL y .OCX que va a distribuir con su aplicacin. Si hace click en Detalles del archivo, le dir las propiedades del fichero seleccionado. Esto le permite conocer la versin y fecha de ese fichero. Recuerde que a la hora de hacer la instalacin, si existe un fichero .DLL con fecha anterior al que lleva su instalacin, se lo cambia. Si el fichero DLL que lleva su instalacin tiene fecha anterior al existente, no lo cambia. Es decir, se queda con el mas moderno. En el siguiente paso le pide que elija entre instalarlo en el directorio de la aplicacin o como servidor OLE. Elija siempre el primero. En el paso siguiente le invita a quitar o aadir ficheros a la distribucin. Puede quitar ficheros DLL u OCX, siempre a sabiendas de que la aplicacin no se podr ejecutar si no lo distribuye. Pero puede ocurrir que el ordenador donde la va a instalar ya lo tenga. Depende de Ud. Quitar uno de estos ficheros. En este paso tambin puede aadir un fichero. Piense por ejemplo, en el fichero de inicializacin que vimos anteriormente. Deber distribuirlo con su aplicacin, aunque luego, una vez en el ordenador del cliente necesite cambiarle algn parmetro. Para ello haga click en Agregar Archivos, le aparecer un cuadro donde puede elegirlo. Ver que se le inserta en el cuadro donde estn el resto de los ficheros. Si ahora lo selecciona y hace click en Detalles del Archivo le aparecer un cuadro donde puede ver, entre otras cosas, el directorio de destino. Por defecto siempre le aparece el directorio de la aplicacin $(App.Path), pero puede cambiarlo al directorio que desee: directorio de Windows $(WinPath), directorio Windows\System &(WinSysPath), directorio de ficheros comunes $(CommonFiles), directorio de Archivos de Programas $(ProgramFiles). Una vez realizado este paso, solamente le queda hacer click sobre Terminar. Si ha elegido realizar la distribucin sobre disquetes se los ir pidiendo uno a uno.

Pgina 334

Le crear varios ficheros, casi todos ellos comprimidos (Observe que el nombre del fichero termina en _). Existir uno que no est comprimido, el Setup.LST Este fichero contiene toda la informacin relativa a la instalacin, y puede cambiarla ya que est editado en ASCII puro. Tiene esta forma:
[BootStrap] File1=1,,setup132.ex_,setup132.exe,$(WinPath),$(EXESelfRegister),,10/16/1995,174592,4.0.0.2422 File2=1,,stkit432.dl_,stkit432.dll,$(WinSysPath),,$(Shared),10/16/1995,24576,4.0.2422.0 File3=1,,VB40032.DL_,VB40032.DLL,$(WinSysPath),,$(Shared),8/15/1995,721168,4.0.24.22 File4=1,,ven2232.ol_,ven2232.olb,$(WinSysPathSysFile),,,11/17/1997,37376,2.0.0.5924 File5=1,,olepro32.dl_,olepro32.dll,$(WinSysPath),$(DLLSelfRegister),$(Shared),11/17/1997,114960,5.0.4118.1 File6=1,,msvcrt20.dl_,msvcrt20.dll,$(WinSysPathSysFile),,,8/24/1996,253952,2.11.0.0 File7=1,,msvcrt40.dl_,msvcrt40.dll,$(WinSysPath),,$(Shared),11/24/1997,326656,4.10.0.6038 File8=1,,ctl3d32.dl_,ctl3d32.dll,$(WinSysPathSysFile),,,10/16/1995,27136,2.29.0.0 File9=1,,VB4ES32.DL_,VB4ES32.DLL,$(WinSysPath),,$(Shared),10/16/1995,37184,4.0.24.22 [Files] File1=1,,COMDLG32.OC_,COMDLG32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),11/17/1997,128784,5.0.37. 14 File2=1,,MFC40.DL_,MFC40.DLL,$(WinSysPath),$(DLLSelfRegister),$(Shared),4/2/1997,924432,4.1.0.6139 File3=1,,MFC40LOC.DL_,MFC40LOC.DLL,$(WinSysPath),,$(Shared),10/16/1995,45056,4.0.0.5208 File4=1,,TABCTL32.OC_,TABCTL32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),11/17/1997,192784,5.1.43.19 File5=1,,RICHTX32.OC_,RICHTX32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),2/20/1997,195856,5.0.37.14 File6=1,,COMCTL32.OC_,COMCTL32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),11/17/1997,604432,5.1.43.1 9 File7=1,,CCTLES32.DL_,CCTLES32.DLL,$(WinSysPath),,$(Shared),10/16/1995,39936,1.0.23.31 File8=1,,DBLIST32.OC_,DBLIST32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),2/20/1997,202000,5.0.37.14 File9=1,,DBGRID32.OC_,DBGRID32.OCX,$(WinSysPath),$(DLLSelfRegister),$(Shared),2/20/1997,519680,5.0.37.14 File10=1,,GRDKRN32.DL_,GRDKRN32.DLL,$(WinSysPath),,$(Shared),10/16/1995,136704,1.19.0.54 File11=1,,DAO3032.DL_,DAO3032.DLL,$(MSDAOPath),$(DLLSelfRegister),$(Shared),11/17/1997,447760,3.0.0.2627 File12=1,,MSJT3032.DL_,MSJT3032.DLL,$(WinSysPathSysFile),,,11/17/1997,965904,3.0.0.2809 File13=1,,MSJTER32.DL_,MSJTER32.DLL,$(WinSysPathSysFile),,,11/17/1997,98356,3.0.0.2712 File14=1,,MSJINT32.DL_,MSJINT32.DLL,$(WinSysPathSysFile),,,11/17/1997,33552,3.0.0.2712 File15=1,,VBAJET32.DL_,VBAJET32.DLL,$(WinSysPathSysFile),,,2/20/1997,18192,5.0.0.7122 File16=1,,VBDB32.DL_,VBDB32.DLL,$(WinSysPath),,$(Shared),10/16/1995,59504,4.0.24.22 File17=1,,MSRD2X32.DL_,MSRD2X32.DLL,$(WinSysPathSysFile),$(DLLSelfRegister),,10/16/1995,250640,3.0.0.2008 File18=1,,MSWNG300.DL_,MSWNG300.DLL,$(WinSysPathSysFile),,,10/16/1995,302352,3.0.0.2008 File19=1,,ODBCJT32.DL_,ODBCJT32.DLL,$(WinSysPathSysFile),,,2/20/1997,241664,3.50.3602.0 File20=1,,ODBCJI32.DL_,ODBCJI32.DLL,$(WinSysPathSysFile),,,2/20/1997,42854,3.50.3602.0 File21=1,,ODBCTL32.DL_,ODBCTL32.DLL,$(WinSysPathSysFile),,,2/20/1997,77824,3.50.3602.0 File22=1,,VBAR2232.DL_,VBAR2232.DLL,$(WinSysPathSysFile),,,11/17/1997,244496,2.0.0.5924 File23=1,,TPepe.ex_,TPepe.exe,$(AppPath),$(EXESelfRegister),,9/1/1998,10240,1.0.0.0 File24=1,,Datos.In_,Datos.Ini,$(AppPath),,$(Shared),9/1/1998,753 [Setup] Title=TPepe DefaultDir=$(ProgramFiles)\TPepe Setup=setup132.exe AppExe=TPepe.exe AppPath= ; Puede eliminar las siguientes lneas para obtener espacio adicional ; para personalizar este archivo en un disco de instalacin completa. ; ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Analicemos el contenido del fichero. Las ltimas lneas son nicamente de relleno. Cuando realiza la distribucin en disquetes, este fichero va en el primero de ellos. Como no le sobra ni un byte, no podra modificar nada en este fichero. Cuando tenga que realizar alguna modificacin, consiga espacio extra en este fichero borrando varias lneas de las que contienen xxxx

Sigamos por atrs.


[Setup]

Pgina 335

Title=TPepe DefaultDir=$(ProgramFiles)\TPepe Setup=setup132.exe AppExe=TPepe.exe AppPath=

Esto le va a fijar el ttulo de la aplicacin (Title), que ser el que le figure en el icono o en la barra de programas. Puede poner el nombre que quiera. Toma como nombre por defecto el que le hayamos dado al proyecto (En nuestro ejemplo Tpepe (Talleres Pepe)) Tambin le fija el directorio donde lo va a instalar (DefaultDir). Por defecto pone el directorio Archivos de Programas $(ProgramFiles) y en l un subdirectorio con el mismo nombre de la aplicacin. Puede cambiar al directorio que desee. Por ejemplo:
DefaultDir = C:\MiCarpeta

De cualquier forma, a la hora de realizar la instalacin, puede cambiar este directorio. No es necesario que exista el directorio indicado aqu. Si ni existe, lo crea. La lnea Setup indica el fichero que le va a ejecutar la instalacin. No la toque. App.Exe es el nombre del ejecutable. No lo cambie. App.Path = No ponga nada. Le evitar complicaciones.

La seccin [Files] indica los ficheros que debe cargar, cada uno con indicacin del directorio donde debe colocarlo. No toque nada de esta seccin. La seccin [BootStrap] contiene informacin de los ficheros que le van a realizar la instalacin. No los toque.

Nota final Este captulo termina la primera parte de esta Gua del Estudiante. Aproximadamente, corresponde al primer trimestre del curso. La segunda parte habla exclusivamente de bases de datos. Asegrese que conoce perfectamente lo explicado hasta aqu. No se volvern a tocar estos temas en el resto del curso. Imprima y encuaderne estos 18 captulos. Recuerde que es IMPOSIBLE estudiar sobre la pantalla del ordenador. Es imprescindible imprimirlos. Y tambin encuadernarlos. El orden siempre ha ayudado a estudiar FIN del captulo decimoctavo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa), Septiembre de 1998

Pgina 336

Visual Basic - Gua del Estudiante Cap. 19


BASES DE DATOS EN VISUAL BASIC (1) Visual Basic nos permite trabajar directamente con distintas bases de datos (ACCESS, dBaseIII, dBaseIV , dBase 5, Excel3, Excel4, Excel5, Excel7, FoxPro2.x, Foxpro3.0, LotusWK1, LotusWK3, LotusWk4, Paradox3.x, Paradox4.x y Paradox5.x Para acceder a estas Bases de Datos basta con introducir un control Data en el formulario, y fijarle las propiedades apropiadas para que trabaje sobre uno u otro tipo de base de datos. El control Data nos permite acceder de una forma sencilla a cualquier base de datos de estos tipos, y sirve de enlace entre la base de datos y los controles que son habilitados para presentar los datos de esa base. El Control Data El control Data puede tomarse directamente de la caja de herramientas. En el formulario tiene el aspecto de una barra deslizante :

El control Data proporciona acceso a datos almacenados en bases de datos usando uno de los tres tipos de objetos Recordset. El control Data le permite ir de registro en registro y presentar y manipular los datos de los en controles enlazados. Sin un control Data, los controles enlazados con datos de un formulario no pueden tener acceso automticamente a los datos. Los controles enlazados solamente pueden tener acceso a un control Data si este est en el mismo Formulario. En el tema de Bases de Datos se emplean trminos no conocidos an. Se irn viendo a lo largo del curso, pero no queda otro remedio mas que comenzar a utilizarlos. Se irn haciendo avances de estos trminos, que sern explicados en profundidad en su momento. Avance de los trminos empleados : Objeto Recordset (conjunto de registros) Es un conjunto lgico de registros. Los tres tipos de objetos Recordset son dynaset, (Permite la lectura y escritura de un registro) snapshot (Realiza una lectura instantnea de los registros, no permitiendo modificarlos) y table. (Representacin en el cdigo de una tabla base que puede utilizarse para agregar, modificar o eliminar registros de una sola tabla). Controles enlazados Son los controles que pueden presentar directamente datos de uno o varios campos de una Base de Datos. Los controles DBList, DBCombo y DBGrid tienen la posibilidad de presentar un conjunto de registros cuando se asocian con un control Data. Los controles CheckBox, TextBox, Label, Picture, Image, ListBox y ComboBox tambin son controles enlazados con datos y pueden asociarse a un nico campo de un Recordset administrado por un control Data. La mayora de las operaciones de acceso a datos se pueden realizar usando el control Data sin

Pgina 337

escribir ningn cdigo. Los controles enlazados con un control Data presentan de forma automtica los datos de uno o ms campos del registro actual o, en algunos casos, de un conjunto de registros a ambos lados del registro actual. El control Data realiza todas las operaciones sobre el registro actual. Avance de trminos Registro Actual. Un registro es un conjunto completo de campos. Una base puede tener muchos registros, pero el puntero de la base de datos apunta a un nico registro en cada momento. Ese registro al que apunta el puntero se llama registro actual. Si el control Data recibe instrucciones de moverse a un registro diferente, todos los controles enlazados pasan automticamente los cambios al control Data para ser guardados en la base de datos. El control Data se sita despus en el registro requerido y pasa los datos del registro actual a los controles enlazados donde son presentados. Esto significa que se pueden modificar los datos de una base de datos simplemente cambiando los datos en los controles enlazados que lo permitan, y moviendo el puntero de la base de datos, es decir, cambiando el registro actual. Una vez iniciada la aplicacin, Visual Basic usa las propiedades del control Data para abrir la base de datos seleccionada, abrir un objeto Database y crear un objeto Recordset. Las propiedades Database y Recordset del control Data hacen referencia a los objetos Database y Recordset recin creados que pueden ser manipulados por el control Data. Siempre podremos conocer el Recordset usado por el control Data leyendo esa propiedad VariabletipoRecordset =Data1.Recordset Cuando se usa un control Data para crear un objeto Recordset o cuando se crea un objeto Recordset en el cdigo y se asigna al control Data, el motor de base de datos Jet de Microsoft puebla automticamente el objeto Recordset. Como resultado, los marcadores (y en los objetos Recordset de tipo snapshot, los datos del conjunto de registros) se guardan en la memoria local; el usuario no necesita manipular el control Data y no es necesario invocar el mtodo MoveLast en el cdigo. Los bloqueos de pgina usados para crear el Recordset se liberan ms rpidamente, haciendo posible que otros objetos Recordset accedan a los mismos datos. Los objetos Recordset creados en el cdigo pero que no se asignan a un control Data no son poblados automticamente por el motor Jet. Se deben poblar desde el cdigo. El prrafo anterior exige al menos una explicacin. Cuando se crea un Recordset mediante un control Data, se leen inmediatamente todos los registros que forman parte de ese Recordset (Recuerde que un Recordset es un conjunto de registros). De esta forma, en una base que estuviera compartida por varios usuarios a travs de una Red de Area Local (RAL) un usuario leera todos los datos en el mismo momento de la creacin del Recordset por el control Data, llevara esos datos a su memoria RAM y no volvera a estorbar en la base de datos (cuando un usuario de una RAL lee un dato en una BD, bloquea esta BD mientras dura su lectura y no pueden acceder a ella otros usuarios) Si el Recordset se crea por cdigo, se lee solamente un registro (la base se bloquea en el momento de la lectura e inmediatamente se libera), y cuando se le pide otra operacin (p.e. que avance un registro) vuelve a bloquear la BD, lee ese registro y la desbloquea. En principio el leer el Recordset de una vez parece que tiene ventajas en aquellas instalaciones que tienen una base de datos compartida. Todo ello a un precio. Ocupar mas memoria RAM en cada uno de los PCs de los usuarios. Esta limitacin hace en algn caso que no sea posible utilizar un control Data por falta de memoria RAM en los puestos de usuario. El control Data puede manipularse con el mouse, movindose de registro en registro o al principio o al final del Recordset. El control Data no permite que el usuario se pase de los lmites del Recordset usando el mouse. No se puede mover el enfoque al control Data.

Pgina 338

Observacin muy importante El control Data crea un objeto Database y un objeto Recordset automticamente. Estos objetos de acceso a datos son idnticos a los creados mediante cdigo, y tienen las mismas propiedades y mtodos. Podemos referirnos a ellos usando el nombre del control Data seguido del nombre del objeto (Database o Recordset). Por ejemplo : Data1.Database Data1.Recordset

El objeto Database creado por un control Data no se cierra aunque se cambie la propiedad DatabaseName del control Data. Lo mismo ocurre con el objeto Recordset. Solamente podemos cerrarlos utilizando el mtodo Close : Data1.Database.Close Data1.Recordset.Close

Esta observacin debe ser tenida muy en cuenta sobre todo cuando la el control Data abre la Base de Datos de forma exclusiva, o cuando tenemos que hacer una operacin con la Base de Datos que exija que est cerrada. Por ejemplo, el mtodo CompactDatabase y otros mtodos que veremos mas adelante. Objetos para acceso a datos Los objetos para acceso a datos Database y Recordset creados por el control Data pueden usarse en los procedimientos. Los objetos Database y Recordset tienen cada uno sus propiedades y mtodos propios y se pueden escribir procedimientos que usen estas propiedades y mtodos para manipular los datos. Por ejemplo, el mtodo MoveNext de un objeto Recordset mueve el registro actual al siguiente registro del Recordset. Para invocar este mtodo, se podra usar el siguiente cdigo: Data1.Recordset.MoveNext El control Data tiene la capacidad de tener acceso a cualquiera de los tres tipos de objetos Recordset del motor Jet versin 2.0. Si no se selecciona el tipo de conjunto de registros, se crea un Recordset de tipo Dynaset. Nota. Las constantes usadas para requerir un tipo especfico 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 mtodo OpenRecordset. Para seleccionar un tipo especfico 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 Edicin Standard y la Edicin Profesional de Visual Basic En cuanto al acceso a datos, la diferencia principal entre las ediciones Estndar y la Profesional de Visual Basic es la capacidad de crear nuevos objetos para acceso a datos. En la edicin Estndar NO se pueden declarar en el cdigo (con la palabra clave Dim) variables como objetos para acceso a datos. Esto quiere decir que slo el control Data puede crear objetos Database y Recordset.

Pgina 339

En la edicin Profesional de Visual Basic, SI se puede crear un nuevo objeto Recordset y asignarlo a la propiedad Recordset del control Data. Todos los controles enlazados conectados con el control Data permiten la manipulacin de los registros del Recordset creado. Asegrese de que las propiedades DataField de los controles enlazados estn definidas con nombres de campo vlidos del nuevo Recordset. Esta diferencia ha llevado a la locura a muchos alumnos y programadores usando la versin de su casa y la de su empresa o centro escolar ! Consultas almacenadas Otra opcin importante cuando se usa el control Data es la posibilidad de ejecutar consultas almacenadas. Si se ha creado previamente un objeto QueryDef, (No se asuste, Un QueryDef no es ni mas ni menos que una consulta en la base de datos ACCES) el control Data puede ejecutarlo y crear un Recordset usando las propiedades almacenadas SQL, Connect y otras del objeto QueryDef. Para ejecutar un QueryDef, establezca la propiedad RecordSource del control Data al nombre del objeto QueryDef (En vez de poner el nombre de una tabla, ponga el nombre de la consulta. Cuando est rellenando esta propiedad, le aparecen, al mismo tiempo que el nombre de las tablas, el nombre de las consultas existentes). Si el objeto QueryDef almacenado contiene parmetros, es necesario crear el Recordset y pasrselo al control Data. Es mucho mas rpida una consulta utilizando un QueryDef que introduciendo la consulta SQL. La razn es muy sencilla. Al crear un QueryDef (Ya ver como) el motor Jet (Es decir ACCESS) crea esa consulta en la propia base de datos. Si lo que hace es una consulta SQL, se debe obtener la informacin registro a registro segn las condiciones establecidas en la clusula SQL. Esta segunda opcin tarda logicamente mas. Administracin de BOF/EOF BOF (Begin Of File). Se produce el BOF cuando el control Data se posiciona sobre el registro inmediatamente anterior al primero (No es un juego de palabras). Este registro ser el -1. EOF (End Of File) Se produce la condicin EOF cuando el control Data se posiciona en el registro inmediatamente posterior al ltimo. Este registro ser tambin el -1. El control Data tambin puede controlar la situacin en la que se encuentra con objetos Recordset sin registros. Cambiando la propiedad EOFAction, se puede programar el control Data para que pase automticamente al modo AddNew. El control Data puede programarse para que se ajuste automticamente a la parte superior o inferior de su formulario primario usando la propiedad Align. En cualquier caso, el control Data ajusta su tamao horizontal al de su formulario primario cuando el tamao de ste cambia. Esta propiedad permite situar un control Data en un formulario MDI sin requerir un control Picture que lo contenga. Propiedades del control Data Align El hecho de que tenga esta propiedad nos permite colocar un control Data en un formulario MDI hijo. Appearance Flat y 3-D Backcolor Color de fondo de la parte intermedia del control

BOFAction Esta propiedad establece el comportamiento del Control Data cuando tiene seleccionado como registro actual el registro -1 (los registros van del 0 a un nmero positivo). Esta situacin se da cuando se va bajando el nmero del registro actual mediante el mtodo

Pgina 340

MovePrevious y nos pasamos del registro 0, o cuando el Recordset no tiene ningn registro. En esta propiedad podemos establecer que se mueva al primer registro ( MoveFirst) o que se quede donde est (BOF Begin Of File). Caption El nombre que figurar en la parte intermedia del control.

Connect Muy Importante. En esta propiedad debemos indicarle al control Data el tipo de base de datos a la que va a conectarse. Admite todas las bases enumeradas al principio de este captulo. DatabaseName En esta propiedad se le indica el nombre (Con su Path) de la base de datos a la que debe conectarse. Para facilitar la bsqueda de la base de datos, haciendo click en esta propiedad en la caja de propiedades, podemos sacar un cuadro de dilogo haciendo click de nuevo en los tres puntos que aparecen a la derecha de la propiedad. El cuadro de dilogo seleccionar directamente las extensiones de los ficheros de bases de datos acordes con el tipo de base de datos seleccionada en la propiedad Connect. Database (Solo en ejecucin)

Esta propiedad es slo de lectura. Devuelve una referencia a un objeto Database subyacente de un control Data. Sintaxis Variable = nombredelcontroldata.Database

El objeto Database creado por el control Data se basa en las propiedades DatabaseName, Exclusive, ReadOnly y Connect del control. Los objetos Database tienen propiedades y mtodos que puede utilizar para administrar los datos. Puede utilizar cualquier mtodo de un objeto Database con la propiedad Database de un control Data, como Close y Execute. Tambin puede examinar la estructura interna de la Database empleando su coleccin TableDefs y, a su vez, las colecciones Fields e Indexes de objetos TableDef individuales. Aunque puede crear un objeto Recordset y pasarlo a la propiedad Recordset de un control Data, no puede abrir una base de datos y pasar el objeto Database recin creado a la propiedad Database del control Data. DragIcon, DragMode , Enabled Igual que todos los controles. EditMode Solo lectura. Devuelve un valor que indica el estado de modificacin del registro actual. Sintaxis Variable = objeto.EditMode

Variable tomar uno de los siguientes valores : dbEditNone dbEditInProgress No se est realizando ninguna operacin de modificacin. Se ha invocado el mtodo Edit y el registro actual se encuentra en el bfer de copia. dbEditAdd Se ha invocado el mtodo AddNew y el registro actual del bfer de copia es un registro nuevo que an 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, o cuando no se utiliza un control Data en Visual Basic Edicin profesional. Puede comprobar el valor de la propiedad EditMode y el del parmetro accin del procedimiento del evento Validate para determinar si se debe invocar el mtodo

Pgina 341

Update. Tambin puede comprobar si el valor de la propiedad LockEdits es True y el de EditMode es dbEditInProgress para determinar si la pgina de datos actual se encuentra bloqueada.

EOFAction Establece el comportamiento del control Data cuando se sobrepasa el ltimo registro. Podemos indicarle que se mueva al ltimo registro ( MoveLast), que se quede donde est (EOF), o que introduzca un nuevo registro ( AddNew) 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 mltiples usuarios. Font, ForeColor, Height, Index, Left, MouseIcon, MousePointer, Name, igual que el resto de los controles. Negotiate Propiedad caracterstica de los controles que tienen la propiedad Align. Establece un valor que determina si se muestra un control que puede alinearse cuando un objeto activo del formulario muestra una o ms barras de herramientas. No est disponible en tiempo de ejecucin. Options Devuelve o establece un valor que especifica una o ms caractersticas del objeto Recordset de la propiedad Recordset del control Data. Puede ponerse en el cuadro de propiedades o en tiempo de ejecucin. Puede tomar los siguientes valores o nombres de constantes (estos nombres solo si los introduce en tiempo de ejecucin)

1 2 4 8 16 32

dbDenyWrite dbDenyRead dbReadOnly dbAppendOnly dbInconsistent dbConsistent

En un entorno multiusuario, otros usuarios no pueden realizar cambios en registros del Recordset. En un entorno multiusuario, otros usuarios no pueden leer registros (slo Recordset de tipo tabla). No se pueden realizar cambios en registros del Recordset. Puede agregar nuevos registros al Recordset, pero no puede leer los registros existentes. Las actualizaciones pueden aplicarse a todos los campos del Recordset, aunque infrinjan la condicin de unin. (Predeterminado) Las actualizaciones slo se aplican a los campos que no infringen la condicin de unin.

64

256

512

dbSQLPassThrough Cuando se utilizan controles Data con una instruccin SQL en la propiedad RecordSource, enva la instruccin SQL a una base de datos ODBC, como SQL Server o Oracle, para su procesamiento. dbForwardOnly El Recordset es un desplazamiento slo hacia adelante. El nico mtodo de movimiento permitido es MoveNext. Esta opcin no puede utilizarse en objetos Recordset manipulados con el control Data. dbSeeChanges Genera un error interceptable si otro usuario est cambiando datos que usted edita.

Para establecer mas de un valor de los descritos, basta con sumar sus valores. Tambin puede establecer ms de un valor para esta propiedad, combinando opciones sumando valores entre s. Por ejemplo, para establecer dbReadOnly y dbInconsistent puede utilizar este cdigo: Data1.Options = dbAppendOnly + dbInconsistent

Pgina 342

Para determinar si la propiedad contiene un valor especfico, puede utilizar el operador And. Por ejemplo, para averiguar si el Recordset est abierto para acceso de slo lectura, podra usar este cdigo: If Data1.Options And dbReadOnly Then... Si cambia la propiedad Options en tiempo de ejecucin, deber utilizar el mtodo Refresh para que el cambio sea efectivo. ReadOnly Devuelve o establece un valor que determina si la Database del control est abierta para acceso de slo lectura. RecordsetType Devuelve o establece un valor que indica el tipo de objeto Recordset que desea que cree el control Data. Los valores o nombre de la constante que puede adoptar son los siguientes: 0 1 2 vbRSTypeTable vbRSTypeDynaset vbRSTypeSnapshot Un Recordset de tipo tabla. (Predeterminado) Un Recordset de tipo hoja de respuestas dinmica. Un Recordset de tipo instantnea.

Si no especifica un RecordsetType antes de que el control Data cree el Recordset, se crear un Recordset de tipo hoja de respuestas dinmica. (Dynaset)

Recordset Devuelve o establece un objeto Recordset definido por las propiedades de un control Data o por un objeto Recordset existente. Veremos mas adelante las propiedades de un objeto Recordset, propiedades que son en todo aplicables al Recordset del control Data. El Recordset es como se adelant, un conjunto de registros. Si las propiedades Connect, DatabaseName, Options, RecordSource, Exclusive, ReadOnly y RecordsetType establecidas para el control Data son vlidas, se crea un Recordset automticamente basndose en dichas propiedades. Ese ser el Recordset del control Data. Pero tambin puede crearse previamente un Recordset mediante la instruccin OpenRecordset y forzar que el Recordset del control Data sea justamente ese mediante la instruccin Set Data1.Recordset = MiRecordset Sea cual fuera la forma de crearlo, a partir del momento en que el Data tenga su Recordset podemos referirnos a l, por ejemplo para ir al primer registro (Data1.Recordset.MoveFirst), avanzar un registro (Data1.Recordset.MoveNext), al anterior (Data1.Recordset.MovePrevious) ir al ltimo (Data1.Recordset.MoveLast), aadir un registro (Data1.Recordset.AddNew), guardar los cambios en la Base de Datos (Data1.Recordset.Update), o borrar el registro actual (Data1.Recordset.Delete) Si se cambia alguna de las propiedades citadas al principio que cambien el Recordset, es necesario volver a crearlo. Para ello basta con utilizar el Mtodo Refresh. (Data1.Refresh) RecordSource

Pgina 343

Devuelve o establece la tabla, el objeto QueryDef (Consulta) o la instruccin SQL subyacente para un control Data. Esta propiedad puede fijarse en el cuadro de propiedades del control data, (el caso mas usado) o introducirse como cdigo. En los dos primeros casos, 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, 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. 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. Ni que decir tiene que para poder introducirla de esta forma es necesario fijar previamente la propiedad DatabaseName. Puede introducirse en tiempo de ejecucin mediante cdigo con la siguiente expresin : objeto.RecordSource [= valor ] Donde objeto es el nombre del control Data, y valor es una expresin de cadena que especifica el nombre de una Tabla o una Consulta, de las que componen la base de datos especificada en la propiedad DatabaseName, o una consulta SQL vlida que utiliza sintaxis apropiada para la base de datos especificada en la propiedad DatabaseName, o una QueryDef, que es una consulta almacenada, que como en los casos anteriores, debe referirse a la base de datos especificada en la propiedad DatabaseName. La propiedad RecordSource especifica el origen de los recursos accesibles a travs de controles enlazados del formulario. Si establece la propiedad RecordSource como el nombre de una tabla existente en la base de datos, todos los campos de esa tabla sern visibles a los controles enlazados adjuntos a este control Data. El orden de los registros recuperados lo establece el objeto Index que selecciona mediante la propiedad Index del Recordset. Si no establece la propiedad Index, los datos se devolvern sin ningn orden concreto. Si establece la propiedad RecordSource como el nombre de una consulta (QueryDef) existente en la base de datos, todos los campos devueltos por la QueryDef sern visibles a los controles enlazados adjuntos al control Data. El orden de los registros recuperados lo establece la consulta del objeto QueryDef. Si la QueryDef no especifica un orden, los datos se devolvern sin ningn orden concreto. Si establece la propiedad RecordSource como una instruccin SQL que devuelve registros, todos los campos devueltos por la consulta a SQL sern visibles a los controles enlazados adjuntos al control Data. Esta instruccin puede incluir una clusula ORDER BY para cambiar el orden de los registros devueltos por el Recordset creado por el control Data o una clusula WHERE para filtrar los registros. Despus de cambiar el valor de la propiedad RecordSource en tiempo de ejecucin, deber utilizar el mtodo Refresh para activar el cambio. Nota. Asegrese de que cada control enlazado tiene un valor vlido para su propiedad DataField. Si cambia el valor de la propiedad RecordSource de un control Data y, a continuacin, utiliza Refresh, el Recordset identificar el nuevo objeto. Esto puede invalidar los valores de DataField de controles enlazados y producir un error interceptable.

Las Propiedades Tag, Top, Visible, WhatThisHelpID, Width, igual que el resto de los controles.

METODOS DEL CONTROL DATA

Pgina 344

(Se explican aqu los mtodos que inciden directamente en el tratamiento de bases de datos. Obviamos los mtodos Drag, Move y ZOrder que son idnticos a los del resto de controles) Mtodo Refresh De momento es aplicable al control Data. Veremos que tambin es aplicable a otros objetos de acceso a datos (QueryDef). El mtodo Refresh no puede utilizarse con colecciones que no sean persistentes, como Databases, Recordsets o Workspaces. Actualiza los objetos de una coleccin para reflejar la base de datos actual. El mtodo Refresh tambin se utiliza para cerrar y volver a generar el objeto Recordset o las estructuras de datos creadas por un control Data. Sintaxis nombredelcontrolData.Refresh

Debe utilizar el mtodo Refresh en los entornos multiusuario en los que otros usuarios puedan modificar la base de datos. Tambin puede ser necesario su uso en las colecciones afectadas de forma indirecta por los cambios en la base de datos. Puede utilizar el mtodo Refresh sobre un control Data para abrir o reabrir la base de datos (si han variado las propiedades DatabaseName, ReadOnly, Exclusive o Connect) y volver a generar el objeto Recordset indicado por la propiedad Recordset del control. Mtodo UpdateControls Obtiene el registro actual del objeto Recordset de un control Data y muestra los datos de los controles vinculados al control Data. Sintaxis nombredelcontroldata.UpdateControls

Utilice este mtodo para restablecer en los controles enlazados sus valores originales, por ejemplo cuando un usuario modifica los datos y luego decide cancelar los cambios. Este mtodo produce el mismo efecto que hacer actual de nuevo al registro actual, excepto en que no se produce ningn evento ni introduce en la Base de Datos los posibles valores que se hubiesen cambiado en los controles enlazados.

Mtodo UpdateRecord Guarda los valores actuales de los controles enlazados. Sintaxis nombredelcontrolData.UpdateRecord

Puede utilizar este mtodo para guardar el contenido actual de los controles enlazados en la base de datos durante el evento Validate sin desencadenar de nuevo el evento Validate. El uso de este mtodo evita los eventos en cascada. El mtodo UpdateRecord tiene el mismo efecto que ejecutar el mtodo Edit, modificar un campo y luego ejecutar el mtodo Update, excepto en que no se produce ningn evento. Puede utilizar este mtodo para evitar desencadenar el evento Validate. En algunos casos, la actualizacin puede no tener lugar, debido a que la operacin vulnere las restricciones de integridad referencial, o que la pgina que contiene el registro est bloqueada, o que la base de datos u objeto Recordset no sean actualizables, o a que el usuario no cuente con el permiso adecuado para la operacin. En cualquiera de estas circunstancias, se producir un error interceptable.

Pgina 345

Estos son los mtodos del Control Data. Este control tiene su Recordset, y el Recordset del control Data tiene sus mtodos, idnticos a los de un Recordset creado por cdigo. EVENTOS DEL CONTROL DATA Error Se produce solamente como resultado de un error de acceso a datos que tiene lugar cuando no est ejecutando cdigo Visual Basic. Private Sub Data1_Error ([ndice As Integer,] datoserr As Integer, respuesta As Integer) ndice es el ndice de ese control si existen varios con el mismo nombre datoserr es el nmero del error. Respuesta es un nmero que se corresponde con la respuesta que se va a tomar, como se describe a continuacin : Constante 0 1 Valor Descripcin Continuar. (Predeterminado) Presentar el mensaje de error.

vbDataErrContinue vbDataErrDisplay

Normalmente las aplicaciones proporcionan la funcionalidad del control de los errores de tiempo de ejecucin dentro del cdigo. Sin embargo, los errores de tiempo de ejecucin pueden ocurrir cuando no se est ejecutando cdigo de la aplicacin, por ejemplo cuando: Un usuario hace clic en un botn del control Data. El control Data abre automticamente una base de datos y carga un objeto Recordset despus de un evento Form_Load. Un control personalizado ejecuta una operacin como los mtodos MoveNext, AddNew o Delete. Si se produce un error en cualquiera de estas acciones, se produce el evento Error. Si no se escribe cdigo para el procedimiento de evento Error, Visual Basic presenta el mensaje asociado con el error. Reposition Se produce despus de que un registro se convierte en el registro actual. Private Sub Objeto_Reposition() Donde objeto = Nombre del control Data Cuando se carga un control Data, El primer registro de su objeto Recordset se convierte en el registro actual, provocando el evento Reposition. Cuando quiera que un usuario haga clic en uno de los botones del control Data, movindose de registro en registro o si se usa uno de los mtodos Move del objeto Recordset asociado al control data, como MoveNext, MoveFirst, MovePrevious, los mtodos Find, como FindFirst, FindNext, o cualquier otra propiedad o mtodo que cambie el registro el actual, se produce el evento Reposition despus de que cada registro se convierta en el actual. Este evento se puede usar para realizar clculos basndose en los datos del registro actual o para cambiar el formulario en respuesta a los datos del registro actual.

Pgina 346

Validate Se produce antes de que un registro diferente se convierta en el registro actual; antes del mtodo Update (excepto cuando los datos se guardan con el mtodo UpdateRecord); y de los mtodos Delete, Unload o la operacin Close. Private Sub objeto_Validate ([ ndice As Integer,] accin As Integer, guardar As Integer) objeto = Nombre del control Data ndice = Indice del control Data dentro de una matriz de controles (Si ha lugar) accin = Un entero que indica la operacin que ha producido el evento, como se describe mas adelante guardar = una expresin booleana que especifica si los datos asociados han cambiado, como se describe mas adelante. Accin 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 operacin cuando se sale del procedimiento Sub. Mtodo MoveFirst. Mtodo MovePrevious. Mtodo MoveNext. Mtodo MoveLast. Mtodo AddNew. Operacin Update (no UpdateRecord). Mtodo Delete. Mtodo Find. La propiedad Bookmark no ha sido definida. Mtodo Close. El formulario se va a descargar.

Los valores de guardar son: True False Los datos asociados han cambiado. Los datos asociados no han cambiado.

El evento Validate se usa para realizar las ltimas comprobaciones sobre los registros que se van a escribir en la base de datos. Vea la ayuda de Visual Basic para mayor detalle de este evento. Para los dems eventos, es aplicable lo mismo que para el resto de los controles. CONTROLES ENLAZADOS A DATOS Los controles enlazados a datos permiten crear aplicaciones con acceso a datos con muy poco cdigo, o incluso ninguno. Para utilizar cualquiera de estos controles enlazados conectables a datos debe incluir uno o ms controles Data en un formulario. El control Data establece un enlace entre la base de datos y los controles enlazados para la manipulacin de los datos. 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. Existen en Visual Basic diez controles enlazados a datos, adems del control Data : Data Ya comentado, se utiliza para tener acceso a los datos de las bases a travs de controles enlazados de un formulario. Crea y administra los objetos Database y Recordset

Pgina 347

para su uso por parte de los controles enlazados. Requerido para su uso con todos los dems controles enlazados. DBCombo Se utiliza para obtener una combinacin enlazada formada por un cuadro de lista y un cuadro de texto. La lista puede llenarse automticamente a partir de un control Data. El usuario puede elegir un elemento de la lista o introducir un valor en el cuadro de texto. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto especfico 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. La lista puede rellenarse automticamente desde un control Data, y puede proporcionar acceso de lectura / escritura a un campo de texto especfico seleccionado en ella. DBGrid Se utiliza para obtener una combinacin enlazada formada por varios registros. La cuadrcula puede rellenarse automticamente a partir de un control Data. El usuario puede elegir un elemento de la cuadrcula o introducir un valor en un nuevo registro. Puede utilizarse para proporcionar acceso de lectura / escritura a un objeto Recordset, y para mover el registro actual del objeto Recordset asociado al control Data. Label Se usa para el texto que el usuario no debe modificar. Puede utilizarse para ofrecer acceso de slo lectura a un campo de texto especfico. 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 texto especfico. CheckBox Se utiliza para crear un cuadro que el usuario puede elegir de forma sencilla para indicar si algo es verdadero o falso, o para mostrar varias opciones entre las que el usuario pueda elegir ms de una. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo booleano o de bit especfico. ComboBox Se utiliza para obtener una combinacin de un cuadro de lista y un cuadro de texto. La lista se rellena con el mtodo AddItem. El usuario puede elegir un elemento de la lista o introducir un valor en el cuadro de texto. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de texto seleccionado en la lista. Consulte el control DBCombo ListBox Se utiliza para mostrar una lista en la cual el usuario puede elegir un elemento. La lista se rellena con el mtodo AddItem. Puede usarse para proporcionar acceso de lectura / escritura a un campo de texto especfico seleccionado en la lista. Consulte el control DBList PictureBox Se usa para mostrar una imagen grfica de un mapa de bits, un icono o un metaarchivo en un formulario. Puede utilizarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario especfico. Image Se utiliza para mostrar una imagen grfica de un mapa de bits, un icono o un metaarchivo en un formulario. Las imgenes mostradas en un control Image utilizan menos recursos que las de los controles PictureBox. Puede usarse para proporcionar acceso de lectura / escritura a un campo de imagen o binario especfico. 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 travs del control Data. Las propiedades comunes a todos ellos son : DataSource Fuente de datos. Es el nombre del control Data que lo enlaza con la B.D. Este

Pgina 348

control Data es el que determina la Tabla donde estn los campos con los datos. Esta Tabla se determina mediante la propiedad RecordSource del control Data. DataField Es el nombre del campo, dentro de la Tabla de la base de datos, que se va a presentar en el control enlazado a datos. Esta propiedad no la tiene el DBGrid debido a que presenta todos los campos de la Tabla de la base de datos seleccionada en el control Data. Si se le ha forzado al control Data la propiedad Recordset, los campos que se pueden mostrar en los controles enlazados a datos son justamente, los de ese Recordset. Cada uno de los controles enlazados a datos tiene su aplicacin especfica dentro del proceso de presentacin y escritura de una Base de Datos. Control Label Posiblemente el control Label es el control mas sencillo para mostrar el contenido de un campo de una base de datos. Como todos los controles enlazados a datos, el Label permite presentar los datos e introducirlos en la base a travs del control Data. Lo que ocurre con el Label es que su propiedad Caption no se puede introducir directamente por teclado, y deber cambiarse por cdigo. Esto puede ser una ventaja (no hay posibilidad de introducirlo accidentalmente) y un inconveniente, al tener que escribir cdigo para hacerlo. El control Label, al poder ser origen (a travs del formulario que lo contiene) y destino de un enlace DDE, esto nos puede resolver muchos problemas de introducin de distintos datos de otras aplicaciones que no tengan acceso directo a una base de datos. El control Label, en lo referente al enlace a datos, solamente tiene las propiedades mencionadas de DataSource y DataField. Control TextBox Todo lo dicho del control Label es aplicable al TextBox, que adems presenta la particularidad de que en este control s se puede escribir directamente desde el teclado. Control CheckBox El control CheckBox permite presentar e introducir datos de tipo Booleano. Tiene las propiedades DataSource y DataField en lo relativo a acceso a datos. Controles ListBox y ComboBox Estos controles tienen una caracterstica especial respecto a su comportamiento con el enlace a la base de datos. La lista no se puede cargar directamente desde la base de datos, sino a travs de un control intermedio, por ejemplo un Label, donde presentaremos un campo de la base de datos. El texto de la propiedad Caption de este Label se introduce en el ListBox o ComboBox mediante el mtodo AddItem. Una vez introducidos todos los elementos de ese campo que nos interesen, cada vez que la base de datos se sita sobre el registro correspondiente a uno de los elementos que est en el ListBox o ComboBox, ste cambia su ListIndex para seleccionar el elemento correspondiente al registro actual del control Data. El ListBox puede contener elementos correspondientes a la base de datos y otros ajenos. Puede emplearse esta caracterstica del ListBox para seleccionar un elemento entre varios elementos tomados de la BD y otros introducidos por otro procedimiento, 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. Tiene las propiedades DataSource y DataField en lo relativo a acceso a datos.

Pgina 349

Control PictureBox y Control Image Pueden mostrar una imagen almacenada en una Base de Datos. Mediante el control Data, se puede introducir la imagen presente en uno de estos controles en la Base de Datos. El campo que contenga una imagen en una BD debe ser BINARIO LARGO, y el tipo de imgenes que se pueden introducir son los mapas de bits (Archivos con extensin .BMP), los archivos de icono, (Extensin .ICO) y los metaarchivos. (Metafiles, extensin .WMF) Para introducir un grfico en una BD es mas prctico introducirlo mediante un control Data y un control Picture o Image que creando por cdigo un Recordset. En realidad deberamos decir que es el nico mtodo prctico de introducir / sacar imgenes de una Base de Datos Control DBGrid Es posiblemente el control que mas se use para presentar y modificar datos de una B.D. El control DBGrid presenta todos los registros y todos los campos de la Base de Datos. Por eso, necesita obligatoriamente un control Data para poder presentar datos. Otros controles (Label, TextBox, Picture, etc.) que solamente presentan un dato (un campo de un registro) pueden trabajar sin necesidad de un control data, creando un Recordset mediante cdigo. (Lo veremos un poco mas adelante). Sin embargo el control DBGrid, al presentar todos los datos de la base de datos necesita un control Data. Veamos porqu. Cuando creamos un objeto Recordset mediante la instruccin : (se ver mas adelante) Set Mirecordset = MiDataBase.Openrecordset (Select campo1, campo2 from Mitabla) lo que estamos haciendo es seleccionar, de todos los campos que pueda tener la tabla llamada Mitabla, los denominados campo1 y campo2. Cada vez que seleccionemos un registro, es ese registro solamente el que se mantiene en la memoria del ordenador, (el registro actual) y de ese registro, solamente metemos los datos del campo1 y campo2. Cuando creamos un Recordset mediante un control Data, se meten en la memoria TODOS los registros de la tabla especificada en el control data. Por lo tanto, al permanecer todos los registros de esa tabla en memoria, podremos presentar sus valores en el control DBGrid. No lo podremos hacer con un Recordset creado mediante cdigo, que solamente mantiene un registro en memoria. Deberemos explicar qu ocurre cuando se crea un Recordset mediante cdigo, y posteriormente se fuerza a que el Recordset del control data sea igual a ese Recordset creado. Con el Recordset creado con la instruccin anterior, podemos forzar a un control Data que su Recordset sea igual al ya creado mediante la instruccin : Set Data1.Recordset=MiRecordset En este caso, 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. As ya podemos rellenar las cuadrculas del control DBGrid. Observe que una aplicacin 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. Pero si necesitamos presentar los datos en un DBGrid, no quedar mas remedio que usar un control Data. Si nuestra aplicacin no tiene que presentar en el DBGrid todos los campos de la tabla de la B.D. podemos crear previamente un Recordset

Pgina 350

mediante cdigo y a continuacin forzar que el Recordset del control Data sea igual al Recordset creado, utilizando la expresin anterior. El control DBGrid tendr tantas columnas como campos tenga el Recordset. El nmero de filas ser igual al nmero de registros que tiene la tabla. Si se sobrepasa el espacio fsico del DBGrid para poder presentarlos, aparecern automticamente flechas de deslizamiento vertical. El ancho de las columnas puede cambiarse mediante la propiedad Width del objeto Columns del DBGrid. DBGrid1.Columns(n).Width = Valor Donde n es el nmero de la columna (la primera es la 0) y el valor debe expresarse segn las unidades de medida (ScaleWidth) del Formulario que lo contiene. 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. La ltima fila que se muestra en el control DBGrid se deja en blanco para permitir a los usuarios introducir nuevos registros. Si la propiedad AllowAddNew es False, los usuarios no pueden establecer el foco en dicha fila. El Recordset subyacente puede, por otras razones, no permitir inserciones incluso en el caso de que la propiedad AllowAddNew sea True. En este caso, se producir un error si el usuario intenta agregar un registro. AllowDelete Devuelve o establece un valor que indica si el usuario puede eliminar registros del objeto Recordset subyacente a un control DBGrid. Utilice la propiedad AllowDelete para impedir que los usuarios eliminen registros del conjunto de registros a travs de la interaccin con el control DBGrid. El objeto Recordset subyacente puede, por otras razones, no permitir eliminaciones incluso en el caso de que la propiedad AllowDelete sea True. En este caso, se producir un error si el usuario intenta eliminar un registro. AllowRowSizing Devuelve o establece un valor que indica si un usuario puede modificar el tamao de las filas del control DBGrid. Sintaxis nombre.AllowRowSizing = [True / False]

Si la propiedad AllowSizing es True, el puntero del mouse se convierte en una flecha de doble cabeza (Size N S) cuando se sita sobre el divisor de filas entre selectores de registro, y el usuario puede modificar el tamao de las filas mediante arrastre. Cualquier cambio de tamao de columna provoca un evento RowResize. AllowUpdate Devuelve o establece un valor que indica si un usuario puede modificar datos del control DBGrid.

Pgina 351

Sintaxis

nombre.AllowUpdate = [True / False]

Cuando la propiedad AllowUpdate es False, el usuario puede an desplazarse a travs del control DBGrid y seleccionar datos, pero no puede modificar ninguno de los valores; cualquier intento de hacerlo se ignora. Puede tambin hacer uso de las propiedades del objeto Columns para hacer que columnas individuales del control DBGrid sean de slo lectura, pero los valores de la propiedad AllowUpdate tienen prioridad sobre los valores establecidos para las columnas (sin modificar stos). Nota El objeto Recordset puede no permitir actualizaciones incluso si AllowUpdate es True para el control DBGrid; en este caso se produce un error interceptable cuando el usuario intenta cambiar el registro. ColumnHeaders Devuelve o establece un valor que indica si los encabezados de columna se muestran en el control DBGrid. Sintaxis objeto.ColumnHeaders = [True / False]

Si es True se muestran los encabezados de columna del control DBGrid, y si es False no se muestran. DataMode Establece un valor que especifica si el control DBGrid funciona en modo enlazado o no enlazado. Esta propiedad no est disponible en tiempo de ejecucin. Los valores que puede tomar la propiedad DataMode son: 0-Bound. El control DBGrid est enlazado con el control Data. 1-Unbound. El control DBGrid no est enlazado directamente al control Data. Un DBGrid est enlazado cuando se le asigna un control Data en su propiedad DataSource. En este caso, presenta sin mas los datos del Recordset de ese control Data. Si le especificamos en la propiedad DataMode que no est enlazado, utilizaremos cdigo en los procedimientos del control Data para pasarle los datos cuando nos interese. DefColWidth Devuelve o establece un valor que indica el ancho de columna predeterminado para todas las columnas del control DBGrid. Sintaxis objeto.DefColWidth [= valor]

donde valor es un entero basado en el modo de escala del control. Si se da a la propiedad DefColWidth el valor 0, el control establece automticamente el tamao de todas las columnas en base al ancho del encabezado de columna o al valor de la propiedad Size del campo subyacente, seleccionando el ms largo de los dos. RecordSelectors Los selectores de registros aparecen a la izquierda de las filas en el control DBGrid. Cuando el usuario elige el selector, el registro completo (fila del control DBGrid) se selecciona.

Pgina 352

La propiedad RecordSelectors devuelve o establece un valor que indica si se muestran los selectores de registro en el control DBGrid. Sintaxis objeto.RecordSelectors = [True / False]

El Objeto Columns aplicado al control DBGrid. El objeto Columns es un objeto no privativo del control DBGrid, que contiene todas las columnas y las propiedades de las columnas de un control. Podemos cambiar las propiedades de cada una de las columnas de un DBGrid mediante las propiedades del objetos Columns asociado a l. Por ejemplo, el encabezamiento de una columna en un DBGrid es, por defecto, el nombre del campo que se va a presentar en esa columna. Si queremos poner otro encabezamiento a una columna, ejecutaremos la expresin : DBGrid1.Columns(0).Caption = "Cabecera" donde el 0 entre parntesis significa que estamos afectando a la columna nmero 0 (la primera por la izquierda). Si queremos cambiar su anchura : DBGrid1.Columns(3).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.

CONTROLES DBList y DBCombo

Los dos controles DBList y DBCombo se implementan de la misma manera. Las dos nicas diferencias estriban en la forma en que se presenta la informacin al usuario y la presencia de la porcin del control DBCombo en el cuadro de texto, que se emplea para introducir valores. Los controles DBList y DBCombo tienen dos modos que pueden utilizarse individualmente o al mismo tiempo: Autollenado: Llena automticamente 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. Actualizacin automtica: Enlaza el registro seleccionado en el control a un campo especfico del objeto Recordset administrado por el control Data especificado por la propiedad DataSource. Esto explicado en otras palabras significa lo siguiente : En control DBList o DBCombo puede trabajar sobre dos controles Data. Uno para rellenar la lista. El control Data y el campo que rellena la lista son los especificados en las propiedades RowSource y ListField del control 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. (Llamemos a esta base de datos Base A en esta explicacin)

Pgina 353

El otro control Data es el que estos controles usan para introducir datos en su BD asociada. El control Data y el campo de la BD asociados a estos controles DBList y DBCombo, son los especificados en las propiedades DataSource y DataField. Es sobre esta base de datos y el campo correspondiente sobre los que estos controles DBList y DBCombo actan cambiando o introduciendo datos. (Llamemos a esta otra base de datos Base B) Basta con seleccionar un elemento de la lista (que pertenece a la base A) y ese elemento se colocar en el campo correspondiente (el indicado en la propiedad DataField del control DBList o DBCombo) de la base B. En el caso del DBCombo, podemos escribir directamente el dato en su caja de texto en vez de seleccionarlo de la lista. No tiene porqu ser el elemento que vemos en la lista el que pasemos a la otra base de datos. Puede ser otro campo del mismo Recordset. Depende de la propiedad BoundColumn que viene a continuacin. Lasela con la atencin que se merece. Vemos pues que estos controles pueden servir como un puente entre dos bases de datos. Veamos unas propiedades especificas de estos dos controles : 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, o el nombre del campo empleado para rellenar un control DBList o DBCombo. Resumamos. En un DBList o DBCombo presentamos en su lista un determinado campo de una BD. Esa BD tendr mas campos. Un poco mas arriba decamos que ese elemento de la lista podamos pasarlo a otra BD (La especificada en la propiedad DataSource, y en su campo DataField). Podramos pasar a esa BD, en vez del elemento de la lista, otro campo de esa BD origen ?. Podramos, por ejemplo, presentar en la lista el nombre de una persona, nombre que hemos tomado de un listn telefnico, y en vez de pasar el nombre que es el que figura en la lista, pasar su nmero de telfono, que es otro campo de la misma BD. La respuesta es SI. Para ello, pongamos en la propiedad BoundColumn del DBList o DBCombo que estamos usando, el nombre del campo que contiene el nmero de telfono. Observe que por defecto, esa propiedad se rellena con el mismo campo que el especificado en la propiedad ListField. Eso no quiere decir que no se pueda cambiar. Para cambiarlo, haga click en la flecha vertical que aparece en la casilla de propiedades, y donde ver que aparecen todos los campos de la base de datos seleccionada en el control Data asociado a este control. Tambin puede cambiarlo en tiempo de ejecucin con la siguiente sintaxis : nombredelDBList.BoundColumn = nombredelcampo Con estas ideas expresadas aqu, puede comenzar a leer el texto de ayuda de esta propiedad. No se desespere si no entiende algo de lo all expresado. BoundText Devuelve o establece el valor de la propiedad BoundColumn de un control DBCombo o DBList pasado desde o hacia la propiedad DataField despus de realizar una seleccin. Es decir, es el contenido del campo especificado en la propiedad BoundColumn comentada anteriormente. Esta propiedad est disponible solamente en tiempo de ejecucin. Esta propiedad es de lectura y escritura. Es sencilla de usar en para conocer el contenido del campo especificado en BoundColumn. (lectura del valor)

Pgina 354

Cuando la queramos utilizar para forzar el valor de esta propiedad a un valor determinado, debemos utilizar la siguiente sintaxis : objeto.BoundText [= valor] En este caso, 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. Si encuentra uno igual , se establece el valor de la propiedad BoundText basndose en el campo especificado por la propiedad BoundColumn. Si no se encuentra dicha coincidencia, la propiedad BoundText se establece en el valor Null. Es decir, si hay coincidencia con algn valor de ese campo, BoundText seguir con el valor especificado. Si no la hay, BoundText se pone a Nulo.

MatchWithList Propiedad solo de lectura. Devuelve True si el contenido actual de la propiedad BoundText coincide con uno de los registros de la parte de lista del control. Sintaxis Variable = objeto.MatchWithList

Si Variable = True el contenido de la propiedad BoundText coincide con uno de los registros de la lista. Si es False, el contenido de la propiedad BoundText no coincide con ninguno de los registros de la lista. Cuando introduce un valor en la parte de texto del control DBCombo, la propiedad MatchWithList se establece como True si el valor introducido es uno de los elementos que aparecen en la lista. Usando esta propiedad, el cdigo puede interceptar entradas que no estn la lista, o proporcionar cdigo para agregar la nueva entrada a la tabla de origen. DataChanged Devuelve o establece un valor que indica que han cambiado los datos del control enlazado por algn proceso distinto de la recuperacin de datos del registro actual. No est disponible en tiempo de diseo. Sintaxis propiedad Variable puede ser True, indicando que los datos que hay actualmente en el control no son iguales que los del registro actual, y False (Predeterminado) que indica que los datos que hay actualmente en el control (si los hay) son iguales que los del registro actual. Comentarios Cuando un control Data se mueve de un registro a otro, pasa datos desde los campos del registro actual a controles enlazados al campo especfico o el registro completo. Cuando se muestran datos en los controles enlazados, la propiedad DataChanged se establece como False. Si el usuario o alguna operacin cambia el valor del control enlazado, la propiedad DataChanged se establece como True. Si pasa a otro registro la propiedad DataChanged no se ve afectada. Cuando el control Data comienza a mover a otro registro, se produce el evento Validate. Si DataChanged es True para algn control enlazado, el control Data invoca automticamente los mtodos Edit y Update para enviar los cambios a la base de datos. objeto.DataChanged [=Variable] Variable = objeto.DataChanged establece la propiedad lee el valor actual de esta

Pgina 355

Si no desea guardar los cambios de un control enlazado en la base de datos, puede establecer la propiedad DataChanged como False en el evento Validate . MatchEntry Devuelve o establece un valor que indica cmo el control DBCombo o DBList realiza bsquedas basndose en la entrada del usuario. Sintaxis objeto.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 ms caracteres. 0 vbMatchEntrySimple Coincidencia bsica: (Predeterminado) El control busca la siguiente coincidencia del carcter introducido usando la primera letra de entradas de la lista. Al escribir repetidamente la misma letra se recorren todas las entradas de la lista que comienzan por esa letra. 1 vbMatchEntryExtended Coincidencia ampliada: El control busca una entrada que coincida con todos los caracteres introducidos. La bsqueda se realiza a medida que se escriben los caracteres, refinando progresivamente la bsqueda. Cuando la propiedad MatchEntry se establece como vbMatchEntryExtended y el usuario presiona la tecla de retroceso o espera varios segundos, la cadena de coincidencias de restablece. SelectedItem (Solo DBCombo) Devuelve un valor que contiene un marcador para el registro seleccionado en un control DBCombo. Sintaxis DBCombo1.SelectedItem

Cuando selecciona un elemento de la parte de lista del control DBCombo, la propiedad SelectedItem contiene un marcador que puede utilizar para reposicionar el registro seleccionado en el Recordset como especifica la propiedad RowSource. SelText SelText devuelve o establece una cadena con el texto actualmente seleccionado, o es una cadena de longitud cero () si no hay caracteres seleccionados. VisibleCount Devuelve un valor que indica el nmero de elementos visibles del control DBCombo o DBList. Sintaxis objeto.VisibleCount

La propiedad VisibleCount devuelve un entero desde 0 al nmero de elementos visibles del control. Un elemento se considera visible nicamente si una parte del texto es visible. VisibleItems Devuelve una matriz marcadores, uno para cada elemento visible de la lista del control DBCombo o DBList.

Pgina 356

Sintaxis

objeto.VisibleItems

Estos marcadores pueden emplearse para obtener registros individuales del conjunto de registros empleado para rellenar la lista.

Pgina 357

FIN del decimonoveno captulo de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 358

Visual Basic Gua del estudiante Cap. 20


OPERACIONES CON BASES DE DATOS SIN UTILIZAR EL CONTROL DATA En el captulo anterior hemos visto los controles capaces de acceder a un Base de Datos, enlazados mediante un control Data. Se comenz a exponer que no es necesario usar un control Data para acceder a leer datos, aadir registros o cambiar su contenido. Una base de datos puede abrirse sin necesidad de un control Data. Puede tambin crearse un Recordset o una consulta simplemente escribiendo cdigo. Tambin puede crearse una base de datos ACCESS u otro tipo soportado por el Motor de Bases de Datos MicrosoftJet. La eleccin de un sistema u otro no es arbitraria. El control Data ser necesario en aquellas aplicaciones en las que se va a usar un control DBGrid, pues como se recordar, 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. El control Data ser necesario en aquellas aplicaciones donde utilicemos un DBGrid, un DBList o un DBCombo. Veremos mas adelante que tambin ser necesario cuando queramos guardar imgenes en una Base de Datos. El control Data tambin permite consultas mas rpidas a la BD. El hecho de guardar el contenido completo del Recordset en la memoria hace que cualquier consulta sea mas rpida. Eso s, estamos empleando mucha mas memoria RAM. Puesto que queremos trabajar con una Base de Datos sin emplear controles Data de enlace, tendremos que crear otro tipo de objetos: Los Objetos de Acceso a Datos (DAO - Data Access Objet). Estos objetos, pese a que no tienen representacin en la interface grfica, son objetos Visual Basic como los dems, y nos podremos referir a ellos por su nombre como hacamos con todos los controles. Eso s, debemos declararlos como se declaran las variables, y siguen siendo vlidos los criterios de declaracin de variables en cuanto al mbito de aplicacin. Si declaramos un DAO en un procedimiento, no nos podremos referir a l fuera de ese procedimiento. Si queremos que sea vlido en toda la aplicacin deberemos declararlo en la seccin de declaraciones de un mdulo, o en la seccin de declaraciones de un formulario si fuese suficiente ese mbito para nuestra aplicacin.

Pgina 359

Objetos de Acceso a Datos Veamos un grfico muy ilustrativo tomado de la ayuda de VB con todos los objetos DAO.

Podemos observar en la Leyenda : Objeto y Coleccin. Esto significa que un objeto DAO puede ser un determinado objeto (Por ejemplo el Recordset). Puede haber varios objetos Recordset abiertos al mismo tiempo. Al conjunto de los objetos Recordset abiertos le llamamos Coleccin de Recordsets, y es a su vez un objeto DAO : El objeto Recordsets (Fjese en el plural) El Objeto Workspace representa una sesin. El Objeto Workspaces representa la coleccin de todos los objetos Workspace abiertos en ese momento. Dado que las colecciones representan un conjunto de objetos, uno de estos objetos de la coleccin puede representarse, bien por el nombre que tenga (Misesion, nombre tpico de un objeto Workspace), o por el nombre de la coleccin seguido del ndice que representa a ese objeto concreto dentro de la coleccin [Workspaces (0)] Objeto DBEngine El DBEngine es el Motor de Bases de Datos. Es el objeto de acceso a datos de mayor jerarqua. De hecho es quien le va a realizar todas las operaciones de acceso a datos. Como cualquier Objeto DAO tiene sus Mtodos, Propiedades y Colecciones: Mtodos CreateWorkspace, CompactDatabase, RepairDatabase, Idle, RegisterDatabase Propiedades DefaultPassword, DefaultUser, IniPath, LoginTimeout, Version Colecciones Errors, Properties, Workspaces (predeterminada) A estas alturas an no sabemos lo que es una Base de Datos. Logicamente no vamos a explicar aqu lo que es compactar una base de datos cuando no sabemos ni lo que es (Entienda esta aclaracin solamente en el sentido estricto del orden que debe llevar este captulo. De sobra sabemos que Vd. s sabe lo que es una BD) . Por lo tanto, la explicacin de estos mtodos, propiedades u colecciones lo ir viendo segn vayamos avanzando en el estudio de los objetos DAO.

Pgina 360

Objeto Workspace
Un objeto Workspace define una sesin para un usuario especfico. Cuando se inicia Visual Basic, se crea automticamente un Workspace con palabra clave y nombre de usuario Admin. Este Workspace es precisamente el que ocupa el nmero cero de la coleccin de Workspaces. Es decir, es el Workspaces(0). El objeto Workspace es la sesin de trabajo abierta sobre la que estamos trabajando. El objeto Workspace contiene todo lo relativo a una sesin de trabajo en el mas puro estilo informtico. Contiene : Grupos de trabajo, que es un grupo de usuarios de un entorno multiusuario que comparten datos y el mismo sistema de base de datos. Grupos de usuarios, que es una coleccin de cuentas de usuario. Estos objetos, que no son objetos de acceso a datos, sino de explotacin de los recursos del sistema, estn enfocados a la seguridad respecto al acceso a las bases de datos que se trabajan conjuntamente. No tendra sentido hablar aqu de ellos si no fuese porque encontrar referencias a estos objetos continuamente en la ayuda de Visual basic. Bases de Datos (Databases). Este el objeto que ahora nos interesa del objeto Workspace. Un objeto Database es una base de datos abierta. Al objeto Workspace se le puede dar un nombre definido por el usuario. Ese nombre habr que declararlo como nombre de una variable objeto Workspace : Dim Misesion as Workspace La declaracin de la variable Objeto tiene las mismas caractersticas que cualquier variable en cuanto al mbito en el que se puede usar. Para que pueda usarse en toda la aplicacin deberemos declararla en un Mdulo con la sentencia Global Public Public Misesion as Workspace Esta advertencia es vlida para la declaracin de todos los objetos DAO. Una vez declarado el nombre del objeto Workspace, hay que crearlo. En realidad, y tal como citbamos mas atrs, cada vez que se inicia una sesin de Visual Basic, se crea automticamente un Workspace. El nmero 0 A este Workspace no podemos ponerle ningn tipo de palabra de acceso, ya que se la ha puesto VB : Admin. Utilicemos este Workspace, el nmero 0 de la coleccin Workspaces, para comenzar a trabajar. Set Misesion = Workspaces(0) Mediante esta sentencia hemos automticamente por Visual Basic . hecho que Misesion sea el Workspace creado

Pero si no queremos aprovechar este Workspace creado automticamente por Visual Basic, y queremos usar otro, usemos el mtodo CreateWorkspace. Este mtodo es un mtodo del Objeto DBEngine.

Creacin 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, mientras trabaje con Visual Basic y Bases de Datos: Set ObjetoDAOInferior = ObjetoDAOSuperior.Mtodo ( Aqu .... alguna cosa ) Logicamente el trmino Aqu .... alguna cosa va a depender de cada mtodo y de lo que Vd. quiera hacer, pero la estructura Set DAOInferior = DAOSuperior.Mtodo ( - - - - - - - - - - ) Pgina 361

se mantendr en todas las operaciones de creacin y manipulacin de objetos DAO. Tan simple como un juego de nios . No lo olvide y se le quitar el miedo al manejo de bases de datos mediante cdigo. Posiblemente hasta ahora le haya parecido muy difcil y haya optado por usar el control Data para todas sus aplicaciones. Si recuerda este Juego de nios ver que es mas sencillo crear objetos DAO que poner un control Data en un formulario.

Mtodo CreateWorkspace (Mtodo del DBEngine)


Usaremos la regla anterior para crear este objeto DAO. Suponemos que ya est declarado en alguna parte el nombre del objeto Workspace (Public Misesion as Workspace) Set Misesion = DBEngine.CreateWorkspace(Nombre, Usuario, Contrasea) Donde Misesion es la variable declarada como tipo objeto Workspace. Nombre es una variable de tipo String que da un nombre nico al nuevo objeto Workspace. Usuario es una variable de tipo String que identifica al propietario del nuevo objeto Workspace. Este propietario deber estar en la coleccin de Usuarios (Users) Contrasea es una variable de tipo String que contiene la contrasea del usuario propietario de este Workspace. Debe coincidir (logicamente) con la contrasea declarada para el User Usuario citado en el parmetro anterior. Deben especificarse TODOS estos argumentos. Si el usuario no tiene contrasea, se ingresar el valor caso de introducirlo mediante cdigo, o una variable vaca. Primer problema (Los objetos DAO no estn exentos de ellos). Seguro que al intentar crear un Workspace le aparezca un mensaje de error : No pasa nada. Simplemente que hemos corrido mucho y nos acabamos de estrellar. Y nos hemos estrellado con las seguridades del motor de bases de datos JET (Si lo prefiere, con las seguridades de ACCESS). No podemos abrir un Workspace sin ser un usuario registrado en la coleccin Users, y no podemos explicar, de momento, como se crea esta coleccin. Mas adelante s podremos, una vez que conozcamos mas acerca de bases de datos. No se preocupe que el tema de seguridades se explicar concienzudamente en un captulo posterior y la creacin de Workspaces no tendr secretos en ese momento. Confrmese de momento con trabajar con el Workspace creado automticamente por Visual Basic. Este Workspace es el nmero 0 de la coleccin Workspaces. Este Workspace se llama #Default Workspace#, y el nombre del propietario es Admin. Este propietario s est registrado en la Coleccin Users. Para usar este Workspace creado por Visual Basic basta con la instruccin indicada mas atrs : Set Misesion = Workspaces(0) Veamos a modo de adelanto, las Propiedades, Mtodos y Colecciones del objeto Workspace : Propiedades Mtodos Name, Password, UserName BeginTrans, CreateGroup, Close, CreateUser, CommitTrans OpenDatabase, CreateDatabase, Rollback Databases (predeterminada), Groups, Users

Colecciones

Al conjunto de Workspaces existentes se le llama Coleccin Workspaces. Solamente tiene una propiedad : Count, y un solo Mtodo : Refresh

Objeto Database

Pgina 362

Un objeto Database representa una base de datos abierta. Una coleccin Databases contiene todos los objetos Database abiertos o creados en un objeto Workspace del motor de bases de datos Microsoft Jet. Para manipular una base de datos abierta se utiliza un objeto Database y sus mtodos y propiedades. Al objeto Database se le debe dar un nombre definido por el usuario. Eso s, hay que declararlo como una variable objeto Database Dim MiDataBase As Database Coleccin Databases Es el conjunto de Objetos Database existentes. La coleccin Databases pertenece al Workspace.

Abrir una Base de Datos ya existente. Mtodo OpenDatabase


Para abrir una base de datos existente deberemos usar el mtodo OpenDatabase. Pero previamente deberemos declarar el nombre que se le va a dar a ese objeto Database mediante la instruccin Dim si queremos que el mbito de ese Database sea un formulario, o Global o Public, (en la seccin de declaraciones de un Mdulo o Formulario) si queremos que el mbito sea toda la aplicacin. Por ejemplo, si queremos abrir una base de datos y poder referirnos a ella en toda la aplicacin, debemos declararla de esta forma en la seccin de declaraciones de un mdulo : Public MiBaseDatos as Database

Mtodo OpenDatabase
Abre la base de datos existente. La base de datos abierta se agrega automticamente a la coleccin Databases. Sintaxis Recuerde la expresin general: Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -) Set MiBaseDatos = Misesion.OpenDatabase(nombre_bd[, exclusivo[, slo-lectura[, origen]]]) La sintaxis del mtodo 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. Misesion Variable de tipo de dato objeto Workspace que representa el objeto Workspace existente que va a contener a la base de datos. nombre_bd Expresin de cadena con el nombre de un archivo (y su Path) de una base de datos existente. Si el nombre de archivo tiene extensin, es necesario especificarla. Si la red lo admite, tambin puede especificar una ruta de red, como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD.MDB". nombre_bd tambin puede ser un origen de datos OBDC. Lo veremos en otro captulo. 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, se producir un error. Si no se refiere a una base de datos existente o a un origen de datos ODBC vlido, se producir un error.

Pgina 363

Si es una cadena de longitud cero ("") y origen es "ODBC;", aparecer un cuadro de dilogo con todos los nombres de orgenes de datos ODBC registrados, en el que el usuario podr elegir una base de datos. exclusivo 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. Si se omite este argumento, 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 slo lectura o False si se va a abrir con acceso de lectura/escritura. Si se omite este argumento, la base se abrir para lectura/escritura. Expresin de cadena utilizada para abrir la base de datos. Esta cadena constituye los argumentos de conexin ODBC. Para especificar una cadena de origen deber especificar tambin los argumentos exclusivo y slo_lectura. Consulte la sintaxis en la propiedad Connect. Set MiBaseDatos = Misesion.OpenDatabase (C:\CursoVB\MiBase.MDB)

slo_lectura

origen

p.e.

abre la base de datos cuyo fichero est en C :\CursoVB y se llama MiBase.MDB. Al no expresarle mas parmetros la abre de modo no exclusivo, y de lectura y escritura. Al no especificar nada en el parmetro origen entiende que la base es ACCESS Nota para todo este captulo. No es necesario cambiar el nombre del Workspace. Si Misesion = Workspaces (0), la sentencia anterior podemos ponerla tambin : Set MiBaseDatos = Workspaces(0).OpenDatabase (C:\CursoVB\MiBase.MDB) El hecho de poner siempre un nombre al Workspace es solamente a efectos didcticos Para cerrar una base de datos y retirar as su objeto Database de la coleccin Databases, utilice sobre el objeto el mtodo Close.

Crear una Base de Datos ACCESS. Mtodo CreateDatabase


Veamos de forma breve como se crea una base de datos. Mas adelante se explicar con detalles. Para crear una base de datos deberemos utilizar el mtodo CreateDatabase. Previamente debemos declarar el nombre que queremos dar a esa nueva base de datos como un objeto Database : Dim MiBaseDatos as Database Si tenemos declarado un Workspace llamado Misesion mediante la declaracin : Dim Misesion as Workspace podremos usar el mtodo del Workspace CreateDatabase para crear esa base de datos. Nos crear una base de datos ACCESS Set MiBaseDatos = Misesion.CreateDatabase (C:\MiCarpeta\MiBase.MDB, Idioma [, opciones]) Una Base de Datos ACCESS tiene tablas. Para crear una tabla debemos usar el mtodo CreateTableDef. Declaremos ahora el nombre de un nuevo objeto : El Objeto TableDef. Dim Mitabla As TableDef y crearemos las tablas necesarias mediante CreateTableDef Set Mitabla = MiBaseDatos.CreateTableDef ([nombre[, atributos[, origen[, conexin]]]])

Pgina 364

Una Tabla tiene Campos (Fields). Para crear un campo debemos usar el mtodo CreateField Previamente declararemos el nombre del Objeto Field Dim MiCampo as Field Set MiCampo = Mitabla.CreateField ([nombre[, tipo [, tamao]]]) Observe el mencionado juego de nios. El mtodo correspondiente para crear un objeto DAO pertenece al objeto DAO inmediatamente superior en jerarqua, es decir, CreateDatabase es un mtodo del objeto Workspace, CreateTableDef es un mtodo del objeto Database, CreateField es un mtodo del objetos TableDef. Las colecciones pertenecen tambin al objeto inmediatamente superior en jerarqua al tipo de objetos que forman la coleccin. La coleccin Fields (Objeto Fields) pertenece a un objeto TableDef, la coleccin TableDefs (objeto TableDefs) pertenece a un objeto Database, y la coleccin Databases (Objeto Databases) pertenece a un objeto Workspace. La coleccin Workspaces pertenece al DBEngine, y el DBEngine ya no podemos asignarlo a ningn objeto DAO. Tendremos que decir que pertenece al sistema. Recordemos ese juego de nios : Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -) Veremos que despus de crear un objeto, debemos aadirlo a la coleccin a la que debe pertenecer con el mtodo Append. El agregarlo a la coleccin es imprescindible en el caso de los objetos TableDef, Field, QueryDef. El procedimiento es siempre el mismo : Objeto superior.Coleccin.Append Objeto a aadir Veamos con detalle cada uno de los mtodos para ir creando la Base de Datos Completa. Mtodo CreateDatabase Crea un nuevo objeto Database, guarda la base de datos en disco y devuelve un objeto Database abierto. Sintaxis Set MiBaseDatos = Misesion.CreateDatabase (nombre_base, inf_local [, opciones]) Donde MiBaseDatos es el nombre del objeto Database por el cual nos referiremos a esa base de datos, NO el nombre del archivo con el que quedar guardada en el disco. Misesion es el nombre del objeto Workspace existente que contendr la base de datos. Si se omite este argumento, se utilizar el objeto Workspace predeterminado. nombre_base es el nombre del archivo de base de datos que se va a crear. Es decir, el nombre del archivo en el disco. Puede ser una ruta completa y un nombre de archivo, como por ejemplo "C:\MIBD.MDB". Si no se indica una extensin, se agregar .MDB. Si la red lo admite, tambin puede especificar una ruta de red, como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD". Con este mtodo slo pueden crearse archivos de base de datos .MDB. (ACCESS) inf_local es una expresin de cadena utilizada para especificar el orden alfabtico que se va a usar en esta Base de Datos. Debe especificar este argumento o se producir un error. Consulte la tabla de constantes para inf_local incluida ms adelante en este tema.

Pgina 365

En el argumento Opciones puede combinar varias opciones, segn se especifica a mas adelante. Puede combinar varias opciones sumando las constantes correspondientes. VALORES En el argumento inf_local se suministra informacin de la lengua empleada para especificar la propiedad CollatingOrder del texto para las comparaciones entre cadenas. Es un argumento obligatorio. Para los idiomas Ingls, alemn, francs, portugus, italiano y espaol moderno se usa la siguiente constante : dbLangGeneral Para el Espaol tradicional se usar la constante dbLangSpanish. No use esta constante, pues no hace nada especial respecto a dbLangGeneral Consulte la ayuda de Visual Basic para informacin de otras lenguas. Este parmetro es obligatorio. Piense que una vez creada la Base de Datos, alguna vez le pedir que le obtenga un Recordset con los datos ordenados alfabticamente ( acurdese de la sentencia SQL ORDER BY Nombredelcampo ) Para Opciones se pueden usar las siguientes constantes : Constante dbEncrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Descripcin Crea una base de datos codificada. Crea una base de datos que utiliza la versin 1.0 del motor de base de datos Microsoft Jet. Crea una base de datos que utiliza la versin 1.1 del motor de base de datos Microsoft Jet. Crea una base de datos que utiliza la versin 2.5 del motor de base de datos Microsoft Jet. Crea una base de datos que utiliza la versin 3.0 del motor de base de datos Microsoft Jet. Esta Version es compatible con la 3.5

Si se omite la constante de codificacin, se crear una base de datos no codificada. Slo es posible especificar una constante de versin. Si se omite la constante de versin, se crear una base de datos que utilizar la versin 2.5 del motor de base de datos Microsoft Jet (para 16 bits) o la versin 3.0 (para 32 bits), dependiendo del entorno en el que se trabaje. Puede utilizar el mtodo CreateDatabase para crear una plantilla de una nueva base de datos que acceda al motor Jet. El mtodo CreateDatabase abre esta nueva base de datos y devuelve un objeto Database, cuya estructura y contenido deber completar utilizando objetos de acceso a datos adicionales. Es decir, crear una Base de Datos sin nada para pode rellenarla posteriormente. Estos objetos que se pueden aadir son : Objetos TableDef, TableDefs, Field, Fields, QueryDef, QueryDefs El Objeto TableDef es una tabla de una base de datos ACCESS. El Objeto TableDefs es una coleccin que contiene todas las tablas de la base de datos Una coleccin TableDefs contiene todos los objetos TableDef almacenados de una base de datos. El objeto TableDefs, la coleccin de tablas, pertenece al objeto DataBase. Un objeto Field representa una columna de datos con un tipo de datos y un conjunto de propiedades comunes. La coleccin Fields contiene todos los objetos Field almacenados de un objeto Index, QueryDef, Recordset, Relation o TableDef.

Pgina 366

Un objeto QueryDef representa una consulta de la base de datos. El objeto QueryDefs es la coleccin de objetos QueryDef. La diferencia entre una consulta (Un QueryDef) y una tabla (Un TableDef) es que la Tabla tiene dentro de s los datos. La consulta tiene dentro una referencia al lugar de las tablas donde se encuentran los datos.

CREACION DE LAS TABLAS DE ESTA BASE DE DATOS Dado que una base de datos ACCESS debe tener Tablas, deberemos crear estas una vez que hayamos creado la base de datos. La forma de crearlas es utilizando el mtodo CreateTableDef. Para ello, declararemos tantos objetos DAO tipo TableDef como tablas tengamos. Le daremos un nombre definido por el usuario, que NO ser el nombre de las tablas, sino el nombre por el que nos referiremos al objeto DAO TableDef en el cdigo de nuestra aplicacin. Para declarar las variables Objeto TableDef usaremos la misma lgica que para todos las variables en cuanto a mbito de aplicacin. Public Mitabla01 as TableDef Public Mitabla02 as TableDef Una vez declarados todos los Objetos TableDef, procederemos a crearlos usando el mtodo CreateTableDef. Mtodo CreateTableDef. Crea un nuevo objeto TableDef. Sintaxis La de siempre : Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -)

Set Mitabla = MiBaseDatos.CreateTableDef([nombre[, atributos[, origen[, conexin]]]]) Observe que el mtodo CreateTableDef es un mtodo del objeto Database ( MiBaseDatos en este caso) La sintaxis del mtodo CreateTableDef consta de las siguientes partes: Mitabla MiBaseDatos nombre atributos Variable declarada como tipo de dato objeto TableDef. Nombre de variable del objeto Database que se desea usar para crear el nuevo objeto TableDef. nombre del nuevo objeto TableDef. (Nombre de la Tabla que acabamos de crear) Variable de tipo Long que indica una o ms caractersticas del nuevo objeto TableDef. Para mayor informacin acerca de los valores para atributos vea la Ayuda de Visual Basic correspondiente a CreateTableDef. Variable de tipo String que contiene el nombre de la tabla de una base de datos externa de la que proceden originariamente los datos. La cadena origen pasa a ser el valor de la propiedad SourceTableName del nuevo objeto TableDef. Variable de tipo String que contiene informacin sobre el origen de una base de datos abierta, de una base de datos utilizada en una consulta de paso a travs o de una tabla adjunta. Si desea ms informacin sobre las cadenas de conexin vlidas, consulte la propiedad Connect.

origen

conexin

Si omite uno o ms de los argumentos opcionales al utilizar CreateTableDef, puede utilizar despus una instruccin de asignacin para definir o restablecer la propiedad correspondiente antes de agregar el nuevo objeto a una coleccin. Una vez agregado, slo podr modificar los

Pgina 367

valores de algunas de las propiedades del nuevo objeto. Si desea ms informacin, consulte los temas individuales de las propiedades. Ya tenemos creadas las tablas que componen la base de datos. Pero una tabla contiene campos, y estas tablas creadas con el mtodo CreateTableDef estn, de momento, vacas. Deberemos crear los campos con el mtodo CreateField. Antes de usar el mtodo CreateField deberemos declarar tantos objetos DAO tipo Field como campos vayamos a crear. Por ejemplo, para declararlos en un mdulo y que su mbito sea toda la aplicacin : Public MiCampo01 as Field Public MiCampo02 as Field Un objeto Field es un campo de la base de datos. El Objeto Fields es la coleccin de los objetos Field existentes en una Tabla. Mtodo CreateField Crea un nuevo objeto Field. Este es un procedimiento del objeto TableDef Sintaxis Set DAOInferior = DAOSuperior.Mtodo ( - - - - - -)

Set MiCampo = Mitabla.CreateField ([nombre[, tipo [, tamao]]]) Donde : MiCampo Mitabla nombre tipo

Variable declarada como tipo de dato objeto Field. Nombre de variable del objeto TableDef que se desea utilizar para crear el nuevo objeto Field. Variable de tipo String que da el nombre al campo creado. Constante de tipo Integer que determina el tipo de datos del nuevo campo. Consulte la propiedad Type para obtener informacin sobre los tipos de datos vlidos. Entero que indica el tamao mximo, en bytes, de los objetos Field que contengan texto. Consulte en la propiedad Size los valores vlidos para tamao. Este argumento se ignora en el caso de campos numricos o de anchura fija.

tamao

Es posible que quiera que alguno de los campos creados tenga unas caractersticas o Atributos especiales. (Por ejemplo, que sea un contador) Vea la Propiedad Attributes mas adelante. Ya tenemos creada la Base de Datos, sus Tablas y los Campos de cada tabla. Sin embargo esto todava no es una base de datos completa. Una vez creados todos los campos, debemos aadirlos a su tabla, y una vez que la tabla ya tiene aadidos todos sus campos, debemos aadir es tabla a la base de datos. Si no lo hacemos as, la base de datos continuara vaca. Para ello, utilizaremos el Mtodo Append (Lo veremos mas adelante) MiTabla1.Fields.Append MiCampo11 MiTabla1.Fields.Append MiCampo12 MiTabla1.Fields.Append MiCampo13 Aadiramos todos los campos a todas las tablas existentes.... MiTabla2.Fields.Append MiCampo21 MiTabla2.Fields.Append MiCampo22 MiTabla2.Fields.Append MiCampo23 Pgina 368

Y ahora aadiramos todos los TableDef ya llenos de campos, al objeto TableDefs de la Base de Datos : MiBaseDatos.Tabledefs.Append Mitabla1 MiBaseDatos.Tabledefs.Append Mitabla2 Mtodo CreateIndex Otro mtodo del objeto TableDef es CreateIndex, y tiene una coleccin denominada Indexes. El mtodo CreateIndex crea un nuevo objeto : un objeto Index. (Para no liarnos, un objeto Index es un ndice de una tabla.) Los objetos Index especifican el orden en que se accede a los registros de las tablas de una base de datos y si se aceptan o no registros duplicados. Adems, los objetos Index permiten un acceso eficiente a los datos. En el caso de las bases de datos externas, los objetos Index describen los ndices establecidos para las tablas externas. Sintaxis Set NombreIndice = NombreTabledef.CreateIndex([Nombre])

Donde NombreIndice es el nombre de una variable declarada como tipo de dato objeto Index. NombreTabledef es el nombre de variable del objeto TableDef que se desea usar para crear el nuevo objeto Index. Nombre es una variable de tipo String que da un nombre nico al nuevo objeto Index. Para retirar un objeto Index de una coleccin, utilice en ella el mtodo Delete. Un objeto Index tiene las siguientes propiedades : Clustered - El objeto Index representa un ndice agrupado de una tabla. Primary - El objeto Index representa un ndice primario de una tabla. Foreign - El objeto Index representa una clave externa en una tabla Unique - El objeto Index representa un ndice nico (clave) de una tabla. IgnoreNulls - Indica si permite valores Nulos en los campos del ndice. Required - Indica si objetos Field o Index requieren valores no Nulos. Name - Nombre del Objeto Index DistinctCount - Devuelve un valor que indica el nmero de valores nicos del objeto Index que se incluyen en la tabla asociada. La propiedad DistinctCount devuelve un tipo de datos Long. Para crear un ndice proceda de la siguiente forma : Set Indice = mitabla01.CreateIndex("indiceID") Set micampo1N = Indice.CreateField("ID", 4) objeto Indice.Required = True Indice.Primary = True Indice.Fields.Append micampo1N mitabla01.Indexes.Append Indice Se asigna un nombre al objeto Index Asocia el campo deseado al ndex. El campo debe estar ya creado. No admite valores Nulos Se trata del ndice primario se aade el campo a la coleccin Fields del objeto Index. Se aade el objeto Index a la coleccin Indexes del objeto Tabledef

(Aadir un ndice a una tabla es una tarea que ha dado mas de un quebradero de cabeza. No se desanime si no sale a la primera) Como primera advertencia de lo incomprensible que puede ser trabajar con ndices vemos la segunda lnea del cdigo anterior : Set micampo1N = Indice.CreateField("ID", 4)

Pgina 369

Parece que estamos creando el campo ID. Pues no. Ese campo ya debe est ar creado mediante el mtodo del objeto TableDef CreateField. En realidad lo que hacemos mediante ese CreateField del objeto Indice es asociar ese campo al Indice. Una vez creado el Indice puede darle las propiedades deseadas (hacerlo Indice Primario Clave Maestra en Access - , que no acepte valores nulos - Required - o cualquiera de las propiedades expuestas mas atrs. No se olvide, una vez con todas sus propiedades, agregar primero el campo a la coleccin Fields del Indice, y a continuacin el ndice a la coleccin Indexes del Tabledef : MiIndice.Fields.Append MiCampo MiTableDef.Indexes.Append MiIndice

PROPIEDADES TYPE, ATTRIBUTES Y SIZE REFERIDAS A LOS CAMPOS Propiedad Type Devuelve o establece un valor que indica el tipo de datos de un objeto. En objetos Field, el valor de esta propiedad es de lectura/escritura hasta que el objeto se agrega a una coleccin o a otro objeto, despus de lo cual es de slo lectura. Sintaxis objeto valor objeto.Type [= valor] Nombre del Objeto Field. Un entero o constante de los descritos a continuacin. (El tipo de datos es Integer).

Dependiendo de la versin del motor de bases de datos usado, puede tomar los siguientes valores Versin 2 (16 bits) Valor 8 10 12 1 3 4 5 6 7 2 11 Constante dbDate dbText dbMemo dbBoolean dbInteger dbLong dbCurrency dbSingle dbDouble dbByte dbLongBinary Descripcin Fecha/Hora Texto Memo Yes/No Integer Long Currency Single Double Byte Long Binary (Objeto OLE) Sirve para guardar fechas y horas Sirve para texto hasta 255 bytes Para textos sin limitacin Booleanas de -32.768 a 32.767 de - 2.147.483.648 y 2.147.483.647 Long en Pesetas (Euros) Coma flotante, simple precisin Coma flotante, doble precisin de 0 a 255 Para meter Imgenes u otros datos binarios largos.

En VB5 que trabaja con la versin 3.5 del motor de bases de datos JET, tiene los siguientes valores : Constante dbBigInt dbBinary dbBoolean dbByte dbChar dbCurrency dbDate Descripcin Big Integer Binary Boolean Byte Char Currency Date/Time Pgina 370

dbDecimal dbDouble dbFloat dbGUID dbInteger dbLong dbLongBinary dbMemo dbNumeric dbSingle dbText dbTime dbTimeStamp dbVarBinary

Decimal Double Float GUID Integer Long Long Binary (Objeto OLE) Memo Numeric Single Text Time TimeStamp VarBinary

Vea la propiedad Type de VB5 para ver los detalles de cada tipo de dato. Propiedad Attributes Devuelve o establece un valor que indica una o ms caractersticas de un objeto Field. En un objeto que no ha sido agregado a una coleccin, esta propiedad es de lectura/escritura. Sintaxis objeto valor objeto. Attributes [= valor] Nombre del Objeto Field cuya caracterstica se va a leer o cambiar. Una constante que especifica las caractersticas de un objeto, como se describe a continuacin.

En un objeto Field, valor especifica las caractersticas del campo representado por el objeto Field y puede ser una suma de las siguientes constantes:: Constante dbFixedField dbVariableField dbAutoIncrField Descripcin El tamao del campo es fijo (predeterminado en campos numricos). El tamao del campo es variable (Slo campos de texto). El valor del campo en los registros nuevos es incrementado automticamente a un valor Long integer nico que no puede ser modificado. Slo aceptado en tablas bases de datos Jet. El valor del campo no puede ser modificado. El campo est ordenado de forma descendente (Z-A o 100-0) (slo se aplica a objetos Field de una coleccin Fields de un objeto Index). Si se omite esta constante, el campo se ordena ascendentemente (A-Z o 0100) (predeterminado).

dbUpdatableField dbDescending

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, si hemos creado un campo denominado ID que ser el contador de una serie de registros, y queremos que se incremente en 1 cada vez que aadamos un registro, debemos usar la propiedad Attributes ANTES de aadir ese campo al objeto TableDef correspondiente, de la siguiente forma : Set micampo1N = mitabla01.CreateField("ID", 4) micampo1N.Required = True micampo1N.Attributes = dbAutoIncrField mitabla01.Fields.Append micampo11 Propiedad Size Creamos el campo ID La propiedad Required la veremos Le damos atributo de contador Aadimos el campo a la tabla

Pgina 371

Devuelve o establece un valor que indica el tamao mximo, en bytes, de un objeto Field que contiene texto o el tamao fijo de un objeto Field que contiene texto o valores numricos. En objetos no agregados a una coleccin Fields, esta propiedad es de lectura/escritura. Sintaxis objeto valor objeto.Size [= valor] Nombre del objeto Field. Una constante o valor que indica el tamao mximo, como se describe a continuacin. (El tipo de datos es Integer). Valor 1 1 2 4 8 4 8 8 1-255 0 0 Descripcin True/False Byte Integer Long Currency Single Double Fecha/Hora Texto Long Binary (Objeto OLE) Memo

Constante dbBoolean dbByte dbInteger dbLong dbCurrency dbSingle dbDouble dbDate dbText dbLongBinary dbMemo

FIN DE LAS PROPIEDADES TYPE, ATTRIBUTES Y SIZE REFERIDAS A LOS CAMPOS CONSULTAS DE ACCESS Pero habr observado que una base de datos ACCESS puede contener, adems de tablas, CONSULTAS. Estas consultas son los objetos QueryDef. Vamos a crear una consulta en la base ACCESS mediante el Mtodo CreateQueryDef

Mtodo CreateQueryDef Antes de utilizar el mtodo CreateQueryDef debe declarar el nombre de los objetos a crear, declarndolos como Variables Objeto tipo QueryDef . El mbito es igual que para cualquier variable: Public MiConsulta1 as QueryDef Public MiConsulta2 as QueryDef Ahora podemos utilizar el mtodo CreateQueryDef para crear el nuevo objeto QueryDef en la base de datos. Sintaxis Con la frmula de siempre : Set MiConsulta1 = MiBaseDatos.CreateQueryDef ([Nombre][, Texto_sql]) Donde MiConsulta1 es una variable del tipo QueryDef que previamente se ha declarado como tal. Ser el nombre por el que llamemos al Objeto QueryDef en el cdigo de nuestra aplicacin. MiBaseDatos es el nombre del objeto Database abierto en el que vamos a introducir el nuevo objeto QueryDef. Nombre es una expresin de cadena que representa el nombre de la nueva consulta que vamos a crear. Puede omitir este parmetro a la hora de crear el QueryDef, y ponerle el nombre con posterioridad. Texto_sql es una expresin de cadena (instruccin SQL vlida) que define el objeto QueryDef. Pgina 372

Lgicamente una consulta nos debe suministrar una serie de datos de una o mas tablas. Esos datos no tienen porqu ser todos los datos de las tablas. Texto_sql es precisamente el filtro de esos datos (expresado mediante una clusula SQL). Si se omite el argumento Texto_sql, puede definirse el objeto QueryDef estableciendo un valor en su propiedad SQL antes o despus de agregarlo a una coleccin. Vea la Ayuda de Visual Basic para mayor informacin. Una vez creado el objeto QueryDef, no es necesario aadirlo a la coleccin QueryDefs de la Base de Datos, excepto que hayamos creado el objeto QueryDef sin nombre. (Sin haber puesto el parmetro Nombre, segn se coment mas atrs). Para aadirlo a la coleccin QueryDefs : MiBaseDatos.QueryDefs.Append MiConsulta1 Veamos ahora con detalle el Mtodo Append

Mtodo Append
Agrega un nuevo objeto para acceso a datos a una coleccin. Observe que Append aade un objeto a una coleccin. Por ejemplo, aade un campo a la coleccin Fields (Fjese en el plural) de un objeto TableDef, o una tabla a la coleccin TableDefs de un Objeto Database. Sintaxis coleccin objeto coleccin.Append objeto Cualquier coleccin que admita nuevos objetos (las limitaciones se indican en la tabla siguiente). Variable de un tipo de dato objeto que identifica el objeto a agregar, que debe ser del mismo tipo que los elementos de coleccin.

Entre los usos del mtodo Append se encuentran agregar una nueva tabla a una base de datos, agregar un campo a una tabla o un campo a un ndice. El objeto agregado se convierte en un objeto persistente y se almacena en disco, hasta que se lo elimine con el mtodo Delete. Si la coleccin es Workspaces (que slo se almacena en la memoria), el objeto seguir activo hasta que se lo elimine con el mtodo Close. La adicin de un nuevo objeto se produce inmediatamente, pero se debe utilizar el mtodo Refresh en las restantes colecciones que puedan verse afectadas por los cambios en la estructura de la base de datos. En la tabla siguiente se muestran algunas limitaciones en el uso del mtodo Append. El objeto de la primera columna contiene a la coleccin de la segunda. La tercera columna indica cundo se puede agregar un objeto a la coleccin. Esta lista contempla solamente los objetos estudiados hasta ahora. Consulte la Ayuda de VB para ver la lista completa de limitaciones. Objeto Coleccin Cundo puede utilizarse Append Siempre Nunca. Los errores se anexan automticamente.. No. Con el mtodo OpenDatabase se

DBEngine Workspaces DBEngine Errors Workspace Databases automticamente. Workspace Groups Workspace Users Database QueryDefs Database Recordsets Database TableDefs Group Users User Groups QueryDef Fields Recordset Fields TableDef Fields

anexan

S S Slo cuando el QueryDef lo hemos creado sin nombre. No. Se anexan automticamente. S S S No No Slo cuando la propiedad Updatable del objeto TableDef se Pgina 373

Tabledef

Indexes

Index

Fields

establece a True o cuando el objeto TableDef no est anexado. Slo cuando la propiedad Updatable del objeto TableDef se establece a True o cuando el objeto TableDef no est anexado. Slo cuando el objeto Index es un objeto nuevo no anexado.

Como ejemplo, para aadir los campos MiCampo11, ....., MiCampo13 al objeto TableDef MiTabala1, los campos MiCampo21, ..... , MiCampo23 al Objeto MiTabla2, y los campos MiCampo31, .... , MiCampo33 al objeto Mitabla3, y estas tres tablas al Objeto MiBaseDatos, usaremos las siguientes sentencias : MiTabla1.Append MiCampo11 ... MiTabla1.Append MiCampo13 MiTabla2.Append MiCampo21 ... MiTabla2.Append MiCampo23 MiTabla3.Append MiCampo31 ... MiTabla31.Append MiCampo33 MiBaseDatos.Append MiTabla1 MiBaseDatos.Append MiTabla2 MiBaseDatos.Append MiTabla3 El orden debe ser el indicado, primero se aaden los campos a la tabla y luego las tablas a la base de datos. Los nombres MiCampoxx, Mitablax y MiBaseDatos son los nombres de los objetos DAO que ha creado, NO los nombres fsicos del campo, de la tabla o de la base de datos, entendiendo por nombres fsicos el nombre del fichero de la base de datos, el nombre de la tabla en esa base de datos o el nombre del campo dentro de esa tabla.

Relaciones
Ya tenemos la base de datos completamente creada. Sin embargo alguien dir que le falta algo : Relacionar dos tablas Una Relacin es una asociacin establecida entre dos campos del mismo tipo ubicados en dos tablas distintas. Se pueden establecer relaciones uno a uno uno a varios. Para relacionar un campo con otros, ese campo debe ser clave maestra. A la tabla que contiene a este campo se le llama Tabla principal. A la tabla que contiene el campo (o los campos) relacionados se le llama Tabla Relacionada. Para crear una relacin, usaremos un nuevo objeto DAO : El objeto Relation. Este objeto forma parte de una coleccin, que es a su ves otro objeto DAO : el objeto Relations. Para crear una relacin usaremos el Mtodo CreateRelation, que es un mtodo del objeto Database. Como para cualquier otro objeto DAO, es necesario declararlo : Dim MiRelacion as Relation Declaramos tambin un objeto DAO tipo Field, llamado MiCampo, pues deberemos hacer una cosa similar a la que hacamos para el mtodo CreateIndex Dim MiCampo as Field

Pgina 374

Supongamos que queremos crear una relacin en la base de datos creada en el ejemplo anterior, y queremos relacionar el campo Campo11 que est en Tabla1 y que lo habamos hecho clave maestra, con el campo Campo21 de Tabla2. Tabla1 y Tabla2 son los nombres reales de las tablas, NO los nombres de los objetos Tabledef. El ejemplo que trae la ayuda de VB puede ser muy aclaratorio, pero le advertimos lo mismo que para los ndices, paciencia. Una vez creada la relacin, podr comprobarlo visualizndola con el visor de relaciones del Access Suponemos que la base de datos est abierta. Si no lo est, la abrimos. Set MiBaseDatos = Workspaces(0).OpenDatabase("MIBD.MDB") Creamos el objeto Relation, que tendr por nombre RelacionUno, pero este nombre NO debe confundirse con el nombre del objeto DAO Relation, que es MiRelacion Set MiRelacion = MiBaseDatos.CreateRelation("RelacionUno") Una vez creada, le decimos a MiRelacion cual es la Tabla principal MiRelacin.Table = "MiTabla1" 'Nombre de la tabla principal. Le decimos cual es el nombre de la tabla relacionada MiRelacin.ForeignTable = "Tabla2" Le ponemos los atributos a la relacin. En este caso dbRelationUpdateCascade, para que, si hacemos un cambio en el valor del campo de la tabla principal, ese cambio se refleje en el campo o los campos relacionados con el. MiRelacin.Attributes = dbRelationUpdateCascade Le decimos cual es el nombre del campo de la tabla principal que vamos a relacionar Set MiCampo = MiRelacin.CreateField("Campo11") Le recordamos lo de antes. Campo11 debe estar ya creado en la tabla Tabla1. Parece un poco ilgico usar el mtodo CreateField para un campo que ya est creado. Pero eso s, aqu CreateField es un mtodo del objeto DAO Relation, no del objeto DAO Tabledef. Le decimos ahora cual es el nombre del campo en la tabla relacionada MiCampo.ForeignName = "Campo21" Aadimos el campo creado a la coleccin Fields del objeto Relation MiRelacin.Fields. Append MiCampo Y ahora aadimos el objeto Relation recin creado a la coleccin Relations del objeto Database MiBaseDatos.Relations. Append MiRelacin Solamente nos falta ver que valores puede tener la propiedad Attributes del objeto Relation dbRelationUnique dbRelationDontEnforce dbRelationInherited dbRelationUpdateCascade La relacin es uno a uno. La relacin no es impuesta (no hay integridad referencial). La relacin existe en una base de datos no activa que contiene las dos tablas vinculadas. Las actualizaciones se realizarn en cascada. Pgina 375

dbRelationDeleteCascade

Las eliminaciones se realizarn en cascada.

PROPIEDADES DEL OBJETO DATABASE

Name

(Aplicable a todos los objetos DAO)

Devuelve el nombre, definido por el usuario, de un objeto de acceso a datos. Sintaxis Nombre = objeto.Name

donde nombre es una expresin de cadena que especifica un nombre. El nombre debe empezar por una letra y puede contener un mximo de 40 caracteres. Puede incluir nmeros subrayados pero no puede incluir signos de puntuacin ni espacios. (El tipo de datos es String). Los objetos TableDef y QueryDef no pueden compartir el mismo nombre, ni tampoco los objetos User y Group. El uso de lectura/escritura en la propiedad Name depende del tipo de objeto al que se aplica, pero independientemente del tipo de objeto, la propiedad Name es de slo lectura, una vez que se haya agregado a una coleccin. Recuerde que la Propiedad Name de un Objeto DAO es el nombre por el que nos referimos a ese objeto en el cdigo de la aplicacin, NO, por ejemplo, el nombre del fichero que contiene la Base de Datos en el disco. El fichero que contiene la base de datos puede ser C :\CEU\ALUMNOS.MDB, y en nuestra aplicacin el Name del objeto Database es MiBase, ya que la hemos abierto con la sentencia : Set MiBase = Workspaces(0).OpenDatabase (C :\CEU\ALUMNOS.MDB) Connect Esta propiedad nos permite indicarle el origen de la base de datos. No es necesario para bases de datos Access. Es necesario para anexar tablas de otras bases de datos. Lo ver en el siguiente captulo. Updatable Devuelve un valor que indica si pueden hacerse cambios sobre un objeto de acceso a datos. Esta propiedad es solo de lectura. Devuelve un valor True / False que indica si la base abierta permite ser cambiada o actualizada, y False en caso contrario. Sintaxis objeto.Updatable

CollatingOrder Devuelve un valor que especifica la secuencia del orden del texto en comparacin de cadenas u ordenacin. El valor de esta propiedad es de slo lectura. Esta propiedad corresponde al parmetro inf_local introducido al crear la base de datos. Sintaxis Variable = NombredelaBase.CollatingOrder

Variable contendr el valor de la constante, p. e. dbLangGeneral QueryTimeout Pgina 376

Devuelve o establece un valor que especifica el nmero de segundos que el motor de base de datos Microsoft Jet espera antes de producir un error de tiempo de espera cuando se ejecuta una consulta en una base de datos ODBC. Sintaxis objeto.QueryTimeout [= valor]

objeto Nombre del objeto Database valor Un entero que representa el nmero de segundos que el motor de base de datos Jet espera antes de devolver un error de tiempo de espera. (El tipo de datos es Integer). Cuando se usa con objeto Database, la propiedad QueryTimeout especifica un valor global para todas las consultas asociadas con dicha base de datos. El valor de tiempo de espera predeterminado es de 60 segundos. El valor asignado a QueryTimeout en un objeto Database prevalece sobre el valor predeterminado. Count Devuelve el nmero de objetos de una coleccin. Al referirse a una coleccin, no se puede referir a un objeto Database, sino a un objeto Databases (plural) o a cualquier coleccin (plural) de objetos DAO. Sintaxis Variable = objeto.Count

El valor de la propiedad Count es un entero de tipo Long. Los miembros de una coleccin se numeran a partir de 0, de forma que los bucles siempre se codifican comenzando por el miembro nmero 0. Por ejemplo: For I = 0 To Workspaces(0).Databases.Count - 1 ... Next I Nota Tambin puede utilizar la sintaxis For Each objeto In Coleccin para enumerar todos los miembros de una coleccin. Por ejemplo: Dim MiBd as Database For Each MiBd In Workspaces(0).Databases Debug.Print MiBd.Name Next El valor de la propiedad Count nunca es Null. Cuando es 0, no hay ningn objeto en la coleccin. No existira esa coleccin. Version Devuelve un valor que indica la versin de la base de datos o motor de base de datos asociado con el objeto. El valor de esta propiedad es de slo lectura. Sintaxis objeto.Version

Valores devueltos El valor devuelto por la propiedad Version es una expresin de cadena cuyo resultado es un valor, que para el objeto Database identifica la versin del motor de base de datos Jet que ha creado la base de datos. METODOS DEL OBJETO DATABASE

Pgina 377

Se enumeran los mtodos del objetos Database, resaltando en negrita los vistos hasta este momento. Se vern al final del captulo los mtodos no vistos mas importantes. BeginTrans CreateProperty CreateTableDef OpenQueryDef Close CreateQueryDef DeleteQueryDef OpenRecordset CommitTrans CreateRelation Execute OpenTable CreateDynaset CreateSnapshot ExecuteSQL Rollback

Objeto TableDef Un objeto TableDef representa la definicin de una tabla de una base de datos. Una coleccin TableDefs contiene todos los objetos TableDef almacenados de una base de datos. Como ya se ha comentado la forma de crear una tabla, vamos a comentar solamente las propiedades y mtodos del objeto TableDef Un objeto TableDef contiene las siguientes colecciones, mtodos y propiedades: (las que ya se han visto estn resaltadas en negrita) COLECCIONES Fields (predeterminada) METODOS CreateField CreateIndex CreateProperty OpenRecordset RefreshLink Indexes Properties

PROPIEDADES Attributes Updatable RecordCount LastUpdated Connect SourceTableName ValidationRule Name DateCreated ValidationText

Una coleccin TableDefs contiene los siguientes mtodos y propiedades: METODOS Append Delete Refresh

PROPIEDAD : Count Comentaremos en primer lugar los mtodos. Uno de ellos, CreateField ya se ha visto, y su misin es crear los campos que van a formar parte de una tabla. Otro de los mtodos es OpenRecordset. Este mtodo se emplea para abrir un Recordset. Observe que este mtodo tambin lo tiene el objeto Database. Pero tambin es un mtodo del objeto QueryDef y del propio objeto Recordset. Esto significa que este mtodo bien lo podemos emplear con un objeto Database (As se hace normalmente) o con un objeto TableDef, QueryDef o incluso con otro Recordset. Poco podramos explicar este mtodo si no sabemos que es un Recordset. Por ello, se va a explicar a continuacin.

EL OBJETO RECORDSET ( O la mitad de lo que Vd. necesita saber de Bases de Datos) Un objeto Recordset representa registros de una tabla base o los registros resultantes de la ejecucin de una consulta. La coleccin Recordsets contiene todos los objetos Recordset abiertos de un objeto Database. Pgina 378

Al utilizar objetos de acceso a datos, casi toda la interaccin con los datos se produce a travs de objetos Recordset. Todos los objetos Recordset estn formados por registros (filas) y campos (columnas). Existen tres tipos de objetos Recordset: Recordset de tipo tabla: Representacin en cdigo de una tabla base de datos que puede utilizarse para agregar, modificar o eliminar registros de una sola tabla de base de datos. Un Recordset tipo Tabla contiene todos los campos de una tabla y no puede contener campos que no pertenezcan a esa tabla. Recordset de tipo hoja de respuestas dinmica: Resultado de una consulta que puede tener registros actualizables. Un Recordset de tipo hoja de respuestas dinmica es un conjunto dinmico de registros que puede utilizarse para agregar, modificar o eliminar registros de una o ms tablas de una base de datos subyacente. Este tipo de objeto Recordset puede contener campos de una o ms tablas de una base de datos. Recordset de tipo instantnea: Copia esttica de un conjunto de registros que puede utilizarse para buscar datos o generar informes. Los objetos Recordset de tipo instantnea pueden contener campos de una o ms tablas de una base de datos, pero no pueden actualizarse. Puede elegir el tipo de objeto Recordset a crear mediante el argumento tipo del mtodo OpenRecordset. Resumiendo, un Recordset es un conjunto de registros. Recuerde cuando explicbamos en control Data se deca que este control creaba un Recordset a partir de sus propiedades DatabaseName y RecordSource. De esta forma, el conjunto de registros que tiene ese control Data es la totalidad de los registros de la tabla (o consulta) que ponamos en la propiedad RecordSource. Pero siempre podemos asignar a la propiedad Recordset de ese control Data un Recordset ya creado mediante cdigo. Y en ese caso, solamente contendr los campos que a nosotros nos interese, incluso campos de distintas tablas, cosa que viene muy bien algunas veces. Un Recordset lo crearemos con el mtodo OpenRecordset que estamos estudiando. Como se trata de un mtodo de los objetos Database, y de los objetos TableDef , QueryDef y Recordset, podemos abrir un Recordset desde cualquiera de ellos. Antes de abrirlo, debemos declarar de la forma correcta el nombre que va a tener el Objeto Recordset que se va a abrir : Public Mirecordset As Recordset Una vez declarado, para abrirlo basta con ejecutar la sentencia : Set Mirecordset = base_datos.OpenRecordset (origen[, tipo[, opciones]]) Set Mirecordset = Objeto.OpenRecordset ([tipo[, opciones]]) La diferencia entre las dos formas, es que en la primera se ha abierto directamente desde el Objeto Database, (base_datos = nombre del objeto Database), y en origen le debemos expresar la tabla o tablas (Objetos TableDef) (o QueryDef, consulta) donde debe buscar los registros. En la segunda forma, se abre directamente de un objeto TableDef, QueryDef o Recordset, con lo que ya no es necesario expresar la tabla o tablas de origen, ya que cualquiera de estos tres objetos lleva implcito la eleccin de una serie de registros de una o varias tablas. Observe que si abre un Recordset desde una Tabla o QueryDef, ese Recordset contendr todos los registros de esa Tabla o QueryDef. No puede elegir solo una parte de los registros que contiene esa tabla o QueryDef Al crear un nuevo objeto Recordset se agrega automticamente a la coleccin Recordsets.

Pgina 379

Si Objeto hace referencia a un objeto Recordset de tipo instantnea u hoja de respuestas dinmica, el tipo del nuevo objeto ser el mismo. Si objeto se refiere a un objeto Recordset de tipo tabla, el nuevo ser un Recordset de tipo hoja de respuestas dinmica. Origen en la primera expresin es una variable de tipo String que especifica el origen de los registros del nuevo objeto Recordset. El origen puede ser un nombre de tabla, un nombre de consulta o una instruccin SQL que devuelva registros. En el caso de los objetos Recordset de tipo tabla, el origen slo puede ser un nombre de tabla. Tipo es el tipo de Recordset que se quiere crear. Si no se especifica un tipo, OpenRecordset crear un objeto Recordset de tipo tabla cuando sea posible. (Cuando especifica como Origen el nombre de una Tabla) Si se especifica una consulta o una tabla adjunta, OpenRecordset crear un objeto Recordset de tipo hoja de respuestas dinmica. El tipo del nuevo objeto Recordset se define mediante una de las siguientes constantes : dbOpenTable para abrir un objeto Recordset de tipo tabla. dbOpenDynaset para abrir un objeto Recordset de tipo hoja de respuestas dinmica. dbOpenSnapshot para abrir un objeto Recordset de tipo instantnea. El parmetro opciones permite especificar las caractersticas del nuevo objeto Recordset tales como las restricciones de edicin y consulta para otros usuarios. Vea la Ayuda de VB para mayor detalle. Los objetos Recordset se eliminan automticamente de la coleccin Recordsets al cerrarlos con el mtodo Close. Ejemplo de creacin de un Objeto Recordset Decamos que se puede crear un Recordset con la sentencia : Recuerde la Frmula general Set DAOinf = DAOsup. Mtodo ( - - - - - - - ) Set Mirecordset = base_datos.OpenRecordset (origen[, tipo[, opciones]]) Si tenemos abierta una base de datos llamada MiBaseDatos, podemos crear el objeto MiRecordset eligiendo de la tabla MiTabla de esa base de datos los campos Campo1, Campo2 y Campo3, y que sea del tipo de hoja de respuestas dinmica, de la siguiente forma : Set Mirecordset = MiBaseDatos.OpenRecordset (SELECT Campo1, Campo2, Campo3 _ FROM MiTabla, dbOpenDynaset) Si deseamos que el Recordset contenga todos los campos de esa misma tabla : Set Mirecordset=MiBaseDatos.OpenRecordset (SELECT * FROM MiTabla, dbOpenDynaset) o simplemente sin utilizar la sentencia SQL : Set Mirecordset = MiBaseDatos.OpenRecordset (MiTabla, dbOpenDynaset) En los ejemplos anteriores no se ha establecido ningn parmetro en Opciones. Si desde el Recordset anterior, queremos crear un nuevo Recordset denominado MiRecordset1, que tenga la condicin de que sea solo lectura, usaremos la sentencia : Set Mirecordset1 = Mirecordset.OpenRecordset (dbReadOnly) Este nuevo Recordset contendr los mismos campos que el Recordset origen, pero no podremos cambiar datos en l.

Pgina 380

Pueden crearse tantos Recordsets como se necesiten. Estos Recordsets pueden tener campos comunes. Es ms, podramos crear dos Recordsets exactamente iguales. Pero en la mayora de los casos, necesitaremos crear un Recordset donde se elijan varios campos de una o varias tablas, seleccionando de esos campos unos determinados valores. Por ejemplo, en una base con las direcciones de los clientes, a lo mejor queremos seleccionar todas aquellas direcciones en las cuales el cdigo postal sea el 28700 (San Sebastin de los Reyes). 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.D., no el nombre que pueda tener esa B.D. en el disco), y esta base de datos tiene una tabla llamada DIRECCIONES (Este s es el nombre real de la tabla dentro de la B.D.) Vamos a abrir un Recordset con todos los clientes de San Sebastin de los Reyes : Set Mirecordset2 = CLIENTES.OpenRecordset (SELECT * FROM DIRECCIONES WHERE COD_POSTAL = 28700, dbOpenDynaset) El Recordset Mirecordset2 contiene todos los campos de todos los registros de la tabla DIRECCIONES que cumplan la condicin de que el cdigo postal (campo COD_POSTAL en el ejemplo) sea igual a 28700. Observe en esta y anteriores expresiones, que la sentencia SQL est entre doble comilla. Podemos introducir cualquier sentencia SQL para determinar qu registros introducimos en el Recordset. Por ejemplo, si queremos seleccionar todos los clientes de Madrid (su cdigo postal comenzar necesariamente por 28 y le seguirn tres cifras) : Set Mirecordset2 = CLIENTES.OpenRecordset (SELECT * FROM DIRECCIONES WHERE COD_POSTAL LIKE 28???, dbOpenDynaset)

Propiedad RecordCount Devuelve el nmero de registros accedidos en un objeto Recordset. El valor de esta propiedad es de slo lectura. (El objeto TableDef tambin tiene la propiedad RecordCount) Sintaxis NombredeMiRecordset.RecordCount

Donde NombredeMiRecordset ES un objeto Recordset. El valor devuelto por la propiedad RecordCount es un Long in (NombredeMiRecordset puede ser tambin un objeto Dynaset, un objeto Snapshot o un objeto Table. Los objetos Dynaset, Snapshot y Table son objetos obsoletos que se mantienen por razones de compatibilidad) (Puede emplear la misma sintaxis para conocer los registros de un objeto TableDef) Use la propiedad RecordCount para saber a cuantos registros se accede en un objeto Recordset o TableDef. RecordCount no indica cuantos registros se contienen en un Recordset de tipo hoja de respuestas dinmica o instantnea hasta que se ha accedido a todos los registros. Para que el mtodo RecordCount le devuelva el nmero de registros existentes, tiene que acceder previamente al primero y al ltimo. El acceder al primero es fcil, ya que nada mas crearse el Recordset, el primer registro se convierte en Registro actual. Pero si en estas condiciones intenta usar el mtodo RecordCount, la respuesta ser que tiene 0 registros. Acceda al ltimo registro mediante el mtodo MoveLast. A partir de ese momento, ya le indicar el nmero correcto de registros existentes. Un Recordset o TableDef sin registros tienen 0 como valor de la propiedad RecordCount.

Pgina 381

Veamos unos Mtodos importantes del Objeto Recordset para aadir o modificar el contenido de registros : Si queremos aadir un registro a un Recordset, se utilizar el Mtodo AddNew : Mtodo AddNew Crea un nuevo registro en un objeto Recordset de tipo tabla u hoja de respuestas dinmica. Sintaxis MiRecordset.AddNew El mtodo AddNew crea un nuevo registro que puede editar y agregar al objeto Recordset. Este mtodo establece en los campos el valor Null (predeterminado para los objetos Recordset de tipo tabla) o los valores predeterminados, si existen. El registro creado queda en la memoria, y ah se puede modificar simplemente asignando a cada campo el valor deseado. Para asignar un valor a un campo simplemente tenemos que poner la expresin : MiRecordset ! MiCampo1 = Dato tipo string MiRecordset ! MiCampo2 = Dato tipo numrico Una vez que se hayan introducido los datos en el nuevo registro, debe utilizar el mtodo Update para guardar los cambios y agregarlo al conjunto de registros. No se modificar la base de datos hasta que se utilice el mtodo Update. La posicin del nuevo registro depende del tipo de objeto Recordset: En un objeto Recordset de tipo hoja de respuestas dinmica, los registros se insertan al final del conjunto, independientemente de las reglas de ordenacin que pueda haber en vigor al abrir el conjunto de registros. En un objeto Recordset de tipo tabla cuya propiedad Index est definida, los registros se agregan en el lugar correspondiente al orden. Si no se ha establecido la propiedad Index, los nuevos registros se agregan al final del conjunto. El registro que era actual antes de utilizar el mtodo AddNew contina sindolo despus. Esto puede comprobarlo asignando a un Label el contenido de un campo, aadir 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. Si desea hacer que el nuevo registro sea el actual, puede establecer en la propiedad Bookmark el marcador identificado por el valor de la propiedad LastModified. En la prctica anterior observar tras este proceso que se cambia el contenido del Label al nuevo valor. Vea la propiedad LastModified un poco mas adelante. Si queremos modificar el contenido de un registro ya existente en un Recordset, utilizaremos el Mtodo Edit :

Mtodo Edit Copia el registro actual de un objeto Recordset de tipo hoja de respuestas dinmica o tabla en el bfer de copia para su edicin. Sintaxis MiRecordset.Edit

Donde MiRecordset representa el nombre de un objeto Recordset abierto y actualizable que contiene el registro a editar. Una vez invocado el mtodo Edit, los cambios efectuados en los campos del registro actual se copian en el bfer de copia. Al terminar de realizar los cambios deseados, utilice el mtodo

Pgina 382

Update para guardarlos. Como en el caso del mtodo AddNew este registro modificado est en la memoria y es necesario introducirlo en la BD. El registro actual contina sindolo despus de utilizar Edit. Para poder usar Edit debe existir un registro actual. Si no es as o si MiRecordset no se refiere a un objeto Recordset de tipo tabla u hoja de respuestas dinmica, a un objeto Table o a un objeto Dynaset abierto, se producir un error. El uso de Edit producir un error en las condiciones siguientes: No hay registro actual. La base de datos o el conjunto de registros es de slo lectura. Ningn campo del registro es actualizable. Otro usuario ha abierto la base de datos o el conjunto de registros para uso exclusivo. Otro usuario ha bloqueado la pgina que contiene el registro. Una vez aadido el registro, o cambiados los datos de un registro, debemos utilizar el Mtodo Update para guardar los datos en la BD. Mtodo Update Guarda el contenido del bfer de copia en un objeto Recordset de tipo hoja de respuestas dinmica o tabla especificado. Es decir, mete en la Base de Datos el contenido del registro que estaba en la memoria, bien por haber utilizado el mtodo Update, bien por haber utilizado el mtodo Edit. Sintaxis MiRecordset.Update

Donde MiRecordset representa el nombre de un objeto Recordset de tipo hoja de respuestas dinmica o tabla, abierto y actualizable. Utilice Update para guardar el registro actual y los cambios que haya realizado en l. Los cambios en el registro actual se perdern en las siguientes situaciones: Uso del mtodo Edit o AddNew y desplazamiento a otro registro sin utilizar antes Update. Uso de Edit o AddNew y utilizacin de nuevo de Edit o AddNew sin especificar antes Update. Establecimiento de otro registro en la propiedad Bookmark. Cierre del conjunto de registros indicado en MiRecordset sin utilizar antes Update. Cada vez que se crea o edita un registro se cambia el valor de la propiedad LastModified, que tomar el marcador de ese registro creado o editado. Mtodo CancelUpdate Cancela todas las actualizaciones pendientes del objeto Recordset. Sintaxis recordset.CancelUpdateTipo

Tipo puede tomar los siguientes valores dbUpdateRegular dbUpdateBatch Comentarios Cancela los cambios pendientes que no estn en la memoria cach. Cancela los cambios pendientes en la memoria cache actualizada.

El mtodo CancelUpdate cancela todas las actualizaciones pendientes a causa de una operacin Edit o AddNew. La utilizacin del mtodo CancelUpdate tiene el mismo efecto que Pgina 383

moverse a otro registro sin utilizar el mtodo Update, salvo que el registro activo no cambia y algunas propiedades, como BOF y EOF, no se actualizan.

Mtodo Delete Este mtodo elimina el registro actual de un objeto Recordset de tipo hoja de respuestas dinmica o tabla. Para eliminar un registro, debe haber un registro actual en el Recordset antes de utilizar Delete, pues de lo contrario se producir un error interceptable. Una vez eliminado, este registro sigue siendo el registro actual. Puede observar, que si a continuacin de Delete utiliza AbsolutePosition para conocer en que registro est, la respuesta ser -1, prueba de que est sobre un registro inexistente. 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 vlido. Sintaxis MiRecordset.Bookmark [= valor] Donde MiRecordset es el nombre del Recordset, y valor es una expresin de cadena o expresin Variant cuyo resultado es un marcador vlido. (El tipo de datos es String o Variant). En un Recordset basado completamente en tablas del motor de base de datos Microsoft Jet, el valor de la propiedad Bookmarkable es True y pueden usarse marcadores. Sin embargo, otros productos de bases de datos pueden no aceptar los marcadores. Por ejemplo, no se pueden usar marcadores en un Recordset basado en una tabla anexa Paradox que no tiene clave principal. Cuando se abre o se crea un objeto Recordset, cada uno de sus registros tiene un marcador nico. El marcador del registro actual puede guardarse asignando el valor de la propiedad Bookmark a una variable. Para volver a dicho registro rpidamente despus de haberse movido a un registro diferente, establezca la propiedad Bookmark del objeto Recordset al valor de dicha variable. En Visual Basic versin 4.0, la propiedad Bookmark se almacena internamente como matriz de Byte. Por esta razn, si se intenta usar la propiedad Bookmark en una operacin de comparacin, se producir un error interceptable. Antes de tener acceso a la propiedad Bookmark, copie los valores de los marcadores a variables cadena y efecte las comparaciones usando dichas variables cadena. Por ejemplo, el siguiente cdigo compara marcadores en dos objetos Recordset: Dim Marca1 as String, Marca2 as String Dim Rs1 as Recordset, Rs2 as Recordset Set Rs1 = Db.OpenRecordset("Ttulos") Set Rs2 = Rs1.Clone() Marca1 = Rs1.Bookmark Marca2 = Rs2.Bookmark If Marca1 = Marca2 Then Print "Esta comparacin es vlida " No intente realizar la siguiente comparacin, aunque a primera vista parezca igual : If Rs1.Bookmark = Rs2.Bookmark Then ..... Porque dar error. No hay lmite en el nmero de marcadores que pueden establecerse. Para crear un marcador para otro registro distinto del registro actual, muvase al registro deseado y asigne el valor de la propiedad Bookmark a una variable String que identificar el registro.

Pgina 384

Para asegurarse de que el Recordset acepta marcadores, inspeccione el valor de su propiedad Bookmarkable antes de usar la propiedad Bookmark. Si Bookmarkable es False, el Recordset no acepta marcadores, y el uso de la propiedad Bookmark produce un error interceptable. Si la propiedad Bookmark se establece a un valor que corresponda a un registro eliminado, se produce un error interceptable. Para actualizar el contenido de un registro, vuelva a definir la propiedad Bookmark a s misma. (Sin embargo, esta tcnica, tambin cancela todas las operaciones pendientes invocadas por los mtodos Edit o AddNew). Por ejemplo: Rst.Bookmark = Rst.Bookmark El valor de la propiedad Bookmark no es igual que el nmero de un registro. !!!

Propiedad LastModified Devuelve un marcador que indica el registro ms recientemente agregado o modificado. Sintaxis NombreRecordset.LastModified

El valor devuelto por esta propiedad es un tipo de datos Variant o String. (Similar al devuelto por Bookmark) LastModified se puede usar para colocarse en el registro ms recientemente agregado o actualizado. Esta propiedad puede usarse para volver al ltimo registro que ha sido modificado. Basta para ello igualar la propiedad Bookmark a la propiedad LastModified : NombreRecordset.Bookmark = NombreRecordset.LastModified Mtodos MoveFirst, MoveLast, MoveNext, MovePrevious Se sitan en el primer, el ltimo, el siguiente o el anterior registro del objeto Recordset especificado y lo convierten en el registro actual. Sintaxis MiRecordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Puede utilizar los mtodos Move para desplazarse de un registro a otro sin aplicar una condicin. Al abrir el conjunto de registros indicado en Recordset, el primer registro pasa a ser el registro actual y en la propiedad BOF se establece False. Si el conjunto no contiene ningn registro, se establecer en BOF el valor True y no habr registro actual. Si el primer o el ltimo registro ya es el actual al utilizar MoveFirst o MoveLast, el registro actual no vara. Si utiliza MovePrevious cuando el registro actual sea el primero, en la propiedad BOF se establecer True y no habr registro actual. Si utiliza de nuevo MovePrevious, se producir un error y BOF continuar con el valor True. Si utiliza MoveNext cuando el registro actual sea el ltimo, en la propiedad EOF se establecer True y no habr registro actual. Si utiliza de nuevo MoveNext, se producir un error y EOF continuar con el valor True. Si Recordset hace referencia a un objeto Recordset de tipo tabla o a un objeto Table, el movimiento se har segn el ndice actual de la tabla. Para establecer el ndice actual puede usar la propiedad Index. Si no establece un ndice actual, el orden de los registros devueltos no estar definido.

Pgina 385

Si utiliza MoveLast en un objeto Recordset basado en una consulta SQL o QueryDef, se forzar la terminacin de la consulta, poblando completamente el objeto Recordset. No es posible utilizar los mtodos MoveFirst ni MovePrevious en los Recordset tipo snapshot de desplazamiento hacia delante. Para desplazar la posicin del registro actual en un objeto Recordset un nmero de registros determinado hacia adelante o hacia atrs, utilice el mtodo Move. Mtodo Move Desplaza la posicin del registro actual en un objeto Recordset. Sintaxis MiRecordset.Move filas[, inicio]

Donde : filas es un valor de tipo Long con signo que especifica el nmero de filas (de registros) que se desplaza la posicin. Si filas es mayor que 0, la posicin se desplaza hacia adelante (hacia el final del archivo). Si es menor que 0, la posicin se desplaza hacia atrs (hacia el principio del archivo). Inicio (opcional) es un valor de tipo String que identifica un marcador. Si se especifica inicio, el desplazamiento ser relativo al marcador indicado. Si se omite, Move comenzar por el registro actual. El marcador que debe utilizarse para definir el registro Inicio debe ser un Bookmark o similar (LastModified, por ejemplo) Si se especifica una posicin anterior al primer registro, la posicin del registro actual se situar al principio del archivo (BOF). Si se especifica una posicin posterior al ltimo registro, la posicin del registro actual se situar al final del archivo (EOF). Si el objeto Recordset no contiene registros y el valor de su propiedad BOF es True, el uso de este mtodo para desplazarse hacia atrs producir un error interceptable en tiempo de ejecucin. Lo mismo ocurrir si el valor de la propiedad EOF es True y pretende desplazarse hacia adelante. Si las propiedades BOF o EOF tienen el valor True y se intenta usar el mtodo Move sin un marcador vlido, se generar un error interceptable. Si el objeto Recordset est basado en una consulta, la operacin forzar la ejecucin de la consulta en el nmero de filas especificado..

Mtodos FindFirst, FindLast, FindNext, FindPrevious Buscan el primer, el ltimo, el siguiente o el anterior registro de un objeto Recordset de tipo instantnea u hoja de respuestas dinmica, que satisfaga el criterio especificado y lo convierte en el registro actual. Sintaxis MiRecordset.{FindFirst | FindLast | FindNext | FindPrevious} criterio

MiRecordset es el nombre de un objeto Recordset. Criterio es una expresin de cadena (como la clusula WHERE de una instruccin SQL, sin la palabra WHERE) que se utiliza para buscar un registro. Si no se encuentra ningn registro que satisfaga el criterio, 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 Recordset contiene ms de un registro que satisfaga el criterio, FindFirst hallar el primero de ellos, FindNext el siguiente y as sucesivamente. Compruebe siempre el valor de la propiedad NoMatch para determinar si la operacin de bsqueda ha tenido xito. Si la bsqueda ha tenido xito, NoMatch se establece a False. Si ha Pgina 386

fracasado, NoMatch se establece a True y el registro actual pasa a ser el primero del objeto Recordset. Por ejemplo: Dim Estabaaqui as String Estabaaqui = Recordset.Bookmark Recordset.FindFirst "Nombre = 'Luis' " ' Busca un nombre. Recuerde siempre las comillas dobles para la expresin de bsqueda y las comillas simples si se trata de un dato string. If Recordset.NoMatch Then Recordset.Bookmark = Estabaaqui ' Se ha encontrado? ' Si no se ha encontrado, vuelve al que era el registro actual. ' S se ha encontrado.

Else . . Aqu las instrucciones adecuadas End If

No es posible utilizar estos mtodos en un objeto Recordset de tipo snapshot de desplazamiento hacia delante. Al buscar campos que contengan fechas, deber utilizar el formato de fecha de los Estados Unidos (mes-da-ao), incluso cuando no utilice la versin para este pas del motor de base de datos Jet, pues de lo contrario es posible que no se encuentren los datos buscados. Puede utilizar la funcin Format para convertir la fecha. Por ejemplo: Mirecordset.FindFirst "fecha > #" & Format(mifecha, 'm/d/yy' ) & "#" Observe que las fechas, aparte de ponerlas en americano, hay que presentarlas entre almohadillas (#). Observe lo dicho mas atrs para las comillas dobles en la expresin de bsqueda. De cualquier forma, cuando vaya a buscar registros por fechas, comparar fechas o hallar diferencias de tiempo, rmese de mucha paciencia. No se desanime si no le sale a la primera.

Mtodo Clone En muchas ocasiones es necesario crear un Recordset que sea copia exacta de otro. Las ocasiones en las que es necesario hacer esto pueden ser variadas, pero vamos a destacar una : crear un Recordset idntico al Recordset de un control Data, para trabajarlo con cdigo durante una parte de la ejecucin del programa. Otras aplicaciones pueden ser copiar el Recordset de otra mquina a travs de la Red de Area Local, ... y donde podamos llegar con nuestra imaginacin. La sintaxis de Clone es la siguiente : Crea un objeto Recordset duplicado referido al objeto original. Tambin puede utilizar el mtodo Clone con los antiguos objetos Dynaset, Snapshot y Table. Sintaxis Set Duplicado = Original.Clone( )

Donde Duplicado es una variable tipo Recordset, y Original es el Recordset que se va a duplicar.

Pgina 387

Con el mtodo Clone puede crear mltiples Recordsets. Cada uno de ellos puede tener su propio registro actual. El uso de Clone no modifica los datos de los registros. Puede modificar un registro desde cualquier Recordset, bien desde el que sirvi de original, bien desde cualquiera de sus copias, pero debe hacerlo invocando los mtodos Edit - Update. Puede compartir marcadores entre dos o ms Recordsets creados de esta forma. Puede utilizar el mtodo Clone cuando desee realizar en un conjunto de registros una operacin que requiera varios registros actuales. Este mtodo es ms rpido y eficiente que crear un nuevo Recordset. Inicialmente, un Recordset creado con Clone carece de registro actual. Para hacer que un registro sea el actual antes de utilizar el Recordset copia, puede utilizar cualquiera de los mtodos Move, Find o Seek (solo para Recordsets tipo Tabla), o establecer su propiedad Bookmark El hecho de cerrar el Recordset original no afecta al duplicado y viceversa. Nota No es posible utilizar este mtodo con snapshots de desplazamiento hacia delante (objetos Recordset de tipo instantnea con la opcin dbForwardOnly activada). Ejemplo de Clone Cuando tenemos un control Data que maneja un campo Fecha, si queremos cambiar el dato de la fecha no tendremos problemas. Pero si lo que queremos es quitar la fecha, es decir, poner ese campo con el valor Null, el control Data no nos dejar. Ello sucede porque Null no es una fecha vlida, y si lo intentamos nos dar Error de Conversin de Datos Para poder anular ese dato de fecha vamos a crear un Recordset idntico al del control data mediante Clone. En ese nuevo Recordset s podemos poner ese campo fecha a Null. Lo cambiamos, y una vez cambiado hacemos que el Recordset del control data sea igual al Recordset ya modificado. Dim CopiaDelRecordset as Recordset DAO Dim Pepe as string 'declaramos el nombre del nuevo objeto 'declaramos una variable tipo string para llevar a ella el registro actual del C. Data 'Hacemos un Recordset idntico

Pepe=Data1.Recordset.Bookmark Set CopiaDelRecordset =Data1.Recordset.Clone

'ya est creado el Recordset clnico. Hacemos que su registro actual sea el mismo que el del control Data CopiaDelRecordset.Bookmark = Pepe 'Ahora editamos el nuevo Recordset y le metemos el valor Null el campo fecha. CopiaDelRecordset.Edit CopiaDelRecordset!CampodeLaFecha = Null CopiaDelRecordset.Update 'Ya tenemos el dato Null en el Recordset copia del original. Ahora solo hay que ponerlo 'como Recordset del control Data Set Data1.Recordse t= CopiaDelRecordset 'Se le da un Refresh al control Data para que refresque todos sus controles asociados Data1.Refresh ' ahora cerramos el Recordset creado. CopiaDelRecordset.Close Y mediante este pequeo truco podemos hacer que un campo fecha se ponga a Null. No es el nico truco para conseguirlo.

Pgina 388

Mtodo Requery
El mtodo Requery actualiza los datos de un objeto Recordset, volviendo a ejecutar la consulta con la que se ha creado ese Recordset. Este mtodo debe usarse cada vez que se sospeche que los datos de la Base de datos han cambiado, y se quieran presentar los datos actualizados. Es un mtodo tpico de una BD que se est usando desde varios puestos a travs de una Red de Area Local. Sintaxis NombreRecordset.Requery [NuevoQueryDef]

Donde NombreRecordset es el nombre del Recordset, y NuevoQueryDef (opcional) es una consulta almacenada No es posible utilizar el mtodo Requery en objetos Recordset tipo Snapshot o en los Dynaset que tengan la propiedad Restartable a False, ni tampoco en los objetos Recordset de tipo Tabla. Si los valores de las propiedades BOF y EOF del objeto Recordset son ambos True despus de utilizar el mtodo Requery, la consulta no habr devuelto ningn registro y el objeto Recordset no contendr datos.

Mtodos BeginTrans, CommitTrans y Rollback


Estos mtodos son mtodos del Objeto Workspace Veamos estos tres mtodos que, dadas sus funciones, deben estudiarse conjuntamente. Supongamos un Banco. Debe hacer una transferencia entre dos cuentas corrientes que estn en la misma base de datos. La operacin es sencilla : Busca la cuenta origen y crea un nuevo registro. Apunta en el campo OPERACIN una T de Transferencia, en el campo IMPORTE apunta el valor del dinero a transferir, y en el campo SALDO pone la diferencia entre lo que haba en ese campo en la ltima operacin, menos el importe del dinero transferido. A continuacin hace un proceso similar con la cuenta destino, pero en este caso, sumndole el importe de la transferencia. No hay problemas. Pero que pasa si, una vez sacado el dinero de la cuenta destino, no se puede ingresar en la cuenta destino, por la razn que sea (cuenta bloqueada, no existe esa cuenta, fallo de la red de rea local) Obviamente la operacin no se ha completado, y hay que devolver el dinero a la cuenta origen. Podra hacerse un apunte, metiendo la misma cantidad de dinero que se ha extrado anteriormente, y su saldo no se ver afectado. Pero no s lo que pensara el cliente cuando vea un estadillo de su cuenta, en la que le han sacado una cantidad de dinero, aunque en el siguiente apunte se lo hayan vuelto a introducir. Para evitar estas situaciones usamos estos mtodos. Con el mtodo BeginTrans iniciamos lo que se llama una Transaccin. Con CommitTrans terminamos la transaccin y se guardan los cambios realizados (En ambas cuentas a la vez, en el caso del ejemplo). Con Rollback se termina la transaccin sin llegar a guardar los cambios, quedando el Objeto Workspace afectado por las operaciones internas a esa transaccin tal y como estaba antes de comenzar dicha transaccin. Dado que una transaccin pertenece a un Workspace, deberemos aplicar estos mtodos al Workspace que ese usuario tenga abierto. Es decir, en un sistema con varios usuarios que estn trabajando simultneamente sobre una Base de Datos, un determinado usuario deber entrar con un Workspace propio (una sesin de trabajo solo para l). En estas condiciones podemos crear una transaccin. Sintaxis MiSesin.BeginTrans MiSesin.CommitTrans MiSesin.Rollback Pgina 389

Puede usar estos mtodos con un objeto Database, pero no es recomendable, ya que han quedado obsoletos (y posiblemente no le funcione en versiones nuevas del motor de Bases de Datos) para los objetos Database. MiBase.BeginTrans MiBase.CommitTrans MiBase.Rollback

Dentro de un objeto Workspace, las transacciones son siempre globales y no se limitan slo a la base de datos o al conjunto de registros. Si realiza operaciones en ms de una base de datos o conjunto de registros durante una transaccin en un objeto Workspace, el mtodo Rollback deshar todas las operaciones en todos ellos. Quiere esto decir que una transaccin debe iniciarse al comenzar una determinada operacin, realizar esa operacin sin realizar ninguna otra durante ese tiempo, terminar la operacin y finalizar la transaccin, bien con CommitTrans o con Rollback. Si desea tener transacciones simultneas, lo mas indicado es crear varios objetos Workspace para usar uno con cada transaccin. Puede anidar transacciones. Es posible tener hasta cinco niveles de transacciones abiertos a un tiempo en un mismo objeto Workspace utilizando mltiples combinaciones anidadas de BeginTrans y CommitTrans o Rollback. En este caso, el orden de finalizacin de una transaccin debe ser siempre de menor a mayor nivel jerrquico, es decir, se deber cerrar primero la transaccin que est mas interior dentro del anidamiento, y as sucesivamente. Si cierra una transaccin anidada mediante CommitTrans, y posteriormente cierra una transaccin que abarque a esta ltima con Rollback, los cambios de la primera transaccin NO quedarn guardados. (Cuando se utilizan bases de datos SQL ODBC externas no es posible anidar las transacciones). Si cierra un objeto Workspace sin guardar o deshacer las transacciones pendientes, stas se desharn automticamente. Algunas bases de datos pueden no admitir las transacciones. En este caso la propiedad Transactions del objeto Database o Recordset tendr el valor False. Lea detenidamente la Ayuda de estos mtodos antes de trabajar con ellos. El hecho de usar transacciones, aparte de lo que significa para asegurar la integridad de los datos, ahorra accesos al disco (Importantsimo en algunas redes LAN y WAN), ya que los cambios a introducir se van almacenando en un bfer en la memoria, y se vuelcan al disco solamente en el momento de terminar la transaccin de modo afirmativo con CommitTrans.

Pgina 390

Mantenimiento y Copia de Bases de Datos.


Vamos a ver dos mtodos del Objeto DBEngine para el mantenimiento y copia de Bases de Datos ACCESS. En una Base de Datos ACCESS, cuando borramos un dato en realidad no lo estamos borrando, sino marcndolo como borrado. (No intente recuperar un dato marcado y no borrado porque no se puede.) Por lo tanto, ver que tras sucesivas operaciones de escritura / borrado en una BD, esta va aumentando su tamao. Se necesita un mtodo que limpie todos los datos inservibles de la BD para disminuir su tamao. Este mtodo tambin deber reorganizar los ndices y marcadores internos a esa BD. El objeto DAO que debe hacer estas cosas es el Motor de Bases de Datos. Es decir, el Objeto DBEngine. Los mtodos son CompactDatabase, que hace una copia de la base de datos (no borra la BD original) sin copiar los datos intiles, y RepairDatabase, 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, metemos datos burlando los elementos de proteccin de la BD,....

Mtodo CompactDatabase
Copia, compacta y da la opcin de modificar la versin, el orden de intercalado y la codificacin de una base de datos cerrada. Sintaxis DBEngine.CompactDatabase BaseDatosAnt, BaseDatosNva [, inf_local [, opciones]] BaseDatosAnt es el nombre del fichero de la base de datos a compactar. Debe expresar el Path completo y el nombre del fichero (C :\MiCarpeta\MiBase.MDB) Si el nombre de archivo tiene extensin, deber especificarla. Si la red lo admite, tambin puede especificar una ruta de red, como por ejemplo "\\MISERVID\MIDIR\MiBase.MDB". BaseDatosNva es el nombre del fichero (con su Path completo) de la base de datos nueva, creada al copiar la BaseDatosAnt, ya compactada. No es posible especificar en el argumento BaseDatosNva el mismo archivo de base de datos que en BaseDatosAnt. inf_local es una expresin de cadena utilizada para especificar el alfabeto usado a la hora de ordenar datos de esa Base de Datos. El parmetro a introducir es el mismo que para el argumento similar usado en la creacin de la Base de Datos (dbLangGeneral para el caso de Espaa). Este argumento es opcional. Si se omite, la informacin local de BaseDatosNva ser la misma que la de BaseDatosAnt. Opciones nos permite cambiar alguna caracterstica de la Base de Datos. Puede elegirse entre cifrarla o no cifrarla y cambiar la versin del motor de bases de datos que va a usar la nueva Base de Datos. dbEncrypt dbDecrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Codifica la base de datos durante la compactacin. Descodifica la base de datos durante la compactacin. Crea una base de datos que utiliza la versin 1.0 del motor Jet Crea una base de datos que utiliza la versin 1.1 del motor Jet Crea una base de datos que utiliza la versin 2.5 del motor Jet Crea una base de datos que utiliza la versin 3.0 del motor Jet

Se puede usar una constante (solamente) de encriptacin y una (solamente) de Versin. Slo se puede compactar BaseDatosNva con una versin igual o posterior a la de BaseDatosAnt. Lea detenidamente la ayuda en lnea de este Mtodo.

Pgina 391

Mtodo RepairDatabase
Intenta reparar una base de datos daada que accede al motor de base de datos Microsoft Jet. Sintaxis DBEngine.RepairDatabase NombreBase

Donde NombreBase es el nombre (Y path) del fichero que contiene la Base de Datos a reparar. Puede especificar una ruta de red. P.e. : "\\MISERVID\ MIDIR\NombreBase.MDB". Para poder reparar la base debe estar Cerrada. Recuerde, si est en un entorno multiusuario, que los dems usuarios tampoco pueden tenerla abierta mientras la repara. El mtodo RepairDatabase tambin intenta validar todas las tablas del sistema y todos los ndices. Los datos que no puedan repararse se pierden. Si la base de datos no puede repararse, se producir un error interceptable. Sugerencia Despus de reparar una base de datos, es aconsejable compactarla con el mtodo CompactDatabase para desfragmentar el archivo y recuperar espacio en disco.

METODOS DEL OBJETO DataBase Mtodo Execute


Este Mtodo es para el Objeto DataBase y para el Objeto QueryDef. Ejecuta una consulta de acciones o una instruccin SQL en el objeto Database especificado. Sintaxis Para un objeto DataBase NombreBD.Execute origen[, opciones]

Donde NombreBD es el nombre del objeto DataBase Origen es una instruccin SQL Opciones es un entero o constante que determina las caractersticas de integridad de datos de la consulta, segn se especifica mas adelante.

Para un objeto QueryDef

NombreQuerydef.Execute [opciones]

Donde NombreQuerydef es el nombre del objeto QueryDef cuya propiedad SQL especifica la instruccin SQL a ejecutar. Opciones igual que para el Objeto Database. En opciones puede utilizar las siguientes constantes: dbDenyWrite dbInconsistent dbConsistent dbSQLPassThrough dbFailOnError dbSeeChanges Deniega el permiso de escritura a los dems usuarios. (Predeterminado) Actualizaciones inconsistentes. Actualizaciones consistentes. Paso a travs de SQL. Hace que se pase la instruccin SQL a una base de datos ODBC para su procesamiento. Deshace las actualizaciones en caso de error. Genera un error en tiempo de ejecucin si otro usuario modifica los datos que se estn editando.

El mtodo Execute slo es vlido para las consultas de acciones. Si utiliza Execute con otro tipo de consultas, se producir un error. Debido a que las consultas de acciones no devuelven registros, Execute no devuelve un conjunto de registros.

Pgina 392

Ejemplo. En el siguiente ejemplo, usamos EXECUTE para cambiar el campo Nombre en una tabla llamada CLIENTES de una Base de Datos abierta, cuyo Objeto DataBase se llama BaseDatos. Para poder jugar con el nombre a cambiar y el nombre cambiado, se introduce el nombre que queremos cambiar en TBNombre2 y el nuevo nombre en TBNombre1 Dim RegistrosCambiados As Long Dim MiSQL As String MiSQL = "UPDATE CLIENTES SET NOMBRE = '" & TBNombre2 & "' WHERE NOMBRE= '" & TBNombre1 & "'" BaseDatos.Execute MiSQL, dbFailOnError RegistrosCambiados = BaseDatos.RecordsAffected MsgBox RegistrosCambiados Dada una instruccin SQL sintcticamente correcta y teniendo los permisos adecuados, el mtodo Execute no fallar, an cuando no pueda modificarse ni eliminarse una lnea. Por lo tanto, debe especificar siempre la opcin dbFailOnError cuando utilice el mtodo Execute para ejecutar una consulta de actualizacin o eliminacin. Esta opcin 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.

Propiedad RecordsAffected
Para determinar el nmero de registros afectado por el ltimo mtodo Execute, puede utilizar la propiedad RecordsAffected del objeto Database o Querydef. Por ejemplo, RecordsAffected contienen el nmero de registros eliminados, actualizados o insertados al ejecutar una consulta de acciones. Al utilizar el mtodo Execute para ejecutar un objeto Querydef, en la propiedad RecordsAffected del Querydef se establece el nmero de registros afectados. Para obtener el mejor rendimiento, especialmente en un entorno multiusuario, puede anidar el mtodo Execute dentro de una transaccin: Utilice el mtodo BeginTrans en el objeto Workspace actual, use luego el mtodo Execute y complete la transaccin con el mtodo CommitTrans en el objeto Workspace. De esta forma se guardarn los cambios en el disco y se liberarn los bloqueos que se hayan podido producir durante la ejecucin de la consulta.

IMGENES EN UNA BASE DE DATOS ACCESS

Una imagen (la fotografa de una persona por ejemplo) puede guardarse en una base de datos tipo ACCESS y presentarse en un control Picture. Imagine una aplicacin que sea una agenda de telfonos y pueda insertar la foto de la persona !! Para introducir una imagen en una BD, el campo de esa BD donde se va a introducir la imagen debe ser LongBinary ( si esa versin de ACCESS lo tiene) u Objeto OLE. Introducir y presentar un bit-map en una base de datos es necesario hacerlo mediante un Control Data. Un bit-map puede presentarse en un control Picture o en un control Image. Ambos son controles enlazados a datos. Si introducimos un Control Data y un Control Picture o Control Image en el Formulario, asociamos el Control Data a la Base de Datos, y el campo que contiene el grfico a el Control Picture (o Control Image) mediante sus propiedades DataSource = Nombre del Control data, DataField = Nombre del Campo, tenemos el problema resuelto. Para meter un grfico en la BD basta con introducir ese grfico en el Picture (o Image) mediante LoadPicture, por ejemplo, y guardar los datos en la BD, bien cambiando el registro actual del Control data, bien mediante el mtodo UpdateRecord de dicho Control Data.

Pgina 393

La asociacin de la Base de datos al Control Data puede hacerse, bien mediante sus propiedades DatabaseName y RecordSource, bien creando un Recordset con cdigo e igualando la propiedad Recordset del Control Data a ese Recordset. Es posible que se pueda introducir y presentar un bit-map en un control Picture o Image de otra forma, sin usar el control Data. Eso s, complicando el cdigo. No merece la pena liarse con esto. Lo mismo que decamos que necesitamos un Control Data cuando vamos a usar un DBGrid, debemos usar un Control Data cuando vayamos a presentar una imagen. FIN del captulo 20 de VISUAL BASIC - Gua del Estudiante. Copyright Luis Surez Bernaldo 1998. Este texto es de libre difusin para fines educativos. Prohibida la copia total o parcial para usos comerciales. San Sebastin de los Reyes (Madrid, Espaa) , Junio de 1998

Pgina 394

Vous aimerez peut-être aussi