como saber si un objeto tomó el :end() o no ??

como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Wed Mar 08, 2017 1:54 am

Saludos a todos. Amigos del foro.

Tengo el siguiente problema.

al entrar a un formulario coloco un timer para que cuando se cumpla el tiempo establecido, aparezca un dialogo y le avise al usuario que le queda 1 minuto para terminar.
La rutina hace bien su trabajo, muestra el mensaje en el dialogo y este se cierra a los 30 segundos de haber aparecido, lo hago con un oDlg:end(). Luego de esto le quedan al usuario 30 segundos mas para decidir que hacer. si no hace nada, se cierra el formulario y el programa retorna al menu.
Todo funciona perfecto.. PEROOO.. mientras el programa no pierda el foco... es decir, si al aparecer el formulario avisando que queda un minuto, el usuario se va al explorador, o a word, o a cualquier otra instancia o aplicacion, la rutina ciertamente lo saca del formulario y retorna al menu, pero el dialogo que avisa que queda un minuto y que debe desaparecer a los 30 seg. no lo hace... queda sobre el menu principal. ¿por qué sucede esto y como se puede solucionar?

Al parecer, cuando el programa NO tiene el foco, no se ejecuta la instrucción oDlg:end()

Espero haberte explicado bien.

si alguien me puede ayudar, agradecido altamente.

un Abrazo a todos.
"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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby Antonio Linares » Wed Mar 08, 2017 8:42 am

Puedes proporcionar un PRG que reproduzca lo que describes ? gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Wed Mar 08, 2017 10:44 am

Hola Antonio, ok... voy a tomar el mas sencillo y tratar de comentartelo lo mas detallo posible y lo pongo por aquí.

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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Wed Mar 08, 2017 11:29 pm

Hola Antonio.
Aqui te dejo los dos prgs en donde trato de explicarte el problema que se me presenta.

el Primero, en el cual se construye un formulario y se integran TIMERS para controlar su duracion.


Define Dialog oDlg resource "AD_Empresa" title 'Registro de Datos de la Empresa'
oDlg:lHelpIcon:=.f.
oDlg:SetFont(oFontDlg)


// aqui activo dos Timers: el _oTimerTabla1 es el tiempo que tiene el usuario para estar dentro del formulario
// se configura en otro modulo y queda en una variable publica. Yo, en lo personal asigno 10 minutos ya que lo considero
// suficiente. Pero como dije, queda a criterio del usuario.
// el _oTimerTabla2 es el mismo tiempo de _oTimerTabla1 menos 1 minuto.

Define Timer _oTimerTabla1 Interval _nInterval1 Action iif(fWorkTime(),(lSalir:=.t.,oDlg:end()),)
Activate Timer _oTimerTabla1

Define Timer _oTimerTabla2 Interval _nInterval2 Action iif(fWorkTime(),(lSalir:=.t.,oDlg:end()),)
Activate Timer _oTimerTabla2

// al cumplirse el timer 2, se le avisal al usuario que le queda 1 minuto para terminar sus operaciones con el formulario
// al cumplirse el timer 1, el formulario se cierra y retorna al menu principal.

********* fin de los timers



redefine bitmap oBmpLogo filename _cBmpLogo ID 180 of oDlg on right click fChangeLogo(@oBmpLogo)
oBmpLogo:lTransparent:=.t.

fDefineSays(@oDlg,aSays,aColors[3],aColors[1],oFontDlg)

Redefine get oGet00 Var cNombreEmpresa Id 100 of oDlg READONLY
oGet00:SetColor( _nCd_Black,_nCd_LBlue)
Redefine get oGet01 Var cRifEmpresa Id 101 of oDlg READONLY
oGet01:SetColor( _nCd_Black,_nCd_LBlue)

Redefine get oGet02 Var cLicencia Id 102 of oDlg
oGet02:SetColorFocus( CLR_YELLOW )

