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 26-02-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 21
Gelmin Va por buen camino
Question Guardar antes de que mi aplicacion se cierre

que tal a todos mi pregunta es la siguiente resulta que tengo un programita en delphi que funciona como cronometro cuando se ejecuta comienza a correr el cronometro cuando se cierra entonces guarda algunos datos de tiempo en una base de datos funciona bien cuando yo cierro el programa el detalle es que yo no quiero que el usuario lo cierre si no que lo cierre windows cuando se cierre la sesion efectivamente cuando cierro secion en windows el programita se cierra pero en ese momento no me guarda los datos en la BD entonces lo que quiero es que cuando se cierre ya sea por el usuario o por win siempre me guarde los datos que necesito en la BD...me han dicho que intersecte el mensaje WM_ENDSESSION de win pero no se exactamente como hacerlo ¿tienen alguna sugerencia? Saludos Gelmin Martinez(Nicaragua)
__________________
Powered by Gel
Responder Con Cita
  #2  
Antiguo 26-02-2004
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
Este es un viejo problema de Delphi. Cuando se termina la sesión, Windows manda el mesaje WM_ENDSESSION a todas las ventanas de aplicación pero Delphi, al recibir este mensaje, no manda llamar al evento OnClose.

Para interceptar este mensaje, o cualquier otro de Windows, debes crear un manejador del mensaje:

Código:
type
  TForm1 = class(TForm)
  private
    procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
  end;
El procedimiento se puede llamar como quieras pero después de la palabra reservada message especificas el mensaje que deseas interceptar.

Por otro lado, podrías también intentar usar el evento OnCloseQuery en lugar de OnClose ya que éste sí es llamado por Delphi cuando se intenta cerrar la sesión.

De cualquier forma ten en cuenta esto:

En Windows 95/98, cuando se intenta cerrar una sesión, Windows manda primero el mensaje WM_QUERYENDSESSION para preguntar a las aplicaciones si se permite cerrar la aplicación. Si por lo menos una de ellas responde que no, entonces el proceso se interrumpe y la sesión no termina. Si todas las ventanas aceptan que se cierre la sesión, entonces, y sólo entonces Windows les manda el mensaje WM_ENDSESSION.

Sin embargo en Windows 2000, y supongo que también en Windows XP, y yendo contra toda lógica, Microsoft cambió la lógica de esto: cuando una ventana responde "sí" al mensaje WM_QUERYENDSESSION Windows le manda inmediatamente el mensaje WM_ENDSESSION, aún antes de que otras ventanas procesen el mensaje WM_QUERYENDSESSION.

¿En qué te afecta esto?

Bueno, si tu aplicación procesa el mensaje WM_ENDSESSION, guardando los datos que tenga que guardar y cerrándose, y posteriormente otra aplicación contesta "no" a WM_QUERYENSESSION, entonces la sesión no termina pero tu programa sí, lo cual puede no ser lo que deseas.

Hace no mucho tuve un problema similar: requería una aplicación que se ejecutara al comenzar Windows y que no debía terminar sino hasta que terminara la sesión y no podía dejar que terminara por un problema así. La solución que encontré fué la de poner esta línea

SetProcessShutDownParameters($100, 0);

en el OnCreate del formulario principal. Básicamente, la función indica a Windows en qué orden se le debe enviar el mensaje de cerrar sesión. Las aplicaciones en el rango 0-$FF lo reciben al último.

// Saludos
Responder Con Cita
  #3  
Antiguo 26-02-2004
Avatar de Gelmin
Gelmin Gelmin is offline
Miembro
 
Registrado: may 2003
Ubicación: Chinandega-Nicaragua
Posts: 56
Poder: 21
Gelmin Va por buen camino
Lightbulb Wm_queryendsession.....!

Que tal...agradesco la ayuda proporsionada....! probe lo del queryendsession y sucede lo siguiente: programe que guardara cuando se detectara el mensaje de queryendsession:
Código Delphi [-]
//declaracion del procedimiento Guardar dentro de Tform1
  procedure Guardar(var msg: TMessage); message WM_QUERYENDSESSION;
//definicion
procedure TForm1.Guardar(var msg:Tmessage);
begin
  Thoras.Open; //abrir la tabla THoras
  Thoras.insert;   //modo de insercion
  Thorashoraent.Value:='Hora entrada'; 
  Thorashorasal.Value:='Hora salida';
  Thorascant.Value:=5; //cantidad horas
  Thoras.Post; //guardar
  Thoras.close;  //cerrar la tabla Thoras
end;

Pero no me guardaba nada....! despues decidi hacer eso mismo en el OnCloseQuery del form y ahi si me funciona pero solamente cuando tengo los dos procedimientos el del Queryendsession y el del OnCloseQuery del form ambos hacen exactamente lo mismo abrir la tabla (Thoras.Open...etc!) pero lo que no entiendo es porque tengo que hacer lo mismo en el procedimiento
procedure Guardar(var msg: TMessage); message WM_QUERYENDSESSION;
y en el Evento OncloseQuery del form para que me pueda funcionar....! la verdad no se porque tiene que ser asi...pero bueno si asi funciona asi se queda. Si tienes algun comentario sobre esto diganlo...Saludos Gelmin Martinez (Nicaragua)
__________________
Powered by Gel

Última edición por vtdeleon fecha: 23-12-2009 a las 19:34:25.
Responder Con Cita
  #4  
Antiguo 25-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Me gustaría reabrir este hilo, ya que hay otro hilo parecido.

Quizás haya que indicar en ese procedimiento el resultado, es decir, añadir msg.Result := 1 para indicar que todo ha ido bien. Realmente no lo he probado, ¿alguien está de acuerdo o en contra?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 24-09-2008
Nebli
 
Posts: n/a
Yo quería hacer algo parecido pero para saber la fecha y hora en la que se apagaba el portátil, ya que le dura muy poco la batería y quería saber por término medio cuanto le duraba.

Si cerraba yo la apliación de Delphi no había ningún problema, pero si apagaba el portátil y era Windows quien la cerraba, efectivamente no guarda la fecha y hora de cierre.

habrá que estudiar lo que aquí se dice y solucionarlo.

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 16:31:10.


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