Capturar Accion del Usuario

Capturar Accion del Usuario

Postby JoseAlvarez » Wed Feb 23, 2022 12:28 pm

Saludos a todos amigos,,

Tengo un sistema que opera con la BD en la nube.

A cada dialogo le asigno un tiempo determinado para que el usuario ejecute el trabajo (con un timer) , una vez cumplido el tiempo establecido, el formulario se cierra automaticamente.

Es decir, por ejemplo, para ingresar la informacion personal y profesional de un empleado, le determino un tiempo de 10 minutos al dialogo, pasados eso 10 minutos se cierra.

Esto para evitar que un formulario quede abierto en caso de que el usuario se aleje de la pc por mucho tiempo o simplemente se vaya a casa y se le olvide cerrar el dialogo. Hasta alli me funciona muy bien.

El detalle que se me presenta y no he sabido como solventar es cuando el usuario regresa por ejemplo al minuto 9 o al minuto 9 con 50 seg. que quiere decir que regreso antes de que se venciera el tiempo activo del dialogo, pero igualmente se cierra.. es decir, necesito una manera de detectar cuando el usuario ejecute alguna actividad con el formulario, como mover el raton o escribir en un campo y reinicirar el tiempo desde 0

¿Alguien que me de una mano por favor?
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Capturar Accion del Usuario

Postby hmpaquito » Wed Feb 23, 2022 12:42 pm

Hola,

SysIdleSecs() pero afecta a todo el sistema

Salu2
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Capturar Accion del Usuario

Postby FiveWiDi » Wed Feb 23, 2022 1:18 pm

Hola José,

Entiendo que con el Timer lanzas una función que SÓLO hace que cerrar el diálogo (la aplicación o lo que sea).

Yo modificaría lo que hace esa función de tal manera que controlara el tiempo que ha transcurrido desde un primer momento (al inicio del Timer).
Así cuando transcurran 8 minutos podría mostrar un mensaje, pero cuando transcurran 10 cerrar lo que sea.

Si no estoy equivocado un Timer sigue actuando aun cuando se muestre un DIALOG MODAL; que para la solución que te propongo, en ese DIALOG MODAL estaría el aviso de los 8 minutos.
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1190
Joined: Mon Oct 10, 2005 2:38 pm

Re: Capturar Accion del Usuario

Postby JoseAlvarez » Wed Feb 23, 2022 1:46 pm

hmpaquito wrote:Hola,

SysIdleSecs() pero afecta a todo el sistema

Salu2


Hola amigo hmpaquito. Podria servirme, el inconveniente que veo es que habria que asignar el mismo tiempo a todos los formularios (si estoy entendiendo bien) , siendo que no todos necesitan la misma cantidad de minutos, de todas maneras voy a investigar sobre esta funcion que me dices, gracias.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Capturar Accion del Usuario

Postby JoseAlvarez » Wed Feb 23, 2022 1:50 pm

FiveWiDi wrote:Hola José,

Entiendo que con el Timer lanzas una función que SÓLO hace que cerrar el diálogo (la aplicación o lo que sea).

Yo modificaría lo que hace esa función de tal manera que controlara el tiempo que ha transcurrido desde un primer momento (al inicio del Timer).
Así cuando transcurran 8 minutos podría mostrar un mensaje, pero cuando transcurran 10 cerrar lo que sea.

Si no estoy equivocado un Timer sigue actuando aun cuando se muestre un DIALOG MODAL; que para la solución que te propongo, en ese DIALOG MODAL estaría el aviso de los 8 minutos.


Saludos fivwWiDi.
Gracias por responder. Lo que dices ya lo intente, pero sucede lo mismo, el mensaje aparece a los 9 minutos, pero si el usuario regresa a los 9minutos 30 segundos y desea seguir con el formulario, igual se le va a cerrar a los 30 segundos. lo que quiero es que se reinicie el timer nuevamente desde cero para ese formulario cuando se detecte alguna accion.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Capturar Accion del Usuario

Postby karinha » Wed Feb 23, 2022 2:38 pm

