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 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Mensaje antes de salir

Leí hace tiempo que habia una función para mostrar un mensaje antes de cerrar la aplicación.

Me explico mejor con un ejemplo: Cuando estamos por ejemplo con el block de notas y damos a salir, nos sale un mensaje que dice "¿Desea usted guardar los cambios antes de salir?" pues bien, eso es lo que quiero hacer yo, que se muestre ese mensaje con los botoncitos respectivos de aceptar y cancelar. Lo tengo que hacer creando una form nueva a mano, o hay algo que te lo de.

gracias y un saludo.
Responder Con Cita
  #2  
Antiguo 05-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
En el evento OnCloseQuery se suministra un parámetro booleano (CanClose). Este parámetro determina si el formulario debe o no cerrarse.

Investiga un poco sobre este evento. Busca en los foros por onCloseQuery y obtendras buenos resultados.

tu deberás hacer algo como:

Código Delphi [-]
if Respuesta_usuario = OK
   then CanClose := TRUE
   else CanClose := FALSE

No tengo Delphi a mano.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Vale buscare, gracias.
Responder Con Cita
  #4  
Antiguo 05-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Para salir del programa en el evento onclose:
Código Delphi [-]
if MessageDlg('¿Está seguro que desea salir del Programa?', mtConfirmation,
       [mbYes, mbNo], 0) = mrYes then
       Action := caFree
     else
       Action := caNone;
Para validar o guardar etc:
Código Delphi [-]
If MessageDlg('¿Desea guardar los cambios',mtConfirmation,[mbYes,mbNo],0) = mrYes 
then
// lo que sea
else
// lo contrario
Bueno me imagino que es asi.
Saludos
Responder Con Cita
  #5  
Antiguo 05-06-2007
sinalocarlos sinalocarlos is offline
Miembro
 
Registrado: sep 2006
Posts: 152
Poder: 18
sinalocarlos Va por buen camino
Caundo usas formas heredadas es facil utilizar en la forma base:

Código Delphi [-]
procedure formabase_frm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
var
i,opcionelegida:integer;
begin
  inherited;
  i:=0;
  opcionelegida:=-1;
  while (i<=ComponentCount - 1) do
  begin
    if (Components[i] is Tdatasource) then
    begin

        if TdataSource(Components[i]).State in [dsedit, dsinsert] then
        begin

           if opcionelegida = -1 then
              opcionelegida:=Application.MessageBox('Existen Datos sin guardar, Desea Grabar los Cambios',
                              'Guardar', MB_YESNOCANCEL + MB_ICONINFORMATION );
           if opcionelegida <> -1 then
           begin
              case opcionelegida of
                  ID_NO:begin
                          TdataSource(Components[i]).DataSet.Cancel;
                  end;//ID_NO
                  ID_YES:begin
                          TdataSource(Components[i]).DataSet.Post;
                  end;//IS_YES
                  ID_CANCEL: begin
                          CanClose := False;

                  end;
              end;//case
           end;//if opcionelegida<>-1 then
        end;//if Tdatasorce
    end;//if components [i]
    inc(i);
 end;//while
end;//proc


Con lo cual Validas todos los datasources de tu forma, que porque datasource y no dataset, es por los que usamos los datasets en un modulo

Espero te sirva de algo
Responder Con Cita
  #6  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Gracias, despues de ponerlo ha quedado muy chulo jejeje
Responder Con Cita
  #7  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Como podría poner el mismo mensaje pero con aparte de 'si' y 'no' poniendo la opcion de 'cancelar'?
Responder Con Cita
  #8  
Antiguo 05-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Para hacer que la combinación sea SI,NO,CANCELAR existe la constante MB_YESNOCANCEL.

Fijate en el ejemplo que te expongo:

Código Delphi [-]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Res: integer;
begin
 Res := MessageBox(0, '¿Desea guardar los cambios antes de salir?', 'Advertencia', MB_ICONINFORMATION or MB_YESNOCANCEL);
 case Res of
 IDYES: begin
         CanClose := True;
         ShowMessage('Se ha presionado SI');
        end;
 IDNO: begin
         CanClose := False;
         ShowMessage('Se ha presionado NO');
       end;
 IDCANCEL: begin
              CanClose := False;
              ShowMessage('Se ha presionado CANCEL');
           end;
  end;
end;
Como notarás, no sólo establezco que dicha constante sino que además, le indico que en la apariencia de cuadro de díalogo aparezca un globo de información.

Te sugiero que veas ayuda sobre el MessageBox() para que conozcas cada constante de parámetro y de salida. Como asi para entender mejor el funcionamiento de MessageBox().

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 05-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Para que ya no tengas que estar pensando en los mensajes.
El programa (Constructor.zip) que esta aqui: http://www.terawiki.clubdelphi.com/D.../Herramientas/
Te ayudara a hacer los mensajes como los quieres, es simplisimo de usar y no se tiene que instalar ni nada, solo le das click y ya.
Una vez hecho el mensaje, copias el codigo (que genera el programa) y lo pegas en delphi, mas simple nada.
Saludos
Responder Con Cita
  #10  
