Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Bloquear aplicacion despues de cierto tiempo (https://www.clubdelphi.com/foros/showthread.php?t=783)

andres1569 11-07-2003 11:02:13

Hola Marc:

Quizás me expresé mal en la primera consideración; a lo que me refería con lo de acceder a los Timers no era por una cuestión del tiempo de vida de los mismos sino a que el Timer está declarado dentro de la clase TForm, mientras que la variable UltimoAcceso es global. Si escribimos Form1.Timer.Enebled, esto nos obliga a que Form1 esté creado (lo cual es cierto normalmente si Form1 está en la lista de AutoCreate Forms), pero esta asignación no funcionaría si Form1 fuera nil. Este es un problema general que se nos presenta cuando queremos acceder a componentes de un Form desde funciones que no pertenecen a la declaración de dicho form, tenemos que referirnoa a variables que no sabemos si se van a instanciar o no. Admito, de todas formas, que lo normal es que esto no suceda si hablamos del Form principal o del DataModule principal, que suelen instanciarse una vez (usando la variable declarada en su unit) y de forma automática al arrancar el programa.

Tanto en las dos soluciones que planteamos, una cosa parece clara, a cada evento de usuario se dispara, o bien en tu caso Timer.Enabled o como yo proponía GetTickCount, si es que lo entendí bien. En este caso, teniendo en cuenta la frecuencia con que se disparan los eventos (más sabiendo que hay eventos del mouse), creo que el rendimiento sí es fundamental.

Ahora se me ha ocurrido una forma de hacerlo que quizás no te agrade demasiado, porque declara 2 variables más, y es algo inexacta; la ventaja es que no entorpece la aplicación con llamada a métodos, lo cual puede ser crítico cuando se dan muchos eventos consecutivos (claro que con las máquinas de hoy quizás eso no se note demasiado):

1.- Declaramos dos nuevas variables globales, EventoOcurrido : Boolean, y TiempoTranscurrido : Longint;

2.- Cuando se produce un evento (ya sea con AppEvents o con Hooks), ponemos EventoOcurrido a TRUE;

3.- El TTimer lo fijamos a un intervalo de 10000 (10 segundos no afecta mucho a la aplicación), éste intervalo será el que marque la inexactitud.

4.- En el OnTimer del Timer escribimos algo así:
Código:

if EventoOcurrido then
begin
  EventoOcurrido := FALSE;
  TiempoTranscurrido := 0; 
end
else begin
  Inc (TiempoTranscurrido, Timer1.Interval);
  if TiempoTranscurrido > 3600000 then DeconectarAplicacion
end;

Con esto nos evitamos el uso del GetTickCount y sus efectos secundarios, aunque tenga cierto margen de error, que no creo que importe demasiado en muchos casos.
Podríamos bautizarla como versión remix, v. 3.2 (si te parece, nombre interno Guillot1569). :D:D

Son ideas ... que cada uno escoja la que má le guste.

PD: Para los interesados comentar que el proyecto "Código Bloquear Aplicación después de cierto tiempo" está sujeto a la especificación GPL, todo el que quiera puede participar. :)

kinobi 11-07-2003 11:45:06

Hola,

Cita:

Posteado originalmente por andres1569
PD: Para los interesados comentar que el proyecto "Código Bloquear Aplicación después de cierto tiempo" está sujeto a la especificación GPL, todo el que quiera puede participar. :)
si está bajo licencia GPL, sería conveniente aclarar que allí donde se utilice (la aplicación que utiliza "Bloquear Aplicación después de cierto tiempo") también debe estar bajo los términos de la licencia GPL, y por tanto los fuentes deben estar a libre disposición pública.

Tal vez otro tipo de licencias: BSD, MPL, o incluso LGPL, pudiesen ser no tan exigentes al respecto.

Saludos.

guillotmarc 11-07-2003 18:13:28

Hola Andrés.

En efecto esta solución parece insuperable. Puesto que lo único que hacemos en el evento de usuario, es poner a cierto una variable booleana. :)

NOTA : Ni había pensado en la posiblidad que la variable UltimoAcceso fuese global. Es que nunca las uso, había pensado que sería una variable privada del formulario principal o del Datamodule principal, por eso comenté que el Timer tenia los mismos problemas de visibilidad y tiempo de vida que la variable.