Code: Select all  Expand view  RUN

// \SAMPLES\ALVAREZ.PRG - 23/01/2022.

#Include "FiveWin.ch"  //-> The Best...

FUNCTION Espera_Alvarez()

   LOCAL oDlg, oFld, oFont, aGrad
   LOCAL aBitmaps := { "..\bitmaps\alphabmp\facebook.bmp", ;
                       "..\bitmaps\alphabmp\windows.bmp" }

   LOCAL nTempo_espera, cNome_funcao, lTimercontinua

   // -> 1 hora tem 3600 segundos.
   nTempo_espera := 15  // segundos.

   cNome_funcao := "LOGOFF()"  

   lTimercontinua := .F.

   aGrad := { { 0.30, CLR_WHITE, CLR_HBLUE },{ 0.50, CLR_HBLUE, CLR_WHITE } }

   DEFINE FONT oFont   NAME "Ms Sans Serif" SIZE 00, -14 BOLD
                     
   DEFINE DIALOG oDlg TITLE "- TFolderex - Testing -" SIZE 350, 350          ;
      PIXEL TRUEPIXEL RESIZABLE GRADIENT aGrad
     
   @ 1, 0 FOLDEREX oFld PIXEL ADJUST OF oDlg ;
      PROMPT "Prenotazioni", "Pagamenti"     ;
      BITMAPS aBitmaps                       ;
      TAB HEIGHT 26 OPTION 1 ROUND 5 FONT oFont COLOR CLR_HGREEN TOP

   oFld:aEnable = { .T., .T., .F. }

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT( oFld:Resize(), TINATIVO():NEW( nTempo_espera, cNome_funcao,   ;
                              lTimerContinua ) )

RETURN NIL

// tinativo.prg - By William Adami
// exemplo do uso da classe Tinativo
// Apos um tempo de inatividade do mouse
// e do teclado chama uma funcao qualquer.

//#include "fivewin.ch"

// STATIC oWnd

//************

/*
FUNCTION Main()

   LOCAL nTempo_espera, cNome_funcao, lTimercontinua

   // Tempo a ser esperado ate chamar a funcao
   // -> 1 hora tem 3600 segundos.
   nTempo_espera := 10  // segundos.

   // nome da funcao a ser chamada quando
   // chegar no tempo de espera
   cNome_funcao := "LOGOFF()"  
   // se apos executar a funcao , continua
   // monitorando a inatividade do mouse e teclado.
   lTimercontinua := .F.

   define window oWnd title "Teste de teclado e mouse"

   activate window oWnd ;
      ON INIT tinativo():new( nTempo_espera, cNome_funcao, lTimerContinua )

RETURN NIL
*/


FUNCTION LOGOFF()

   // msgalert( "AQUI ENTRA SUA FUNCAO DE LOGOFF !", "AVISO" )

   IF MsgYesNo( OemToAnsi( "ATEN€ÇO USUµRIO:                       " )+CRLF+ ;
                OemToAnsi( "PROTEJA OS BANCOS DE DADOS DO PROGRAMA." )+CRLF+ ;
                OemToAnsi( "SE NÇO ESTIVER USANDO O ALVAREZ.EXE,   " )+CRLF+ ;
                OemToAnsi( "DESLIGUE-O PARA NÇO CORRER RISCOS.     " )+CRLF+ ;
                OemToAnsi( "POSSO DESLIGAR O PROGRAMA? <S> ou <N>??" ),      ;
                OemToAnsi( "AVISO PARA DESLIGAR O ALVAREZ.EXE...   " ) )

      HB_GCALL( .T. )

      CLEAR MEMORY

      PostQuitMessage( 0 )

      QUIT

   ENDIF

RETURN NIL

//   tinativo.prg -> By William Adami

// #include "fivewin.ch"

CLASS TINATIVO

   DATA nTimeInpAntes
   DATA nTimeInpDepois
   DATA cTimeAtu
   DATA nTempo
   DATA oTimerTime
   DATA cFunc
   DATA lContinuar

   METHOD NEW( nTime, cFuncao, lContinua )  CONSTRUCTOR

   METHOD ver_tempo()

