FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour como saber si un objeto tom贸 el :end() o no ??
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
como saber si un objeto tom贸 el :end() o no ??
Posted: Wed Mar 08, 2017 01: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.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: Wed Mar 08, 2017 08:42 AM

Puedes proporcionar un PRG que reproduzca lo que describes ? gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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.
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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.
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: Thu Mar 09, 2017 04: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.
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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 (fw): Select all Collapse
#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)
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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.
Posts: 851
Joined: Sun Nov 09, 2014 05:01 PM
Re: como saber si un objeto tom贸 el :end() o no ??
Posted: 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.

Continue the discussion