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' ,
ExBar in 'units\ExBar.pas',
flogin in 'forms\flogin.pas' ,
fsplash in 'forms\fsplash.pas' ,
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