ENDCLASS

METHOD new( ntime, cFuncao, lContinua ) CLASS TINATIVO

   ::cfunc := cfuncao
   ::ntempo := ntime
   ::lContinuar := lContinua
   ::oTimerTime := TTimer():New( 1000, { || ::VER_TEMPO() } )
   ::oTimerTime:Activate()
   ::cTimeAtu := time()
   ::nTimeInpAntes := getInputState()    // 0 = erro

RETURN self

METHOD VER_TEMPO CLASS TINATIVO

   LOCAL AUX

   ::nTimeInpDepois := getInputState()

   IF ( ::nTimeInpDepois - ::nTimeInpAntes ) > 0

      ::nTimeInpAntes := getInputState()

      ::cTimeAtu := time()

   ENDIF


   IF ( CONVTIME( time() ) - CONVTIME( ::cTimeAtu ) ) > ::ntempo

      ::oTimerTime:DeActivate()

      aux := ::cfunc
   
      // aqui executa a funcao

      &aux

      if ::lContinuar

         ::oTimerTime:Activate()
         ::cTimeAtu := time()

      ENDIF


   ENDIF

RETURN NIL

FUNCTION CONVTIME( ZZ )

   LOCAL Z

   Z := ( VAL( LEFT(ZZ,2 ) ) * 360 ) + ( VAL( SUBSTR(ZZ,4,2 ) ) * 60 ) + ;
          VAL( RIGHT( ZZ,2 ) )

RETURN Z

//*----------------------------------------------------------------------
#pragma BEGINDUMP
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include "windows.h"
#include "hbapi.h"
HB_FUNC( GETINPUTSTATE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&lpi))
{
hb_retni(0);
}
hb_retni(lpi.dwTime);
}
#pragma ENDDUMP

// fin / end
 



Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Capturar Accion del Usuario

Postby JoseAlvarez » Wed Feb 23, 2022 3:13 pm

karinha wrote:
Code: Select all  Expand view  RUN

// \SAMPLES\ALVAREZ.PRG - 23/01/2022.

#Include "FiveWin.ch"  //-> The Best...

FUNCTION Espera_Alvarez()

   LOCAL oDlg, oFld, oFont, aGrad
   LOCAL aBitmaps := { "..\bitmaps\alphabmp\facebook.bmp", ;
                       "..\bitmaps\alphabmp\windows.bmp" }

   LOCAL nTempo_espera, cNome_funcao, lTimercontinua

   // -> 1 hora tem 3600 segundos.
   nTempo_espera := 15  // segundos.

   cNome_funcao := "LOGOFF()"  

   lTimercontinua := .F.

   aGrad := { { 0.30, CLR_WHITE, CLR_HBLUE },{ 0.50, CLR_HBLUE, CLR_WHITE } }

   DEFINE FONT oFont   NAME "Ms Sans Serif" SIZE 00, -14 BOLD
                     
   DEFINE DIALOG oDlg TITLE "- TFolderex - Testing -" SIZE 350, 350          ;
      PIXEL TRUEPIXEL RESIZABLE GRADIENT aGrad
     
   @ 1, 0 FOLDEREX oFld PIXEL ADJUST OF oDlg ;
      PROMPT "Prenotazioni", "Pagamenti"     ;
      BITMAPS aBitmaps                       ;
      TAB HEIGHT 26 OPTION 1 ROUND 5 FONT oFont COLOR CLR_HGREEN TOP

   oFld:aEnable = { .T., .T., .F. }

   ACTIVATE DIALOG oDlg CENTERED ;
      ON INIT( oFld:Resize(), TINATIVO():NEW( nTempo_espera, cNome_funcao,   ;
                              lTimerContinua ) )

RETURN NIL

// tinativo.prg - By William Adami
// exemplo do uso da classe Tinativo
// Apos um tempo de inatividade do mouse
// e do teclado chama uma funcao qualquer.

//#include "fivewin.ch"

// STATIC oWnd

//************

