Delphi - Guardar datos antes que Windows cierre mi *.exe

 
Vista:

Guardar datos antes que Windows cierre mi *.exe

Publicado por Gelmin Martinez (58 intervenciones) el 25/02/2004 23:32:03
Hola que tal a todos mi pregunta es la siguiente:
Tengo un programita desarrollado en delphi que funciona como un cronometro...La idea es que cuando el usuario Inicie sesion el programa se active y empieze a correr el tiempo en el cronometro cuando el usuario cierre la sesion el programa debe cerrarse guardar la hora de entrada y de salida en una base de datos. yo programe que cuando se cerrara la ventana principal se guardaran esos datos, el me funciona cuando yo lo abro y luego lo cierro. El problema esta en que el programa no lo cerrara el usuario si no que lo hara windows al momento de cerrar secion y en ese momento no me guarda ningun dato, el detalle esta en que hasta que cierre la secion de windows se tiene que cerrar el programa y guardar los datos pero no lo hace solo cuando cierro el programa sin cerrar la secion...Alguien tiene alguna idea de como hacer que funcione....un saludo
Gelmin Martinez (Nicaragua)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Guardar datos antes que Windows cierre mi *.exe

Publicado por seoane (65 intervenciones) el 26/02/2004 01:21:10
Una solucion es interceptar el mensage que envia windows cuando se finaliza la sesion. Este mensage es WM_ENDSESSION

Aqui te dejo un ejemplo:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
procedure Guardar(var msg: TMessage); message WM_ENDSESSION;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Guardar(var msg: TMessage);
begin
// Yo guardo la hora en un archivo de texto
// tu haz lo que necesites
with TStringList.Create do
try
Add(TimeToStr(Time));
savetofile('hora.txt');
finally
free;
end;
inherited;
end;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No quiere funcionar con la tabla...!

Publicado por Gelmin Martinez (58 intervenciones) el 26/02/2004 17:12:02
Gracias por tu tiempo seoane, probe el ejemplo que indicastes en tu comentario y funciona correctamente....pero cuando hago lo de guardar en la tabla no lo guarda estoy utilizando Delphi 5.0 y Access 2000 me conecto a la BD con ADO y lo que hago en la parte de guardar es lo siguiente:
procedure TForm1.Guardar(var msg: TMessage);
begin
//Esto es lo que hago en vez de guardar la hora en txt
Thoras.Open; //abrir la tabla Horas
Thoras.insert; //modo de insercion
Thorashoraent.Value:='Hora entrada';
Thorashorasal.Value:='Hora salida';
Thorascant.Value:=25; //cantidad horas
Thoras.Post; //guardar
Thoras.close; //cerrar la tabla horas
end;
Lo he estado probando de muchas maneras para que me guarde los valores en la tabla pero no lo hace....si quieres lo pruebas y si te funciona me dices que es lo que estoy haciendo mal o que es lo que me falta...ok saludos Gelmin Martinez (Nicaragua)

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No quiere funcionar con la tabla...!

Publicado por Cuervo (262 intervenciones) el 26/02/2004 17:41:48
en el ejemplo que te ha puesto el colega... en lugar de WM_ENDSESSION pruba con: WM_QueryEndSession;
Pero por lo que he leido, los compilados de delphi no responden a la constantes WM_ENDSESSION...

si no te funciona, la solucion es el metodo hook
hay varios codigos sueltos en internet sobre este metodo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Algo raro....con Queryendsession

Publicado por Gelmin Martinez (58 intervenciones) el 26/02/2004 20:40:06
Ya probe con el WM_QUERYENDSESSION tampoco me funcionaba pero alguien me dijo por ahi que programara el evento onclosequery del form si lo programo ahi sin capturar el mensaje WM_QUERYENDSESSION tampoco me funciona el chiste es que si dejo el procedimiento para capturar el mensaje y tambien programo al Onclosequery del form para que haga lo mismo que hace el que captura el mensaje de la sesion ahi si me funciona....la verdad no se porque osea que repito las ordenes de guardar en la BD en el procedimiento del WM_QUERYENDSESSION y en el evento OnCloseQuery del form para que me pueda funcionar....para mi es algo raro pero asi si me funciona....un saludo Gelmin Martinez (Nicaragua)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algo raro....con Queryendsession

Publicado por Cuervo (262 intervenciones) el 26/02/2004 20:59:33
ok proba con esto...
http://www.delphifaq.com/fq/q4045.shtml
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algo raro....con Queryendsession

Publicado por BigLuis (463 intervenciones) el 26/02/2004 21:12:35
Un poco de rollo (lo siento).
Normalmente cuando se sale de una aplicacion Delphi por ejemplo llamando al metodo Close, se produce la siguiente secuencia de llamadas:
FormCloseQuery(que retorna CanClose=True para poder salir).
FormClose.
FormDestroy.
Si la aplicacion esta activa e intentas salir de ella desde Windows, por ejemplo al cerrar el sistema o la sesion, se produce la siguiente secuencia:
FormClseQuery.
FormDestroy
El paso FormClose, por alguna "oscura" razon parece no ser llamado.
Este es el flujo que se produce desde Windows:
Windows envia el mensage WM_QUERYEBNDSESSION a todas las aplicaciones una por una y espera la respuesta.Cada aplicacion recibe el mensaje y devuelve un valor distinto de 0 si puede cerrarse o 0 si no puede terminar.Si alguna aplicacion retorna un 0 la sesion no termina.
Cada aplicacion responde con True indicando que Windows puede terminar en el momento en que todas hayan procesado el mensage.
Este parece ser el problema de Delphi: Parece ser que las aplicaciones Delphi retornan TRUE y el metodo FormDestroy es llamado inmediatamente, ignorando el metodo FormClose, y Windows termina.
SIGUE......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Algo raro....con Queryendsession

Publicado por BigLuis (463 intervenciones) el 26/02/2004 21:13:20
SIGUE EL ROLLO.....
Una solucion es responder al mensage WM_QUERYENDSESSION y evitar que Windows se cierre retornando el valor 0.Puede hacerse desde el metodo FormCloseQuery.Otra solucion es responder al mensage WM_QUERYENDSESSION llamando al procedimiento que quieres que se ejecute y que has puesto en el metodo FromClose.
Ejemplo
private
procedure WMQueryEndSession(var Message:TWMQueryEndSession); message WM_QUERYENDSESSION;

implementation
procedure TForm1.WMQueryEndSession(var Message:TWMQueryEndSession);
begin
inherited;//permitir al manejador de mensajes heredado responder primero.
//Aqui puedes evitar que Windows cierre
Message.Result:=0;
//o llamar al procedimiento que quieres que se ejecute
Miprocedimiento;
end;
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Guardar datos antes que Windows cierre mi *.exe

Publicado por arnalfox (2 intervenciones) el 18/03/2004 22:23:25

A menudo uso la siguientes líneas de código cuando deseo guardar datos en una tabla de fora instantanea.

// Asigno datos e ser necesario
...
...
Nombre_Tabla.Post;
DBISaveChanges(Nombre_Tabla.Handle);

Claro debes delarar el BDE en en USES de tu form
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar