Está en la página 1de 30

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 On Error GoTo Rutina ‘Va a la Rutina especificada


On Error Resume Next ‘Pasa del error y continúa en la línea siguiente
a ‘la que provocó el error
On Error GoTo 0 ‘Desactiva todo el tratamiento de errores que
‘haya activado en el procedimiento actual.

Veamos el ejemplo anterior, con la 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 o simplemente


Debug.Print Err

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

LSB Visual Basic - Guía del Estudiante Capítulo 10 Página 20


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

-------------------- salto de página manual -----------------------


#
Lectura de datos

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

-------------------- salto de página manual -----------------------


#
Lectura de datos

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

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 1
Identificador2 2
Identificador3 3
Identificador4 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 1
Identificador2 2
Identificador3 3
Identificador4 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.

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

{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 1
Identificador2 2
Identificador3 3
Identificador4 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 1
Identificador2 2
Identificador3 3
Identificador4 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