Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2006
Avatar de ebarbeito
ebarbeito ebarbeito is offline
Registrado
 
Registrado: sep 2005
Ubicación: Alicante (Spain)
Posts: 2
Poder: 0
ebarbeito Va por buen camino
Question Formularios: gestión MainForm+LoginForm+SplashForm

Saludos a los lectores del foro.

A continuación, paso a plantearos un problema que me ha surgido, por si me pudiérais echar un capote aportando sugerencias. Tengo tres formularios:
  • frmLogin : Inicio de sesión de usuario (login).
  • frmSplash : Pantalla de bienvenida.
  • frmMain : Principal.
Además, tengo un fichero INI de configuración para ciertas variables de la aplicación. De entre ellas, al iniciar la aplicación, el usuario puede elegir entre:
  • Realizar petición de "inicio de sesión" o no. Si habilita el inicio de sesión (frmLogin) la aplicación deberá seguir ([frmSplash] + frmMain) cuando se introduzca un usuario-contraseña correcto. Si no se habilita, la aplicación seguirá su curso ([frmSplash] + frmMain) empleando un "usuario predeterminado".
  • Mostrar (o no) pantalla de bienvenida. Si se habilita, pues se mostrará la pantalla de bienvenida mientras se van cargando el resto de datos de inicialización del programa.
Con lo que el flujo del programa podrá ser de varias formas:
  • frmLogin -> frmSplash -> frmMain
  • frmLogin -> frmMain
  • frmSplash -> frmMain
  • frmMain
Mi duda es que no estoy muy seguro de cuál puede ser el modo más apropiado a la hora de gestionar esta forma de "iniciación de la aplicación" (múltiples ventanas en función de según que opciones de usuario). He modificado el fichero del proyecto para abarcar todo esto, y lo he dejado tal que así:

Código Delphi [-]
program mR;

uses
  Forms,
  fmain in 'forms\fmain.pas' {frmMain},
  ExBar in 'units\ExBar.pas',
  flogin in 'forms\flogin.pas' {frmLogin},
  fsplash in 'forms\fsplash.pas' {frmSplash},
  TConfig in 'units\TConfig.pas',
  SysUtils;

{$R *.res}

begin
  Application.Initialize;

  With Config.Create(ChangeFileExt (Application.ExeName,'.ini')) Do
  Try
    Load;

    If getUserSession Then
    Begin
        frmLogin := TfrmLogin.Create(Application);
        frmLogin.ShowModal
    End;

    If Not Application.Terminated Then
    Begin
        If getSplash Then
        Begin
            frmSplash := TfrmSplash.Create(Application);
            frmSplash.Update
        End;

        Application.CreateForm(TfrmMain, frmMain);

        If getSplash Then
            frmSplash.Free;
    End;
  Finally
    Free;
  End;

  Application.Run;
end.

Explico un poco. La unidad TConfig alberga el mecanismo que me he creado para trabajar con mi fichero INI (en resumen, una serie de registros y una clase Config). En el bloque begin-end del fichero del proyecto lo que hago es instanciar un objeto Config en el que hago una lectura global del fichero INI (metodo Load; que inicializa los datos miembro de la clase con las claves extraidas de cada sección/campo del fichero INI) y luego compruebo si hay que abrir o no el formulario de "inicio de sesion" (con el método getUserSession). Por ahí se puede ver también que se utiliza otro método parecido: getSplash (análogo a getUserSession solo que para el formulario de bienvenida).

Compruebo Application.Terminated (True o False) porque en caso de cargar el Inicio de sesión y de que el usuario no haya pasado la prueba de autenticación (es decir, introducir un usuario/contraseña correcto durante X intentos), en el propio formulario de inicio de sesión (frmLogin) invoco al método Terminate de Application. Por si quedara más claro, aquí adjunto el código (temporal) del evento Click del botón "Aceptar" de frmMain utilizado para validar los datos introducidos por el usuario:

Código Delphi [-]
procedure TfrmLogin.cmdOkClick(Sender: TObject);
begin
    If editPasswd.Text <> 'a' Then
    Begin
        ShowMessage ('Contraseña incorrecta.');
        Application.Terminate
    End
    Else
    Begin
        allowed := True;
        Self.Close
    End;
end;

Como he dicho, es un código de prueba temporal. He llamado a Application.Terminate desde allí porque de algún modo tengo que "cortar de ráiz" la ejecución en el momento que el usuario haya demostrado que no ha sabido introducir un usuario/contraseña válido.

Bueno, y este rollete no es más para ver si existe un modo más elegante (seguro) para lograr un inicio de aplicación como el propuesto (con MainForm+[LoginForm+SplashForm]).

Gracias por la ayuda que me puedan brindar

Última edición por ebarbeito fecha: 06-02-2006 a las 23:04:50.
Responder Con Cita
  #2  
Antiguo 07-02-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Esta un poco liado ese asunto de condicionar cada ventana segun un valor.
Por lo regular utilizo el codigo de este post para mostrar un Splash-Login-Principal.

De ahi en adelante solo debes condicionarlo.

Pd:Confieso que no llegue a leer todo tu mensaje.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 08-02-2006
Avatar de ebarbeito
ebarbeito ebarbeito is offline
Registrado
 
Registrado: sep 2005
Ubicación: Alicante (Spain)
Posts: 2
Poder: 0
ebarbeito Va por buen camino
vtdeleon, gracias por tu respuesta :-) Aunque al final he modificado un poco la solución que pegué en mi primer mensaje.

Me he creado una variable (booleana) "allowed" dentro de la unidad flogin (unidad que alberga el formulario de inicio de sesión, frmLogin) que por defecto se encuentra a True. Con ella controlo en el fichero del proyecto el acceso, o no, al formulario principal. allowed cambiará a False en el comportamiento de frmLogin, cuando no se haya obtenido acceso legal a través del mismo (usr/pwd válidos). De este modo no tengo que llamar a Application.Terminate desde ninguna parte ni tampoco comprobar Application.Terminated (como puse en mi anterior mensaje)

Pego el fragmento de código del cuerpo modificado. Y, por supuesto, sigo abierto a sugerencias.

Código Delphi [-]
begin
  Application.Initialize;

  // comprobación de valores de configuración al iniciar
  With Config.Create(ChangeFileExt (Application.ExeName,'.ini')) Do
  Try
    // cuando se desea inicio de sesión
    If getUserSession Then
    Begin
        frmLogin := TfrmLogin.Create(Application);
        frmLogin.ShowModal
    End;

    // cuando el acceso es permitido
    If flogin.allowed Then
    Begin
        // cuando se desea ventana de bienvenida
        If getSplash Then
        Begin
            frmSplash := TfrmSplash.Create(Application);
            frmSplash.Update
        End;

        // instantiación de formularios, datos, etc.
        Application.CreateForm(TfrmMain, frmMain);
        { ... }

        If getSplash Then
            frmSplash.Free;
    End;

  Finally
    Free;
  End;

  // let's go!
  Application.Run;
end.
vtdeleon el código al que me has referenciado no me valía para cómo quería que se comportara el inicio de la aplicación. En caso de tener que lanzar el formulario frmLogin, solo me interesa crear la ventana de bienvenida (frmSplash) y el principal (frmMain) si se validan satisfactoriamente los datos de autenticación. En otro caso, no hace falta reservar memoria para más objetos pues la aplicación deberá entonces terminar.

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:37:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi