OnKey Events on Forms
Description
Handling key events, macro recorder example, and an application help example.
Handling Key Events
The general approach to intercepting and handling keystrokes in your application is as follows:
Test to see what key was pressed by examining the value in a_user.key.value. Keys such as 'Backspace', 'Up', 'Down' etc. will be represented using a curly bracket syntax (e.g. {Backspace})
Tip: To get a list of key codes, right click in the Code Editor and select Genies, Insert Key code.. from the menu.
Write code that you want to execute if a particular key was pressed. Remember that your event handler will be called multiple times for each key event ('down', 'repeat' and 'up'). The value of the key event is in a_user.key.event.
If you want to prevent Alpha Anywhere from passing the key on to the form, set a_user.key.handled to .t.. If this value is .f. then the key will be passed onto the form. Otherwise, the keystroke will not be passed onto the form.
For example, this code intercepts the Shift+F10 key. The keystroke is NOT passed onto the form.
IF a_user.key.value = "{+F10}" THEN
'set a_user.key.handled = .t. to prevent the key stroke being passed on to the Form
a_user.key.handled = .t.
IF a_user.key.event = "down" THEN
ui_msg_box("","User pressed shift+F10")
END IF
END IFMacro Recorder Example
Here is an example script that records and plays back keystroke macros within a form. The script is defined in a form's OnKey event.
Application Help Example
Here is a collection of examples scripts that intercepts the F1 key and lets the application redefine HELP. The help topic is set by each field's OnArrive event, and cleared on the field's OnDepart event. In this example, it is assumed that the Xbasic application programmer has provided a windows HELP file. :
OnKey event for form:
' Declare the WinHelp function - Published windows
' function name is WinHelpA (A is for ASCII single byte)
' there is also a WinHelpW that is multibyte (i.e. Unicode)
' WinHelp is the name our Xbasic program uses
declare user32 WinHelp@WinHelpA LLCLL
' Define some useful constants
constant global HELP_COMMAND = 258
constant global HELP_KEY = 257
constant global HELP_PARTIAL_KEY = 261
constant global HELP_INDEX = 3
dim shared helptopic as C
HELP_FILENAME = :a5.get_path()+ "\invoice.hlp"
' If the user hit the {F1} key...
if (A_USER.KEY.value = "{F1}" ) then
' eat the key and invoke help with our help file
A_USER.KEY.handled = .T.
if (A_USER.KEY.event = "down") then
if (helptopic <> "") then
' if a topic is defined, use the topic in the help call
WinHelp(0, HELP_FILENAME, HELP_PARTIAL_KEY,helptopic)
else
' If no help topic defined, then just show an index
WinHelp(0, HELP_FILENAME, HELP_INDEX,"")
end if
end if
end ifOnArrive event for INV_NO field:
' Set the topic to be invoice numbers dim shared helptopic as C helptopic = "Invoice Numbers"
OnDepart event for INV_NO field:
' No longer on the invoice number field, so un-define the topic dim shared helptopic as C helptopic = ""
OnArrive event for Vendor_ID field:
' Set the topic to be Vendor dim shared helptopic as C helptopic = "Vendor"
OnDepart event for Vendor_ID field:
' No longer on the Vendor_ID field, so ' undefine the topic dim shared helptopic as C helptopic = ""
See Also