Antiguo 05-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Y como alternativa, puedes emplear Message Dialog de la GExperts. Sitúa el cursor donde quieres poner el código de tu mensaje. Te vas a Message Dialog, le indicas el texto, las contantes.. OK y ¡Listo! ya tienes tu messagebox().

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #11  
Antiguo 05-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Esto lo unico que demuestra es que somos unos perezosos para hacer los mensajes a mano y nos buscamos alternativas, a que no.
Saludos
Responder Con Cita
  #12  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Gracias una vez mas (esta debe de ser la numero 1000) jajaja
De eso se trata, pensar más para hacer menos.
Responder Con Cita
  #13  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Vale ya le he pillado el truco a esto, no es tan dificil, pero una cosilla más, esto se puede hacer para que no cierren el programa de golpe? (evitar que presionen la x de cerrar el programa).
Responder Con Cita
  #14  
Antiguo 05-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
El evento onCloseQuery está precisamente para evitar cerrar un formulario.
Cuando tu presionas en la X se dispara primero el evento onCloseQuery, si tiene asignado algún código en este evento se ejecutará. De otro modo se procede con onClose.

Es decir el orden es:

1). "Preguntar si tiene asignado onCloseQuery": que hacer al momento de recibir la orden de cierre.
2). "Preguntar si tiene asignado onClose": que hacer al momento del cierre.

Ahora, si lo que tu quieres es deshabilitar la X hay varias maneras de hacerlo. Una manera es seteando la propiedad BorderIncons en vacio.
Hay otros trucos para conseguirlo (que en este momento no recuerdo), pero en lo personal no prefiero ocultar dicho botón.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #15  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Lo único que quiero es que cuando se presione la X, salga el típico mensaje de ¿Quiere usted guardar antes de salir? y no que directamente se cierre el programa perdiendo todo...

Lo del mensaje se hacerlo, pero no se como utilizar el onCloseQuery.
Responder Con Cita
  #16  
Antiguo 05-06-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
El código que te expuse son un ejemplo de como se usa en OnCloseQuery.

Lo que tu necesitas hacer es una combinación del onCloseQuery y OnClose.
Si lo que deseas es que el formulario se cierre independientemente si debe o no guardar los cambios deberás hacerlo empleando una variable pública o global que te permita decidir si debe guardar o no. CanClose Deberá ser True.

De modo que que debes hacer algo por el estilo:

Código Delphi [-]
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Rta: integer;
begin
 Rta := MessageBox(0, '¿Quiere usted guardar antes de salir?', 'Advertencia', MB_ICONQUESTION or MB_YESNO);
 if Rta = IDYES
    then DebeGuardar := True
    else DebeGuardar := False;

 CanClose := True; //De cualquier modo debe cerrarse. False para que no se cierre
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if DebeGuardar
     then GuardarCambios;
  Action := caFree; //caFree para que libere la memoria ocupada
end;

procedure TForm1.GuardarCambios;
begin
 // Lo que debas hacer...
end;

Espero haber sido más claro.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Vale gracias, esta tarde si tengo tiempo lo pondré ;-)
Responder Con Cita
  #18  
Antiguo 05-06-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por jorgegetafe
Vale gracias, esta tarde si tengo tiempo lo pondré ;-)
Hola, puede ser que hoy amanecí muy sensible y me has de perdonar estimado jorgegetafe, pero me parece una respuesta no muy cordial de alguien que si se tomo el tiempo de contestar, pero como te digo, se me hace que no dormi bien.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #19  
Antiguo 05-06-2007
Avatar de jorgegetafe
jorgegetafe jorgegetafe is offline
Miembro
 
Registrado: dic 2006
Posts: 238
Poder: 18
jorgegetafe Va por buen camino
Cita:
Empezado por egostar
Hola, puede ser que hoy amanecí muy sensible y me has de perdonar estimado jorgegetafe, pero me parece una respuesta no muy cordial de alguien que si se tomo el tiempo de contestar, pero como te digo, se me hace que no dormi bien.
Salud OS.
:-( Se lo he agradecido y le he dicho que en cuanto pueda lo probaré... ahora mismo no puedo... creo que no hago daño a nadie...
Responder Con Cita
  #20  
Antiguo 05-06-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por jorgegetafe
:-( Se lo he agradecido y le he dicho que en cuanto pueda lo probaré... ahora mismo no puedo... creo que no hago daño a nadie...
Perdona como te dije, por supuesto que le agradeces y hasta ahi hubiese estado bien, pero eso de que si tienes tiempo lo pones es lo que me parece no tan cordial.

No me hagas caso, como te digo, amaneci muy susceptible. sea la paz.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mensaje - Evento... antes de perder el foco, es posible??? ariefez Varios 11 13-07-2007 23:28:21
Mensaje Raro al Salir aplicacion JULIOCTORRESG Varios 6 14-12-2006 22:06:30
Preguntar antes de salir de aplicacion jorgesl Varios 6 19-04-2006 20:25:15
Salir de un While alfredosg19 Varios 5 17-03-2005 02:09:07
COmo genero un mensaje antes de un Sysutils.Abort Bitbanner Conexión con bases de datos 19 16-02-2005 17:41:58


La franja horaria es GMT +2. Ahora son las 20:41:50.


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