Visual Basic - Guía del Estudiante Cap. 8 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: Shell "C:\VB\MARCADOR.EXE 080" Mediante esta línea, lo que hacemos es ejecutar el programa MARCADOR.EXE e introducirle como parámetro el número a marcar. Resultado: el programa MARCADOR.EXE llama al número 080 (Bomberos), y una vez establecida la llamada podemos pasarle a ese Organismo datos o lo que nuestra aplicación haga. Veamos que dice la Ayuda de VB respecto a la Función Shell: Ejecuta un programa ejecutable. Sintaxis Variable = Shell ( rutaDeAcceso [, estiloDeVentana] ) donde: Variable es identificador de la tarea (ID) rutaDeAcceso es el nombre del programa por Ejecutar (con su Path) y cualquier argumentos o conmutadores (switches) de 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. estiloDeVentana es el número correspondiente al estilo de la ventana en la cual se va a ejecutar el programa. En Microsoft Windows, si se omite estiloDeVentana, el programa se inicia minimizado con enfoque. El argumento con nombre estiloDeVentana tiene estos valores: Constante Valor Descripción vbHide vbNormalFocus 0 1 vbMinimizedFocus 2 Se oculta la ventana y se pasa el foco a la ventana oculta. La ventana recupera el foco y vuelve a su posición y tamaño original. La ventana se muestra como un icono con foco. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 1 vbMaximizedFocus vbNormalNoFocus 3 4 vbMinimizedNoFocus 6 La ventana se maximiza con foco. La ventana vuelve al tamaño y posición más recientes. La ventana activa actual permanece activa. La ventana se muestra como un icono. La ventana activa actual permanece activa. Comentarios 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 Private Sub cmbCalculadora_Click() Dim variable As Long variable = Shell("C:\windows\calc.exe", 1) label1.Caption = Str(variable) End Sub Posiblemente lo único que le importe sea el ejecutar esa 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. El programa a ejecutar puede ser un programa Windows caso anterior de la calculadora) o un programa DOS. 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. La declaración de las Apis y Constantes (En la sección de Declaraciones de un Módulo) es la siguiente: Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As _ String, ByVal lpWindowName As String) As Long LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 2 Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal _ bInheritHandle As Long, ByVal dwProcessID As Long) As Long Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode _ As Long) As Long Declaramos las constantes Public Const WM_CLOSE = &H10 Public Const STILL_ACTIVE = &H103 Public Const PROCESS_QUERY_INFORMATION = &H400 El Procedimiento podemos ponerlo en el Módulo anterior o en el formulario. Variará el tipo de declaración de las APIs: Public Sub ExecCmdNoFocus(ByVal CmdLine As String) (CmdLine es el parámetro que le vamos a pasar cuando invoque este procedimiento). 'Este procedimiento inicia un proceso en DOS y espera a que termine 'Una vez terminado este proceso, cierra la ventana, que se mostrará minimizada y sin foco Declaramos las variables locales en ese procedimiento Dim hProcess As Long 'handle del proceso donde se invoca la 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 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine, _ vbMinimizedNoFocus)) Do GetExitCodeProcess hProcess, RetVal Sleep 100 'en este apartado comprueba si está abierta la ventana "Finalizado - ARJ" winHwnd = FindWindow(vbNullString, "Finalizado - ARJ") If winHwnd <> 0 Then RetValls = PostMessage(winHwnd, WM_CLOSE, 0&, 0&) End If Loop While RetVal = STILL_ACTIVE End Sub La ventana DOS del ARJ tiene el Caption Finalizado - ARJ cuando ya ha terminado el proceso. En el procedimiento ExecCmdNoFocus se analiza si esa ventana está presente (prueba de que ARJ ya ha terminado, pues antes de terminar tiene otro Caption). Para llamar a ese procedimiento hay que citarle por su nombre (ExecCmdNoFocus) que como lo hemos declarado Public en un 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 : El parámetro CmdLine del procedimiento es todo lo que va entre paréntesis. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 3 ExecCmdNoFocus ("C:\DirA\ARJ.EXE a C:\DirB\Fichero1.Ext") NO se preocupe si no lo entiende ahora. Es difícil. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 4 LA FUNCION COMMAND En el ejemplo anterior usábamos un ejecutable realizado en C++ para marcar un número telefónico que le introducíamos como parámetro. ¿Podemos hacer eso en una aplicación VB? La respuesta debe ser SI. Usaremos para ello la función Command. Esta función nos devuelve el parámetro introducido tras el nombre del ejecutable realizado en VB, cuando iniciamos la aplicación VB mediante la línea de comandos de Windows (línea Archivo | Ejecutar del Menú de Windows 3.xx o línea Ejecutar de W95), o desde otra aplicación utilizando la función Shell. Veamos también en este caso lo que dice la Ayuda de VB: 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 En las aplicaciones desarrolladas con Visual Basic y compiladas en un archivo .EXE, Command devuelve los argumentos que aparezcan en la línea de comandos tras el nombre de la aplicación. Por ejemplo: 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: Shell Marcador.exe 1234567 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: Private Sub Form_Activate() FRMARCADORL1.Caption = Command End Sub También podemos pasar parámetros a un ejecutable, mediante el Drag & Drop de Windows. Hemos visto mas atrás como podemos hacer Drag & Drop en una aplicación VB. Pero como comentábamos, el D&D no es una función de VB, sino de Windows. Y Windows lo utiliza en su LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 5 Explorador de Windows para pasar como parámetro a una aplicación el nombre del fichero que arrastremos hacia el icono que representa a esa aplicación. Como estoy seguro que se ha liado, vamos con un ejemplo. Si Vd. hace un editor de textos (Editor.EXE) que soporta un formato determinado (por ejemplo el RichTextFormat RTF), para ejecutar su programa y meterle como 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.) LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 6 La Función DoEvents Cede el control de la ejecución al sistema operativo, para que éste pueda procesar otros eventos. También nos permite conocer el número de formularios abiertos en una aplicación. 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. Do Until Transmitido = True Rem Si Transmitido no llega nunca a ser true, nunca podrá salir del bucle DoEvents ‘Esta función devuelve el control al sistema operativo cada vez que se ejecuta ‘y puede comprobar si se han pulsado las teclas Ctrl-Alt-Sup Loop 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. Precaución Asegúrese de que el procedimiento que ha cedido el control con DoEvents no se ejecute de nuevo desde una parte diferente del código antes de que regrese la primera llamada a DoEvents. Esto podría causar resultados impredecibles. Además, no use DoEvents si existe la posibilidad de que otras aplicaciones interactúen con el procedimiento, de formas imprevistas, durante el tiempo en éste ha cedido el control. EJEMPLO Para explicar la función DoEvents se ha preparado un pequeño ejercicio con un formulario principal (Form1) y dos formularios auxiliares, estos últimos solamente a efectos de contar, mediante DoEvents el número de formularios abiertos. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 7 Se declara la variable PARAR como booleana en las declaraciones del Form1 El botón COMENZAR introduce un bucle que no pararía nunca. También pone Label1 de color Verde. Private Sub Command1_Click() Label1.BackColor = RGB(0, 255, 0) Do While PARAR = False N=N+1 If N = 1000 Then 'Cada vez que N=1000 ejecuta la función DoEvents. DoEvents N=0 End If Loop End Sub En el formulario Form1, al que previamente le hemos puesto la propiedad KeyPreview a True, se le ha puesto este código en su procedimiento KeyPress: Private Sub Form_KeyPress(KeyAscii As Integer) PARAR = True Label1.BackColor = RGB(255, 255, 0) End Sub 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. El botón ROJO tiene este código: Private Sub Command2_Click() PARAR = True Label1.Caption = DoEvents Label1.BackColor = RGB(255, 0, 0) End Sub 'Aquí comprobamos los Formularios que tenemos 'abiertos en este momento. 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. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 8 Los botones FORM2, cierra Form2, FORM3, cierra Form3, lo único que hacen es mostrar u ocultar Form2 y Form3 a efectos de poder comprobar cuantos formularios tenemos abiertos. Private Sub Command4_Click() Form2.Show End Sub Private Sub Command6_Click() Form2.Hide End Sub Private Sub Command5_Click() Form3.Show End Sub Private Sub Command7_Click() Form3.Hide End Sub Por último SALI nos saca del programa. Observe que si no 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. Private Sub Command3_Click() End End Sub 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. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 9 LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 10 Presentación Modal de formularios. Ventana modal (Este tema ha sido tomado parcialmente de las páginas de Mundo Visual - Visual Basic.) 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 Ejecute la aplicación y comprobará como se comporta un formulario mostrado como Modal. Lo dicho para un formulario puede aplicarse para otro tipo de ventanas. El MessageBox y la ventana del CommonDialog son dos ejemplos de ventanas modales. Veamos la primera : La caja de Mensajes. MessageBox o MsgBox Las cajas de mensajes o MessageBox, tienen una función clara, que es la de mostrar una determinada información, aviso, o pregunta para que el usuario tenga conocimiento de ella y actúe. Hay 2 formas diferentes de mostrar información: 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: Debe darse cuenta de algunas cosas: En primer lugar el mensaje, "Hola" que se escribe a continuación de la palabra MsgBox, también debe darse cuenta del botón Aceptar que tiene el Focus de la ventana activa y que sólo hay ese botón, y por último el título de la ventana. Podemos modificar estos parámetros para alcanzar nuestros objetivos, por eso, vamos a escribir ahora este código: MsgBox "Hola", ,"Ejemplo" . LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 11 El resultado es: Como podemos apreciar en el código, la caja de mensaje posee un título Ejemplo y el mensaje, pero es posible que deseemos escribir un mensaje en varias líneas con salto de párrafo. Nada tan fácil como este código por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", , "Ejemplo". El resultado es: 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: Estos iconos corresponden a los siguientes mensajes: Mensaje crítico. Mensaje de pregunta. Mensaje exclamativo. Mensaje de información. (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: Mensaje crítico. Mensaje de pregunta. Mensaje exclamativo. Mensaje de información. VbCritical VbQuestion VbExcalamqtion VbInformation ó ó ó ó 16 32 48 64 Note que es lo mismo insertar VbCritical o 16. Vamos a ver un ejemplo añadiendo un icono al último ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion , "Ejemplo" El resultado es: LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 12 Ahora bien, es posible que queramos mostrar algún otro botón que o bien no sea el de Aceptar o que además del botón de Aceptar haya más botones. Para este propósito, tenemos los siguientes parámetros: Aceptar Aceptar y Cancelar Anular, Reintentar, Ignorar Sí, No y Cancelar Sí y No Reintentar y Cancelar Aplicación modal vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbApplicationModal ó ó ó ó ó ó ó 0 1 2 3 4 5 0 (Es la caja de mensaje sin icono) La forma de hacer esto es sumar al 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 predeterminado vbDefaultButton2 ó 256 Tercer botón predeterminado vbDefaultButton3 ó 512 Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo + vbDefaultButton2, "Ejemplo" El resultado es: LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 13 Si no se señala el botón predeterminado, Visual Basic seleccionará el primer botón. En caso de seleccionar como predeterminado un botón que no existe, (por ejemplo el tercero), Visual Basic seleccionará el primero. Ahora bien, si decidimos mostrar un mensaje esperando una respuesta, o queremos saber que 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 Así por ejemplo, el siguiente código: Dim Resp As Integer Resp = MsgBox("Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo + vbDefaultButton2, "Ejemplo") If Resp = 6 Then MsgBox "Ha pulsado SI" Else MsgBox "Ha pulsado NO" End If Tiene el resultado siguiente: Si pulsamos el 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 LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 14 El InputBox o caja de entrada es otra de las partes más utilizadas para la interacción del usuario con la aplicación. Es importante que el usuario interactúe con la aplicación para ser el protagonista de esta. 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. La sentencia es: Val = InputBox (Mensaje, Titulo, ValorPredeterminado) Val almacenará el texto escrito por el usuario, que puede ser una cantidad, cadena string, … etc. Por ejemplo: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo") MsgBox "Su nombre es: " & Val Tiene como resultado: (El usuario teclea el nombre - Mundo Visual - y hace click en Aceptar. A 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: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual") MsgBox "Su nombre es: " & Val Obtendremos como resultado: LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 15 Es importante determinar que si el usuario elige el botón Cancelar, el programa devolverá una cadena de caracteres igual a 0, es decir, Val ="". 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: Dim Val As String Val = InputBox("Deme su nombre", "Ejemplo", "Mundo Visual", 1200, 1400) Situará la ventana en el eje de las X a 1200 Twips (posición horizontal) y la Y a 1400 twips (posición vertical). Reitero mi agradecimiento a Mundo Visual http://www.ciudadfutura.com/visualbasic/ LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 16 El Objeto App El objeto App representa a la aplicación. Es el objeto Visual Basic que contiene diversas informaciones acerca de la Aplicación. Alguna de estas informaciones se le pueden introducir al proyecto en tiempo de diseño, en el cuadro de Opciones. Para ello basta con ir, en la Barra de Menú de Visual Basic a Herramientas | Proyecto | Opciones y hacer click en Proyecto. Otra parte donde se introducen es en el cuadro de diálogo Opciones de EXE. Para ver este cuadro proceda de la misma forma que si fuese a crear un archivo .EXE de la Aplicación, Haga click en Archivo | Crear Archivo EXE de la Barra de Menú, y una vez que le aparezca el cuadro de diálogo para introducir el nombre, haga click en OPCIONES. 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. Sintaxis MiVariable = App.Comments Se establece esta propiedad en tiempo de diseño usando el cuadro Opciones de EXE. CompanyName (Propiedad) Devuelve o establece un valor de tipo String que contiene el nombre de la empresa o del creador de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.CompanyName Se establece esta propiedad en tiempo de diseño usando el cuadro de Opciones de EXE. Visual Basic toma por defecto el nombre de la compañía con que se cargó VB. 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. Sintaxis MiVariable = App.EXEName Esta propiedad se establece bien en el cuadro de Opciones, bien al guardar el archivo .EXE FileDescription (Propiedad) Devuelve o establece un valor de tipo String que contiene información de los archivo de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.FileDescription Se establece esta propiedad en tiempo de diseño usando el cuadro Opciones de EXE. HelpFile (Propiedad) LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 17 Ya comentada mas atrás. Especifica el nombre (con su Path) del fichero de ayuda. Se introduce en tiempo de diseño en el cuadro de Opciones. Puede cambiarse en tiempo de ejecución. hInstance (Propiedad) Devuelve el controlador de la instancia de la aplicación. Es un Long Sintaxis VariableLong = App.hInstance Cuando se trabaja en un proyecto dentro del entorno de desarrollo de Visual Basic, la propiedad hInstance devuelve el controlador de la instancia de Visual Basic. El valor de esta propiedad lo pone directamente Windows. LegalCopyright (Propiedad) Devuelve o establece un valor de tipo String que contiene información de derechos de autor sobre la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis Mivariable = App.LegalCopyright Esta propiedad se establece en el cuadro de diálogo Opciones de EXE. 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. Sintaxis MiVariable = App.LegalTrademarks Establezca esta propiedad en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. Major Minor (Propiedades) Devuelven o establecen el número mayor (menor) de la versión del proyecto. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.Major MiVariable = App.Minor El valor de estas propiedades están dentro del rango 0 a 9999. Proporcionan información sobre la versión de la aplicación en ejecución. Se establecen en tiempo de diseño usando el cuadro de diálogo Opciones de EXE. Revision (Propiedad) Devuelve o establece el número de revisión de la versión del proyecto. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.Revision 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 Puede devolver un dato parecido a este: LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 18 MiVariable = 2.1.4 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. Sintaxis VariableBooleana = App.PrevInstance Puede utilizar esta propiedad en un procedimiento de evento Load para determinar si el usuario ya está ejecutando una instancia de una aplicación. Dependiendo de la aplicación, puede ser conveniente que sólo haya una instancia de la misma en ejecución al mismo tiempo en el entorno operativo Microsoft Windows. ProductName (Propiedad) Devuelve o establece un valor de tipo String que contiene el nombre de producto de la aplicación en ejecución. Es de sólo lectura en tiempo de ejecución. Sintaxis MiVariable = App.ProductName 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. Sintaxis VariableLong =App.StartMode Donde Valor es un número o una constante que determina la forma de inicio : Constante Valor Descripción vbSModeStandalone 0 (Predeterminado) La aplicación se inicia como proyecto independiente. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 19 vbSModeAutomation 1 La aplicación se inicia como servidor de automatización OLE. TaskVisible (Propiedad) Devuelve o establece un valor que determina si la aplicación aparece en la lista de tareas de Windows. Sintaxis VariableBooleana = App.TaskVisible Donde booleano puede tomar los valores True o False : True (Predeterminado) La aplicación aparece en la lista de tareas de Windows. False La aplicación no aparece en la lista de tareas de Windows. La propiedad TaskVisible sólo puede establecerse a False en aplicaciones que no presenten interfaz, como servidores OLE que no contengan o presenten objetos Form. Mientras la aplicación disponga de interfaz gráfica, la propiedad TaskVisible se establece automáticamente a True. Title (Propiedad) Devuelve o establece el título de la aplicación que aparecen en la Lista de tareas de Microsoft Windows. Si se modifica en tiempo de ejecución, los cambios no se guardarán con la aplicación. Sintaxis App.Title = “Esto es lo que va a figurar en la barra de Titulo” 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. LSB Visual Basic - Guía del Estudiante Capítulo 8 Página 20