/*
FUNCTION Main()

   LOCAL nTempo_espera, cNome_funcao, lTimercontinua

   // Tempo a ser esperado ate chamar a funcao
   // -> 1 hora tem 3600 segundos.
   nTempo_espera := 10  // segundos.

   // nome da funcao a ser chamada quando
   // chegar no tempo de espera
   cNome_funcao := "LOGOFF()"  
   // se apos executar a funcao , continua
   // monitorando a inatividade do mouse e teclado.
   lTimercontinua := .F.

   define window oWnd title "Teste de teclado e mouse"

   activate window oWnd ;
      ON INIT tinativo():new( nTempo_espera, cNome_funcao, lTimerContinua )

RETURN NIL
*/


FUNCTION LOGOFF()

   // msgalert( "AQUI ENTRA SUA FUNCAO DE LOGOFF !", "AVISO" )

   IF MsgYesNo( OemToAnsi( "ATEN€ÇO USUµRIO:                       " )+CRLF+ ;
                OemToAnsi( "PROTEJA OS BANCOS DE DADOS DO PROGRAMA." )+CRLF+ ;
                OemToAnsi( "SE NÇO ESTIVER USANDO O ALVAREZ.EXE,   " )+CRLF+ ;
                OemToAnsi( "DESLIGUE-O PARA NÇO CORRER RISCOS.     " )+CRLF+ ;
                OemToAnsi( "POSSO DESLIGAR O PROGRAMA? <S> ou <N>??" ),      ;
                OemToAnsi( "AVISO PARA DESLIGAR O ALVAREZ.EXE...   " ) )

      HB_GCALL( .T. )

      CLEAR MEMORY

      PostQuitMessage( 0 )

      QUIT

   ENDIF

RETURN NIL

//   tinativo.prg -> By William Adami

// #include "fivewin.ch"

CLASS TINATIVO

   DATA nTimeInpAntes
   DATA nTimeInpDepois
   DATA cTimeAtu
   DATA nTempo
   DATA oTimerTime
   DATA cFunc
   DATA lContinuar

   METHOD NEW( nTime, cFuncao, lContinua )  CONSTRUCTOR

   METHOD ver_tempo()

ENDCLASS

METHOD new( ntime, cFuncao, lContinua ) CLASS TINATIVO

   ::cfunc := cfuncao
   ::ntempo := ntime
   ::lContinuar := lContinua
   ::oTimerTime := TTimer():New( 1000, { || ::VER_TEMPO() } )
   ::oTimerTime:Activate()
   ::cTimeAtu := time()
   ::nTimeInpAntes := getInputState()    // 0 = erro

RETURN self

METHOD VER_TEMPO CLASS TINATIVO

   LOCAL AUX

   ::nTimeInpDepois := getInputState()

   IF ( ::nTimeInpDepois - ::nTimeInpAntes ) > 0

      ::nTimeInpAntes := getInputState()

      ::cTimeAtu := time()

   ENDIF


   IF ( CONVTIME( time() ) - CONVTIME( ::cTimeAtu ) ) > ::ntempo

      ::oTimerTime:DeActivate()

      aux := ::cfunc
   
      // aqui executa a funcao

      &aux

      if ::lContinuar

         ::oTimerTime:Activate()
         ::cTimeAtu := time()

      ENDIF


   ENDIF

RETURN NIL

FUNCTION CONVTIME( ZZ )

   LOCAL Z

   Z := ( VAL( LEFT(ZZ,2 ) ) * 360 ) + ( VAL( SUBSTR(ZZ,4,2 ) ) * 60 ) + ;
          VAL( RIGHT( ZZ,2 ) )

RETURN Z

//*----------------------------------------------------------------------
#pragma BEGINDUMP
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include "windows.h"
#include "hbapi.h"
HB_FUNC( GETINPUTSTATE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&lpi))
{
hb_retni(0);
}
hb_retni(lpi.dwTime);
}
#pragma ENDDUMP

// fin / end
 



Regards, saludos.



Gracias Joao.
Voy a probar tu ejemplo y te comento como me va.

Un Abrazo.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm



Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 39 guests