Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como ocultar ventana LogIn (https://www.clubdelphi.com/foros/showthread.php?t=76179)

Diego827 14-10-2011 07:44:41

Como ocultar ventana LogIn
 
Hola amigos del Club, tengo una consulta que les parecerá tonta pero soy novato.

Realice un programa con un login, este login cuando es correcto ejecuta la funcion ShowModal() de un segundo Form. El problema es que atrás queda siempre la ventanita del Login; no desaparece obviamente.

Trate de utilizar la funcion Hide(), pero si la utilizo oculta todo incluyendo el segundo Form. Como puedo ocultar el form del login?

Gracias de antemano, un abrazo.

ecfisa 14-10-2011 09:24:31

Hola Diego.

No sé como tenés organizada la creación y aperturas de Forms, pero normalmente un formulario de autentificación debe mostrarse de forma modal, es decir con ShowModal. Ya que la idea es que el usuario se identifique correctamente para ingresar, de otro modo no debería poder acceder a la aplicación.

Entonces sintetizando y de acuerdo al resultado de la verificación de nombre y contraseña, pueden pasar dos cosas:
1. Ingresa los datos correctamente y entra a la aplicación.
2. Ingresa erroneamente los datos y termina la aplicacion.
En ambos casos el formulario login debe cerrarse, es decir que una vez verificados los datos, deberías usar el método Close en lugar de Hide.

El por qué se oculta todo, como te dije al principio, depende de como estés haciendo la creación y aperturas de forms. Sería de gran ayuda que nos pusieras simplificadamente el código con que lo estas realizando.

Saludos.

Diego827 15-10-2011 04:32:48

Te comento
 
Te comento amigo: realice un programa que tiene una ventana de log-in como principal, tiene dos textbox (uno con mascara para los "*"), se pincha el boton de ingresar si el usuario y contraseña estan bien muestra una ventana de forma modal (ShowModal()), pero queda atras la otra ventanita.

Ya intente esto:

en el evento OnShow de la ventana 2 que oculte el form_login con -Hide()- pero oculta todo pues la ventana principal del programa es el Form_login.
en el evento OnCreate de la ventana 2 que oculte el form_login con -Hide()- pero da error puesto que no coloco la ventana 2 como disponible sino como autocreate en Project->Options->Forms.
Si utilizo close() me cierra toda la aplicacion :(

Que puedo hacer?

(

Gracias por responder ecfisa :rolleyes:

ecfisa 15-10-2011 05:39:34

Hola Diego.

En principio yo no haría que el form de autentificación fuera el principal, Sí lo llamaría desde el evento OnShow del form principal y verificaría la condición de salida para decidir si termina la aplicación o continua.

Más o menos de este modo:
Código:

void __fastcall TfrMain::FormShow(TObject *Sender)
{
 frLogin = new TfrLogin(this);
 int ExitResult = frLogin->ShowModal();
 delete frLogin;
 if (ExitResult == mrCancel) 
  Application->Terminate();
}

Previamente hay que quitar frLogin de Proyect->Options->Forms->Auto-create forms.


Un saludo.

Diego827 15-10-2011 15:47:25

Gracias por responder en cuanto lo pruebe posteo.

Un abrazo.

escafandra 15-10-2011 17:02:22

Algo parecido a la solución de ecfisa es lo que hago yo, pero no en el evento OnShow, pues puede darse mas veces si ocultamos y mostramos el Form.

Yo lo hago en el WinMain:

Código:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
      Application->Initialize();

      TLogin *Log = new TLogin(0);
      if(Log->ShowModal() == mrOk)
          Application->CreateForm(__classid(TForm1), &Form1);
      delete Log;
      Application->Run();
  }
  catch (Exception &exception)
  {
      Application->ShowException(&exception);
  }
  return 0;
}

Una solución a la propuesta de hacerlo en el OnShow es colo car una bandera estática:
Código:

void __fastcall TfrMain::FormShow(TObject *Sender)
{
  static bool Primera_vez = true;
  if(Primera_vez){
      frLogin = new TfrLogin(this);
      int ExitResult = frLogin->ShowModal();
      delete frLogin;
      if (ExitResult == mrCancel) 
        Application->Terminate();
      Primera_vez = false; 
  }
}

Aún así, prefiero la primera técnica pues de esa manera nunca se crea el formulario principal.

Saludos.

Diego827 17-10-2011 20:44:36

Excelente! Gracias a los dos!
 
Cita:

Empezado por ecfisa (Mensaje 415673)
Hola Diego.

En principio yo no haría que el form de autentificación fuera el principal, Sí lo llamaría desde el evento OnShow del form principal y verificaría la condición de salida para decidir si termina la aplicación o continua.

Más o menos de este modo:
Código:

void __fastcall TfrMain::FormShow(TObject *Sender)
{
 frLogin = new TfrLogin(this);
 int ExitResult = frLogin->ShowModal();
 delete frLogin;
 if (ExitResult == mrCancel) 
  Application->Terminate();
}

Previamente hay que quitar frLogin de Proyect->Options->Forms->Auto-create forms.


Un saludo.

Señores, gracias por su tiempo. Les comento: Desconocia el comportamiento real de la funcion ShowModal(); resulta que ahora si es principal la form2 y el login lo deje asi:

Form2 On Show{
form_login->ShowModal();
}

y si era correcto el ingreso, en el form_login se realizaba la operacion:

form_login->close();

y listo.

Gracias por su tiempo amigos!!!


La franja horaria es GMT +2. Ahora son las 07:38:06.

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