Visual Basic - Guía del Estudiante Cap.

10 Procedimientos y funciones en VB
CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS - EL OBJETO ERROR LA AYUDA DE WINDOWS

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

En esta ventana debe teclear el nombre que quiere dar al Procedimiento. En tipo debe elegir la opción Procedimiento (Veremos mas adelante la Función y en otro capítulo las opciones Propiedad y Evento) y en el Ambito debe elegir Public o Private dependiendo del ámbito que quiera darle : Public. Se podrá acceder a él desde cualquier Formulario o Módulo del programa. Dependiendo de donde se haya insertado el Procedimiento (Formulario o Módulo), debe citarse de la siguiente forma : Si se ha insertado en un Módulo, puede citarse solamente por su nombre. Puede citarse también por el nombre del módulo seguido por el nombre del procedimiento, separando ambos

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 1

por un punto. Si el procedimiento tiene por nombre NombreProcedimiento y se ha insertado en el Módulo1 puede citarse de las dos formas siguientes en cualquier parte del programa: NombreProcedimiento Modulo1.NombreProcedimiento Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre. Desde otro Formulario o Módulo, hay que citarlo mediante el nombre del Formulario donde está insertado, seguido del nombre del procedimiento, separados por un punto. Private. Si elige este ámbito, sólo se podrá acceder a ese Procedimiento desde el Formulario o Módulo donde se haya insertado. La caja de opción (Check) que pone Todas las variables locales como estáticas nos va a poner todas las variables declaradas dentro del procedimiento como estáticas (No ponen a cero o nulo su valor cuando salimos y volvemos a entrar en ese procedimiento). Puede ahorrarnos un poco de código. El código de los Procedimientos se guarda en el General del Formulario o Módulo donde se han insertado :

Para llamar a un procedimiento desde cualquier parte del código basta con escribir en una línea el nombre del procedimiento. fpublico Muchos programadores anteponen la palabra Call 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.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 2

Cuando se llama a un procedimiento, se lleva a ese procedimiento la condición de tratamiento de errores que existe en el procedimiento desde el que se llamó. Por ejemplo: Private Sub Boton1_Click() On Error GoTo RutErr Lineas de código de este procedimiento ‘Llamada al Procedimiento Calcula_Dietas Calcula_Dietas Mas líneas de código de este procedimiento RutErr: End Sub Si al ejecutarse el procedimiento Calcula_Dietas ocurre un error, al detectarse ese error interceptable, el programa salta a ejecutar la línea RutErr del procedimiento Boton1_Click. 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: Public Sub Calcula_Dietas() On Error Goto 0 ……………. Ens Sub

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. El ámbito de una Función es el mismo que el un Procedimiento. Si se declara Pública puede usarse en toda la aplicación. Si se declara Privada, solamente en el Formulario o Módulo donde se haya insertado. Para llamar a una Función son válidos igualmente los criterios expuestos para los Procedimientos en cuanto a la sentencia Call.

Parámetros de una Función Se dijo anteriormente que a una Función se le pasan uno o varios parámetros con los que va a realizar alguna operación. 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 Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) End Function

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 3

La función MiFuncion sabe que debe recibir dos parámetros, 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 Función internamente. No tienen porqué coincidir con los nombres que tengan las variables que contienen esos valores en otras partes del programa. 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) Si, por ejemplo, le pasásemos los valores : Variable1 = Guía del Estudiante Variable2 = 14 Obtendríamos como resultado la cadena Guía del Estud

