Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
Confirmación de cerrar ventana.

Hola.
Tengo la ventana principal de la aplicación en vcl, la cual quiero que cuando den al botón de cerrar la ventana, me salga una segundo form que diga: si está seguro de salir del programa. Tengo los dos forms pero que tengo que hacer para llamar a ese segundo form al dar al botón de cerrar (X) y desde donde?

Y en el segundo form tengo dos botones. Uno que sería el "si" que cierra los dos forms y sale del programa y otro con "no" que cierra solo el segundo form y se mantiene en el programa en el form 1.

Gracias.
Responder Con Cita
  #2  
Antiguo 24-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Usa el evento OnCloseQuery del primer formulario para llamar al segundo. Por otra parte, quizá no lo sepas pero no es necesario usar un segundo formulario para preguntar al usuario ya que puedes hacer uso de la función MessageBox de la API de Windows:

Código Delphi [-]
if MessageBox(
  Handle, 
  '¿Seguro que desea salir de la aplicación?',
  'Confirmar',
  MB_ICONWARNING or MB_YESNO
) = IDNO then
  abort;

// Saludos
Responder Con Cita
  #3  
Antiguo 24-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
CloseQuery

Hola Roman. Prefiero hacerlo con otro form que lleva iconos y logotipo.
En el Form 1, en evento doy doble click en CloseQuery. Me sale en el code:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Form3.ShowModal;
end;

Después del begin pongo Form3.ShowModal; Está bien?

En el form principal tengo varios botones y uno de ellos es salir. Cuando doy al botón llamo al Form3 que es el mismo que llamo con el CLoseQuery dando a cerrar (x) de la ventana principal. Funciona. De las dos maneras sale el Form3.

En el Form3 tengo los botones de si y no. Primero estoy haciendo el no. code:

procedure TForm3.Button2Click(Sender: TObject);
begin
Close;
end;

He puesto close; está bien?

Lo que tiene que hacer el form3, boton de no, es cerrar solo el form3. Cuando el Form3 se abre desde el botón de salida del form principal, funciona, se cierra sólo el Form3. Pero si el form3 se abre por darle a la (X) cerrar del Form principal, al darle al botón de no del Form3 se cierra el form3 y el form principal, los dos, y tendría que cerrarse sólo el form3.
Que hago mal?

Gracias.-
Responder Con Cita
  #4  
Antiguo 24-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En principio no debería haber diferencia pero vamos a organizarlo mejor.

ShowModal es una función y es su valor de regreso lo que debes examinar en el OnCloseQuery del form principal:

Código Delphi [-]
CanClose := (Form3.ShowModal = mrYes);

No necesitas programarle nada a los botones de Form3. En su propiedad ModalResult pon mrYes para el botón "SÍ" y mrNo para el botón "NO".

Cuando presionas uno de ellos, el formulario Form3 se cierra y ShowModal regresa el valor de la propiedad ModalResult del botón oprimido. (Un formulario modal se cierra automáticamente en cuanto su propiedad ModalResult, que se establece por los botones, es distinta de cero, mrNone).

// Saludos
Responder Con Cita
  #5  
Antiguo 24-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
Hola Roman gracias por la ayuda.

El code del form principal queda así:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (Form3.ShowModal = mrYes);
end;

Y he quitado la programación de los botones del form3. Les he puesto en el modal result mrYes para el botón si y mrNo para el botón no. Lo he probado y cuando cierro la ventana principal con la X salta el form 3 y funcionan correctamente los dos botones. El no solo cierra el form3 y el si cierra el form3 y el form1.
Pero cuando doy al botón salir del principal form, salta el form3 (bien) y le doy al botón no y funciona correctamente, se cierra sólo el form3, pero le doy al botón si y sólo se cierra el form3 y el form principal no se cierra. En teoría tiene que cerrar los dos.

Hay algo que hago mal?

tengo que poner algo más?

Gracias otra vez.
Responder Con Cita
  #6  
Antiguo 25-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por gontxalo
Hay algo que hago mal?

tengo que poner algo más?
No y no. Al menos no me lo parece y acabo de probarlo y funciona bien. ¿Qué código usas en el botón Salir del formulario principal?

Quizá alguna otra cosa esté afectando. Prueba hacerlo en un proyecto vacío.

// Saludos
Responder Con Cita
  #7  
