I found a great script from Mike Wilson here and modified it so I could put it into a UDF for use on a toolbar that can be attached to a form so the form will auto close after the set limit. In my scenario, I have a search form that requires input from the user and using the form's timer event was causing the form to refresh with every key press - essentially preventing the user from entering any data into the search box. By putting the timer event on the toolbar, I can avoid this problem.
This UDF should be generic enough to use with any app - the button images & ui_beep() selections can be changed. The only thing I was not able to do was make the 2 toolbar buttons look like all the others on the toolbar - and it was not for lack of trying!
So this is how to set it up:
In the OnInit event of your form copy this - you can change the seconds & title to whatever you wish (SEE NOTE ). This timer is set to 3 minutes and will alert the user when 10 seconds are remaining before the form closes (text changes color and beeps). At that point, the user can restart the timer, stop it altogether, or just let it finish and the form will close:
You can copy a toolbar and give the copy a new name then edit it by adding an XD button at the end then click Define Xdialog Code and add the following to each of the tabs:
on the Xdialag Body tab:
{embedded=22,2:XD_Timer};
On the Event Code tab:
if dlg_result = "close" then
topparent.Close(.f.)
end if
On the Intialization Event tab:
dim shared vStart as n
dim shared vAlert as n
XdTimerCtrl("Xd_Timer",vStart,vAlert)
Import this function into your control panel Code Tab & refresh the CP:
XdTimerCtrl_04-30-2018.txt
or you can copy & paste the code below.
NOTE: If you change vTitle to a different name than 'XD_Timer' you wil have to make that change in the toolbar's XD tabs where the name CANNOT be a variable.
TimerToolbar.jpg
This UDF should be generic enough to use with any app - the button images & ui_beep() selections can be changed. The only thing I was not able to do was make the 2 toolbar buttons look like all the others on the toolbar - and it was not for lack of trying!
So this is how to set it up:
In the OnInit event of your form copy this - you can change the seconds & title to whatever you wish (SEE NOTE ). This timer is set to 3 minutes and will alert the user when 10 seconds are remaining before the form closes (text changes color and beeps). At that point, the user can restart the timer, stop it altogether, or just let it finish and the form will close:
Code:
dim shared vStart as n dim shared vAlert as n dim shared vTitle as c vStart = 180 vAlert = 170 vTitle = "XD_Timer"
on the Xdialag Body tab:
{embedded=22,2:XD_Timer};
On the Event Code tab:
if dlg_result = "close" then
topparent.Close(.f.)
end if
On the Intialization Event tab:
dim shared vStart as n
dim shared vAlert as n
XdTimerCtrl("Xd_Timer",vStart,vAlert)
Import this function into your control panel Code Tab & refresh the CP:
XdTimerCtrl_04-30-2018.txt
or you can copy & paste the code below.
Code:
FUNCTION XdTimerCtrl AS V (title AS C, vn_Start AS N = 25,vn_Alert AS N = 20,vars as p = local_variables()) 'DESCRIPTION: Use to Embed XD control in a form toolbar to auto close the form dim frm as p dim dlg_body as C dim dlg_code as C dim shared dlg_result as c dim vcountdown as C dim vstop_state as C = "off" dim vtimer_state as C = "active" dim vn_count as N dim vn_seq_time as N = 0 dim flag as L = .t. WITH VARS vn_count = vn_start vcountdown=space(3)+totime(vn_count,2,0) font_color = "Dark Blue" back_color = "White" formatted_text = "{J=C,C}{B="+back_color+"}" + "{C="+font_color+"}" + vcountdown dlg_body=<<%dlg% {removecomments} 'use this one for embedding in a toolbar the other is for testing in the IW {background=Transparent} '{background=#220+226+249} {can_exit=close} {font=arial,10,b} {size=1.5} {timer=rotate}{interval=1} {units=F} {region} <%B=T;T=Restart;J=C,C;I=$$generic.stoplight.go%!Restart> {text=%O={@@}%12,1.5:formatted_text?flag} <%B=T;T=Stop;J=C,C;I=$$generic.stoplight.stop%!stop>; {font=} {endregion}; %dlg% dlg_code=<<%code% if a_dlg_button="rotate" then if vtimer_state="active" formatted_text = "{J=C,C}{B="+back_color+"}" + "{C="+font_color+"}" + vcountdown if vn_count=0 vtimer_state="inactive" vstop_state="on" ui_dlg_event_occurred() a_dlg_button = "close" ui_beep(UI_QUESTION_BEEP) end if if vstop_state="off" vn_seq_time=vn_seq_time+1 vn_count=vn_count-1 vcountdown=space(3)+totime(vn_count,2,0) if vn_seq_time=vn_Alert ui_beep(UI_EXCLAMATION_BEEP) back_color = "yellow" font_color = "red" end if end if end if end if if a_dlg_button = "restart" vstop_state = "off" vtimer_state = "active" font_color = "Dark Blue" back_color = "White" vn_count = vn_start vn_seq_time = 0 vcountdown = space(3)+totime(vn_count,2,0) end if if a_dlg_button = "stop" vstop_state = "on" end if if a_dlg_button = "close" 'switch comment/uncomment for use in embedded toolbar control or IW topparent.Close(.f.) 'Ui_modeless_dlg_close(title) end if %code% dlg_result = ui_modeless_dlg_box(title,dlg_body,dlg_code) 'may need to test dlg_result = "close" to close the active form if dlg_result = "Close" then topparent.Close(.f.) end if END WITH END FUNCTION
TimerToolbar.jpg
Comment