Redefine get oGet03 Var cDirec1 Id 103 of oDlg
Redefine get oGet04 Var cDirec2 Id 104 of oDlg
Redefine get oGet05 Var cBarrio Id 105 of oDlg
Redefine get oGet06 Var cReferencia Id 106 of oDlg
Redefine get oGet07 Var cDistrito Id 107 of oDlg
Redefine get oGet08 Var cProvincia Id 108 of oDlg
Redefine get oGet09 Var cDpto Id 109 of oDlg
Redefine get oGet10 Var cPais Id 110 of oDlg
Redefine get oGet11 Var cTelf1 Id 111 of oDlg
Redefine get oGet12 Var cTelf2 Id 112 of oDlg
Redefine get oGet13 Var cCelular Id 113 of oDlg
Redefine get oGet14 Var cFax Id 114 of oDlg
Redefine get oGet15 Var cMailEmpresa Id 115 of oDlg
Redefine get oGet16 Var cWebSite Id 116 of oDlg
Redefine get oGet17 Var cNotes Id 117 of oDlg memo

Redefine BTNBMP oBAceptar Resource 'BotonGrabar' left Id 150 Of oDlg prompt "Grabar" ;
action (lSalir:=fGrabarEmpresa(),;
iif(lSalir,oDlg:End(),oGet02:setfocus()))
*oBAceptar:setfont(_oFontButt)
oBAceptar:lTransparent:=.t.

Redefine BTNBMP oBSalir Resource 'Salir' left Id 155 Of oDlg prompt "Salir" ;
action (lSalir:=.t., oDlg:End())
oBSalir:lTransparent:=.t.

Activate dialog oDlg center on Init (FillWnd( oDlg,aColors[1],,,.t.),oGet02:SetFocus(),fCreateGetsArray(),fCreateButtsArray())

y el segundo que es donde se controlan los timers


*****************************************************************************
Function fWorkTime()

local oDlgYesNo, oBNo, oBYes
local lFin :=.f.
local lTime :=.f.
local lSalir :=.f.
local oTimerT

Do Case

Case _nInterval2=(_nMinToInterval-1)*60000
// aca se cumple el primer timer y se le avisa al usuario que solo le queda un minuto
SndPlaySound( '.\Sonidos\error.wav' )
_nInterval2 :=(_nMinToInterval-1)*60000+1
_oTimerTabla2:Deactivate()
// se crea este dialogo donde se le pregunta si desea extender el tiempo o no
Define Dialog oDlgYesNo resource "AD_YesNo" // de no recibir respuesta, se cierra solo a los 30 segundos. Si el usuario responde, se cierra de inmediato

Redefine button oBYes Id 31 Of oDlgYesNo action (lTime :=.t. , lSalir:=.t.,oDlgYesNo:End()) // boton yes si desea extender el tiempo
Redefine button oBNo Id 101 Of oDlgYesNo action (lSalir:=.t. , oDlgYesNo:End()) // boton no si no desea extender el tiempo

Define Timer oTimerT Interval 30000 ACTION (oDlgYesNo:End(),oTimerT:End()) // timer que controla si el usuario no contesta y cierra el dialogo
Activate Timer oTimerT // a los 30 seg.

Activate Dialog oDlgYesNo centered On Paint FillWnd( oDlgYesNo,RGB(195,195,195))
oTimerT:End()

if lTime
_nInterval2:=(_nMinToInterval-1)*60000
_nInterval1:=_nMinToInterval*60000
_oTimerTabla1:Deactivate()
_oTimerTabla2:Deactivate() // si el usuario respondió que desea mas tiempo se reinician los timers
_oTimerTabla1:Activate()
_oTimerTabla2:Activate()
endif

Case _nInterval1=_nMinToInterval*60000
// este es el timer que indica la finalizacion del tiempo cuando no se obtiene respuesta del usuario
SndPlaySound( '.\Sonidos\error.wav' ) // hace la variable lFin = .t. y cuando se retorna, se cierra el formaulario y se vuelva al menu principal
MsgWait( "Estimado Usuario, el tiempo de la operación se ha agotado. La conexión con el servidor se cerrará","Tiempo agotado.")
lFin:=.t.

