Capitulo 10 Visual Basic
Capitulo 10 Visual Basic
Capitulo 10 Visual Basic
10
Procedimientos y funciones en VB
CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS - EL OBJETO ERROR
LA AYUDA DE WINDOWS
Procedimientos
Un Procedimiento en Visual Basic es un trozo de código que realiza una determinada tarea. Un
procedimiento es el código que asociamos a un evento de un control (CommandButton_Click,
Form_Load, ...). Un control puede tener por lo tanto, muchos procedimientos asociados. Uno a
cada uno de sus eventos.
Si queremos realizar una determinada tarea en un programa, y esta tarea se repite muchas
veces en ese programa, podemos, por ejemplo, repetir el código tantas veces como sea
necesario en los puntos del programa que así lo pidan. Esto nos llevaría a escribir líneas y
líneas repetidas en nuestras aplicaciones, con el consiguiente incremento de trabajo y del
volumen de la aplicación.
Podemos hacer otra cosa mas práctica y elegante. Escribir ese código una sola vez, creando
con él un Procedimiento. Este Procedimiento tendrá un nombre, y cada vez que queramos que
se ejecute ese código bastará con nombrar por ese nombre al Procedimiento.
En esta ventana debe teclear el nombre que quiere dar al Procedimiento. En tipo debe elegir la
opción Procedimiento (Veremos mas adelante la Función y en otro capítulo las opciones
Propiedad y Evento) y en el Ambito debe elegir Public o Private dependiendo del ámbito que
quiera darle :
NombreProcedimiento
Modulo1.NombreProcedimiento
Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre.
Desde otro Formulario o Módulo, hay que citarlo mediante el nombre del Formulario donde
está insertado, seguido del nombre del procedimiento, separados por un punto.
Private. Si elige este ámbito, sólo se podrá acceder a ese Procedimiento desde el Formulario
o Módulo donde se haya insertado.
La caja de opción (Check) que pone Todas las variables locales como estáticas nos va a
poner todas las variables declaradas dentro del procedimiento como estáticas (No ponen a
cero o nulo su valor cuando salimos y volvemos a entrar en ese procedimiento). Puede
ahorrarnos un poco de código.
Para llamar a un procedimiento desde cualquier parte del código basta con escribir en una
línea el nombre del procedimiento.
fpublico
Call fpublico
No hace falta poner Call, aunque Visual Basic lo admite. Algunos programadores me dicen que
al poner Call, siempre se enteran mejor de que están llamando a un procedimiento. Me parece
muy bien, y creo que es una buena razón. Pero no existe otra razón para ello.
Los datos que se puedan generar en un procedimiento debe extraerlos de ese procedimiento
mediante variables. Verá que con las funciones es distinto.
RutErr:
End Sub
Esto puede producirse serios problemas a la hora de depurar su programa. Para evitar que
suceda eso, y que se pare la ejecución del programa en la línea del procedimiento
Calcula_Dietas en la que se produjo el error, inicie este procedimiento con una instrucción que
anule la condición de tratamiento de errores:
Funciones
Una función es una forma especial de realizar un procedimiento. En realidad es un
procedimiento al que le pasamos una o varios parámetros con los que realizará una operación
(cualquier operación, no tiene porqué ser matemática) y obtendrá un resultado de esos
parámetros. Este resultado puede leerse desde otra parte de la aplicación en una variable que
tienen el mismo nombre que la función. La forma de obtener los datos de la función es llamar
directamente a esa función, como verá un poco más adelante.
Para insertar una Función se procede de igual forma que para un Procedimiento, pero
marcando el botón de opción Tipo Función en la caja de diálogo de la figura anterior.
Para llamar a una Función son válidos igualmente los criterios expuestos para los
Procedimientos en cuanto a la sentencia Call.
Se dijo anteriormente que a una Función se le pasan uno o varios parámetros con los que va a
realizar alguna operación. Al declarar la Función, hay que decirle el nombre de los parámetros
que se le van a pasar, de que tipo son (String, Integer, Boolean, ...) y cómo se le van a pasar
(ByVal, ByRef, ParamArray). Esto hay que introducírselo en la propia declaración
End Function
Una función siempre da un resultado. Este resultado se le introduce en una variable que tiene
el mismo nombre que la función. Esta variable no hace falta declararla, ya que la declaración
de la función lleva implícito que exista una variable con ese nombre.
Imaginemos que lo que va a hacer la función de este ejemplo es tomar una cadena de
caracteres (Variable1) y obtener de ella otra cadena con los caracteres iniciales de la primera,
tantos caracteres como nos indique la segunda variable (Variable2)
Ya se habrá dado cuenta de que debemos emplear Left para obtener los caracteres iniciales
de una cadena. Nuestra función quedará de la forma :
(Observe que hemos añadido la expresión As String al final de la declaración. Esto quiere
significa que le estamos diciendo a la función que su resultado es un String,)
Donde MiFuncion es una variable que se ve en todo el ámbito de la función. Para llamar a la
función, basta con citarla por su nombre y ponerle los parámetros necesarios. Cuando esté
tecleando el código, Visual Basic le invitará a introducir los parámetros citándole su nombre.
(En nuestro ejemplo, ByVal Variable1 as String, ByVal Variable2 as Integer
Pruebe esto con una pequeña aplicación. En un formulario, ponga un TextBox (Text1) donde
va a introducir la cadena original, otro TextBox donde va a introducir el número de caracteres a
tomar, y un Label (Label1) donde va a ver el resultado. Ponga un Botón de comando
(Command1) donde llamará a la función. Inserte una función (MiFuncion) en ese formulario :
Puede pensar que para hacer esta cosa tan elemental no merece la pena hacer una función.
Efectivamente. Bastaría con poner en el botón Command1_Click el siguiente código :
Hemos visto que los parámetros de la función pueden pasarse Por Valor (ByVal), caso del
ejemplo anterior, y Por Referencia (ByRef). ¿Cuál es la diferencia ? La diferencia es que si
le pasa un valor por valor (ByVal) ese valor, aunque lo cambie la función internamente, ese
cambio no se manifiesta fuera de ella. Si se pasa por referencia (ByRef), y la función cambia
el valor de esa variable, ese cambio se mantiene fuera de la función.
Veamos esto de una forma muy sencilla : Vamos a hacer una función que multiplica dos
números. Pero dentro de la función vamos a cambiar uno de esos números, sumándole 2. Una
vez realizada la operación 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.
Las dos funciones son idénticas, excepto en la forma de pasarle los parámetros. Pongamos un
Botón 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
función en sendos Label. Cuando se usa MultiplicaA el valor de X1 (pepe en el
CommandButton) se mantiene. En MultiplicaB cambia al valor pepe+2
Tras esto, se pone en Label2 el valor pepe + 2 (se mantienen el cambio realizado en la
función MultiplicaB x1 = x1 + 2
No queda ahí la cosa. Un valor puede pasarse también 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
Se pueden pasar uno o mas parámetros como Optional. Las condiciones para los parámetros
opcionales es que ocupen los últimos lugares y que sean del tipo Variant
Los parámetros los tomamos de tres TextBox (TB1, TB2 y TB3, siendo este último el que es
opcional. En un botón de comando ponemos este código :
Se puede salir de una función antes de que termine. Por ejemplo, si se cumple una
determinada condición, se puede salir de la función mediante la sentencia Exit Function
Una vez que conocemos gran parte del Visual Basic, y que seguramente habremos hecho
alguna aplicación, 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 afirmación carece de sentido o que al menos es una afirmación gratuita. Sin
embargo es un defecto muy común entre programadores noveles, quizás por la alegría que da
el trabajo terminado, olvidarse de algo tan fundamental como la calidad del programa, y
perder por ello la alegría que da el trabajo bien hecho.
Corrección de Errores.
Denominamos Corrección de errores al proceso de la programación en la que se analizan y
corrigen los errores existentes en el código o en el funcionamiento del programa.
Podemos por tanto dividir los errores en errores de código y errores de funcionamiento.
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 código. En este caso, Visual Basic
nos dará el mensaje de error “Error de Sintaxis” nada mas terminar de escribir la línea. Errores
como este, o el típico If sin End If seguro que se los ha encontrado repetidas veces y no
vamos a ahondar mas en ellos. Se corrige el error sintáctico en el momento y el problema
queda resuelto. Pero volvamos a la línea de código anterior, esta vez ya bien escrita:
Al estar escrita correctamente, esta línea no nos puede dar error de sintaxis. Pero, ¿Que
ocurre cuando estamos ejecutando el programa que contiene esa línea, y en el momento de
ejecutarla no tenemos metido un disquete en la unidad A:? O piense lo que ocurriría si
tenemos un disquete en A:, pero no existe en él el fichero MiFicher.Txt. No existe ningún error
de sintaxis. El programa puede funcionar correctamente si, en el momento de la ejecución de
esa línea, 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.
Existen dos tipos de errores de ejecución: 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
ello dejan de ocurrir estos errores. ¿Recuerda la frase “El programa xxx ha causado un error
de protección general en el Módulo..... “ Bueno, acaba de producir un error No Interceptable.
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, más
normal de lo que parece, ni lo detecta VB ni produce una caída 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 código, línea a línea, está
perfectamente escrito.
Vemos por tanto que VB solamente nos ayudará en los errores de sintaxis, durante el tiempo
de diseño, y los errores interceptables en tiempo de ejecución.
Errores Interceptables.
Los errores interceptables pueden producirse cuando está ejecutando una aplicación, tanto
en el entorno de Visual Basic como en modo autónomo. Algunos de estos errores pueden
ocurrir también en tiempo de diseño o en durante la compilación.
Un error interceptable es, como decíamos anteriormente, un error que Visual Basic conoce.
Para conocerlos, VB dispone de un objeto que vamos a ver a continuación. El Objeto Error
Objeto Error
Contiene información sobre errores en tiempo de ejecución.
El Objeto Error tiene Propiedades y Métodos. Las propiedades del objeto Error las establece
quien genera el error. Por ejemplo, si el error se genera durante la ejecución, será VB quien
genera las propiedades del objeto Error. Pero puede ser también el programador quien genere
el error. Lo veremos mas adelante
Propiedad Description
Devuelve o establece una cadena descriptiva asociada a un error.
Propiedad HelpContext
Propiedad HelpFile
Devuelve o establece la ruta completa del archivo de Ayuda de Microsoft Windows que debe
mostrarse al producirse el error.
Variable = Err.HelpFile
Propiedad LastDLLError
Devuelve un código de error de sistema producido por una llamada a una biblioteca de
vínculos dinámicos (DLL). Esto ocurre cuando falla la ejecución de una función API.
Propiedad Number
Esta es la propiedad mas importante del Objeto Error. Por ello es la propiedad predeterminada.
Permite conocer el número del error producido. También nos permite establecer el número de
error, cuando nos interesa provocar un error mediante código, con el método Raise
Variable = Err
Source
Método Clear
Borra los valores de todas las propiedades del objeto Err.
Sintaxis Err.Clear
Puede utilizar Clear para borrar explícitamente el objeto Err una vez que se ha tratado un
error. Visual Basic llama al método Clear automáticamente siempre que se ejecuta alguna de
las instrucciones siguientes:
De aquí se desprende que un error no “sale” del procedimiento en el que se generó. Para salir
de un procedimiento el programa debe pasar necesariamente por una instrucción Exit Sub. En
ese momento, desaparecen todas las propiedades del Objeto Error.
Método Raise
Genera un error en tiempo de ejecución.
Número Requerido. Entero de tipo Long que identifica la naturaleza del error.
Origen Opcional. Expresión de cadena que indica el objeto o aplicación que ha generado
originariamente el error.
Descripción Opcional. Expresión de cadena que describe el error.
ArchivoAyuda Opcional. Ruta del archivo de Ayuda de Microsoft Windows en el que se
encuentra la información sobre el error.
ContextoAyuda Opcional. Identificador de contexto que especifica el tema del archivo
indicado en ArchivoAyuda que contiene la información de ayuda del error.
Todos los argumentos son opcionales, excepto Número. 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 conservarán para el error actual.
Decíamos al principio del Objeto Error que sus propiedades las establece quien las generó.
Con el Método Raise se genera un error. Y vea que se pueden establecer sus propiedades.
RutinaErrores:
El nombre de la rutina debe ocupar él solo una línea. Se accede directamente a la rutina
cuando citamos su nombre en el código del procedimiento donde está la Rutina.
La rutina es en realidad un trozo de código del procedimiento que se ejecutará, bien porque
hayamos dirigido allí la ejecución del programa (mediante GoTo) o bien porque el programa
pase por la rutina al ejecutarse. Observe el Exit Sub que tiene en la línea inmediatamente
anterior a la Rutina. 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 condición para que pasase por la rutina era que se cumpliese una
determinada condición en Text1. Para que pase por una rutina, al darse la condición de que ha
ocurrido un error, usaremos la instrucción On Error GoTo
Rutina:
MsgBox "Sí pasó por la Rutina"
End Sub
Cuando insertamos la línea On Error GoTo Rutina, el programa sabe que nada mas
producirse un error, debe ir a la rutina señalada. En esa rutina tomaremos las medidas
adecuadas para que se subsane el error producido. Así por ejemplo, si en una línea 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 corrección de errores debe contemplar cada uno de esos dos casos, y actuar de
forma distinta en uno y en otro.
Si estuviese metido el disco, pero no tuviera un fichero llamado Mificher.Txt, daría este error:
En realidad estos errores no son de programa, sino de una utilización incorrecta del programa,
ya que debería estar metido el disco, y que contuviese un fichero llamado Mificher.Txt. Pero
en programación hay que prever estas eventualidades. Y lo lógico sería poner un aviso
diciéndole al usuario que la unidad A: no está preparada (caso 1) o que el disco no contiene el
fichero buscado (caso 2)
Instrucción Resume
Hemos visto en el apartado anterior la sentencia On Error Resume Next, de la que decíamos
que “pasaba” del error y continúa en la línea siguiente a la que provocó el error. Es así ya que
la Instrucción Resume hace desaparecer el error mediante código (Pone Err.Numbber = 0). Si
le añadimos Next el programa sigue ejecutándose en la línea siguiente a la que generó el
error.
La Instrucción Resume puede tener las siguientes sintaxis:
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 detección de errores e introduzcamos una rutina que detecte el error ocurrido y
que haga lo que tenga que hacer en cada caso:
RutinaErrores:
If Err.Number = 71 Then ‘No hace falta poner Err.Number. Basta con Err
MsgBox "La Unidad A no tiene ningún disco. Introduzca uno"
Resume ‘Al poner Resume (sin mas) el programa seguirá ejecutándose
‘en la misma línea que provocó el error. Como hemos
‘intercalado un MsgBox, que lleva implícita una espera a que
se ‘le haga click en su botón, durante esa espera el usuario puede
‘cambiar el disco y al reiniciarse el programa en esa
línea, ya ‘puede tener un disco para que no se repita el
error.
End If
En esta ventana podemos presentar otro tipo de datos, por ejemplo el valor de una variable en
un determinado momento:
Si queremos que cuando se produzca un error se nos presente en esa ventana, basta con
insertar esta línea de código en la Rutina de Error:
Hemos visto la forma de detectar un error y tomar las medidas oportunas para que el
programa siga funcionando. Aquí lo hemos hecho solicitándole una operación 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
solución a todas. Esto quiere decir, que un programa debería tener en cada procedimiento una
llamada a la detección de errores (On error GoTo ... ) y una rutina de corrección. El trabajo es
grande. La recompensa también.
Pero un error muy común 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 compañero. La persona que realizó el programa sabe
perfectamente lo que debe hacer. Y aún queriendo, le cuesta mucho trabajo cometer errores.
Una persona que nunca haya trabajado con el programa, lo que le cuesta trabajo es no
cometerlos.
Toda aplicación bien terminada debe tener una ayuda. Cualquier aplicación realizada en Visual
Basic puede tenerla, usando para ello los recursos que brida Windows.
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.
El Formato de Texto Enriquecido pretende ser un nexo de unión entre todos los procesadores
de texto, para poder intercambiar ficheros editados en uno u otro. De hecho, las últimas
versiones de los mas importantes procesadores de textos incluyen la posibilidad de guardar y
buscar el texto en este formato. (WP, Word)
Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto
escrito como los tipos de letra, tamaño, saltos de carro, etc. Veamos un ejemplo comparativo
del mismo texto escrito en Word, guardado en RTF y en ASCII :
Texto1
Este texto está escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el
tamaño de las letras a tamaño mas grande, mas pequeño, etc.
Texto1
Este texto est escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra
subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el
tamaño de las letras a tamaño mas grande, mas pequeño, etc.
Fin Texto 1
Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las líneas para
poder mostrarlas en una hoja, ya que RTF utiliza líneas sin retornos de carro. Se han
seccionado las líneas terminándolas con un guión bajo y comenzando en la línea siguiente
también con un guión bajo.
Como puede observar, el RTF incluye el texto escrito casi en ASCII, pero añadiendo una serie
de datos respecto al tipo de letra, codifica los acentos, las eñes, y hasta incluye, tomándolo del
ordenador, el nombre del operador que lo ha escrito. Estas informaciones también se guardan
cuando se archiva un texto en el formato propio del procesador de textos, pero lo hace en
binario, por lo que no lo podemos visualizar. El formato RTF, dentro de que mete toda esa
información adicional, lo archiva con caracteres ASCII.
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 aplicación, sus posibles
conocimientos de informática y de otros temas que estarán relacionados con la aplicación. Es
decir, planifiquemos la ayuda antes de comenzar a hacerla.
Escriba el texto de ayuda con Word y guárdelo 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
Pero al compilador HC.EXE hay que suministrarle la información para que pueda trabajar. Esa
información se la damos en un fichero que le pasaremos como parámetro, que debe tener
extensión .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 extensión .HPJ será el que tenga el fichero de ayuda
(Que se obtendrá de la compilación y tendrá por extensión .HLP) Tendrá, de momento, dos
líneas.
[FILES]
AYUDA1.RTF
HC C:\DIRAYUDA\ FICHAYUD.HPJ
La compilación no suele dar problemas sobre todo en un fichero de ayuda tan simple de una
única página. Al compilar, obtenemos un fichero con el mismo nombre que el fichero .HPJ y
extensión .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. Movámoslo al C :\DIRAYUDA
Vayamos a nuestra aplicación VB y abramos el menú de Herramientas | Opciones para sacar
el cuadro de Opciones. Vaya a la pestaña 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.
Sin embargo este procedimiento no sería el mas indicado para una información de ayuda
extensa. Deberemos poner varias páginas. Si lo hacemos así, al pulsar F1 siempre aparecerá
la página 1. Si aparece siempre la página 1, pongamos en esta primera página el índice de
temas, y en las páginas sucesivas cada uno de los temas. Ya veremos como acceder a cada
una de las páginas haciendo click sobre la línea del índice que contiene el título del tema
deseado. Tal y como lo hace con cualquier aplicación Windows.
Volvamos al editor Word y abramos el fichero que habíamos creado de una página, y añádale
mas páginas introduciendo avances de página manuales (Se introducen con Control + Intro)
INDICE
1 - Introducción a la aplicación
2 - Acceso a la Base de Datos
3 - Introducción de datos
4 - Lectura de datos
Introducción a la Aplicación
Introducción de datos
Lectura de datos
Ya tenemos hecho un fichero de ayuda con varias páginas. No es suficiente esto, ya que
WINHELP.EXE , pulsando F1, solamente nos mostrará la página 1. Debemos hacer algo para,
una vez en la página 1, que nos estará mostrando el índice, poder acceder a cada una de las
páginas haciendo click sobre la línea del índice que contiene el tema de interés.
Para ello debemos poner un identificador a cada una de las páginas. Este identificador debe
ser único, es decir, no pueden existir dos páginas con el mismo identificador.
Para introducir un identificador en una página, una vez que tenga el fichero de ayuda
terminado, sitúese con el cursor al comienzo del título de la primera página (después del
índice), justamente al lado de Introducción a la Aplicación . 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.
INDICE
1 - Introducción a la aplicación
2 - Acceso a la Base de Datos
3 - Introducción de datos
4 - Lectura de datos
- - - - - - - - - - - - - - - - - - - - - salto de página manual - - - - - - - - - - - - - - - - - - - - - - - -
#
Introducción a la Aplicación
#
Introducción
(Observe que estamos simulando la ventana de Word. Donde ve - - salto de página 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 página. ¿Qué
podemos hacer para asociar estos identificadores a las líneas correspondientes del índice ?
Muy sencillo, y es el siguiente paso que debe hacer :
INDICE
1 - Introducción a la aplicación
2 - Acceso a la Base de Datos
3 - Introducción de datos
4 - Lectura de datos
Habrá observado en las aplicaciones Windows que para seleccionar un tema hay que poner el
puntero del ratón sobre la línea deseada, que está en color verde, y en ese momento el
puntero se convierte en una mano. En nuestra aplicación ocurrirá lo mismo. Seleccione todas
las líneas 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 diálogo. Vaya al TextBox Subrayado de ese cuadro de diálogo y elija
Doble.
#
Acceso
#
Meterdatos
#
Leerdatos
del editor Word. Verá también todos los caracteres de control del documento. Si lo prefiere,
vaya al menú Herramientas | Opciones y sobre la pestaña Ver seleccione Texto oculto.
Proceda de igual forma con todas las líneas del índice. Cuando termine, guarde el documento
en formato RTF y compílelo de la forma explicada mas atrás. Posiblemente ahora le salgan
errores de compilación, pues el compilador comprueba que todos los identificadores se
corresponden en el índice y en las páginas. Si le falta algún pie de página o un salto de carro
manual le dará error. También le dará un error, mejor dicho una observación, indicándole que
hay párrafos ocultos. Es lógico, ha detectado los textos ocultos que contiene el fichero. Ni
caso. Le habrá creado el archivo .HLP y le sugiero que lo pruebe, moviéndolo al directorio
C :\DIRAYUDA y ejecutando la aplicación. Pulse F1 y le saldrá la página con el índice y las
líneas del índice en verde. Si lo ha hecho todo perfectamente, al seleccionar una y otra línea le
aparecerá la página correspondiente.
Ventanas Emergentes
INDICE
1 - Introducción a la aplicación
2 - Acceso a la Base de Datos
3 - Introducción de datos
4 - Lectura de datos
- - - - - - - - - - - - - - - - - - - - - salto de página manual - - - - - - - - - - - - - - - - - - - - - - - -
#
Introducción a la Aplicación
Observe unas palabras que están subrayadas. Imagínese 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 aplicación, 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 explicación de lo que es esa palabra concreta. Por lo tanto,
debemos introducir esas informaciones a base de introducir nuevas páginas en el documento
Word donde editamos el fichero de ayuda. Añádalas de la misma forma insertándoles un pie
de página y el identificador deseado, de la misma forma que se explicó mas atrás. Recuerde
que el identificador debe ser único.
Una vez terminado de introducir todas las nuevas páginas, vaya a las palabras o frases que
quiere explicar con el texto de esas páginas, selecciónelas y deles el atributo de subrayado
simple (Hágalo de forma similar a cuando hizo lo del subrayado doble, pero esta vez SIMPLE)
Introduzca inmediatamente después de la palabra o frase un texto oculto con el nombre del
identificador seleccionado para la página deseada en esa palabra. Guarde el documento Word
y vuelva a compilar como anteriormente. Ejecute la aplicación y compruebe como vamos
avanzando en el tema de las ayudas de Windows.
#
Introducción
#
Acceso
#
Meterdatos
#
Leerdatos
Para establecer esta relación vayamos al fichero con extensión .HPJ que servía para introducir
los datos al Help Compiler. En nuestro caso se llamaba FICHAYUD.HPJ y tenía por el
momento, solamente dos líneas.
[FILES]
AYUDA1.RTF
En estas dos líneas le introducíamos el nombre del fichero de ayuda [FILE]. Añadamos ahora
en otro apartado [MAP] la relación entre los identificadores de página y los números de
contexto de la propiedad HelpContextID de cada uno de los controles que la tengan activada
(valor distinto a 0). Se escribirá el nombre del identificador de página, y separado por un
espacio o un tabulador, el número de contexto :
[MAP]
Identificador1 1
Identificador2 2
Identificador3 3
Identificador4 4
En este caso, cuando un control que tiene en su propiedad HelpContextID el número 3 tiene el
foco, al pulsar F1 aparecerá como página por defecto la correspondiente a la explicación con
identificador nombre Identificador3. Lo mismo ocurrirá con el resto de los identificadores.
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 complicaría su fichero de ayuda
original, al que debería introducir muchas páginas nuevas. Puede editar estas pequeñas
ayudas en otro documento Word, de la misma forma que se ha descrito, y darle un
determinado nombre (AYUDA2.RTF para nuestro ejemplo) y añadirlo como otro fichero en la
lista [FILES]. Colóquelo tras el fichero anterior, pues el que lleva el índice debe ser el primero
que figure en la lista. Debe añadir la relación entre los nombres de identificador que haya
puesto en ese nuevo fichero y los números de contexto de cada control.
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1 1
Identificador2 2
Identificador3 3
Identificador4 4
(Vea función Shell. No se olvide del 1 final, pues si no lo pone la ayuda le saldrá minimizada.
Puede poner también un 4)
Habrá observado que la ventana de ayuda tiene, en la barra de título el siguiente texto : Ayuda
de Windows. Si deseamos personalizarlo y poner el nombre de nuestra aplicación, basta con
añadir un par de líneas al fichero FICHAYUD.HPJ. Las correspondientes al apartado
[OPTIONS]. Este apartado debe ir en primer lugar del fichero, y puede llevar la información
de la barra de título y el CopyRight. Estos dos parámetros se introducen de la siguiente forma :
[OPTIONS]
TITLE= Nuestra Aplicación VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1 1
Identificador2 2
Identificador3 3
Identificador4 4
Para introducirlo por el primer procedimiento, inserte el gráfico en el texto Word y proceda
como siempre.
Se han resaltado en negrita las tres opciones. Recuerde la llaves donde se encierra la posición
y el nombre (y path) del gráfico.
Debe tener cuidado al introducir gráficos, ya que el compilador (HC.EXE) trabaja en DOS, y
me da la impresión de que no utiliza mas que los primeros 640 Ks. de memoria. Con un gráfico
de 470 Ks. usado en la preparación 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 páginas 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 páginas, y
será ese nombre el que figure en la ventana de historial. Ese nombre es distinto del
identificador de página, aunque no hay ningún problema porque sea el mismo. Ponga como
nombre de la página una palabra que identifique esa página de una forma única.
Para poner el nombre a la página, vaya al comienzo de cada página e introduzca una nota al
pié de la misma forma que cuando ponía el identificador. En este caso el símbolo 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 página usando como criterio de búsqueda
ciertas palabras que ponemos como clave. Por ejemplo, si queremos que aparezca nuestra
página 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 páginas 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 aplicación y
Lo mismo que hacíamos con las palabras, bien las del índice, a las que con un subrayado
doble les introducíamos un enlace a una página, o con cualquier palabra o frase de una
página, que mediante un subrayado simple les introducíamos un enlace a una ventana
emergente, lo mismo podemos hacer con la referencia a un gráfico. (Vea un poco mas arriba,
las referencias a los gráficos del tipo {bmc c:\dirayuda\grafico1.bmp} ) Si seleccionamos esa
referencia y le ponemos el atributo de doble subrayado, al acercar el puntero del ratón a ese
gráfico (en la ayuda) nos mostrará una mano, y haciendo click sobre el gráfico sacará la
página 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 continuación
de la referencia al gráfico, con texto invisible, el indicador de página que especifique la página
o ventana emergente que queremos mostrar.
Páginas en secuencia
Si tenemos una ayuda muy larga y la queremos leer toda, con lo que sabemos deberíamos ir
al índice y desde allí acceder a la página 1, leerla, volver al índice, acceder a la página 2,
leerla, volver al índice ....
Para evitar este proceso, y acceder secuencialmente a cada una de las páginas, podemos
asignar a cada una de las páginas un código de secuencia, que podrá estar formado por
caracteres alfanuméricos. Este código de secuencia será el que marque el orden de aparición
de las páginas. Pero el orden de aparición será según el código ASCII de los caracteres que
formen ese código, comenzando por la izquierda. Por lo tanto puede ocurrirle la paradoja de
que aparezca primero la página 100 que la 65. Es decir, si los códigos están formados por
números aparecerán primero todas las páginas que comiencen por 1, aunque el valor
numérico de una de ellas sea superior a otra que comience por 2, 3, 4, ...
Para asignar este código de secuencia deberemos introducir otra nota al pié para cada página,
en este caso con la marca personal + (signo mas). También deberemos indicarle al WinHelp
que deseamos sacar los botones (<<) y (>>) para desplazarnos por las páginas. Esto se
consigue añadiendo una nueva sección al archivo .HPJ que se denomina [CONFIG] y le
introduciremos en esta sección la expresión BrowseButtons()
[OPTIONS]
TITLE= Nuestra Aplicación VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
Identificador1 1
Identificador2 2
Identificador3 3
Identificador4 4
[CONFIG]
BrowseButtons()
Encabezado de páginas
VENTANAS MULTIPLES
Con frecuencia es útil emplear varias ventanas para mostrar la información de una aplicación.
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 información pedida, sin
perder la información que tenemos en la primera ventana.
Para poder presentar esta segunda ventana es necesario primero definirla. Para ello volvamos
a nuestro fichero .HPJ y le añadiremos un nuevo apartado : WINDOWS, donde introduciremos
el nombre de la nueva ventana, el título de la misma (El título que aparecerá en su parte
superior), y, entre paréntesis, su posición y dimensiones.
El fichero .HPJ quedará de la siguiente forma, tras introducirle dos nuevas ventanas :
[OPTIONS]
TITLE= Nuestra Aplicación VB - Fichero de Ayuda
COPYRIGHT= Nombre del Autor(a)
[FILES]
AYUDA1.RTF
AYUDA2.RTF
[MAP]
[CONFIG]
BrowseButtons()
[WINDOWS]
Ventana2 = “Titulo de esta Ventana”, (PosiciónX, PosiciónY, DimensiónX, DimensiónY)
Ventana3 = “Titulo de esta Ventana”, (PosiciónX, PosiciónY, DimensiónX, DimensiónY)
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 líe. El objeto App no es ni mas ni menos que un
conjunto de datos acerca de la aplicación) Determina o especifica información sobre el título
de la aplicación, la ruta de acceso de su archivo ejecutable y los archivos de Ayuda, y si está
ejecutándose una instancia anterior de la aplicación. Este objeto tiene solamente propiedades.
No tiene ni Eventos ni Métodos. 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
aplicación consultando el valor de esa propiedad del Objeto App. En el ejemplo siguiente
introducimos el nombre del fichero de ayuda en el Label1
Label1.caption= App.HelpFile
En este capítulo 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
ningún 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 deberían 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 además 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 :