cerrar formulario si no tiene actividad

1,240 views
Skip to first unread message

Matías Mancuello

unread,
Dec 7, 2012, 1:48:10 AM12/7/12
to publice...@googlegroups.com
Que tal amigos.. quiero saber como hacer para cerrar un formulario si no hay ningún tipo de actividad (teclado o mouse) en un tiempo determinado..

Saludos!

arti...@gmail.com

unread,
Dec 7, 2012, 5:27:08 AM12/7/12
to publice...@googlegroups.com
Hola, yo en hago lo siguiente, en la case base 'form' de la cual defino todos los formularios pongo un control 'Timer', En el 'KeyPress' del formulario pongo  una instrucción que haga un reset al timer y lo mismo en el 'MouseMove' del form, de esta forma, cuando pulsas una tecla o mueves el ratón sobre el formulario se activa el Reset del Timer y no se dispara el método 'Timer', Si no se usa el ratón durante el tiempo especificado en el control 'Timer' o no se pulsa una tecla, se dispara el evento Timer y ahí guardo la información y cierro el formulario. Espero que te sirva.

Matías Mancuello

unread,
Dec 7, 2012, 6:58:57 AM12/7/12
to publice...@googlegroups.com
hola, muchas gracias por tu colaboración, es definitivamente como lo haré.. Saludos!!

El 7 de diciembre de 2012 08:27, arti...@yahoo.es <arti...@gmail.com> escribió:
Hola, yo en hago lo siguiente, en la case base 'form' de la cual defino todos los formularios pongo un control 'Timer', En el 'KeyPress' del formulario pongo  una instrucción que haga un reset al timer y lo mismo en el 'MouseMove' del form, de esta forma, cuando pulsas una tecla o mueves el ratón sobre el formulario se activa el Reset del Timer y no se dispara el método 'Timer', Si no se usa el ratón durante el tiempo especificado en el control 'Timer' o no se pulsa una tecla, se dispara el evento Timer y ahí guardo la información y cierro el formulario. Espero que te sirva.

--
 
 

eap pupo

unread,
Dec 14, 2012, 3:21:23 PM12/14/12
to publice...@googlegroups.com
Hola amigos!

Me pudieran facilitar ese frm para ver como se hace me pudiera ser útil en algún proyecto futuro.

Por favor enviar a:eap...@gmail.com

Saludos a todos.

Pupo

eap pupo

unread,
Dec 14, 2012, 4:20:25 PM12/14/12
to publice...@googlegroups.com
Hola! ya mas o menos di con lo del formulario para salir, pero el problema está en un formulario que tiene varias tablas abiertas, em combox, listbox y demas, como hago para que las cierres porque empieza a dar error ver adjunto. Y no te deja salir del formulario.

Como se puede solucionar ese caso.

Saludos

Pupo
Error al salir del frm.PNG

Jhonny Zambrana

unread,
Dec 14, 2012, 6:54:37 PM12/14/12
to publice...@googlegroups.com
No estoy muy al tanto d elo que quieren, pero no te sirve un simple, close tables.
 
Saludos.

eap pupo

unread,
Dec 17, 2012, 10:21:28 AM12/17/12
to publice...@googlegroups.com
Hola Jhonny!

Cuando se está dentro del timer que está dentro del formulario y hay varias tablas abiertas eso no funciona.

Saludos

Pupo


--
 
 

Samuel San Miguel Hernández

unread,
Dec 17, 2012, 2:58:03 PM12/17/12
to publice...@googlegroups.com
Hol Pupo;
nunca trabajes con tablas enlazadas a los combos o listas; lo mejor será que lo llenes mediante codigo y luego cierres la tabla al terminar de llenar los combos.. de esta manera no tendrás muchas tablas abiertas y al cerrar el formulario no te preocupas de cerralas.
Saludos.

Robert Martínez

unread,
Dec 17, 2012, 3:14:28 PM12/17/12
to publice...@googlegroups.com
Saludos,

Imagino que en tu formularios tienes un boton para salir (cerrar) el formulario, también imagino que tienes un método que ejecutas desde el evento click de dicho boton, bueno... lo que tienes que hacer es, desde el control timer ejecuta ó el evento click de tu boton salir o el método que este ejecuta para cerrar tu formulario.

Douglas Sánchez

unread,
Dec 18, 2012, 12:35:46 PM12/18/12
to publice...@googlegroups.com
Hola,
En mi caso yo no cierro la aplicacion pero si despues de tanto tiempo el sistema abierto los obligo a salir les quito los permisos asignados al USUARIO, en una variable publica, y asi le dejo la opcion de salir unicamente asi evito que si alguien llega a la pc este no pueda ralizar cambios despues de un tiempo, ni entrar a mysql o sqlserver si no usas dbf.

Saludes


