September 29, 1987 TBWINDO MULTI-LEVEL WINDOWS FOR BORLANDS TURBO BASIC Version 3.2 PURPOSE: This utility creates incredibly quick multi-level windows in Turbo Basic programs for IBM PC/XT/AT compatibles. TEST DRIVE: Compile and run the tutoring program TBDEMO32.BAS to get a feel for features and speed. FILES: In this version, TBWINDO.ARC contains: TBWINDO.INC - Turbo Basic window include file TBMENU.INC - Menu include file TBINPUT.INC - Structured input include file QPRINT.BIN - Quick print inline subroutine QPRINTC.BIN - Quick print between columns QATTR.BIN - Re-attribute an area of the screen QFILL.BIN - Fill an area of the screen with a specified character and attribute QSAVE.BIN - Save portion of screen QREST.BIN - Restore portion of screen RECOLOR.BIN - Screen area recoloring TBDEMO32.BAS - Demonstration program source code TBWIND32.DOC - This document file. README.1ST - Most recent changes and corrections. Assembly language source code for all BIN files is included for all those interested. Any Suggestions for improvements to the code would be appreciated, as I do not profess to be good at Assembly language. USING TBWINDO Include the TBWINDO.INC program in your program with the following statement: $INCLUDE "TBWINDO.INC" Set MW% variable equal to the maximum number of windows you will have open at any one time. - 1 - Set the ScrnArray variable equal to the estimated total memory required to save your screens. If you expreience a subscript out of range error in the include file, increase this variable. As a rough rule of thumb, start out with the variable equal to 250 times the maximum windows (mw%) variable. You invoke the routines by means of a CALL with a list of parameters, rather than a GOSUB. Using the MAKEWINDOW procedure: CALL MAKEWINDOW(ROW%,COL%,ROWS%,COLS%,ATTR%,BRDRSEL%,SHADOW%,ZO OM%) Where: ROW - the screen row of the upper left hand corner of your desired window. Value should be between 2 and 23 (for reasons explained below). WARNING - the subroutine does not check for proper values. You must check these yourself or accept the consequences. COL - the screen column of the upper left hand corner. Value should be between 2 and 79. ROWS - the number of rows long the window should be. COLS - the number of columns wide the window should be. ATTR - the attribute of the window colors. BRDRSEL - the border you desire around the window. Valid selections in this release are: 0 - No Frame (just a border of BACKground color.) 1 - Single Line Frame 2 - Double Line Frame 3 - Single Horizontal Line, Double Vertical Line 4 - Single Vertical Line, Double Horizontal Line SHADOW - Another "switch" to indicate if the window should have a black "shadow" under it offset down. This gives a three-dimensional effect that seems to "raise" the window away from the screen. A value of 1 indicates a shadow is desired on the left side, a value of 2 indicates the right side, while a value of 0 - 2 - means no shadow. ZOOM - A "switch" used to indicate to the subroutine if the window should "grow" from a small box at the midpoints of the coordinates to full size. A value of 1 indicates the window should grow. A value of 0 indicates it should not. using the TITLEWINDOW procedure: CALL TITLEWINDOW(LOC%,TITLE$) Where: LOC - Indicates where the title should be placed. Valid selections are: 1 - Top left hand corner 2 - Top center 3 - Top right hand corner 4 - Lower left hand corner 5 - Lower center 6 - Lower right hand corner TITLE - The string data you would like printed. NOTE: The TITLEWINDOW procedure uses the coordinates from the most recent use of MAKEWINDOW. Use this procedure only after a call has been made to MAKEWINDOW. Using the RemoveWindow procedure: CALL REMOVEWINDOW There are no parameters passed to this procedure. The window created by the last call to MakeWindow is removed from the screen. Using the ClearWindow procedure: CALL CLEARWINDOW There are no parameters pass to this procedure. The window created by the last call to MakeWindow is cleared inside the frame. Using the PrtWindow procedure: CALL PRTWINDOW(ROW%,COL%,STRDAT%) Where: ROW - Is the row within the window you want to print on. - 3 - COL - Is the column within the window where you want printing to start. NOTE: The ROW and COL coordinates are relative to the current window. Row 1 Col 1 refers to the first character position inside the frame in the upper left corner. No parameter checking is done so if the string data exceeds the width of the window it will spill out the right side. STRDAT - Is the string data you want printed inside the window. Using the PrtCWindow procedure: CALL PRTCWINDOW(ROW%,STRDAT$) Where: ROW - Is the row within the window you want to have your string data centered on. NOTE: This procedure uses the current window and will attempt to center the string data between the left border and the right border. No parameter checking is done so if the string data exceeds the width of the window, it will spill out the sides. STRDAT - Is the string data you want printed within the window. Using the FNATTR% function: FNATTR%(FORE%,BACK%) Where: FORE - is the foreground color. Any Turbo Basic color number is valid. BACK - is the backgound color. Any Turbo Basic background color is valid. FNATTR% returns the attribute of the colors specified. Using the RECOLOR procedure: CALL RECOLOR(OLDATTR%,NEWATTR%,SNOCHK%) Where: OLDATTR - Is the attribute of the areas on the screen you wish to change. NEWATTR - Is the attribute of the color you want. - 4 - X% = SCREEN(1,1,1) ' RETURNS CURRENT SCREEN ' ATTRIBUTE CALL RECOLOR(X%,FNATTR%(14,4)) This will recolor everything on the screen that has the same attribute a the upper left corner of the screen to a foreground of 14 and a background of 4. Using the WINDOWXY procedure: CALL WINDOWXY(ROW%,COL%) Where: ROW = The row within the window. COL = The column within the window. This procedure is similar to Basic's LOCATE command except the ROW and COL coordinates are relative to the current window. Row 1 Col 1 refers to the first character position inside the frame in the upper left corner. No parameter checking is done so it is possible to locate outside the window. Using the MAKEMENU procedure: Define and title your menu with calls to MakeWindow and TitleWindow. Then define the selections available to the user in a string array named item$(). Assign the total selections available to itemcount% and the starting selection number to startpos%. Now CALL MAKEMENU. When a selection has be made in the MakeMenu procedure the item number selected will be assigned to the variable curntpos%. You can now use this number to direct the flow of you main program. Please see the source code of the demo program for a better understanding. One point to remember is that a MENU window is no different than any other window. You can pop one over the other and remove them as would a normal window. All of the above variables with the exception of the string variables must either be declared globally as integers by means of a DEFINT statement early in the program; or must have the specific integer identifier (%) attached wherever they appear in the program. The BASIC compiler is picky about this; so be sure to verify that the type assignment is correct. TBWINDO requires no special handling when it comes to compiling your program. Just make certain that all of your variables passing parameters to the TBWINDO subroutine are identified as integers, and you will be - 5 - able to proceed with the compile operation as with any other program. ACKNOWLEDGEMENTS I would like to express my thanks to Dave Evers (BASWIN22), Tom Hanlin (ADVBAS33) and Jim LeMay (WINDOW33). The routines presented are patterned after routines that were written by them for MicroSoft Quick Basic and Borland Turbo Pascal. These utilities are released into the public domain for anyone to use as they see fit however, anyone who feels inspired and would like to contribute to my printer paper and computer supplies fund may feel free to do so. Rick Fothergill 141 Oak Hill Road Pittsfield, MA 01201 (413) 442-2456 GEnie Address: R.FOTHERGILL Compuserve: 76210,443 BBS: (413) 499-7245 300-1200-2400 Baud N-8-1 8:00am - 4:00pm Monday through Friday - 6 - TBWINDO QUICK REFERENCE MakeWindow(Row%,Col%,Rows%,Cols%,Attr%,BrdrSel%,Shadow%,Zo om%) TitleWindow(Loc%,Title$) RemoveWindow ClearWindow MakeMenu PrtWindow(Row%,Col%,StrDat$) PrtCWindow(Row%,StrDat$) FNAttr%(Fore%,Back%) WindowXY(Row%,Col%) Qsave(Row%,Col%,Rows%,Cols%,Scrn%(??)) QRest(Row%,Col%,Rows%,Cols%,Scrn%(??)) ReColor(OldAttr%,NewAttr%,SnoChk%) Qprint(Row%,Col%,StrDat$,Attr%) QprintC(Row%,ColLeft%,ColRight%,StrDat$,Attr%) QFill(Row%,Col%,Rows%,Cols%,Char%,Attr%) QAttr(Row%,Col%,Rows%,Cols%,Attr%) QBox(Row%,Col%,Rows%,Cols%,Attr%,BrdrSel%) - 7 -