""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
MAKING APPLICATION MENUS & MESSAGES MORE R:BASE-LIKE
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
PRODUCT : R:BASE VERSION : 3.1
CATEGORY : PROGRAMMING SUBCATEGORY : TOOLS
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Here are three routines and an undocumented feature that you can use
to make your application menus and messages look like they do in
R:BASE:
o Simulate the output device menu.
o Return to a previous menu option.
o Make red-bar error messages.
R:BASE Output Device Menu
"""""""""""""""""""""""""
OUTPUT.CMD presents the user with a check box to select the desired
output devices. This routine simulates the menu that R:BASE uses to
prompt for the output device when you print a report from the R:BASE
main menu. One advantage to this routine is that you are allowed to
select all three output devices at once. The R:BASE main menu only
allows you to select up to two devices at once.
*( OUTPUT.CMD--Prompt for specific output)
*( devices; return VOUTPUT--TEXT variable)
*( that holds the OUTPUT command.)
SET VAR vresp TEXT
CHOOSE vprint FROM output.mnu +
AT 09,28 black ON cyan CLEAR
SET VAR vprint = (.vprint + ',')
SET VAR v1option = (SSUB(.vprint,1)), +
v2option = (SSUB(.vprint,2)),+
v3option = (SSUB(.vprint,3))
SWITCH (.v1option)
CASE 'Create text file...'
DIALOG 'Enter file name:' vfile vresp 1
SET VAR v1option = .vfile
BREAK
CASE 'Show on screen'
SET VAR v1option = 'SCREEN'
BREAK
CASE 'Printer'
SET VAR v1option = 'PRINTER'
BREAK
DEFAULT
SET VAR v1option = NULL
ENDSW
SWITCH (.v2option)
CASE 'Create text file...'
DIALOG 'Enter file name:' vfile vresp 1
SET VAR v2option = .vfile
BREAK
CASE 'Show on screen'
SET VAR v2option = 'SCREEN'
BREAK
CASE 'Printer'
SET VAR v2option = 'PRINTER'
BREAK
DEFAULT
SET VAR v2option = 'NONE'
ENDSW
SWITCH (.v3option)
CASE 'Create text file...'
DIALOG 'Enter filename:' vfile vresp 1
SET VAR v3option = .vfile
BREAK
CASE 'Show on screen'
SET VAR v3option = 'SCREEN'
BREAK
CASE 'Printer'
SET VAR v3option = 'PRINTER'
BREAK
DEFAULT
SET VAR v3option = 'NONE'
ENDSW
IF v3option = 'NONE' THEN
IF v2option = 'NONE' THEN
IF v1option IS NULL THEN
SET VAR voutput = 'ABORT'
ELSE
SET VAR voutput = .v1option
ENDIF
ELSE
SET VAR voutput = (.v1option +
& 'WITH' & .v2option)
ENDIF
ENDIF
IF v3option <> 'NONE' THEN
IF vresp = '[Esc]' THEN
SET VAR voutput = +
('PRINTER WITH SCREEN')
ELSE
SET VAR voutput=(.vfile & 'WITH BOTH')
ENDIF
ENDIF
CLEAR VAR vprint, v1option, +
v2option, v3option, vfile, vresp
RETURN
Here's OUTPUT.MNU, the menu file used by OUTPUT.CMD:
OUTPUT.MNU
CHKBOX |Select Print Routing|
|Printer| |Printer output|
|Create text file...| |File output|
|Show on screen| |Screen output|
The CHOOSE command in OUTPUT.CMD collects the output devices from the
user. Then the series of SWITCH...ENDSW blocks construct the correct
syntax for the OUTPUT parameters depending on whether the user chose
one, two or all three devices. At the end of the program, the TEXT
variable VOUTPUT contains the correct OUTPUT parameters.
Use the following two commands to run OUTPUT.CMD and send output to
the devices the user chooses:
RUN output.cmd
OUTPUT &voutput
Return to Previous Menu Option
""""""""""""""""""""""""""""""
When you choose an option using the R:BASE menus, R:BASE always
remembers the option the cursor was sitting on when you made the
choice. When R:BASE returns to the previous menu, that remembered
option is highlighted.
But when you create your own application with pull-down menus, this
return option doesn't work the same way. When a user selects an option
and later returns to the application's main menu, R:BASE highlights
the upper left option instead of the last-used option.
Fortunately, you can change this by adding code to your application.
Use the command file MAKEPLAY.CMD listed below. Basically, you run
MAKEPLAY.CMD, passing it the pull-down number and the menu option
number. MAKEPLAY.CMD dynamically creates a playback (script) file that
holds the appropriate keystrokes to move the highlight to the desired
option. Here's MAKEPLAY.CMD:
*( MAKEPLAY.CMD--Make a playback file)
*( to return to the same spot in a)
*( pull down menu. Expects these values)
*( to be passed: pull-down number and)
*( menu option number.)
SET VAR %1 INT, %2 INT, vplay TEXT
IF %1 IS NULL OR %2 IS NULL THEN
WRITE 'You must pass these parameters:'
WRITE ' The pull-down number'
WRITE ' Menu option number'
RETURN
ENDIF
SET VAR vpull_num INTEGER = (.%1 - 1), +
vmenu_num INTEGER = (.%2 - 1), vright = (CHAR(0) + CHAR(77)), +
vdown = (CHAR(0) + CHAR(80))
WHILE vpull_num > 0 THEN
SET VAR vplay = (.vplay + .vright), vpull_num = (.vpull_num - 1)
ENDWHILE
WHILE vmenu_num > 0 THEN
SET VAR vplay = (.vplay + .vdown), vmenu_num = (.vmenu_num - 1)
ENDWHILE
SET VAR vplay = (.vplay + (CHAR(0) + CHAR(95)))
OUTPUT playit.scp
WRITE .vplay
OUTPUT SCREEN
CLEAR VAR vpull_num, vmenu_num, vright, vdown, vplay
RETURN
Use the PLAY command to execute PLAYIT.SCP right before the CHOOSE
statement. Then delete PLAYIT.SCP at the end of the application. Below
is a portion of an .APP file created by Application EXPRESS. The
arrows show you where to insert the appropriate PLAY, RUN, and DELETE
commands to implement MAKEPLAY in an Application EXPRESS application.
Use CODELOCK to make a new .APX procedure file from the modified .APP
file.
$COMMAND
MAKEPLAY
SET QUOTE = '
SET MESSAGES ON
CONNECT makeplay
SET ERROR MESSAGES ON
NEWPAGE
SET COLOR WHITE ON BLUE
SET BELL OFF
LABEL LBEG1
NEWPAGE
PLAY playit.scp
CHOOSE PICK1 FROM Main IN +
makeplay.apx AT 1 1 BLACK ON GRAY
SET VAR PICK11 = (SSUB(PICK1,1))
SET VAR PICK12 = (SSUB(PICK1,2))
CLEAR VAR PICK1
SWITCH (.PICK11)
CASE 1
SWITCH (.PICK12)
CASE 'Option 1'
NEWPAGE
SELECT +
* +
FROM A_Table
WRITE 'Press any key to continue. '
PAUSE
RUN makeplay.cmd USING .PICK11, 1
BREAK
CASE 'Option 2'
NEWPAGE
SELECT +
* +
FROM A_Table
WRITE 'Press any key to continue. '
PAUSE
RUN makeplay.cmd USING .PICK11, 2
BREAK
ENDSW
BREAK
.
.
.
DEL playit.scp
RETURN
The variable PICK11 always contains the correct number of options on
the menu bar, so you need only change the second parameter passed to
MAKEPLAY.CMD to reflect the pull-down option number.
Make Red-bar Error Messages
"""""""""""""""""""""""""""
R:BASE 3.1 displays a red bar at the bottom of the screen to alert the
user of error messages, information prompts, and rules violations. To
add red-bar error messages to your own applications, use REDERROR.CMD
(listed below), or use an undocumented PAUSE feature.
The undocumented PAUSE feature automatically puts "Press any key to
continue." in a red bar message at the bottom of the screen. All you
need to do is put a space and then any character after the PAUSE
command. For example, this works:
PAUSE red
When you press a key to continue, R:BASE clears the screen and
continues..
REDERROR.CMD is more flexible in that it centers any message in a red
bar at the bottom of the screen. When you run it, pass it the message
you want to display by using this syntax:
RUN rederror.cmd USING 'This is the error message.'
Here's REDERROR.CMD
*( REDERROR.CMD--Center message in)
*( a red bar at the bottom of the screen.)
SET VAR vmsg=(CTR(.%1,78) + CHAR(255))
SET VAR vmsg2= (CTR('Press any key to continue.',78) + CHAR(255))
SNAP error.$$$ FROM 24 1 TO 25 80
WRITE .vmsg AT 24,1 gray ON red
WRITE .vmsg2 AT 25,1 gray ON red
PAUSE
DISPLAY error.$$$ AT 24
DEL error.$$$
CLEAR VAR vmsg, vmsg2, %1
RETURN
How REDERROR.CMD Works
""""""""""""""""""""""
First, REDERROR.CMD checks to see if a message was passed to it. Then
it centers the message in 78 characters and adds a hard blank (ALT
255) to the end of it to make sure the color spans the entire screen.
Next, REDERROR.CMD uses the SNAP command to save any text that's
currently displayed on lines 24 and 25. Then it uses two WRITE
statements to display the desired message with "Press any key to
continue" below it. The PAUSE command halts processing to wait for the
user to press a key.
To complete the routine, DISPLAY restores any text that previously was
on lines 24 and 25. Then REDERROR.CMD deletes the scratch file and
clears the variables used in the routine.