El código de arranque de una aplicación (II)

En el artículo anterior vimos cómo se podía cambiar el código de arranque de una aplicación Xailer, de forma que se ejecute una función donde podemos hacer lo que queramos. Pues bien, ahora vamos a ver qué debemos poner en esa función para mostrar una ventana de entrada, al mismo tiempo que mostramos la ventana principal del programa; pero además, antes de dejar al usuario acceder a sus opciones, mostraremos la típica ventana de validación de usuario y contraseña y si no son correctos, abandonaremos el programa.


Para la ventana de entrada, lo más sencillo es crear un formulario (llamémosle TEntrada) a cuya propiedad nBorderStyle le asignamos el valor bsSPLASH. Lo completamos con una imagen de fondo de nuestro agrado, y lo redimensionamos al tamaño de dicha imagen (en el ejemplo no voy a poner ninguna para no tener que incluirla en el fichero de descarga). Ahora necesitamos que esta ventana se muestre y desaparezca pasados unos segundos (digamos 4). Para esto, simplemente añadimos un componente TTimer al formulario, ponemos nInterval = 4000, lEnabled = .T. y en el evento OnTimer escribimos:

METHOD Timer1Timer( oSender ) CLASS TEntrada

   ::Close()

RETURN Nil

Para el formulario principal, en este ejemplo vamos a crear simplemente un formulario (TPrincipal) con nShowMode = smMAXIMIZE. Y ahora vamos a escribir la función Empezar() que estará en el módulo de entrada al programa, tal y como vimos en el artículo anterior:

Procedure Empezar()

   TEntrada():New( Application ):Show()
   TPrincipal():New( Application ):Show()

Return

Si compilamos y ejecutamos el programa podremos ver que se muestra la ventana de entrada y a continuación la ventana principal, pero gracias al estilo bsSPLASH, la ventana de entrada permanece en primer plano, y se cierra automáticamente pasados 4 segundos.

Queda un pequeño detalle… cualquiera puede decirnos: «pero mientras está la ventana de entrada, el usuario puede hacer cosas en la ventana principal». Y tiene razón. Pero lo vamos a solucionar a continuación, después de añadir una tercera ventana para validar un nombre de usuario y contraseña.

Para esta tercera ventana vamos a usar nBorderStyle = bsDIALOG, y colocaremos los controles como en esta imagen:

identificacion

Como detalle diré que el botón de «Aceptar» tiene las propiedades lDefault = .T. y nModalResult = mrOK, mientras que el botón de «Cancelar» tiene la propiedad lCancel = .T.

Además, el botón de «Aceptar» tendrá lo siguiente en su evento OnClick:

METHOD Button1Click( oSender ) CLASS TIdentificacion

RETURN ::oEdit1:Value == "Usuario" .AND.;
       ::oEdit2:Value == "Contraseña"

Como se puede ver, lo único que hace es devolver .T. si se escribe «Usuario» y «Contraseña» respectivamente, y .F. en caso contrario. Y ahora lo único que queda es modificar la función Empezar():

Procedure Empezar()

   LOCAL oEntrada

   oEntrada := TEntrada():New( Application )
   oEntrada:Show()

   TPrincipal():New( Application ):Show()
   oEntrada:ShowModal()

   IF TIdentificacion():New( Application ):ShowModal() != mrOK
      Application:oMainForm:Close()
   ENDIF

Return

Cabe destacar una particularidad: estamos creando y mostrando oEntrada al principio, y después de mostrar la ventana principal, estamos llamando a oEntrada:ShowModal() para volver a mostrarlo. En realidad, la primera vez, cuando llamamos a oEntrada:Show(), se está mostrando; y la segunda vez, cuando llamamos a oEntrada:ShowModal(), no es que se esté volviendo a mostrar, porque ya lo estaba, pero sí se convierte en modal, es decir, la siguiente instrucción no se ejecuta hasta que el formulario se haya cerrado. Esto nos permite controlar que mientras oEntrada está visible, el usuario no puede interactuar con la ventana principal. Por otro lado, el formulario de identificación sólo se va a mostrar cuando ya se haya cerrado oEntrada.

Bueno, esto es todo. Como se puede ver, es muy sencillo controlar el inicio de una aplicación en Xailer, y además, utilizando muy poco código.

El código del proyecto lo puede descargar de aquí

Deja una respuesta