PRB: ScrollText & Improper RETURN from ON Event GOSUB Can Bomb (48727)
The information in this article applies to:
- Microsoft QuickBASIC Compiler for the Apple Macintosh 1.0
This article was previously published under Q48727 SYMPTOMS
In Microsoft QuickBasic Version 1.00 for the Macintosh, system bombs
or machine hangs can result from returning improperly from GOSUB
subroutines for event-trapping when the ScrollText MBLC routine is
used. This can occur in compiled applications and in the QuickBasic
interpreter. Different system bomb ID numbers can result, but the most
common one encountered is "System Error ID = 02."
RESOLUTION
To avoid problems when you perform ON Event GOSUB statements (such as
ON MENU GOSUB), be sure to RETURN from handling the event before
attempting to handle the next event.
MORE INFORMATION
Below is an example of an incorrectly designed QuickBasic program that
does not return properly from an ON MENU GOSUB routine. The program is
condensed from a customer's larger program. The problem occurs from
doing an ON MENU GOSUB statement followed by a GOSUB to a routine that
turns MENU ON (mistakenly), invokes ScrollText, and is improperly
exited by trapping the user-defined QUIT menu option.
The program needs restructuring so that MENU remains OFF while
handling a MENU event (between the ON MENU GOSUB and the RETURN).
Also, the ScrollText routine should be moved to a loop at the main
level code so MENU events can be used in proper conjunction. You
should also execute DisposeScroll when finished using the ScrollText
statement.
The necessary program revisions are not written in the program below.
Please refer to the ToolBoxSampler program in the "QB Demos" folder on
the QuickBasic 1.00 release disk for a similar working example.
ToolBoxSampler polls the MENU() function instead of trapping MENU
events with the ON MENU GOSUB statement.
Example of Incorrect Programming
To encounter the system bomb, choose the QUIT option under the OPTION
One menu two times. This produces a system bomb the first time when
run as a compiled application, but in the environment you might have
to run it a few times to get a system bomb.
DEFINT a-z
DIM HILOW$(31)
QuitFlag=1
GOSUB restoreall
ON MENU GOSUB doMenu: MENU ON
WHILE 1 : WEND
doMenu:
MenuID = MENU(0)
MenuItem = MENU(1) 'SELECT CASE MenuID
CLS
SELECT CASE MenuID
CASE 1 'FILE menu
SELECT CASE MenuItem
CASE 1 : GOSUB Quitsub
END SELECT
CASE 2
SELECT CASE MenuItem
CASE 2 : GOSUB HILOWLIST
END SELECT
CASE ELSE
END SELECT
MENU
RETURN
HILOWLIST:
MENU ON ' Bad program design: should be no MENU ON here,
' and you can't expect to trap MENU selection events in
' the ScrollText loop below, since you haven't yet
' RETURNed from the MENU event which got you here.
linenum% =0: top%=0: S&=0: in%=0: SS&=0
SetRect scr%(1),3,60,275,270
FRAMERECT VARPTR (scr%(1))
SetRect Bar%(1),274,60,290,270
NewScroll S&,Bar%(1),1,1,20,1: 'verticle
QuitFlag=3
WHILE MOUSE (0)<>1 'This Loop is only exited by the Menu Option
ScrollText S&,scr%(1),HILOW$(1),top%,31,linenum%
WEND
RETURN 'This RETURN is never executed.
restoreall:
MENU 1,0,1,"File"
MENU 1,1,1,"QUIT":cmdkey 1,1,"Q"
MENU 2,0,1,"OPTION ONE"
MENU 2,2,1,"OPTION TWO":cmdkey 2,2,"H"
RETURN
hilowend:
DisposeScroll S&
WINDOW CLOSE 1
WINDOW 1
RETURN
Quitsub:
IF QuitFlag=1 THEN GOSUB restoreall : PRINT "the end" : END
IF QuitFlag = 3 THEN QuitFlag=1 : GOSUB hilowend : GOSUB restoreall
RETURN
Modification Type: | Minor | Last Reviewed: | 1/9/2003 |
---|
Keywords: | kbprb KB48727 |
---|
|