EndCase

Return lFin
*********************************************

aca te dejo tambien el link de descarga de dos videos con una duracion cerca de los 3 minutos cada uno donde puedes ver el comportamiento del programa y de los errores

video 1: http://www.softwarebinario.com/ml/EnFocus.rar
video 2: http://www.softwarebinario.com/ml/SinFoco.rar

Espero haya podido explicame bien para que puedas ver lo que esta sucediendo.

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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby Antonio Linares » Thu Mar 09, 2017 11:52 am

Vistos los videos, gracias

Parece que al perder el foco, el timer se desactiva.

Prueba a poner un sonido en el timer, para comprobar si el timer está realmente funcionando ó ha parado:
MsgBeep()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Thu Mar 09, 2017 12:50 pm

Saludos Antonio,

Gracias por tu respuesta.

Si te fijas bien en el código que te puse allí, ya tengo un archivo de sonido, y la respuesta es Positiva, sí se ejecuta.

Te indico donde lo tengo puesto.
*****************************************************************************
Function fWorkTime()

local oDlgYesNo, oBNo, oBYes
local lFin :=.f.
local lTime :=.f.
local lSalir :=.f.
local oTimerT

Do Case

Case _nInterval2=(_nMinToInterval-1)*60000
// aca se cumple el primer timer y se le avisa al usuario que solo le queda un minuto
SndPlaySound( '.\Sonidos\error.wav' )

o es en otra parte que quieres que lo ponga?

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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby Antonio Linares » Thu Mar 09, 2017 12:59 pm

Entiendo que este es el timer que deja de funcionar:

Define Timer oTimerT Interval 30000 ACTION (oDlgYesNo:End(),oTimerT:End()) // timer que controla si el usuario no contesta y cierra el dialogo
Activate Timer oTimerT // a los 30 seg.

luego el sonido tendría que ser llamado desde ese ACTION
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Thu Mar 09, 2017 4:06 pm

Antonio, Hola nuevamente...
Disculpa por no haber entendido tu sugerencia a la primera...

Curiosamente, el msgbeep() no funcionó, y tengo el sonido de la PC funcionando perfectemente, pero eso no importa ahora.

Le coloqué una parada, asi

Define Timer oTimerT Interval 30000 ACTION (msginfo('Close'),oDlgYesNo:End(),oTimerT:End())
Activate Timer oTimerT


y efectivamente, al tener el foco, hace la parada... al no tener el foco, no la hace.

Voy a seguir tratando de solucionar, mientras espero tu respuesta...

saludos.
"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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby carlos vargas » Thu Mar 09, 2017 10:19 pm

usualmente un timer, cuando es creado en un dialogo, se crea en el evento on init, que es cuando ya el dialog realmente existe.
esto para que el timer pertenesca al dialgo.
de lo contrario el timer pertenecesa al dialogo o ventana padre.

Code: Select all  Expand view

#include "FiveWin.ch"

procedure Main()

   LOCAL oWnd
   PRIVATE oTmr

   DEFINE WINDOW oWnd TITLE "Counting minutes"

   ACTIVATE WINDOW oWnd ON INIT BuildTimer() VALID ( oTmr:end(), .t. )

return

procedure BuildTimer()
   
   DEFINE TIMER oTmr INTERVAL 5000 ACTION ( oTmr:DeActivate(), MsgInfo( "Action!" ), oTmr:Activate() )
   ACTIVATE TIMER oTmr

return
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Thu Mar 09, 2017 10:28 pm

Saludos Carlos,
Gracias por tu sugerencia, ya la pogo en práctica y te comento...
"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: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: como saber si un objeto tomó el :end() o no ??

Postby JoseAlvarez » Thu Mar 09, 2017 10:39 pm

Ya probé tu sugerencia Carlos, la falla persiste.. si el programa no mantiene el foco, el timer no funciona...

Seguimos en la búsqueda de la solución.. :D
"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: 726
Joined: Sun Nov 09, 2014 5:01 pm


Return to FiveWin para Harbour/xHarbour

Who is online

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