El 17 de diciembre de 2012 14:55, DIEGO CALLEGARI <acerosc...@gmail.com> escribió:
Matias:

             Te pego al pie, un sencillo pero sofisticado codigo que tengo en un prg, el cual llamo desde mi formulario principal y en mi caso no cierra la aplicacion sino que llama a un form para volver a logear al usuario cada x tiempo de inactividad.
              
                No recuerdo de donde lo tome, o quien me lo facilito, pero no es de mi propiedad salvo algunas modificaciones.

*C:\PRODUCCION\FRM_CAMBIAR_USUARIO.SCX, esta linea que esta casi al final llama a mi formulario, te he dejado las lineas para cerrar y salir de la aplicacion.



aqui va el prg.

   CLEAR
PUBLIC tmrCheck
tmrCheck = NEWOBJECT("DetectActivity")
RETURN

DEFINE CLASS DetectActivity as Timer
  * Sólo detecta inactividad mientras está en este programa?
  JustInThisApp = .F.
  * Intervalo de inactividad tras el cual dispara OnInactivity (en segundos)
  InactivityInterval = 180 
  * Intervalo cada el que chequea actividad
  Interval = 1000  
    LastCursorPos = ""  
  LastKeybState = ""  
  LastActivity = DATETIME() 
  CursorPos = ""     
  KeybState = ""  
  IgnoreNext = .T. 

  PROCEDURE Init
    DECLARE INTEGER GetKeyboardState IN WIN32API STRING @ sStatus
    DECLARE INTEGER GetCursorPos IN WIN32API STRING @ sPos
    DECLARE INTEGER GetForegroundWindow IN WIN32API
  ENDPROC

  PROCEDURE Destroy
    CLEAR DLLS GetKeyboardState, GetCursorPos, GetForegroundWindow
  ENDPROC

  PROCEDURE Timer
    WITH This
      IF ! .CheckActivity()
        * Si no hubo actividad veo si es tiempo de disparar OnInactivity
        IF ! ISNULL(.LastActivity) AND ;
            DATETIME() - .LastActivity > .InactivityInterval
          .LastActivity = NULL && Prevengo disparo múltiple de OnInactivity
          .OnInactivity()
        ENDIF
      ENDIF
    ENDWITH
  ENDPROC 

  * Chequeo si hay actividad
  PROCEDURE CheckActivity
    LOCAL lRet
    WITH This
      IF .JustInThisApp
        IF GetForegroundWindow() <> _VFP.hWnd
          * Estoy en otro programa
          RETURN lRet
        ENDIF
      ENDIF
      .GetCurState()
      IF (!.CursorPos == .LastCursorPos OR !.KeybState == .LastKeybState)
        IF ! .IgnoreNext && La 1ra vez no ejecuto
          lRet = .T. && Hubo actividad
          .OnActivity()
          .LastActivity = DATETIME()
        ELSE
          .IgnoreNext = .F. 
        ENDIF
        .LastCursorPos = .CursorPos
        .LastKeybState = .KeybState
      ENDIF
    ENDWITH
    RETURN lRet   
  ENDPROC

  * Devuelve el estado actual 
  PROCEDURE GetCurState
    LOCAL sPos, sState
    WITH This
      sPos = SPACE(8)
      sState = SPACE(256)
       GetCursorPos (@sPos)
      GetKeyboardState (@sState)
      .CursorPos = sPos  
      .KeybState = sState
    ENDWITH
  ENDPROC  
  
  PROCEDURE OnInactivity
  WAIT WINDOW "Inactividad a las " + TIME() NOWAIT

DO FORM "C:\PRODUCCION\FRM_CAMBIAR_USUARIO.SCX" 
*!*  _Screen.ActiveForm.RELEASE
*!*  CLOSE TABLES 
*!* CLOSE DATABASE
*!* *CLEAR ALL
*!* CLEAR EVENTS 
    ENDPROC
  * Hubo actividad
  PROCEDURE OnActivity
* WAIT WINDOW "Actividad a las " + TIME() NOWAIT
  ENDPROC
ENDDEFINE




El viernes, 7 de diciembre de 2012 03:48:10 UTC-3, Matías Mancuello escribió:
Que tal amigos.. quiero saber como hacer para cerrar un formulario si no hay ningún tipo de actividad (teclado o mouse) en un tiempo determinado..

Saludos!

--
 
 



--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

eap pupo

unread,
Dec 19, 2012, 8:15:47 AM12/19/12
to publice...@googlegroups.com
Hola Samuel gracias por tu respuesta!

En el formulario principal del sistema es muy complejo pues tiene casi una docena de combox y un listbox, y mucha de la información de los combox hay que cambiarla temporalmente. No hay otra manera de como cambiar eso. Si desea te puedo pasar parte de como lleno los combox. Solo que al cerrar cuando llega el tiempo de cronometro no funciona al cerrar el formulario.
Lo que tengo hecho es VFP con sus tablas nativas, el timer me trabaja bien pero da error al cerrar y no puedo acceder al click de form.
Tienes algo mas para eso.

Saludos

Pupo


--
 
 

eap pupo

