PDA

Ver la Versión Completa : Ocultar ventanas


Melissa_12
07-01-2013, 21:45:12
Hola, no se si este hilo deba ir aqui pero este es mi problema: Tengo una ventana en la cual me conecto a una base de datos, una vez que he realizado la conexion puedo ver la ventana principal de mi aplicacion, pero si muevo la ventana con el mouse puedo ver la ventana de la conexion detras, o sea la ventana que se supone que se cierre, he probado con destruirla pero me da error, no se que hacer porque esa ventana es obligatoria y se me ve muy feo que este ahi. Muchas Gracias.

Casimiro Notevi
07-01-2013, 22:00:12
Hay muchas formas de solucinarlo, aunque deberías poner tu código para aconsejarte según la forma en que tú lo haces.

nlsgarcia
07-01-2013, 22:45:13
Melissa_12,


Tengo una ventana en la cual me conecto a una base de datos, una vez que he realizado la conexion puedo ver la ventana principal de mi aplicacion, pero si muevo la ventana con el mouse puedo ver la ventana de la conexion detras, o sea la ventana que se supone que se cierre, he probado con destruirla pero me da error, no se que hacer porque esa ventana es obligatoria

Revisa este link:

Cerrar Formulario: http://www.clubdelphi.com/foros/showthread.php?t=81430&highlight=jjmtzhdz
Espero sea útil :)

Nelson.

Melissa_12
12-01-2013, 20:01:22
Hola, pues me he demorado un poco en responder pero he probado el enlace que me ha dicho Nelson y no se muy bien donde poner el codigo que viene. O sea, ya he puesto la funcion para poner la forma que quiero como forma principal pero desde donde debo llamar el procedimiento?.

Por ejemplo: tengo un formulario donde el usuario se autentica, si la contrasenna y el usuario son correctos pasa al Form1, pero el formulario de autenticacion sigue quedando detras del Form1. Llame al procedimiento en el boton de Aceptar para validar el usuario y la contraseña, pero cuando voy a cerrar el Form1 me da el siguiente error:
"cannot change visible in onshow or onhide" y no tengo la menor idea de que pueda se. Muchas Gracias.

ecfisa
12-01-2013, 21:14:02
Hola Melissa_12.

Si el form es un inicio de seción a la aplicación, revisa estos enlaces:

