PDA

Ver la Versión Completa : Application.Terminate


Esau
24-04-2005, 17:34:10
Hola Amigos hace mucho tiempo que no venia por aqui, bueno les contare que tengo una aplicacion multiusuario , que hace varias cosas... bueno el punto es que en ocasiones los usuarios dejan sus pantallas en las que estan trabajndo abiertas, lo que quiero es que pasado un tiempo de inactividad , el sistema termine la aplicacion o en todo caso bloquee la aplicacion en la que esta trabajndo hasta que se registre denuevo....
la idea es esa.... hay algo parecido en power builder... creo que en delphi tambien se puede hacer... trabajo en Delphi 7.0

gracias

slat
24-04-2005, 19:31:28
puedes usar la funcion getlastinputinfo que devuelve el tiempo que ha transcurrido desde que se produjo la ultima pulsacion de teclado o movimiento de raton.
Pon un timer que en su evento OnTimer revise el tiempo que lleva inactiva la aplicacion mediante esta funcion y que si es superior al que tu le indiques cierras la aplicacion.

Saludos.

Esau
25-04-2005, 15:16:24
nunca pense que fuera tan facil
gracias...

Loviedo
02-05-2005, 22:53:16
En que unidad está la función 'getlastinputinfo' , o cuales son los parametros que recibe y lo que devuelve.
Saludos.

slat
02-05-2005, 23:24:53
esta es la pagina del msdn donde se explica detalladamente esta funcion

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/getlastinputinfo.asp

Loviedo
06-05-2005, 00:55:05
procedure TForm1.Timer1Timer(Sender: TObject);
var
a: tagLASTINPUTINFO;
b: integer;
c: integer;
begin
GetLastInputInfo(a);
b := a.cbSize;
showmessage(inttostr(b));
c := a.dwTime;
showmessage(inttostr(c));
end;

Lo he intentado pero no logro comprender el sentido de esta funcion.
b siempre da resultado 1 y c es como el interval siempre da un número en decremento, pero no se como obtener el tiempo desde que se pulsó una tecla o el ratón.
Gracias anticipadas.

Lepe
06-05-2005, 09:29:02
Pues yo tampoco sé muy bien donde usarlo.

He añadido un ApplicationsEvents (en delphi 6) y en los eventos Activate y Desactivate he añadido este código:

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
var
a: tagLASTINPUTINFO;
b: integer;
c: integer;
begin
a.cbSize:= SizeOf(a);
GetLastInputInfo(a);
Label1.Caption := IntToStr(a.dwTime - last);
LAST:= a.dwTime;

end;


LAST es una variable global de la unidad, y sí efectivamente da los valores correctos, es decir, pones en marcha el programa, te vas a otro programa y despues vuelves, y en el label te aparece el tiempo de inactividad que ha pasado (en milisegundos).

El problema es buscar donde poner ese código, evidentemente en el Activate no nos sirve, en el OnIdle del ApplicationsEvents, tampoco, ya que ese evento se produce entre ciclos muy cortos, y obtenemos siempre un cero

Dentro de un Timer tampoco, ya que el timer está ejecutando código, por tanto la aplicación no está realmente parada.

Con ayuda de este club lo implementamos de esta otra forma:

{ DONE -cINTERFAZ : Bloquear Aplicacion cada cierto tiempo }
procedure ActualizaUltimoAcceso();
begin
// bloqueo implementado mediante timer
Timer1.Interval := gl.Bloqueo.Time * 60000;
timer1.Enabled := false;
timer1.Enabled := gl.Bloqueo.AutoBlock;

end;
procedure TFrmMdi.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
R: TRect;
begin

// interceptamos eventos de teclado y ratón
if ((Msg.message >= WM_KEYFIRST) and (Msg.message <= WM_KEYLAST)) or
((Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST)) then
dtm.ActualizaUltimoAcceso;

end;

Esta solución está más que probada y funciona ;)

Un saludo

Loviedo
06-05-2005, 14:12:36
Con la ayuda de todos, creo que he conseguido lo que quería.Gracias.
Tiempo es una variable global a la unidad.
interval = 1sg.
transcurrido 5 sg. si no se ha pulsado tecla o movimiento del ratón, la aplicación termina.

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if ((Msg.message >= WM_KEYFIRST) and (Msg.message <= WM_KEYLAST)) or
((Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST)) then
tiempo := 0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(tiempo);
if tiempo > 5 then
application.Terminate;
end;