Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 11-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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).

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
Responder Con Cita
  #22  
Antiguo 11-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
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.
Responder Con Cita
  #23  
Antiguo 11-07-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #24  
Antiguo 12-07-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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


SALUDOS A TODOS y MUCHAS GRACIAS por el interés que han prestado.
Responder Con Cita
  #25  
Antiguo 21-09-2006
JuanPa1 JuanPa1 is offline
Miembro
 
Registrado: may 2006
Posts: 66
Poder: 18
JuanPa1 Va por buen camino
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
Responder Con Cita
  #26  
Antiguo 17-04-2017
angelk3215 angelk3215 is offline
Registrado
 
Registrado: abr 2017
Posts: 2
Poder: 0
angelk3215 Va por buen camino
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com
Responder Con Cita
  #27  
Antiguo 17-04-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por angelk3215 Ver Mensaje
descarga la Cerradura AppLock es muy buena y es super liviana con esa seguro resuelves
bloqueodeaplicaciones.com
Eso no es para Android?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 13:11:31.


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