Creating user friendly programs (5)
by Steven Flintham (15A)
Interacting with the user (2)
As mentioned in the last article, this time I want to cover step selection
The simplest type of step selection menu is the "one key to move, one to
select" type. Step1 is an example of this type. The program is fairly easy
to follow, with the possible exception of line 460.
This removes the teletext control codes from the start of the line,
therefore removing the highlight and adds one to choice%. The highlight is
then redisplayed the next time around the loop. Note that choice% is made to
automatically wrap around to zero when it reaches six by the MOD 6
statement. Note also that the CHR$(156) code at the end of the line is not
removed, as this only has an effect when the bar is displayed, when it is
overwritten by another CHR$(156) anyway. It could be considered a little
untidy doing this, but I feel it is neater as it avoids using another TAB
command to move the cursor to an appropriate place to remove the CHR$(156).
The only other point to note is that the values returned begin with 0, so
that the quit option, which is the sixth in the menu, returns 5. This is
done so that the MOD 6 technique mentioned above can be used easily.
This simple form of step selection has one main advantage. This is that only
two keys are required, so it is simple to use and it should be possible to
use this technique, modified for some other input device, with physically
However, it has (to my mind) two disadvantages. The first is that it can be
tedious to have to move through the menu in just one direction -
particularly when you have missed the option you wanted and have to go all
the way round (just like setting most digital watches!)
The second is that, despite the simplicity of the method, it is difficult to
describe succintly and therefore a relatively long "prompt" is required.
Simply writing "Use SPACE to select and RETURN to choose" is confusing,
because it is not clear whether selecting is the action of moving through
the menu or the action of "choosing" an option (see what I mean!) (I suppose
you could use the word "step" to refer to stepping through the menu and
either "choose" or "select" to refer to making a choice, but I still feel
it's a bit confusing)
Two-way step selection avoids these problems - Step2 demonstrates this. This
is very similar to Step1 - the only real point of note as far as the program
is concerned is the use of *FX4,1 to allow the cursor keys to return ASCII
codes. Incidentally, although this also uses a long prompt, it would be
reasonable to just use "Use cursor keys and RETURN", which would all fit on
Step selection is possible in all modes, but the above examples work only in
mode 7. For completeness, Step3 is a version of Step2 written to work in
mode 4. Despite being basically the same, there are a few things worth
mentioning. Firstly, the double height routine is slightly non-standard. It
inserts a blank line at the top of the character and only uses "half" of the
last line of each character to compensate for this. This has the effect of
centering the text more effectively when used with reverse video, but
prevents descenders being displayed properly. As there are none in this
title, this is not a problem, but if you want to use this routine in your
own programs, try it first with a descender to see if you are happy with the
appearance. To see how "conventional" double height would appear, delete
line 800 and un-REM the following line.
Secondly, the bar is made from individual vertical lines because I can never
seem to get the "two-triangle" method of rectangle drawing to work in GCOL 4
mode. The two triangles always overlap and because they are plotted in the
inverse of whatever is on the screen, an inverse line appears across the
diagonal of the rectangle.
This method of rectangle plotting gives a partial "rolling bar" effect, as
mentioned by a member in issue 26, although this is just a side effect of
the method of drawing the bar, and varies depending on system speed. Step4
is a version of Step3 modified to give a better rolling bar effect which
appears regardless of system speed.
The program is fairly straightforward, but PROCdraw_bar is worthy of
examination. It selects inverse graphics with GCOL 4,1 and then works out
where to start and stop drawing the bar. start% is the y-coordinate at which
the bar begins and end% is the y-coordinate at which it ends. These are
initially assigned so that the bar is drawn from top to bottom, and then
swapped round in line 570 if the bar is to be drawn from bottom to top.
The expression after the STEP in the FOR command is just a convienient way
of setting the step value to 4 or -4 without using an IF-THEN command. It
could be replaced with:
IF end%>start% THEN step%=4 ELSE step%=-4
FOR y%=start% TO end% STEP step%
One line of the bar is then drawn, and if offset% has not been set to zero,
another line is drawn at y%+offset%. This is used to erase the old bar
line-by-line as the new one is being drawn, giving the flowing effect.
Finally, PROCdelay(2) provides a delay of two centiseconds between the
drawing of each line.
With the direct selection menus earlier in this series I gave a general
procedure which could be used to make implementing the menus easier. I have
not done this for these menus because there are so many variations that it
would not really be convienient. However, it should be relatively easy to
adapt any of the routines given here for your own programs and you are
welcome to do so, provided they are not used for profit.
In the next article I intend to cover step-and-direct selection menus, which
give the best of both worlds.