************************************************** >*-- Class: tmrtimeout (d:\clients\investlink\tsm50\libs\apptimeout.vcx) >*-- ParentClass: timer >*-- BaseClass: timer >* >DEFINE CLASS tmrtimeout AS timer > > > Height = 23 > Width = 23 > *-- The amount of time to timeout on > ntimeout = 0 > *-- Time this program last ran (in seconds) > nlastrun = 0 > *-- Time the program detected the last change in state > nlastchange = 0 > *-- Last mouse column detected > nlastmousecol = 0 > *-- Last mouse row detected > nlastmouserow = 0 > *-- Current mouse column > nmousecol = 0 > *-- Current Mouse Row > nmouserow = 0 > *-- Current Time the timer ran in calctime() format > nrun = 0 > *-- Current active form. > cactiveform = ("") > *-- Active form at the last timer run > clastactiveform = ("") > *-- Value of LastKey() when timer is run. > nkey = 0 > *-- Lastkey pressed by the user at the previous timer run. > nlastkey = 0 > Name = "tmrtimeout" > > > *-- Calculates time in seconds. Not the SECONDS() function. > PROCEDURE calctime > LPARAMETERS tcTime > > IF PCOUNT() =0 > tcTime = Time() > ENDIF > > #DEFINE SECONDS_DAY 86400 > #DEFINE SECONDS_HOUR 3600 > #DEFINE SECONDS_MINUTE 60 > #DEFINE ELAPASED_DAYS DATE() - {01/01/97} > #DEFINE ELAPSED_HOURS > > *-- This function will return seconds since 1/1/97. This way, when we move from > *-- one day to another (which would cause Seconds() to recycle to 0), we are > *-- not affected. > *-- > *-- One other point. I am trying to optimize the code as much as possible because this > *-- timer may run many times in a session and I want it to be unnoticeable. > LOCAL lnDays, lnHours, lnMinutes, lnSeconds, lnRetVal > > lnDays = DATE() - {01/01/97} > lnHours = VAL(LEFT(tcTime,2)) > lnMinutes = VAL(SUBST(tcTime,4,2)) > lnSeconds = VAL(SUBST(tcTime,7)) > > lnRetVal = (lnDays * SECONDS_DAY) + ; > (lnHours * SECONDS_HOUR) + ; > (lnMinutes * SECONDS_MINUTE) + ; > lnSeconds > > RETURN lnRetVal > ENDPROC > > > *-- Timeout the application > PROCEDURE timeoutapp > LOCAL loTimeoutForm, llUserCancel > loTimeOutform = CREATEOBJECT("timeoutform") > loTimeOutform.Show() > > llUserCancel = loTimeoutForm.uRetVal > loTimeoutForm.Release() > > IF !llUserCancel > ON SHUTDOWN > IF TYPE("goAPP") == "O" AND !ISNULL(goAPP) > *-- Cancel everything out there... > > LOCAL lnForm > > *-- Loop through all open forms and request that they be closed > lnForm = 1 > FOR lnForm = 1 TO _screen.FormCount > IF TYPE("_screen.Forms(lnForm)") == "O" AND !ISNULL(_screen.Forms(lnForm)) > IF UPPER(_screen.Forms(lnForm).BaseClass) = "TOOLBAR" > LOOP > ENDIF > > IF PEMSTATUS(_screen.Forms(lnForm), "Cancel", 5) > _screen.Forms(lnForm).Cancel() > ENDIF > ENDIF > ENDFOR > goAPP.CleanUp() > ENDIF > > QUIT > ELSE > *-- If the user cancels the timeout, reset the timer counter > this.nLastChange = this.nRun > ENDIF > ENDPROC > > > PROCEDURE Timer > LOCAL llChange, lnInterval > > WITH this > *-- Turn the timer off while we are in the timer event > lnInterval= .Interval > .Interval = 0 > > .nRun = .CalcTime() > .nMouseCol = MCOL("") > .nMouseRow = MROW("") > .nKey = LASTKEY() > .cActiveForm = IIF(TYPE("_screen.activeform.caption") == "C", ; > _screen.activeform.caption, ; > "***DESKTOP***") > > llChange = !(.nKey = .nLastKey ; > AND .nMouseCol = .nLastMouseCol ; > AND .nMouseRow = .nLastMouseRow ; > AND .cActiveForm == .cLastActiveForm) > > *-- Now, if we have a change, just record it and go on > > IF llChange > .nLastChange = .nRun > ELSE > IF .nRun - .nLastChange >= .nTimeOut > *-- Timeout > .TimeOutApp() > ENDIF > ENDIF > > *-- Save the current state > > .nLastRun = .nRun > .nLastMouseCol = .nMouseCol > .nLastMouseRow = .nMouseRow > .nLastKey = .nKey > .cLastActiveForm = .cActiveForm > > *-- And that's that > .Interval = lnInterval > ENDWITH > ENDPROC > > >ENDDEFINE >* >*-- EndDefine: tmrtimeout >**************************************************