unread,
Dec 19, 2012, 8:10:57 AM12/19/12
to publice...@googlegroups.com
Gracias Diego por tu respuesta!

Pero lo que necesito como tal es cerrar el formulario donde hay varias tablas abiertas y es VFP con tablas nativas. Es cerrar ese formulario no bloquearlo pero cuando intento cerrar da error en las tablas y el timer me trabaja bien.

Saludos

Pupo




Que tal amigos.. quiero saber como hacer para cerrar un formulario si no hay ningún tipo de actividad (teclado o mouse) en un tiempo determinado..

Saludos!

--
 
 

eap pupo

unread,
Dec 19, 2012, 11:13:58 AM12/19/12
to publice...@googlegroups.com
Ah!! se me olvidaba, existe algo para eso que me dices "desde el control timer ejecuta ó el evento click de tu boton salir", aunque yo en el timer le pongo thisform.release.

Saludos

PUPO

--
 
 

eap pupo

unread,
Dec 19, 2012, 11:12:28 AM12/19/12
to publice...@googlegroups.com
Gracias amigo por responder pero eso no funciona le doy lo que esta en el boton pero no funciona da error de las tablas, aunque me refiera a las tablas asi:

Rowsource="" se lo pongo en blanco y le me refiero a ellos con enabled=.f., también hago eso mismo con los campos.
Rowtypesource=0

Si recuerdas algo mas por favor enviame correo, mil gracias!

Saludos

Pupo

El 17 de diciembre de 2012 12:14, Robert Martínez <soluci...@gmail.com> escribió:
--
 
 

eap pupo

unread,
Dec 24, 2012, 7:26:25 AM12/24/12
to publice...@googlegroups.com
Hola Samuel!

Tienes algún ejemplo de eso que me dices, te adjunto de un formulario que tengo de VFP9 hecho en tablas nativas y de echo es el formulario mas dificil, tiene muchas tablas y he ahí el problema. Si tienes algo por favor me lo puedes enviar a: eap...@gmail.com

Saludos

Pupo
ProyectoOriginal.JPG

Claudio Luna

unread,
Dec 26, 2012, 11:06:31 AM12/26/12
to Comunidad de Visual Foxpro en Español
Hola a todos,
Para simplificar la salida desde el timer y desde tu boton salir de el formulario podes crear un metodo del formulario entonces quedaría así:
boton salir.clck
 thisform.metodosalida()
y en el evento timer del timer :
thisform.metodosalida()
En tu metodosalida() pones lo que hoy tenes el click del boton salir.

Espero que te sirva.
Saludos
Claudio


--
 
 

eap pupo

unread,
Dec 26, 2012, 1:59:43 PM12/26/12
to publice...@googlegroups.com
Hola Claudio!

Gracias por su respuesta.
Pero parece que no entendí su respuesta y mire lo que hice pero no funcionó.

Cree en el formulario el metodo "salirclick" dentro de el puse el thisform.release que esta en el boton salir del formulario, y dentro del evento del timer puse thisform.salirclick, pero eso tampoco
funciona, dime que hice mal entonces. Sigue dando error de las tablas.

Saludos

Pupo



--
 
 

eap pupo

unread,
Dec 26, 2012, 2:08:30 PM12/26/12
to publice...@googlegroups.com
Hola!

Robert pudieras ser mas explicito no soy experto en la materia, necesito mas detallado.

Saludos

Pupo

eap pupo

unread,
Dec 26, 2012, 3:47:51 PM12/26/12
to publice...@googlegroups.com
Hola a todos los que han intervenido en este debate de como cerrar un formulario si no tiene uso.

Resolví de la siguiente manera:

De este correo utilice esas instrucciones, fíjense.

arti...@yahoo.es
Publicar respuesta
Más acciones de mensajes
7 dic
Hola, yo en hago lo siguiente, en la case base 'form' de la cual defino todos los formularios pongo un control 'Timer', En el 'KeyPress' del formulario pongo  una instrucción que haga un reset al timer y lo mismo en el 'MouseMove' del form, de esta forma, cuando pulsas una tecla o mueves el ratón sobre el formulario se activa el Reset del Timer y no se dispara el método 'Timer', Si no se usa el ratón durante el tiempo especificado en el control 'Timer' o no se pulsa una tecla, se dispara el evento Timer y ahí guardo la información y cierro el formulario.

Mas luego le puse un tiempo al timer de 1 min, le pueden poner el tiempo que deseen. Llamé al botón que cierra el formulario así desde el timer:

THISFORM.command2.Click && este es mi btn de salir

este btn lo que tiene es "thisform.release"

y el evento "unload" puse que haga la salva antes de salir, con esto no da error.

Mil gracias a todos los que respondieron.

Cualquier duda ya saben.


Saludos a todos.

Pupo


El jueves, 6 de diciembre de 2012 22:48:10 UTC-8, Matías Mancuello escribió:

DIEGO CALLEGARI

unread,
Dec 17, 2012, 3:55:25 PM12/17/12
to publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages