2 |
One of the
major reasons that Mac
applications seem so
interactive is that
they
are “event driven”
that is, the user can freely redirect the program to a completely different activity at any time with just a single mouse click. The ability to easily create a customized user menu facility that supports this kind of behavior is one of the features that distinguishes the Macversion of Foxbase from its DOS cousins. Faxbase /Mac not only provides the commands to build a custom menu facility that meets Mac standards, but it also provides a menu “trap” that reacts automatically and immediately to a user mouse click on any menu command. Since Foxbase responds to “menu hits” whenever the currently executing program encounters a READ, a program containing a looping construct with a READ in it will give what appears to be instantaneous response to a menu click.
Although Fox hasn’t provided a slick graphically-based tool for this purpose, as
|
they
do for
screen
building
and report
generation, the five commands
and two
special functions used
to
create a menu facility
are not
difficult
to
understand and
use.
Based
on the
description
in
a recent George Goley column, building a
menu
facility in FoxPro
with
similar behavior
is
far more complex.
However, since
the
Fox documentation
in this area
leaves
something to be
desired,
and since it
does
take some experimenting
to get
a
properly
working
menu,
I
offer
the following very condensed description as
an
approach that works. I think
it
will
get
you
on the
right track
the
first time you have
to create
a
menu.
This approach contains
five
basic
steps.
The
objective is
to
construct a
menu
bar across
the top of the
display screen, with
each menu on that bar
having
an
associated set
of
individual commands
that are activated by just sliding the
mouse to the
desired
one and
releasing,
and with immediate action or program
redirection
corresponding
to the
chosen
command. The result will
be
two
programs
-
one
becomes part
of the
initialization
routine of the application, and the other
is a separate
menu
processing
program.
Foxbase commands support two ways
of
thinking
about menus;
this approach thinks in terms
of
arrays
-
the
menu
bar isan array
and
each
set of menu commands is an
array.
In Step 1 you dimension the menu
bar,
name the individual menus, and use a
specific
menu command to “install” the menu bar.
DIMENSION mbartop(4) mbartop(1)
=
Plain”
mbartop(2)
=
“Fancy”
mbartop(3)
=
“Fancier
mbartop(4)
=
“Very Fancy”
MENU BAR mbaitop
You have now
told Foxbase
to make a menu bar with 4 separate, named menus at the top of the
screen.
In Step 2
you
dimension, name and install the
list
of
commands
on each of
those
4
menus. Here are two
samples:
DIMENSION mbarl (3)
mbarl(1)
=
“First”
mbarl(2)
=
“Second’
mbarl(3)
=
‘Third”
MENU 1, mbarl
DIMENSION mbar3(4) mbar3(1)
=
“Primary”
mbar3(2)
=
“Secondary”
|
mbar3(3)
=
‘Tertiary”
mbar3(4)
=
“Quaternary”
MENU 3,
mbar3
You have now
told Foxbase
that the menu in
position 1
in the menu bar
has
three commands,
and
the
one in position
3
has
4
commands.
In Step 3 you add a submenu (hierarchical menu) to one of the
commands
on menu three. The approach is the same, but the install command uses a different option.
DIMENSION
sub3l(4)
sub3l(1)
=
‘Number One’
sub3l
(2)
=
‘Number Two”
sub3l
(3)
=
“Number
Three’
sub3l (4)
=
‘Number Four
MENU 3,
sub3l,4,1
You have now told
Foxbase
that
there is a submenu with 4 commands attached to the
first command on
the menu in position 3 on the menu bar.
In Step 4you install the menu trap and make a connection to a menu processing program. This step
uses a special
menu command and two special functions
designed
just
for this purpose. (This
is the command that FoxPro
doesn’t
have yet.)
ON MENU DO menuproc.prg;
WITH MENU(O), MENU(1)
You have now told Foxbase that whenever the user
clicks
a menu, it should transfer control to the menuproc program, and pass it the contents of two MENU functions. The first function returns the number of the menu
the
user clicked, and the second function
returns
the number of the particular command on
that
menu. One puzzling question that is not treated in the documentation is what the MENU
functions
return in the case of submenus. By experiment it
seems
that MENU(O) returns the
next
number beyond the last full menu, so the
best
approach to keep the menu numbers straight is to define the whole set of menus first and then define the sub- menus. You
can easily
check the numbers by just
running
a debug
window
to watch the MENU(O) and MENU(1) functions as
you click
the menu
In Step 5 you build the menuproc program to take action based on the
users
choice.
This
program is usually nothing
continued on
page
14
LA.
FOX
|
The Other Foxbase
|
Foxbase +/Mac
|
This newsletter
is designed
to
provide
a forum
for users
of
FoxPro, Foxbase +,
and
Foxbase+/Mac
to
share
information, perspectives, and techniques.
Please note:
This
group
has
no
formal
connection
with
Fox
Software,
Inc..
Opinions
expressed
and
liberties
taken herein
are
the sole responsibility of the
direct perpetrators. Don’t
blame
Fox
Software.
Fox,
unless indicated otherwise.
|
2
|
2 |