PROCESS_EVENTS Verb - Continually Process Events/Call Registered Callback
Routine
Syntax
PROCESS_EVENTS {,TIM=int}{,ERR=lineref}
Description
The PROCESS_EVENTS verb continually processes
user interface events.
If the callback subroutine registered to handle the event is invalid, an
!ERROR=21 is returned.
In BBj 5.00 and higher, the Process Events verb supports an optional error
branch.
In BBj
17.0 and higher, the PROCESS_EVENTS verb supports an optional timeout,
specified in seconds.
The following rules determine the dispatch of events from the server's
event queue:
1. If a control has been destroyed, the event is discarded.
2. If a control's callback has been unregistered for an event,
the event is discarded.
3. If a control's callback does not exist in the program, an error
is thrown.
4. Otherwise, the event is read off the queue, and if processing
events, the callback is executed.
A BBj program may use both PROCESS_EVENTS and READ RECORD styles of event
handling, either by nesting a READ RECORD within a CALLBACK routine or
by calling another BBj program which uses a different event style.
When a program switches between event handling styles, the event and notify
queues are emptied. In other words, when a program that was currently
using PROCESS_EVENTS style calls READ RECORD, the event and notify queues
are emptied. Conversely, when a program that was currently using READ
RECORD calls PROCESS_EVENTS the event and notify queues are emptied.
An example of a menu program using either event style calling a program
utilizing either event style follows. The example programs below expect
an argument of either of the following:
|
Argument
|
Description
|
|
-
rr
|
READ RECORD
|
|
-
pe
|
PROCESS_EVENTS
|
Example 1
REM Using both READ RECORD and PROCESS_EVENTS interchangeably
REM Obtain the instance of the BBjAPI object
LET myAPI!=BBjAPI()
REM Open the SysGui device
SYSGUI=UNT
OPEN (SYSGUI) "X0"
REM Obtain the instance of the BBjSysGui object
LET mySysGui!=myAPI!.getSysGui()
REM SET style to 0(INVALID style) [1(READ RECORD), 2(PROCESSEVENTS)]
LET style = 0
REM Set addWindow param values
X=10
Y=10
WIDTH=200
HEIGHT=200
TITLE$="BBj Window"
REM Set the current context
mySysGui!.setContext(0)
REM Create a window with a title in the current context
myWindow! = mySysGui!.addWindow(X,Y,WIDTH,HEIGHT,TITLE$)
REM Create the menu bar
myMenuBar!=myWindow!.addMenuBar()
REM Add a menu to the menu bar
myMenu!=myMenuBar!.addMenu(-100,"&Menu")
REM Add menu items to the menu
myMenu!.addMenuItem(-101,"&Read Record Program")
myMenu!.addMenuItem(-102,"&Process Events Program")
REM Flag to determine if valid event style
LET valid = 0
REM display event style information as static text based on command line
args
if ARGC > 1 then
if ARGV(1) = "rr" or ARGV(1) = "RR" then
myStaticText! = myWindow!.addStaticText(107,20,80,100,30,"Event Style:
READ RECORD",$0000$)
style = 1
valid = 1
fi
if ARGV(1) = "pe" or ARGV(1) = "PE" then
myStaticText! = myWindow!.addStaticText(107,20,80,100,30,"Event Style:
PROCESS EVENTS",$0000$)
style = 2
valid = 1
fi
if valid = 0 then
myStaticText! = myWindow!.addStaticText(107,20,80,100,30,"Invalid Event
Style",$0000$)
myStaticText2! = myWindow!.addStaticText(108,20,110,100,30,"Specify - rr
or - pe to select event style.",$0000$)
style = 0
fi
else
myStaticText! = myWindow!.addStaticText(107,20,80,100,30,"Specify - rr
or - pe to select event style.",$0000$)
fi
DONE:
IF style = 1 THEN
REM READ RECORD STYLE
DIM EVENT$:TMPL(SYSGUI)
LET EVENT=LEN(EVENT$)
while(1)
READ RECORD(SYSGUI,SIZ=EVENT)EVENT$
REM APPCLOSE
IF EVENT.CODE$="X" THEN RELEASE
REM MENU EVENTS
IF EVENT.CODE$="C" THEN
IF EVENT.ID = 101 THEN CALL"MixedEventStyles2.bbj::READRECORDSTYLE"
IF EVENT.ID = 102 THEN CALL"MixedEventStyles2.bbj::PROCESSEVENTSSTYLE"
FI
WEND
FI
IF style = 2 THEN
REM PROCESS_EVENTS STYLE
REM Register the CALLBACK routines
CALLBACK(ON_CLOSE,APP_CLOSE,mySysGui!.getContext())
CALLBACK(ON_MENU_ITEM_SELECT,MENU1_SELECT,mySysGui!.getContext(),-101)
CALLBACK(ON_MENU_ITEM_SELECT,MENU2_SELECT,mySysGui!.getContext(),-102)
REM Process Events
PROCESS_EVENTS
REM Callback routine called when the user closes the application window
APP_CLOSE:
RELEASE
RETURN
REM Callback routine called when the user selects menuItem1
MENU1_SELECT:
CALL"MixedEventStyles2.bbj::READRECORDSTYLE"
REM restore context to current window
mySysGui!.setContext(0)
RETURN
REM Callback routine called when the user selects menuItem2
MENU2_SELECT:
CALL"MixedEventStyles2.bbj::PROCESSEVENTSSTYLE"
REM restore context to current window
mySysGui!.setContext(0)
RETURN
FI
IF style = 0 THEN
REM NO VALID STYLE
PRINT "NO VALID EVENT STYLE"
PRINT "SPECIFY - RR or - PE ON COMMAND LINE"
WHILE (1)
WAIT(1)
WEND
FI
|
Example 2
REM Program to be demonstrate using both event styles from a menu
GOTO DEFAULT
BUILDWINDOW:
REM BUILD THE WINDOW TO BE USED BY EITHER EVENT STYLE
REM Obtain the instance of the BBjAPI object
LET myAPI!=BBjAPI()
REM Open the SysGui device
SYSGUI=UNT
OPEN (SYSGUI) "X0"
REM Obtain the instance of the BBjSysGui object
LET mySysGui!=myAPI!.getSysGui()
REM Set addWindow param values
X=10
Y=10
WIDTH=250
HEIGHT=200
TITLE$="BBj Window"
LET FL = 0
REM Set the current context
mySysGui!.setContext(1)
REM Create a window
myWindow! = mySysGui!.addWindow(X,Y,WIDTH,HEIGHT,TITLE$)
REM Add a button on the window
myRedButton! = myWindow!.addButton(101,50,100,90,30,"Red",$0800$)
REM RETURN TO EITHER READRECORDS OR PROCESS EVENTS
RETURN
READRECORDSTYLE:
GOSUB BUILDWINDOW
myWindow!.setTitle("using READ RECORD")
DIM EVENT$:TMPL(SYSGUI)
LET EVENT=LEN(EVENT$)
WHILE(1)
READ RECORD(SYSGUI,SIZ=EVENT)EVENT$
REM APPCLOSE
IF EVENT.CODE$="X" THEN
myWindow!.destroy()
exit
FI
IF EVENT.CODE$="B" THEN
REM TOGGLE THE BUTTON COLOR
IF FL = 0 THEN
myColorRed! = mySysGui!.makeColor(mySysGui!.RED)
myRedButton!.setText("Blue")
FL = 1
else
myColorRed! = mySysGui!.makeColor(mySysGUI!.BLUE)
myRedButton!.setText("Red")
FL = 0
FI
myRedButton!.setBackColor(myColorRed!)
FI
wend
PROCESSEVENTSSTYLE:
GOSUB BUILDWINDOW
myWindow!.setTitle("Using PROCESS_EVENTS")
REM Register the CALLBACK routines
CALLBACK(ON_BUTTON_PUSH,RED_BUTTON_PUSHED,mySysGui!.getContext(),myRedButton
!.getID())
CALLBACK(ON_CLOSE,APP_CLOSE,mySysGui!.getContext())
REM PROCESS EVENTS
PROCESS_EVENTS
REM Callback routine called when the user closes the application window
APP_CLOSE:
myWindow!.destroy()
exit
RETURN
REM Callback routine called when the red button is pressed
RED_BUTTON_PUSHED:
REM Create the BBjColor Object using colorNum constant
REM TOGGLE THE BUTTON COLOR
if FL = 0 THEN
myColorRed! = mySysGui!.makeColor(mySysGui!.RED)
myRedButton!.setText("Blue")
FL = 1
else
myColorRed! = mySysGui!.makeColor(mySysGUI!.BLUE)
myRedButton!.setText("Red")
FL = 0
fi
myRedButton!.setBackColor(myColorRed!)
RETURN
DEFAULT:
PRINT "This program is intended to called by MixedEventStyles.bbj"
PRINT "Call using labels READRECORDSTYLE or PROCESSEVENTSSTYLE"
PRINT "Running in PROCESS_EVENTS STYLE MODE"
GOTO PROCESSEVENTSSTYLE
|
See Also
READ Verb - BBj
BBjControl::setCallback
BBjControl::clearCallback
Verbs - Alphabetical Listing