Ya se habrá dado cuenta de que debemos emplear Left para obtener los caracteres iniciales de una cadena. Nuestra función quedará de la forma : Public Function MiFuncion(ByVal Variable1 as String, ByVal Variable2 as Integer) As String MiFuncion =Left (Variable1, Variable2) End Function (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 En cualquier parte del programa podemos poner : Label1.Caption = MiFuncion (Guía del Estudiante, 14) y Label1 tomará como Caption la cadena Guía del Estud 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 :

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 función. Efectivamente. Bastaría con poner en el botón Command1_Click el siguiente código : Label1.Caption = Left(Text1.Text, Val(Text2.Text))

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 4

y funcionaría igual. Lógicamente, una función debe introducirse cuando vaya a realizar un código un poco mas complejo, y sobre todo, cuando se va a repetir en muchos procedimientos. 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. 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 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 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() 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 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

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 5

comprar un cliente, por lo tanto no sabemos a priori cuantos parámetros le tenemos que pasar. Para pode pasar un número indeterminado de parámetros se los pasamos como PamArray : Public Sub sumacifras(ParamArray cifra()) Dim I As Integer Dim suma As Integer For I = LBound(cifra) To UBound(cifra) suma = suma + CInt(cifra(I)) Next I Label1.Caption = suma End Sub Private Sub Command2_Click() sumacifras 1, 2, 3, 4, 5, 6, 7, 8 End Sub Este código nos suma las cifras 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 La variable que se pasa con ParamArray debe ser Variant Existe otra forma de pasar parámetros : Optional Cuando se declara una función con un determinado número de parámetros, es necesario pasárselos todos. Si no se hace así, VB nos dará un error. Pero puede que algún parámetro no exista siempre. Cuando uno o varios de los parámetros que se pasan a una función son opcionales, se le pueden pasar como Optional. 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 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 declaración de la función será :

Public Function SUMANOMBRES(NOMBRE As String, APE1 As String, Optional APE2 _ As Variant) ‘ Debemos detectar si se le ha pasado el parámetro opcional. Usamos para ello IsMissing If IsMissing (APE2) Then TB4.Text = NOMBRE & " " & APE1 Else TB4.Text = NOMBRE & " " & APE1 & " " & APE2 End If End Function 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 : Private Sub Command1_Click() If TB3 <> "" Then SUMANOMBRES TB1, TB2, TB3 Else SUMANOMBRES TB1, TB2

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 6

End If End Sub Salir de una función La forma natural de salir de una función es cuando se ejecuta todo su código. Al final siempre tiene la sentencia End Function 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

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 7

CORRECCION DE ERRORES Y DEPURACION DE PROGRAMAS EL OBJETO ERROR 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. 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 ejecución 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 corrección de errores y optimización.

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. Es un error de código, por ejemplo, la siguiente línea 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 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: Open “A:\MiFicher.Txt” For Input as #1 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. En cualquiera de estos dos últimos casos se produce un Error de Ejecución. 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.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 8

No solamente existen estos errores, también 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, 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. Veamos lo que dice la ayuda de VB para este tema: 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 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.

Propiedad HelpContext

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 9

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 automáticamente 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”

También 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 automáticamente cuando el usuario presiona el botón Ayuda (o la tecla F1) del cuadro de diálogo del mensaje de error. Si la propiedad HelpContext contiene un identificador de contexto válido para el archivo especificado, se mostrará automáticamente el tema correspondiente. Si no se especifica nada en HelpFile, aparecerá el archivo de Ayuda completo.

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 ¡¡¡ Number es una variable tipo Long !!! Sintaxis Variable = Err.Number

Al ser la propiedad predeterminada, no es necesario poner Number. La siguiente línea es operativamente igual a la anterior: Variable = Err Source Devuelve o establece el nombre del objeto o aplicación que ha generado el error originariamente. Sintaxis Variable = Err.Source Err.Source = expresión_cadena

Vea en la ayuda de VB la explicación (muy ilustrativa) de esta propiedad.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 10

El Objeto Error tiene solamente dos métodos:

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: Cualquier tipo de instrucción Resume Exit Sub, Exit Function, Exit Property Cualquier instrucción On Error De aquí se desprende que un error no “sale” del procedimiento en el que se generó. Para salir de un procedimiento el programa debe pasar necesariamente por una instrucción Exit Sub. En ese momento, desaparecen todas las propiedades del Objeto Error.

Método Raise
Genera un error en tiempo de ejecución. Sintaxis Err.Raise(Número, Origen, Descripción, ArchivoAyuda, ContextAyuda)

Los argumentos de Raise se describen a continuació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.

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 extrañe si alguien le llama Label o Etiqueta. En otros lenguajes se llama así, incluso en Q-Basic, donde no existían los controles Visual Basic llamados etiquetas, se usaba esta denominación. En Visual Basic no podemos usarla, para no confundirla con el control. Una Rutina es un trozo de código escrito en un procedimiento, que tiene un nombre. El nombre de la Rutina puede ser cualquiera, y debe terminar con el carácter dos puntos (:) Por ejemplo: 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.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 11

Para citarla, debemos usar ese nombre, quitando el carácter dos puntos final. Podemos llamarla mediante la sentencia GoTo. Veamos un pequeño ejemplo. Es un botón 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" End If Exit Sub Rutina: MsgBox "Sí pasó por la Rutina" End Sub La rutina es en realidad un trozo de código del procedimiento que se ejecutará, 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 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 dicen que de estos últimos hay muy pocos.

Instrucción On Error GoTo
Activa una rutina de tratamiento de errores y especifica la ubicación de la misma en un procedimiento. También puede utilizarse para desactivar una rutina de tratamiento de errores. Sintaxis a On Error GoTo Rutina ‘Va a la Rutina especificada On Error Resume Next ‘Pasa del error y continúa en la línea siguiente ‘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 instrucción On error GoTo. Private Sub Command1_Click() On Error Resume Next ‘Con la línea anterior le decimos que se olvide del error y siga en la línea siguiente ‘a la que provocó el error If Text1 = "Text1" Then GoTo Rutina Else On Error GoTo 0 ‘La línea anterior desactiva el tratamiento de errores generado en la línea segunda (On ‘Error Resume Next). Pruebe a quitar y poner esta línea (On error GoTo 0) Err.Raise 53 ‘En la línea anterior generamos “artificialmente” el error 53 MsgBox "No pasa por la Rutina"

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 12

Exit Sub End If 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. Hagamos un ejemplo donde al pulsar un botón (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 ejecución. El disco no está listo Si estuviese metido el disco, pero no tuviera un fichero llamado Mificher.Txt, daría este error: Se ha producido el Error ‘53’ de tiempo de ejecución. No se ha encontrado el archivo 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: 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 ejecución continúa con la instrucción 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,

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 13

la ejecución continúa en la instrucción del procedimiento que contiene la rutina de tratamiento de errores desde la que se llamó a otro procedimiento. Resume Next Si el error se ha producido en el procedimiento que contiene el controlador de errores, la ejecución continúa con la instrucción inmediatamente posterior a la que lo causó. Si el error se ha producido en un procedimiento llamado, la ejecución continúa en la instrucción del procedimiento que contiene la rutina de tratamiento de errores (o la instrucción On Error Resume Next) inmediatamente posterior a aquélla desde la que se llamó a otro procedimiento. Resume Rutina La ejecución continúa en la rutina citada en la instrucción. 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 detección de errores e introduzcamos una rutina que detecte el error ocurrido y que haga lo que tenga que hacer en cada caso: Private Sub Command2_Click() On Error GoTo RutinaErrores Dim Variable As String Open "A:\Mificher.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 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 If Err = 53 Then ‘Aquí hemos puesto solamente Err MsgBox "El disco A no tiene ningún fichero llamado Mificher.Txt. Ponga el disco correcto" Resume End If End Sub

Ventana de Depuración. El Objeto Debug
Es momento ahora de hablar de la ventana de depuración. Esta ventana permite que Visual Basic se comunique con nosotros en tiempo de ejecución. Es la ventana de Debug. No está presente normalmente en la pantalla, pero se presenta haciendo click en Ver | Ventana de Depuración de la barra de menú de Visual Basic. En esta ventana se presenta lo que escribamos en un objeto preparado para ayudarnos en la corrección de errores, que se llama precisamente Objeto Debug: Este objeto no tiene propiedades y tiene solamente un método: el Método Print En esta ventana podemos presentar otro tipo de datos, por ejemplo el valor de una variable en un determinado momento:

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 14

Debug.Print MiVariable Veremos en el ejemplo de este capítulo una aplicación de la ventana de depuración que le dejará claras las ideas. 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: 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 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.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 15

LA AYUDA DE WINDOWS NOTA sobre las ayudas de los programas Windows Hasta ahora era normal presentar las ayudas en el formato cásico de fichero .Hlp. Sin embargo, dado el auge que ha tomado el formato Html (sobre todo desde que Microsoft lo incluyó como una parte más de Windows), actualmente se está usando más el formato .Html que el .Hlp. Las razones son bastante obvias. La edición de un fichero Html es mucho mas sencilla que la de un Hlp (Y si no se lo cree, léase este capítulo) Pese a todo, se sigue incluyendo este tema, ya que el formato Hlp sigue siendo actual. Eso sí, este capítulo no se ha actualizado, y cuando se habla del HC.Exe deberíamos estar hablando del HelpWorkShop (HWC.Exe), un programa que funciona en Windows, y para el que es aplicable todo lo descrito aque de los fichero .Hpj. 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. La presentación de la ayuda podría hacerse mediante un formulario, donde se presentan distintos ficheros según 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 presentación de Windows sería laborioso. Solución : utilizar los recursos de Windows. El recurso de Windows es un programa capaz de presentar ficheros de ayuda. Estos ficheros son un poco especiales y solamente se pueden presentar mediante ese presentador de ficheros de ayuda. Ese es el programa WinHelp.Exe para las versiones de 16 bits y las primeras versiones de Windows 95, y el WinHlp32.Exe para Windows 98 y Windows NT4. Como en todas las aplicaciones de Microsoft (MS) tienen compatibilidad hacia arriba. Por lo tanto no se extrañe que una ayuda que le abre perfectamente el WinHlp32.Exe, si la pretende abrir con el WinHelp.exe (que es más antiguo) le diga que no se trata de un fichero de ayuda. 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 exigía. El Formato de Texto Enriquecido pretende ser un nexo de unión entre todos los procesadores de texto, para poder intercambiar ficheros editados en uno u otro. De hecho, las últimas versiones de los mas importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato. (WP, Word) Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito como los tipos de letra, tamaño, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto escrito en Word, guardado en RTF y en ASCII : Texto1 Este texto está escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamaño de las letras a tamaño mas grande, mas pequeño, etc.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 16

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

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 17

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 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. Para acceder a la ayuda, Windows ofrece la posibilidad de pulsar F1 . Nuestras aplicaciones deben sacar la ayuda pulsando F1. Lo podrán hacer mediante otros procedimientos. Comencemos por lo mas sencillo, una ayuda de una única página. 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 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 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 Vayamos al directorio C :\ ...... \VB\HC (en MS-DOS) y tecleemos 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.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 18

Haga click en Aceptar y ejecute la aplicación. Pulse F1. ¡SORPRESA ! Tenemos en pantalla la ventana de ayuda de Windows con el fichero que habíamos 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 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) Imaginemos que tenemos esta configuración del fichero : 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 Esta aplicación está realizada para . . . . . . . . . . -------------salto de página manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Acceso a la Base de Datos

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 19

Para abrir la Base de datos . . . . . . . . . -------------salto de página manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Introducción de datos Para introducir datos . . . . . . . . . . . . -------------salto de página manual - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Lectura de datos Para leer los 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. Le aparecerá en la parte inferior de la pantalla un cuadro para introducir el identificador de esa página. Repita el proceso para todas las páginas insertándoles una Nota al pié a cada una. Al final obtendrá este resultado : 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 Esta aplicación está realizada para . . . . . . . . . .

#

Introducción Visual Basic Guía del Estudiante Capítulo 10 Página 20

LSB

- - - - - - - - - - - - - - - - - - - - - salto de página manual # Acceso a la Base de Datos Para abrir la Base de datos . . . . . . . . .

-----------------------

- - - - - - - - - - - - - - - - - - - - - salto de página manual - - - - - - - - - - - - - - - - - - - - - - - # Introducción de datos Para introducir datos . . . . . . . . . . . . -------------------# Lectura de datos salto de página manual -----------------------

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

(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 : Volvamos a la primera página del documento Word, donde tenemos el índice. 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
# #

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 21

Al ponerles doble subrayado, le aparecerán en la ayuda de color verde, y el puntero se le transformará en una mano cuando lo ponga encima de una de esas líneas. Pero todavía queda asociarlas a cada uno de los identificadores. Para ello tiene que llevar el puntero del ratón justamente al final de cada una de las líneas. Al hacer click el puntero de escritura se coloca en ese punto. Tiene que escribir a continuación de cada línea el nombre del identificador que corresponda. Pero lógicamente 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 + Mayúsculas + O. Pulse las tres al mismo tiempo y a continuación escriba el nombre del identificador que corresponda. No verá lo que escribe pues para eso está escribiendo con texto invisible. Puede visualizarlo mediante el botón

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. ¡ Ya tenemos una ayuda de varias páginas ! Ventanas Emergentes Es posible que dentro de la información presentada en cualquiera de las páginas anteriores, exista una palabra o frase que quisiera explicar con mas detalles. Habrá observado en las ayudas de Windows que algunas frases dentro de las páginas de ayuda están en verde, y al

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 22

acercar el puntero del ratón a ellas se convierte en una mano. Para poder hacer lo mismo en nuestra ayuda, volvamos al documento Word. 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 Esta aplicación está realizada para . . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de página manual # Acceso a la Base de Datos Para abrir la Base de datos . . . . . . . . . - - - - - - - - - - - - - - - - - - - - - salto de página manual - - - - - - - - - - - - - - - - - - - - - - - # Introducción de datos Para introducir datos . . . . . . . . . . . . -------------------# Lectura de datos salto de página manual ---------------------------------------------

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

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. Si repasamos las propiedades de los controles, seguro que se acuerda de la propiedad HelpContextID que tenían la mayoría de los controles VB. En aquel momento decíamos que esa propiedad que establece un número de contexto asociado para este control. Este número se aplica para determinar la ayuda interactiva asociada a este control. Ha llegado el momento de sacarle partido a esa propiedad.

Introducción Acceso # Meterdatos # Leerdatos
# #

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 23

Podemos usar la tecla F1 para acceder al índice de la ayuda de una aplicación y movernos a lo largo de la ayuda seleccionando una u otra información. A veces resulta práctico seleccionar directamente la ayuda correspondiente a la función de un control. Para poder hacer esto, asociaremos una de las páginas del documento Word anterior al número que figura en la propiedad HelpContextID. Cuando ese control tenga el foco, al pulsar F1 saldrá como página por defecto la página asociada mediante la propiedad HelpContextID. 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 Identificador2 Identificador3 Identificador4 1 2 3 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. Añada a su aplicación 4 TextBox y asígneles los valores 1, 2, 3 y 4 a sus propiedades HelpContextID. Vuelva a compilar la ayuda y ejecute la aplicación. Vaya pasando el foco de uno a otro TextBox y comprobándolo. 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. 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 rápidamente a la ayuda de un determinado control puede que no sea el ideal, ya que en una aplicación, siempre tiene el foco algún control. Si ese control que ahora mismo tiene el foco tiene activado el HelpContextID, y el usuario pulsa F1, con la

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 24

intención de ir a ver cualquier cosa no relacionada con el control que tiene actualmente el foco, se verá sorprendido con que aparece una información que nada tiene que ver con la esperada (índice). En cualquier caso, siempre podrá ir al índice haciendo click en el botón CONTENIDO de la ventana de ayuda, pero en principio no está bien que le aparezca en pantalla una información no esperada. Tiene solución, incluya en el menú (palabra Ayuda) o en un control Image con el símbolo ? una llamada al programa WINHELP.EXE, pasándole como parámetro el nombre del fichero de ayuda. Esto lo podemos hacer mediante la función SHELL SHELL “WINHELP.EXE C:\DIRAYUDA\FICHAYUD.HLP “, 1 (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) También puede utilizar para este fin el CommonDialog. Introduzca un CommonDialog en su aplicación 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 función 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 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 Identificador2 Identificador3 Identificador4 1 2 3 4

El dato introducido en la línea COPYRIGHT sale en el menú de la pantalla de ayuda, en Ayuda | Versión.

Gráficos en la ventana de Ayuda. Si necesita introducir un gráfico en la ventana de ayudas puede hacerlo de dos formas : - Introducirlo en el fichero Word. Esta opción es recomendable si el gráfico es muy pequeño. - Introducirlo directamente desde un fichero .BMP ó .WMF (Metarchivo). Recomendable cuando el gráfico es grande. Este método se denomina de referencia a un gráfico. Para introducirlo por el primer procedimiento, inserte el gráfico en el texto Word y proceda como siempre.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 25

Para introducirlo por el segundo método, tiene tres posibilidades : Introducir el gráfico 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. Se supone que el gráfico está en un fichero llamado GRAFICO1.BMP en el directorio C:\DIRAYUDA. Vayamos al documento Word, y en el sitio donde desee introducir el gráfico inserte la(s) línea(s) : {bmc c:\dirayuda\grafico1.bmp}Le colocará este gráfico en medio de la ventana de ayuda, y este texto inmediatamente debajo del gráfico. o {bml c:\dirayuda\grafico1.bmp}Le colocará este gráfico a la izquierda de la ventana de ayuda, y este texto a la derecha del gráfico. o {bmr c:\dirayuda\grafico1.bmp}Le colocará este gráfico a la derecha de la ventana de ayuda, y este texto a la izquierda del gráfico. 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

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 26

saque la Ayuda. Observará que el botón Búsqueda de la ventana de ayuda está habilitado. Haga click en este botón y verá que esas palabras ya figuran en la lista. Usar los Gráficos de la Ayuda como enlaces a páginas 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() El fichero FICHAYUD.HPJ quedará 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 Identificador2 Identificador3 Identificador4 1 2 3 4

[CONFIG] BrowseButtons() Encabezado de páginas

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 27

Habrá observado en la ayuda de Visual basic que una o dos líneas en la parte superior de la ventana de ayuda se conservan allí continuamente aunque nos desplacemos hacia abajo mediante los cursores de desplazamiento. Esas líneas son el Encabezado de página. Para conseguir esto en nuestra ayuda deberemos escribir las líneas que queramos que se conserven como encabezado de página al principio de cada página, seleccionarlas con el cursor del ratón y abrir el menú Formato | Párrafo (Se supone que está utilizando el procesador de texto Microsoft Word) donde le aparecerá un cuadro de diálogo con dos solapas, Sangría y Espacio y Presentación. Elija Presentación y dentro de esta solapa, active la casilla Conservar con el Siguiente. Las líneas que hubiera seleccionado se le conservarán como Encabezado de página.

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. Esta segunda ventana se comporta de manera idéntica a la primera, en cuanto a llamadas a otras páginas o a menús emergentes. 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]

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 28

Identificador1 Identificador2 Identificador3 Identificador4

1 2 3 4

[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) Para llevar la información a una de estas ventanas, en vez de a la ventana principal, se añadirá tras el identificador de la página que queremos enviar a la nueva ventana el símbolo > y a continuación el nombre de la ventana. 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 Como la propiedad HelpFile también es de escritura, se puede cambiar en tiempo de ejecución el fichero de ayuda. Piense lo útil que puede resultar esto para cambiar el idioma de la ayuda de una aplicación. 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 información sobre el Objeto App)

Otros Compiladores de Ayuda (HCP.EXE, HCW.EXE, ...) 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 :

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 29

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 edición de los ficheros :RTF y .HPJ sigue siendo válida para estos compiladores. Existen algunos compiladores que también crean el fichero .HPJ. Es comprensible no intentar examinar uno a uno en esta Guía del Estudiante.

LSB

Visual Basic

-

Guía del Estudiante

Capítulo 10

Página 30

Sign up to vote on this title
UsefulNot useful