FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
|||
|
|||
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; Podríamos bautizarla como versión remix, v. 3.2 (si te parece, nombre interno Guillot1569). 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.
__________________
Guía de Estilo |
#22
|
||||
|
||||
Hola,
Cita:
Tal vez otro tipo de licencias: BSD, MPL, o incluso LGPL, pudiesen ser no tan exigentes al respecto. Saludos. |
#23
|
||||
|
||||
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:
Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#24
|
||||
|
||||
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; 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 ; 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 SALUDOS A TODOS y MUCHAS GRACIAS por el interés que han prestado. |
#25
|
|||
|
|||
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:
|
#26
|
|||
|
|||
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com |
#27
|
||||
|
||||
Eso no es para Android?
|
|
|
|