Capitulo 8 Visual Basic
Capitulo 8 Visual Basic
Capitulo 8 Visual Basic
LA FUNCION SHELL
LA FUNCION COMMAND PARA PASAR PARAMETROS
LA FUNCION DoEvents
Cajas de mensaje (Mensaje Box)
Cajas de entrada de datos (Input Box)
El Objeto APP (La Aplicación)
LA FUNCION SHELL
La función Shell se utiliza para ejecutar un programa ajeno a la aplicación que se está
ejecutando. Imaginemos que tenemos una aplicación Visual Basic que necesita, por ejemplo,
establecer una comunicación telefónica, y que esa comunicación telefónica nos la realiza un
programa desarrollado en C++ , llamado MARCADOR.EXE que funciona perfectamente y no
queremos desaprovechar. Imaginemos que ese programa tiene la posibilidad de introducirle el
número telefónico que debe marcar como un parámetro. Este parámetro se le introduce,
supongamos, añadiendo el número al nombre del programa ejecutable. Por ejemplo:
MARCADOR.EXE 1234567
En nuestra aplicación Visual Basic introduciremos una línea invocando la función Shell seguida
del nombre (y Path) del ejecutable y del parámetro que le vamos a introducir al ejecutable:
donde:
rutaDeAcceso es el nombre del programa por Ejecutar (con su Path) y cualquier argumentos
o conmutadores (switches) de línea de comando requeridos; puede incluir directorio o carpeta
y unidad de disco. También puede ser el nombre de un documento que se ha asociado con un
programa ejecutable.
Si la función Shell ejecuta con éxito el archivo nombrado, devuelve la identificación de la tarea
(ID) del programa iniciado. La ID de la tarea es un número exclusivo que identifica el programa
en ejecución. Este número debe ser un Long. Si la función Shell no puede iniciar el programa
nombrado, ocurrirá un error. Si desea conocer el ID de la tarea, realice una aplicación con un
botón (cmbCalculadora) y un label (label1). Ponga en ese botón en su procedimiento click, el
siguiente código. - Observe que esta aplicación inicia la calculadora de Windows -
Posiblemente lo único que le importe sea el ejecutar esa aplicación, sin dar mayor importancia
al ID de la tarea. Utilice una línea con la siguiente expresión :
Shell ("C:\windows\calc.exe"), 1
(Observe en las dos formas de ejecutar la función Shell, que la colocación de los paréntesis y
la coma separadora es distinto.
Nota La función Shell ejecuta otros programas de manera asíncrona. Esto quiere decir que
no se puede esperar que un programa iniciado con Shell termine su ejecución antes de que se
ejecuten las instrucciones que siguen a la función Shell en la aplicación. Esto es un gran
inconveniente de la función Shell. Excepto en contadas ocasiones, siempre es necesario
conocer cuando se ha terminado de ejecutar el programa iniciado mediante Shell. Y no es ese
el único problema. La mayoría de los programas DOS que se ejecutan con Shell no se cierran
automáticamente. Esto significa que si podemos evitar el uso de Shell debe evitarse. Pero si
es completamente necesario, tampoco pasa nada. Pero hay que controlar, tanto la terminación
del proceso DOS como su cierre.
Podemos usar para ello APIs. No las hemos explicado todavía. Por eso, y adelantar un poco
como se trabaja con ellas, vamos a presentar, sin grandes explicaciones, lo que hay que hacer
para poder detectar que se ha terminado de ejecutar el programa DOS y para cerrarlo. Verá
mas APIs mas adelante.
El programa DOS elegido para este ejemplo es el popular ARJ.EXE, un compresor de datos
que, sin ánimo de publicidad, es uno de los mejores que existen. Pero trabaja solamente en
DOS. Se utiliza un Procedimiento que he llamado ExecCmdNoFocus, para detectar que el
proceso abierto para comprimir o descomprimir ha finalizado, y proceder a cerrarlo.
Dim hProcess As Long 'handle del proceso donde se invoca la función Shell
Dim RetVal As Long 'Valor donde la función GetExitCode coloca el resultado
Dim winHwnd As Long ' manipulador de la ventana que contenga el Caption
‘Finalizado - ARJ
Dim RetValls As Long 'valor de retorno de PostMessage
Do
GetExitCodeProcess hProcess, RetVal
Sleep 100
'en este apartado comprueba si está abierta la ventana "Finalizado - ARJ"
winHwnd = FindWindow(vbNullString, "Finalizado - ARJ")
If winHwnd <> 0 Then
RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
End If
Loop While RetVal = STILL_ACTIVE
End Sub
La ventana DOS del ARJ tiene el Caption Finalizado - ARJ cuando ya ha terminado el
proceso. En el procedimiento ExecCmdNoFocus se analiza si esa ventana está presente
(prueba de que ARJ ya ha terminado, pues antes de terminar tiene otro Caption).
Para llamar a ese procedimiento hay que citarle por su nombre (ExecCmdNoFocus) que
como lo hemos declarado Public en un Módulo, podemos llamarle desde cualquier parte de la
aplicación. Debemos pasarle el parámetro CmdLine, que será el programa que vamos a
ejecutar con Shell y los parámetros adicionales que este programa necesite (En este caso, el
programa es ARJ.EXE y a continuación debe indicársele el nombre del archivo ya
comprimido, a continuación a para que añada mas ficheros a ese archivo, y a continuación el
nombre de ese fichero o ficheros a añadir :
Command (Función)
Devuelve parte del argumento de la línea de comandos utilizada para lanzar Microsoft Visual
Basic o un programa ejecutable desarrollado con Visual Basic.
Cuando se inicia Visual Basic desde la línea de comandos, la parte de la línea de comandos
que sigue a /CMD se pasa al programa como un argumento de la línea de comandos. En el
siguiente ejemplo, cmdlineargs representa la información de argumento devuelta por la función
Command.
VB /CMD cmdlineargs
MyApp cmdlineargs
En la ventana Código, puede usted cambiar el texto devuelto por Command eligiendo
Opciones del proyecto en el menú Herramientas.
Veamos con un par de ejemplos como se pueden usar estas dos funciones:
Marcador Telefónico
Esta aplicación debe marcar un número telefónico. El número a marcar se le pasará como
parámetro tras el nombre de la aplicación. La aplicación ya compilada se llamará
MARCADOR.EXE. Para marcar un número debemos poner, en la línea de Comando de
Windows:
Marcador.exe 1234567
o como ya sabemos, introducirle el parámetro mediante una llamada con la función Shell
desde otra aplicación:
Como no vamos a realizar llamada alguna, sino comprobar que esto puede funcionar, nuestra
pequeña aplicación tendrá solamente un Label llamado FRMARCADORL1 donde
presentaremos el número a marcar. Todo el código necesario se lo metemos en el
procedimiento Activate del formulario:
También podemos pasar parámetros a un ejecutable, mediante el Drag & Drop de Windows.
Si Vd. hace un editor de textos (Editor.EXE) que soporta un formato determinado (por ejemplo
el RichTextFormat RTF), para ejecutar su programa y meterle como parámetro el nombre del
fichero Carta.RTF de forma que al arrancar lea directamente el fichero Carta.RTF, basta con ir
al Explorador de Windows, abrir la carpeta que contenga Carta.RTF, arrastrar el nombre de
ese fichero y llevarlo al icono que representa a Editor.EXE, que imaginemos que le ha
preparado un acceso directo. Suelte el botón del ratón y su editor se ejecutará, y además, le
meterá como parámetro el nombre del fichero Carta.RTF (con su Path correspondiente) Si Ud.
había previsto la captura del Command tal como se explicó mas atrás, y ha preparado su
aplicación para que tome el contenido de Command y entienda que tiene que abrir y cargar
ese fichero, su aplicación Editor.EXE cargará automáticamente ese fichero. Observe que esta
es la forma de trabajar de los procesadores de texto usados normalmente (Word, WordPerfect,
Write, etc.)
Sintaxis DoEvents
Cede el control al sistema operativo
Sintaxis variable=DoEvents
variable contendrá un número indicando el número de formularios abiertos en
este momento.
La función DoEvents es una instrucción obligada en todos los bucles por condición para evitar
que, en caso de meterse en un bucle infinito, podamos salir de el aunque sea teniendo que
pulsar las teclas Ctrl-Alt-Sup. Si no lleva esa línea DoEvents, es posible que tenga que
resetaear el ordenador. El siguiente bucle se pone para esperar a que el programa envíe un
mensaje a través del control de comunicaciones. Este, una vez terminada la comunicación,
pone la variable Transmitido a True. Imagínese que se corta la comunicación y Transmitido
nunca llega a ser True.
La función DoEvents devuelve también el número de formularios abiertos por una versión
única de Visual Basic, como la versión estándar de Visual Basic. DoEvents devuelve 0 en el
resto de las aplicaciones.
El control no se devuelve hasta que el sistema operativo haya terminado de procesar los
eventos en cola y que (sólo para Microsoft Windows) se hayan enviado todas las teclas en la
cola SendKeys.
Si partes de su código consumen demasiado tiempo de procesamiento, use periódicamente
DoEvents para ceder el control al sistema operativo, de manera que eventos como la entrada
por el teclado o los clics del mouse (ratón) se puedan procesar sin grandes retrasos. Utilice
esta función sobre todo, cuando tenga bucles demasiado largos que puedan interrumpir la
entrada de datos por teclado o ratón.
EJEMPLO
El botón COMENZAR introduce un bucle que no pararía nunca. También pone Label1 de color
Verde.
Si no hubiésemos puesto DoEvents en una parte del bucle del contador, nunca se podría
acceder al Procedimiento KeyPress del formulario, pues el programa lo único que haría será
dar vueltas en el bucle indefinidamente.
Lo mismo ocurriría con el botón ROJO. Al estar el programa haciendo el bucle continuamente,
nunca podríamos entrar el Procedimiento Click de este botón.
Por último SALI nos saca del programa. Observe que si no hubiésemos puesto DoEvents en
el medio del bucle, tampoco podríamos salir del programa, puesto que el sistema operativo no
podría comprobar que hemos hecho Click en este botón.
Realice esta pequeña práctica con la línea DoEvents del botón COMENZAR activada y
desactivada (Con una comilla simple). Prepárese para, en este último caso, detener la
aplicación pulsando Ctr-Pausa, pues de otra forma no la podrá detener.
Se dice que un Formulario o cualquier tipo de ventana se presenta de forma Modal cuando un
elemento de ese formulario o ventana toma el foco en el momento de mostrarse, y exige que
se realice alguna gestión sobre ella antes de permitir que otra parte de la aplicación tome de
nuevo el foco. La actuación que generalmente exige un formulario o ventana es ocultarse.
Para ver esto, cree una aplicación con dos formularios. El primero (Form1) puede ser el
formulario donde se realizan todas las operaciones de la aplicación. El segundo (Form2) puede
ser el típico formulario donde se presenta la información del fabricante de la aplicación, al que
se accede normalmente desde el menú, con la palabra Acerca de...
Cree un menú en el primer formulario con esa palabra y ponga este formulario como
formulario inicial de la aplicación. En el procedimiento click de este menú ponga el siguiente
código :
Form2.Show 1
El 1 detrás de la expresión Show indica que el formulario Form2 debe mostrarse de forma
Modal, lo que significa que no se podrá volver a operar con ningún elemento de Form1 hasta
que se oculte o descargue el formulario Form2. Ponga en este Form2 el típico botón de
Aceptar, cuyo código puede ser simplemente :
Me.Hide
Lo dicho para un formulario puede aplicarse para otro tipo de ventanas. El MessageBox y la
ventana del CommonDialog son dos ejemplos de ventanas modales. Veamos la primera :
1 - El aviso es sí, que tiene por objetivo mostrar una información de interés.
2 - El aviso con espera de respuesta, que muestra una información esperando que el usuario
seleccione una de las respuestas posibles para que el programa la trate.
Una caja de mensaje, puede ser por ejemplo, la instrucción MsgBox "Hola". Por defecto, la
caja de mensaje será similar a esta:
Habrá observado en la expresión anterior que se ha utilizado vbCrLf (Visual Basic Carriage
Return Line Feed, VB retorno de carro y avance de línea) Vea mas adelante la aclaración de
esta expresión. Con ella logramos introducir un salto de línea.
Supongo que se habrá percatado de que entre el mensaje y el título de la ventana, hemos
escrito dos comas, esto es porque entre las comas, debe ir un número que representará el
icono a mostrar. Existen cuatro iconos diferentes además de la posibilidad de no mostrar
ninguno. Los iconos son:
(Sólo en W32. En Windows 3.xx dispone de otros diferentes, aunque con el mismo significado)
Para mostrar el icono en cuestión o para que Visual Basic lo entienda, es necesario escribir lo
siguiente:
El resultado es:
Aceptar vbOKOnly ó 0
Aceptar y Cancelar vbOKCancel ó 1
Anular, Reintentar, Ignorar vbAbortRetryIgnore ó 2
Sí, No y Cancelar vbYesNoCancel ó 3
Sí y No vbYesNo ó 4
Reintentar y Cancelar vbRetryCancel ó 5
Aplicación modal vbApplicationModal ó 0 (Es la caja de mensaje sin
icono)
La forma de hacer esto es sumar al parámetro del icono que queremos mostrar el valor de los
botones que deseamos que aparezcan.
Así por ejemplo:
MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo , "Ejemplo"
El resultado es:
Aún así, es posible que deseemos que el Focus lo adquiera otro un botón determinado. Por
ejemplo, en este caso el Focus lo tiene el botón Sí, pero es posible que deseemos que lo tenga
el botón No por ejemplo. Esto se consigue con los siguientes parámetros:
Primer botón predeterminado vbDefaultButton1 ó 0
Segundo botón predeterminadovbDefaultButton2 ó 256
Tercer botón predeterminado vbDefaultButton3 ó 512
Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo +
vbDefaultButton2, "Ejemplo"
El resultado es:
Ahora bien, si decidimos mostrar un mensaje esperando una respuesta, o queremos saber que
botón ha pulsado el usuario, esto lo podemos conseguir mediante el siguiente código de
respuestas:
Aceptar vbOK ó 1
Cancelar vbCancel ó 2
Anular vbAbort ó 3
Reintentar vbRetry ó 4
Ignorar vbIgnore ó 5
Sí vbYes ó 6
No vbNo ó 7
If Resp = 6 Then
MsgBox "Ha pulsado SI"
Else
MsgBox "Ha pulsado NO"
End If
Si pulsamos el botón Sí obtendremos una acción, y si pulsamos el otro botón otra acción.
Ahora bien, para elegir o seleccionar un evento o acción, el usuario debe saber combinar los
códigos, sabiendo que un MsgBox posee la siguiente sintaxis principal:
MsgBox Mensaje, Botones, Título de la ventana
InputBox
El InputBox nos permite sacar una caja donde el usuario pasará un parámetro, valor o dato
para que el programa lo trate y lo ejecute.
El mensaje que quiere que aparezca se realiza de forma casi idéntica al MessageBox. Puede
escribirse varias líneas de texto seguidas por la constante de Visual Basic vbCrLf o salto de
línea o párrafo.
Val almacenará el texto escrito por el usuario, que puede ser una cantidad, cadena string, …
etc.
Por ejemplo:
Dim Val As String
(El usuario teclea el nombre - Mundo Visual - y hace click en Aceptar. A continuación se
muestra el MsgBox - 2ª línea del código anterior )
Ahora bien, podemos determinar un texto predeterminado a la caja de entrada, como por
ejemplo:
La caja de entrada puede ser sin embargo más personalizada mediante dos parámetros como
son la posición de la ventana de entrada de datos en la pantalla. Estos parámetros se ponen a
continuación del ValorPredeterminado.
Por ejemplo:
Estas informaciones son las Propiedades del objeto App. Este objeto no tiene Métodos ni
Eventos.
Comments (Propiedad)
Devuelve o establece una cadena que contiene comentarios sobre la aplicación en ejecución.
Es de sólo lectura en tiempo de ejecución.
CompanyName (Propiedad)
Devuelve o establece un valor de tipo String que contiene el nombre de la empresa o del
creador de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución.
EXEName (Propiedad)
Devuelve el nombre raíz (sin la extensión) del archivo ejecutable que se está ejecutando
actualmente. Si se utiliza en el entorno de desarrollo, devuelve el nombre del proyecto.
Esta propiedad se establece bien en el cuadro de Opciones, bien al guardar el archivo .EXE
FileDescription (Propiedad)
Devuelve o establece un valor de tipo String que contiene información de los archivo de la
aplicación en ejecución. Es de sólo lectura en tiempo de ejecución.
HelpFile (Propiedad)
hInstance (Propiedad)
LegalCopyright (Propiedad)
Devuelve o establece un valor de tipo String que contiene información de derechos de autor
sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución.
LegalTrademarks (Propiedad)
Devuelve o establece un valor de tipo String que contiene información de marca registrada
sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución.
Establezca esta propiedad en tiempo de diseño usando el cuadro de diálogo Opciones de EXE.
Revision (Propiedad)
Mediante las propiedades Major, Minor y Revision obtenemos la versión del programa. Es muy
util conocer la version del programa para saber si lo hay que actualizar. Por ejemplo, la
instrucción:
MiVariable = App.Major & “.” & App.Minor & “.” & App.Revision
Así conocemos que la versión del programa es la 2.1.4. Estos datos de Major, Minor y
Versión hay que introducirlos en el programa durante el tiempo de diseño. Se usa para ello la
caja de Propiedades del Proyecto
Path (Propiedad)
Especifica la ruta de acceso del archivo .VBP de proyecto cuando se ejecuta la aplicación
desde el entorno de desarrollo o la ruta de acceso del archivo .EXE cuando se ejecuta la
aplicación como un archivo ejecutable.
Esta propiedad es sumamente útil. Cuando se realiza una aplicación, no es prudente obligar al
usuario a meterla dentro de un determinado directorio impuesto por el programador. Si no es
así, no sabremos en qué directorio está el ejecutable, y es muy conveniente saberlo, sobre
todo cuando se utilizan ficheros auxiliares de inicialización, que deberían estar en el mismo
directorio de la aplicación. Si queremos abrir el fichero MiAplicacion.Cfg que estará
obligatoriamente en el mismo directorio de la aplicación (aunque no conocemos su nombre),
solamente tenemos que poner la línea de código : Open App.Path & “\MiAplicacion.ICfg” For
Input as # 1, sin importarnos cual es el nombre real de ese directorio.
PrevInstance (Propiedad)
Devuelve un valor booleano que indica si hay ya en ejecución una instancia anterior de una
aplicación. Es muy utilo saber que hay una instancia del programa en ejecución para impedir
que se vuelva a abrir otra.
ProductName (Propiedad)
Establezca esta propiedad en tiempo de diseño usando el cuadro de diálogo Opciones de EXE.
El valor de la propiedad Revision está dentro del rango 0 a 9999.Esta propiedad proporciona
información sobre la versión de la aplicación en ejecución. Esta propiedad se establece en
tiempo de diseño usando el cuadro de diálogo Opciones de EXE.
StartMode (Propiedad)
Devuelve o establece un valor que determina si una aplicación se inicia como proyecto
independiente o como servidor de automatización OLE. De sólo lectura en tiempo de
ejecución.
TaskVisible (Propiedad)
Title (Propiedad)
Valor será una expresión de cadena que especifica el título de la aplicación. La longitud
máxima de valor es 40 caracteres.
Esta propiedad está disponible en tiempo de diseño en el cuadro de diálogo del comando
Crear EXE del menú Archivo.
Todos estos datos figuran en el archivo de proyecto (.VBP). Puede verse editándolo con el
Block de Notas de Windows, e incluso pueden modificarse estas propiedades directamente
sobre ese archivo.