Cita:

si está bajo licencia GPL, sería conveniente aclarar que allí donde se utilice (la aplicación que utiliza "Bloquear Aplicación después de cierto tiempo") también debe estar bajo los términos de la licencia GPL, y por tanto los fuentes deben estar a libre disposición pública.
Parece que habría que ir pensando en hacer una licencia cdPL (club delphi public license), derivada de la GPL, para solventar estos problemas :D :D

Saludos.

Lepe 12-07-2003 14:55:36

Hola a todos.

Siento no haber contestado antes, pero estoy mas liado que un gato con un obillo de lana.


Al final lo he implementado como tu dices andres, pero ahorrandome esas variables.

he creado una rutina que se llama Actualiza ultimo acceso
Código:

procedure  TDTM.ActualizaUltimoAcceso();
begin
// bloqueo implementado mediante timer

  Timer1.Interval:= gl.Bloqueo.Minutos*60000;
  timer1.Enabled:=gl.Bloqueo.AutoBlock ;
end;

captando los mensajes de la aplicación
Código:

if ((Msg.message >= WM_KEYFIRST) AND (Msg.message <= WM_KEYLAST)) OR
    ((Msg.message >= WM_MOUSEFIRST) AND (Msg.message <= WM_MOUSELAST)) then
        dtm.ActualizaUltimoAcceso ;

Así lo que hago es reiniciar el timer con el tiempo que haya establecido el usuario. Se supone que esas instrucciones las hará cuando el usuario no esté haciendo nada, y son solo 2 instrucciones.

Por otra parte, el Ontimer se ejecutará 1 vez cada 4 o 5 minutos y lo unico que hace es presentar la pantalla de bloqueo deshabilitando el timer hasta que se vuelva a Reconectar el usuario.

Quizás esté recargando el Applicantion.OnMessage, pero me olvido de saber cuando ha sido el UltimoAcceso del Usuario y si ha ocurrido el Evento o no.


Como bien decias esta es otra idea, que cada cual coja la que mas le guste :cool:


SALUDOS A TODOS y MUCHAS GRACIAS por el interés que han prestado.

JuanPa1 21-09-2006 17:55:18

TMsg
 
Hola, tengo una interrogante. El tipo TMsg es de delphi y que hace?? hay un tipo equivalente en visual basic o algun componente que me permita hecer lo mismo en visual basic??
Cualquier sugerencia o respuesta a mi pregunta gracias de antemano
Saludos..

Cita:

Empezado por andres1569
Hola:

Puedes colocar un componente TApplicationEvents, interceptar el evento OnIdle y ahí almacenas en una variable de tipo Longint el instante mediante GetTickCount. Colocas un TTimer con un Interval no muy pequeño, puesto que debe controlar minutos supongo (p.e. Interval = 60000), y ahí compruebas si ha trnscurrido el máximo tiempo de inactividad, algo así:

Código:


var
  UltimoAcceso : Longint;

procedure TFormPrincipal.ApplicationEvents1OnIdle (Sender: TObject;
  var Done: Boolean);
begin
  UltimoAcceso := GetTickCount;
  Done := TRUE;
end;

procedure Timer1OnTimer (Sender: TObject)
begin
  if GetTickCount - UltimoAcceso > 3600000 then // 60 minutos
    Database1.Connected := FALSE;
end;

Si manejas un Delphi 4.0 o menor, no exite el componente TApplicationEvents, tienes que hacerlo "a mano":

Código:

procedure TFormPrincipal.AppMessage (var Msg:TMsg; var Handled:Boolean);
begin
  // interceptamos eventos de teclado y ratón
  if (Msg.message in [WM_KEYFIRST .. WM_KEYLAST]) OR
    (Msg.message in [WM_MOUSEFIRST .. WM_MOUSELAST]) then
    UltimoAcceso := GetTickCount;
end;

procedure TFormPrincipal.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
  UltimoAcceso := GetTickCount;
end;

A ver si esto te sirve

Un saludo


angelk3215 16-04-2017 23:43:38

descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com

AgustinOrtu 16-04-2017 23:47:23

Cita:

Empezado por angelk3215 (Mensaje 515555)
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com

Eso no es para Android?


La franja horaria es GMT +2. Ahora son las 15:07:22.

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