Page 1 of 1
Error Handling Inside Function
Posted: Wed Oct 01, 2008 8:36 am
by SlowCoder
Hi all! I'm new here, but did lots of QB programming back in the early 90's.
I previously posted this on another board (VBForums), but have not had any responses in 2 weeks. So now I've come to you!
I want to determine the maximum number of lines my display can have, so I wrote the following function:
Code: Select all
FUNCTION HighScreenRows
DIM ScreenMode(4)
'*** find maximum screen rows ***
ScreenMode(1) = 25: ScreenMode(2) = 43: ScreenMode(3) = 50: ScreenMode(4) = 60
FOR intRows = 1 TO 4
ResolutionGood = 1
ON ERROR GOTO ErrorHandler
WIDTH 80, ScreenMode(intRows)
ON ERROR GOTO 0
'
IF ResolutionGood = 1 THEN HighScreenRows = ScreenMode(intRows)
NEXT intRows
'
VIEW PRINT
EXIT FUNCTION
ErrorHandler:
'*** capture screenmode errors ***
ResolutionGood = 0
RESUME NEXT
END FUNCTION
Unfortunately this isn't working, as it doesn't like the error handling. I get a "label not found" error on my "on error goto ErrorHandler" line.
So, what I'd like to know is a couple of things:
1. How do I properly handle my errors in subs/functions?
2. Is there a better way to determine the highest rows available?
I'm using QuickBasic 4.5, not QBasic.
Thanks, guys!
Posted: Wed Oct 01, 2008 11:50 am
by burger2227
You cannot use ON ERROR in a SUB or Function. You don't need it there.
Place ON ERROR ahead of the FUNCTION or SUB calls in the main program. It will still work from the main module.
Also move your ErrorHandler sub to the main module! That is where ON ERROR looks for it.
Be careful with error handlers when creating a program. ANY error will trip it and you will not be able to know what the error was. You can use ERR to read the error numbers and categorize the error in the Handler. I generally disable my error handler when adding code. Just comment out the ON ERROR line. Otherwise you may have problems later!
Ted
Posted: Wed Oct 01, 2008 1:01 pm
by SlowCoder
Hmmm ... I understand what you're saying, and that explains a lot actually.
That leaves me with an unclean feeling. I try to keep the cleanest code possible. I would like to keep as much of the code within the function. Having to place error catching routines outside just feels dirty.
So, I'll reiterate my 2nd question. Is there a way to determine the maximum number of lines a different way?
Posted: Wed Oct 01, 2008 1:17 pm
by burger2227
YOU must learn the screen resolutions for Text and Graphics. Screen 0 has several WIDTH options for text. They are listed in the SCREEN Help section. The Text character sizes are also listed.
I saw an Interrupt routine that returned those values, but it messed up my Monitor settings. Here are some PEEK functions I found:
Code: Select all
DEF SEG = 0
PRINT PEEK(&H449) ' 1 byte, current video mode
PRINT PEEK(&H44A) ' 2 bytes, current screen width (columns)
PRINT PEEK(&H484) ' 1 byte, EGA/VGA screen height (rows)
DEF SEG
I have a zip file with 2 PEEK and POKE listings at QbasicStation.com in Member Files if you want to play around with settings. BE CAREFUL and use DEF SEG!
Ted
Posted: Wed Oct 01, 2008 1:57 pm
by SlowCoder
I know the text/graphic screen modes. Back in my school days I wrote a number of graphical applications, when EGA was the babe of babes.
That is not the issue here. What I am try to accomplish (which may be accomplished by your example) is how to determine, on the fly, the number of text lines a video card can handle. I am using screen 0 for this.
The reason for this ... I am writing a menuing system that will, with luck, be used by a wide audience, many of which may have legacy hardware for the purpose. This could even include old CGA video cards and monitors.
Posted: Wed Oct 01, 2008 6:24 pm
by MystikShadows
Interesting
...I'm gonna way a look at that
.
Burger, those peeks seem to work fine for me here...on a laptop
Posted: Thu Oct 02, 2008 12:34 am
by burger2227
Good to know Myst. Sometimes it is hard to find things so old that STILL work LOL. PEEKPOKE.ZIP information file:
http://www.qbasicstation.com/index.php? ... &filecat=4
Ted
Posted: Fri Oct 03, 2008 1:23 pm
by Ralph
Ted, I liked your basic program kernel very much, and added some code for myself, to go through all screen modes without having to do a manual change each time. I thought someone else might like to use it, so, here it is:
Code: Select all
GOTO RAE
'Program by "burger22", alias Ted, on 10/02/2008, as posted on:
'http://www.petesqbsite.com/forum/viewtopic.php?t=2773&sid=787edd50e4aa7d61b03a2f5ebd9a723f
DEF SEG = 0
PRINT PEEK(&H449) ' 1 byte, current video mode
PRINT PEEK(&H44A) ' 2 bytes, current screen width (columns)
PRINT PEEK(&H484) ' 1 byte, EGA/VGA screen height (rows)
DEF SEG
'''==========================================================================
RAE: 'Ted's program, as modifie by Ralph for all screen mode's in QuickBASIC
CLS
L = 0: H = 2
DO
FOR s = L TO H
SCREEN s
PRINT " SCREEN"; s
DEF SEG = 0
sp = 6: IF s < 7 THEN sp = 7
PRINT SPC(sp); PEEK(&H449); "Video mode"' 1 byte, current video mode
PRINT " "; PEEK(&H44A); "Columns (width)"' 2 bytes, current screen width (columns)
PRINT " "; PEEK(&H484); "Rows (height)"' 1 byte, EGA/VGA screen height (rows)
DEF SEG
PRINT
PRINT "Press <Esc> to end, press any other key to continue"
k$ = "": WHILE k$ = "": k$ = INKEY$: WEND
IF k$ = CHR$(27) THEN SYSTEM
NEXT s
L = 7: H = 13
LOOP UNTIL s = 14
SYSTEM
COOL
Posted: Fri Oct 03, 2008 11:57 pm
by burger2227
Nice idea Ralph. I would add 1 to the row counts however.
Ted
Thanks, Ted
Posted: Sat Oct 04, 2008 3:07 pm
by Ralph
Thanks to you, I have now improved the program a little, and corrected the total number of rows that your oritginal code provided, by adding 1, as you suggested. Here is the new code:
Code: Select all
GOTO RAE
'Program by "burger22", alias Ted, on 10/02/2008, as posted on:
'http://www.petesqbsite.com/forum/viewtopic.php?t=2773&sid=787edd50e4aa7d61b03a2f5ebd9a723f
DEF SEG = 0
PRINT PEEK(&H449) ' 1 byte, current video mode
PRINT PEEK(&H44A) ' 2 bytes, current screen width (columns)
PRINT PEEK(&H484) ' 1 byte, EGA/VGA screen height (rows)
DEF SEG
'''==========================================================================
RAE: 'Ted's program, as modifie by Ralph for all screen mode's in QuickBASIC
L = 0: H = 2
DO
FOR s = L TO H
SCREEN s
'get data through PEEK
DEF SEG = 0
video = PEEK(&H449) '1 byte, current video mode
columns = PEEK(&H44A) '2 bytes, current screen width (columns)
rows = PEEK(&H484) + 1 '1 byte, current screen height (rows)
DEF SEG
CLS
'in order to avoid pushing the screen up two spaces, it is necessary to
'locate the bottom line here, before printing other data to the screen
LOCATE rows, 1
PRINT rows; "<Esc> to end, <Spacebar> to continue"
'print screen data
LOCATE 1, 5: PRINT "SCREEN";
IF s <10> 6 THEN sp = 6
LOCATE 2, sp: PRINT video; "is the video mode"
LOCATE 3, 6: PRINT columns; "columns (width)"
LOCATE 4, 6: PRINT rows; "total rows (height)"
LOCATE rows - 2, 5: PRINT "= total rows-2 = normal useable rows"
LOCATE 1, 1
FOR I = 1 TO rows - 2
PRINT I
NEXT I
k$ = "": WHILE k$ = "": k$ = INKEY$: WEND
IF k$ = CHR$(27) THEN SYSTEM
NEXT s
L = 7: H = 13
LOOP UNTIL s = 14
SYSTEM
Posted: Sat Oct 04, 2008 4:15 pm
by burger2227
It also works with WIDTH column and row settings in various screen modes.
Ted
Posted: Sat Oct 04, 2008 4:33 pm
by Ralph
Ted, I don't follow you. What works with WIDTH columns and rows, too?
Posted: Sat Oct 04, 2008 5:59 pm
by burger2227
Screen 0 for example can use the following with WIDTH columns, rows.
Columns can be 40 or 80. Rows can be 25, 43 or 50.
So if you set WIDTH 40, 50 then it will return those values.
Try WIDTH 80, 60 in Screen 12.
The Help index also shows that Screen 9 and 10 can have columns of 80 only and 25 or 43 rows.
Posted: Sat Oct 04, 2008 7:56 pm
by Ralph
I understand, now. Yes, but, with my eyesight getting worse by the day, I think I may be forced into using only SCREEN mode 13, width 40, height 25! Or, I might just change my present 19" monitor for a 24" one, if I can find one and can afford the price.
Posted: Mon Oct 06, 2008 3:33 pm
by SlowCoder
I am glad that this subject has raised the interest of some ... Thank you.
However, I see that the peeks only return the current values, and not the maximum available.
I'm still working on it (as time permits), but would still appreciate your assistance.
Also, thanks for the reference to peekpoke.zip! Good find.
Posted: Mon Oct 06, 2008 6:24 pm
by Anonymous
You are welcome!
Ted