login delphi (http://www.clubdelphi.com/foros/showthread.php?t=77452)
Formlulario Login/Pass y Form Principal (http://www.clubdelphi.com/foros/showthread.php?t=75324)
Como ocultar ventana LogIn (http://www.clubdelphi.com/foros/showthread.php?t=76179)
Una ayuda por favor (http://www.clubdelphi.com/foros/showthread.php?t=76008)



Si se trata de una verificación para permitir o negar el ingreso a determinada acción u otro formulario, podes hacer:

Formulario login:

...
var
frmLogin: TfrmLogin;

implementation

(* Aquí declaro las variables Nombre y Password como ejemplo.
En tu caso, supongo, obtendras los datos de un archivo *)
var
Nombre : string = 'Nombre';
Password: string = 'Password';

procedure TfrmLogin.FormCreate(Sender: TObject);
begin
BitBtnAceptar.ModalResult := mrOK;
BitBtnCancelar.ModalResult := mrAbort;
EditPwd.PasswordChar:= '*' //(si no deseas mostrar lo que escribe)
end;

procedure TfrmLogin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (EditName.Text <> Nombre)or(EditPwd.Text <> Password) then
ModalResult:= mrAbort;
Action:= caFree
end;

procedure TfrmLogin.FormDestroy(Sender: TObject);
begin
frmLogin:= nil;
end;
end.


Formulario que llama previamente a frmLogin para permitir (o no) el acceso a determinada acción:

procedure TfrmMain.ButtonAccedeClick(Sender: TObject);
begin
frmLogin:= TfrmLogin.Create(nil);
if frmLogin.ShowModal = mrOk then
ShowMessage('Ingresa') // En tu caso abrir el otro form
else
ShowMessage('No ingresa');
end;

Tenes que quitar a frmLogin de: Project -> Options -> Forms -> Auto-create forms.

Saludos.

nlsgarcia
13-01-2013, 04:44:34
Melissa_12,


He probado el enlace que me ha dicho Nelson y no se muy bien donde poner el código que viene. O sea, ya he puesto la función para poner la forma que quiero como forma principal pero desde donde debo llamar el procedimiento?

En el caso particular de que el Form de acceso de tu aplicación sea el MainForm, puedes una vez validado y aceptado el acceso del usuario al sistema, colocar el siguiente código antes de llamar a la primera pantalla de tu aplicación (Se asume que FormLogin es el MainForm):

// Código de ejemplo del Formulario FormLogin:

// Cambia el formulario principal en Runtime.
procedure SetAsMainForm(aForm:TForm);
var
P : Pointer;
begin
// Dirección del Formulario Principal
P := @Application.Mainform;
// Cambia la Dirección del Formulario Principal
Pointer(P^) := aForm;
end;

// Valida el acceso a la aplicación
procedure ValidateLogin(UserName, PassWord : String);
begin

// Ejecutas el código de validación de acceso de tu aplicación.

// Si el acceso fue valido ejecutas el código siguiente:

// Establece FormApp con FormMain
SetAsMainForm(FormApp);

// Muestra FormApp
FormApp.Show;

// Cierra FormLogin
FormLogin.Close;

end;

El código anterior establece a FormApp como formulario principal en vez de FormLogin y cierra el formulario de login.

Una forma mas estándar de usar un formulario de login es la siguiente:

procedure TForm1.FormCreate(Sender: TObject);
begin

Form2 := TForm2.Create(nil);
Form2.Visible := False;
Form2.BorderStyle := bsDialog;

if Form2.ShowModal = mrOk then
begin
Form1.BringToFront;
Form2.Release;
end
else
Application.Terminate;

end;

El código anterior llama en el evento OnCreate de Form1 al formulario de login Form2 el cual valida el acceso a la aplicación. Form2 no se encuentra configurado en: Project -> Options -> Forms -> Auto-create forms y por ser de tipo Modal, Form1 no se visualizara hasta que el acceso sea valido, caso contrario finalizara la aplicación.

Te anexo un ejemplo de login usando una aplicación MDI, pero la lógica es la misma para aplicaciones SDI. El ejemplo esta disponible en el link: http://terawiki.clubdelphi.com/Delphi/Ejemplos/Varios/?download=Login.rar

El ejemplo de cambiar el formulario principal del Mensaje 3 esta disponible en el link: http://www.clubdelphi.com/foros/attachment.php?attachmentid=2477&d=1353126375

Espero sea útil :)

Nelson.

Melissa_12
25-01-2013, 17:29:18
Hola, disculpen por demorarme tanto en responder pero es que pense que ya habia resuelto el problema, resulta que hoy dando una ultima hojeada vi que la ventana principal sigue haciendo lo mismo.
Voy a dar una idea general:
Tengo una ventana de conexion a mi servidor, esta ventana solo se mostrara cuando la conexion no se haya podido efectuar para que el usuario introduzca los datos correctamente, de lo contrario esta venatana sera transparente al usuario. Cuando el usuario no se ha podido conectar con el servidor, para que la ventana no se quede detras del login(que es la proxima ventana que muestro si logro establecer la conexion) hago esto:

Login := TForm1.Create(Self);
SetAsMainForm(Login);
Form25.Close;
Login.Showmodal;

Entonces se muestra la ventana de Login correctamente, cuando introduzco el usuario y la contraseña en caso que esten correctos:

Main := TForm2.Create(Self);
SetAsMainForm(Main);
Main.Show;
Form1.Free;

Y se queda la ventana del Login detras de la principal, ya he probado con Close pero me da error, he probado con Release y tambien, ya no se que hacer. Muchas Gracias por su tiempo.

ecfisa
25-01-2013, 17:45:29
Voy a dar una idea general:
Tengo una ventana de conexion a mi servidor, esta ventana solo se mostrara cuando la conexion no se haya podido efectuar para que el usuario introduzca los datos correctamente, de lo contrario esta venatana sera transparente al usuario.
...
Y se queda la ventana del Login detras de la principal, ya he probado con Close pero me da error, he probado con Release y tambien, ya no se que hacer. Muchas Gracias por su tiempo.
Hola Melisa_12.

¿ Ya Intentaste con el código sugerido en el mensaje #5 ?

Saludos.

nlsgarcia
25-01-2013, 18:00:29
Melissa_12,


Y se queda la ventana del Login detras de la principal, ya he probado con Close pero me da error...


Solo debes adicionar el Cierre del Formulario Login a tu código:

Main := TForm2.Create(Self);
SetAsMainForm(Main);
Main.Show;
Login.Close;

Te sugiero revisar el Msg #6, en el hay mayor detalle a todo lo comentado y ejemplos que puedes descargar y analizar.

Espero sea útil :)

Nelson.

nlsgarcia
25-01-2013, 19:32:03
Melissa_12,

Nota Adicional al Msg #9:

No puedes efectuar Operaciones con los métodos Close o Release sobre un Formulario que no esta instanciado, en este caso Form1 según tu código del Msg #7, esto provocara un mensaje de Access violation, no obstante el método Free si puede ser utilizado, es por ello que tu código anterior no da error pero tampoco libera el formulario de acceso dado que no es Form1 es Login.

Espero sea útil :)

Nelson.

Melissa_12
28-01-2013, 18:48:44
Hola Nelson, muchas gracias por el tiempo que te tomas tratando de ayudarme. Pero es que no logro dar con la solucion.
No entiendo por ejemplo si en el primer formulario que tengo(que es la conexion con la base de datos) se cierra correctamente para dar paso a la de autenticar con el metodo SetAsMainForm, despues cuando quiero que el formulario principal sea el formulario Main y le paso el mismo metodo no lo ve como principal y no me deja cerrar el del login, de verdad que no se.
He visto los ejemplos que me has recomendado pero no me sirven porque es que tengo un primer formulario como ya he dicho para establecer la conexion en caso que los datos sean erroneos. Muchas gracias por la ayuda.