Antiguo 25-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
Hola Roman
Lo he probado en uno nuevo y tampoco. Me hace lo mismo que te comentaba. Con la x del principal funciona y dando al botón del principal el no funciona y el si sólo cierra el segundo form quedando el principal abierto.

El code del botón de salir del principal es:

procedure TForm1.Button5Click(Sender: TObject);
begin
Form3.ShowModal;
end;

Gracias.
Responder Con Cita
  #8  
Antiguo 25-05-2005
CAOS CAOS is offline
Registrado
 
Registrado: mar 2005
Posts: 9
Poder: 0
CAOS Va por buen camino
Confirmación de cerrar ventana

Tiene pinta de que no estás devolviendo bien el valor de retorno del ShowModal.

Asegurate que tu botón indica mrYes o que el ModalResult es igual a mrYes, que es con el valor que estás haciendo la comparación.
Responder Con Cita
  #9  
Antiguo 25-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
Cierra sólo el Form3 y el principal se queda activo.

Si, el Form3 el botón si tiene en ModalResult mrYes. Y el Form principal el botón de salir sólo tiene:

procedure TForm1.Button5Click(Sender: TObject);
begin
Form3.ShowModal;
end;

El botón salir del form principal en ModalResult tiene mrNone.
Responder Con Cita
  #10  
Antiguo 25-05-2005
CAOS CAOS is offline
Registrado
 
Registrado: mar 2005
Posts: 9
Poder: 0
CAOS Va por buen camino
Vamos a hacerlo con un ejemplo:


Creamos 3 formularios y lo dejamos que sean AutoCreate.
Ahora en el formulario TForm1 le asociamos un botón que en su evento OnClick tenga la apertura del TForm2.
Form2.ShowModal;
En el formulario TForm3 añadimos dos botones, uno con ModalResult a mrYes y el otro a mrNo.
En el evento OnCloseQuery del TForm2 añadimos el siguiente código:
CanClose := (Form3.ShowModal = mrYes);

Si ejecutamos esta aplicación al cerrar el formulario 2 si pulsas sobre el botón con valor de retorno mrYes se cierra y si es mrNo (o cualquier otro valor) no.
Responder Con Cita
  #11  
Antiguo 25-05-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Cita:
Empezado por gontxalo
Hola Roman
No soy Roman, pero vamos a contestar... jejeje

Cita:
Lo he probado en uno nuevo y tampoco. Me hace lo mismo que te comentaba. Con la x del principal funciona y dando al botón del principal el no funciona y el si sólo cierra el segundo form quedando el principal abierto.

El code del botón de salir del principal es:

procedure TForm1.Button5Click(Sender: TObject);
begin
Form3.ShowModal;
end;

Gracias.
Aquí está tu problema... en el código del evento debes poner:

Código Delphi [-]
procedure TForm1.Button5Click(Sender: TObject);
begin
  Close
end;

El evento CloseQuery siempre se ejecuta al momento de mandar cerrar una ventana, así que lo que tenías antes ya debe funcionar bien...


Saludos...
Responder Con Cita
  #12  
Antiguo 25-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
yata Conseguido

Hola Maeyanes.
Pues si.
Es eso. Lo he probado y efectivamente he ahí el fallo.

¡¡¡ funciona!!!

ok

Gracias.
Responder Con Cita
  #13  
Antiguo 25-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Creo que el punto importante aquí es que entiendas el por qué fallaba.

Cuando oprimías el botón "Salir", se mostraba el Form3 que ahí le indicabas y no el programado en el evento OnCloseQuery. De hecho este evento nunca se llamaba porque nunca mandabas cerrar la ventana.

Supongo que el código era un remanente de los primeros intentos que habías hecho tratando de mostrar la ventana de confirmación al momento de apretar el botón "Salir".

Como ahora te das cuenta, la utilidad del evento OnCloseQuery es que se ejecutará independientemente del método que uses para cerrar la ventana principal.

Puedes añadir un item de menú, o un botón en una barra de herramientas con la opción "Salir" o bien presionar Alt-F4, y el código que ahora tienes seguirá funcionando correctamente.

// Saludos
Responder Con Cita
  #14  
Antiguo 26-05-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Poder: 20
gontxalo Va por buen camino
ya lo entiendo

Hola.
Gracias.
Ayer me puse a pensar pero no sabia porque fallaba. Pero ya lo entiendo.
Yo con el botón salir del principal llamaba al form3 y no al programado.
Gracias.
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 01:09:20.


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