home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / library / qb_pds / qb4tb522 / mixed.doc < prev    next >
Encoding:
Text File  |  1992-02-25  |  27.9 KB  |  716 lines

  1.  
  2.             MIXED-LANGUAGE TOOLBOX FOR QuickBASIC
  3.             ─────────────────────────────────────
  4.                       By Christy Gemmell
  5.  
  6.  
  7. These are native QuickBASIC functions and procedures which call the
  8. machine-code routines in the Assembly-Language Toolbox for QuickBASIC.
  9. To use them, you must link both TOOLBOX.LIB, from the Assembly-Language
  10. Library disk, and the copy of MIXED.LIB from the Mixed-Language Library
  11. disk to your stand-alone programs, like this:
  12.  
  13.     LINK yourprog,,,toolbox.lib mixed.lib;
  14.  
  15. Since the QuickBASIC environment only allows one Quick Library to be
  16. loaded at a time, however, the version of MIXED.QLB supplied also
  17. contains all the routines from TOOLBOX.LIB. This allows you to use the
  18. environment to develop and test programs which use functions from 
  19. both libraries. Just start QuickBASIC with the command:
  20.  
  21.     QB(X) yourprog /L mixed.qlb
  22.  
  23. You can even build your own Quick Libraries, incorporating Toolbox
  24. routines, using the QuickBASIC Linker as follows:
  25.  
  26.     LINK /QU yoursub.obj yourfun.obj toolbox.lib mixed.lib,,bqlb45.lib;
  27.  
  28. BQLB45.LIB is the special interface library supplied with Microsoft's
  29. QuickBASIC 4.5 compiler. Substitute the following library names for other
  30. versions of the language.
  31.  
  32.     BQLB40.LIB          for QuickBASIC 4.0
  33.     BQLB41.LIB          for BASIC 6.0
  34.     QBXQLB.LIB          for BASIC 7.0 and 7.1 PDS
  35.  
  36. Be sure that, whichever interface library you use, it can be found by
  37. LINK.EXE when the library is being built. This can be done, either by
  38. copying it to the Linker's own directory or to a subdirectory pointed to
  39. by a LIB= environment variable in your AUTOEXEC.BAT file, for example:
  40.  
  41.     SET LIB=C:\QB45\LIBRARY
  42.  
  43. See your MS-DOS or PC-DOS manual for more information about environment
  44. variables.
  45.  
  46. If you have the Professional version of the Assembly-Language Toolbox,
  47. of course, building customised libraries is much easier since a full
  48. set of object (.OBJ) modules, together with source code, is supplied
  49. with this release.
  50.  
  51. The stand-alone (.LIB) and Quick Library (.QLB) versions of the Mixed-
  52. Language Toolbox both contain the following SUB programs and FUNCTION
  53. procedures:
  54.  
  55.  
  56. BARMENU
  57.  
  58. Creates and operates a menu orientated horizontally on the screen row
  59. specified. The calling program must supply :
  60.  
  61. Row%        =   The screen row on which the menu bar will appear.
  62. Atr%        =   The display attribute or colour for the menu bar.
  63. Opt%        =   Number of options available for selection.
  64. Menu$()     =   String array containing selection list. Menu$(0) should
  65.                 be set to a string of ASCII characters, corresponding to
  66.                 the initial or key letter of each option in the list.
  67.                 Insert a space at the appropriate position of an option
  68.                 to be disabled. In the remaining option strings an
  69.                 ampersand '&' indicates that the next character is the
  70.                 Hotkey to be highlighted for that option.
  71. Bar%        =   The menu selection to be highlighted on entry into the
  72.                 procedure.
  73. Nxt%        =   If set, this flag just causes the menu to be refreshed
  74.                 without pausing for a selection from the user. This is
  75.                 used to handle presses on the Right or Left Arrow keys
  76.                 in the Pull-Down Menu procedure.
  77. Ctx%        =   If set, this flag indicates that context-sensitive help
  78.                 is available, in which case ...
  79. Tpc$        =   The root name of the Topic file to be displayed if the
  80.                 user presses <F1> for help. The current selection number
  81.                 is appended to this to produce the actual filename.
  82. Mouse%      =   If set, this flag indicates that a mouse is installed
  83.                 and can be used to make selections.
  84.  
  85. DECLARE SUB BarMenu (Row%, Atr%, Opt%, Menu$(), Bar%, Nxt%,_
  86.                      Ctx%, Topic$, Mouse%)
  87.  
  88. On completion the procedure returns with the following variable set:
  89.  
  90. Bar%        =   Number of selection made by user. If zero then the
  91.                 <Escape> key was pressed to abort the procedure
  92.                 without making a selection.
  93.  
  94. VERMENU (see below) is a similar procedure which operates a vertically
  95. orientated point-and-shoot type menu.
  96.  
  97. See the source code of DEMON.BAS, the Toolbox demonstration program, for
  98. examples of BARMENU and VERMENU in use.
  99.  
  100.  
  101. BINDEC
  102.  
  103. Translates a string of binary digits to their long integer decimal
  104. equivalent.
  105.  
  106. DECLARE FUNCTION BinDec& (Binary$)
  107.  
  108.  
  109. CAPITAL
  110.  
  111. Converts all alphabetic characters in a string to lower-case,
  112. except for the first character of each word, which is forced
  113. to upper-case.
  114.  
  115. DECLARE FUNCTION CapItal$ (Original$)
  116.  
  117. This function is designed for use in printing address labels
  118. and can correctly identify and format proper surnames like
  119. 'McLaughlin'.
  120.  
  121.  
  122. CENTRE
  123.  
  124. Centres the string supplied within an empty string of specified width.
  125.  
  126. DECLARE FUNCTION Centre$ (Text$, MaxWidth%)
  127.  
  128. This function is called by the VERMENU routine (see below) to centre the
  129. title of a pull-down menu within the window it refers to.
  130.  
  131.  
  132. CHECKPRINTER
  133.  
  134. This procedure checks if the specified parallel printer is ready and
  135. on-line. If so, it returns immediately with Ready% set to -1 (TRUE), if
  136. not, CHECKPRINTER displays the message 'PRINTER NOT READY' on the bottom
  137. row of the screen and waits for the operator to correct the problem and
  138. press a key.
  139.  
  140. If the user presses <Escape>, the procedure returns with Ready% set to
  141. zero (FALSE). Any other keystroke causes it to go back and test the
  142. printer again. CHECKPRINTER will not return until either the printer is
  143. ready for output, or the <Escape> key is pressed.
  144.  
  145. DECLARE SUB CheckPrinter (Printer%, Ready%)
  146.  
  147. Printer% is the number of the parallel printer to test (1 = LPT1: etc).
  148.  
  149. Example:    CheckPrinter 1, Ready%              ' Test LPT1:
  150.             IF NOT Ready% THEN
  151.                STOP
  152.             ELSE
  153.                LPRINT Stuff$
  154.             END IF 
  155.  
  156.  
  157. DATEINPUT
  158.  
  159. Accepts and verifies date input in a Reverse Video entry panel, all the
  160. usual editing keys are supported and entry is terminated by either a
  161. Carriage Return or one of several special function keys (see below).
  162.  
  163. DECLARE FUNCTION DateInput$ (Default$, Context%, Topic$, HotKey%)
  164.  
  165. Default$    =  default string which can be accepted by just pressing
  166.                the <Enter> key.
  167. Context%    =  set TRUE if context-sensitive help is available, in
  168.                which case ... 
  169. Topic$      =  name of the HELP Topic file to display whenever the
  170.                <F1> key is pressed. 
  171. HotKey%     =  If entry is terminated by anything other than the
  172.                <Enter> key, this variable will contain an explanatory
  173.                return code ..
  174.  
  175. Return Codes:   1  =  <Escape> abort entry returning a null string
  176.                 2  =  <F2>     repeat previous entry for this field
  177.                 3  =  <Up Arr> pressed, move to previous field 
  178.                 4  =  <Dn Arr> pressed, move to next field
  179.                 5  =  <Pg Up>  pressed, move to top of screen
  180.                 6  =  <Pg Dn>  pressed, move to end of screen
  181.  
  182. Editing Keys:   <L.Arrow>   =  Move cursor one character to the left
  183.                 <R.Arrow>   =  Move cursor one character to the right
  184.                 <Home>      =  Move cursor to first character of field
  185.                 <End>       =  Move cursor to last character of field
  186.                 <Ctrl End>  =  Clear from current cursor position to
  187.                                the end of the entry field.
  188.                 <BackSpace> =  Replace character under cursor with a
  189.                                blank space and move cursor one character
  190.                                to the left.
  191.                 <F1>        =  pop up on-line HELP screen.
  192.  
  193. DATEINPUT is designed to be used as part of a full-screen data-entry
  194. system. Your program can examine the return code to determine whether
  195. the operator wishes to terminate entry or move forwards or backwards
  196. between entry fields.
  197.  
  198. See also the REVINPUT function for a similar, more general-purpose,
  199. data-entry routine.
  200.  
  201.  
  202. DAYSBETWEEN
  203.  
  204. Calculates the number of days between two dates, supplied as strings in
  205. the format DD/MM/YYYY. The function will provide accurate results when
  206. supplied with dates between 01/01/1901 and 31/12/2099.
  207.  
  208. DECLARE FUNCTION DaysBetween& (Date1$, Date2$)
  209.  
  210. See the INTERVAL function for a method of calculating the number of
  211. days between two Julian dates.
  212.  
  213.  
  214. DECBIN
  215.  
  216. Translates a decimal number to an equivalent string of binary digits.
  217.  
  218. DECLARE FUNCTION DecBin$ (Decimal&)
  219.  
  220.  
  221. DOSVERSION
  222.  
  223. Gets the current Operating System (DOS) version. The version is returned
  224. as a string in the form "3.20" (for DOS 3.2).
  225.  
  226. No calling parameters are required.
  227.  
  228. DECLARE FUNCTION DosVersion$ ()
  229.  
  230. The correct version will be returned, even under DOS 5.0 with SETVER
  231. set to report otherwise.
  232.  
  233.  
  234. FINDFILE
  235.  
  236. This function can be used to locate a particular file in any drive or
  237. directory of the current system. Supply it with a pathname or an ambiguous
  238. filespec and it will display a list of all matching files from which the
  239. user can select the one required by highlighting it with the cursor arrow
  240. keys. The function returns the full pathname of the file selected or a
  241. null string if <ESC> was pressed.
  242.  
  243. DECLARE FUNCTION FindFile$ (FileSpec$, Attr%, Mouse%)
  244.  
  245. FileSpec$   =  Pathname of file to be located. It can include a drive
  246.                letter and the filename may be ambiguous if you use the
  247.                wildcard characters '*' or '?'.
  248.  
  249. Attr%       =  The display attribute for the file selection box if more
  250.                than one match is expected. If Attr% = 0 the function
  251.                uses default colours - Black on Cyan for colour monitors
  252.                and inverse video for monochrome monitors.
  253.  
  254. Mouse%      =  set this to TRUE (non-zero) if mouse support is required.
  255.  
  256. On entry, FILESPEC$ should contain the name of the file to be located. If
  257. the filespec is ambiguous, the program presents a directory listing, in a
  258. popup window, of all files which match and allows the operator to select
  259. the actual one required. If the pathname is explicit, FindFile just checks
  260. if it actually exists. On return FILESPEC$, will contain the full pathname
  261. of the selected file, or a null string if it was not located (or the
  262. <Escape> key was pressed).
  263.  
  264.  
  265. GETFLAG
  266.  
  267. The MIXED-LANGUAGE Toolbox includes a pair of functions which give you
  268. access to the INTRA-APPLICATION COMMUNICATION AREA (IAC), an area of
  269. memory which has been reserved, by DOS, so that programs can communicate
  270. with each other. The IAC is 16 bytes long and is located, in low RAM at
  271. addresses 0000:04F0 - 04FF (Hex). Once set, an IAC flag retains it's value
  272. until you reset it or the computer is rebooted.
  273.  
  274. This function returns the value of one of the IAC flag bytes (1 to 16).
  275.  
  276. DECLARE FUNCTION GetFlag% (Flag%)
  277.  
  278. You can set the current setting of a particular IAC flag byte with the
  279. SETFLAG function.
  280.  
  281. Since QuickBASIC programs, compiled with the /O switch to run stand-alone,
  282. cannot pass variables to chain modules, you can use this feature to
  283. implement a limited form of parameter passing.
  284.  
  285.  
  286. GRATTRIB
  287.  
  288. Calculate display attribute for graphics modes, given the foreground
  289. and background colours required.
  290.  
  291. DECLARE FUNCTION GrAttrib% (ForeGround%, BackGround%)
  292.  
  293. GRATTRIB calculates the attribute value which controls the foreground and
  294. background colours of characters displayed using the GRAPRINT, CGATEXT,
  295. MCGATEXT and VGATEXT procedures. It translates them using the formula:
  296.  
  297.     Attribute% = (BackGround% * 256) + ForeGround%
  298.  
  299. Make sure that you use foreground and background colour values appropriate
  300. to the SCREEN mode currently in use.
  301.  
  302. The ATTRIBUTE function provides a similar service for use with text mode
  303. screens
  304.  
  305.  
  306. ISDIR
  307.  
  308. This routine tests to see if the supplied string is the name of a
  309. directory. To do this a local error handler is established to trap any
  310. run-time errors and an attempt is made to change to the directory
  311. specified in TEST$. If an error occurs then ISDIR% is set to Boolean FALSE
  312. (zero), otherwise TRUE (-1) is returned.
  313.  
  314. DECLARE FUNCTION IsDir% (Test$)
  315.  
  316. ISDIR is used by the FINDFILE function when searching for files on another
  317. drive or directory.
  318.  
  319.  
  320. LEGALNAME
  321.  
  322. This function returns TRUE or FALSE to indicate if the filespec passed to
  323. it is legal. To do this, each character in the string is compared with a
  324. set of illegal characters. If none are found a further check is made to
  325. ensure there are no more than eight characters in the name and three in
  326. the extension.
  327.  
  328. FUNCTION LegalName% (FileSpec$)
  329.  
  330.  
  331. LINEUP
  332.  
  333. Returns a string representation of a numeric value. If COMMA% is TRUE
  334. (non-zero) then the string has commas inserted between every group of
  335. three digits to the left of the decimal. If LENGTH% is non-zero then the
  336. resulting string is left padded with spaces to produce a string of the
  337. required length. If CURRENCY$ is not null, the character it contains will
  338. be prefixed to the returned string.
  339.  
  340. DECLARE FUNCTION LineUp$ (Num#, Places%, Comma%, Length%, Currency$)
  341.  
  342.  
  343. LONGDATE
  344.  
  345. This function accepts a three-part numeric date and transcribes it into
  346. a string containing the date in words. This includes the day of the week,
  347. which is obtained by calling DOS's internal time and date services. DOS
  348. is also used to check for an invalid date.
  349.  
  350. DECLARE FUNCTION LongDate$(Day%, Month%, Year%)
  351.  
  352. LONGDATE returns a null string if the arguments passed evaluate to an
  353. illegal date (eg 29/2/1989).
  354.  
  355.  
  356. MATCH
  357.  
  358. Returns the starting position of a string of characters within
  359. a larger string.
  360.  
  361. DECLARE FUNCTION Match% (Start%, Search$, Pattern$)
  362.  
  363. Call with:  Start%   = character position in search string to
  364.                        start searching from
  365.             Search$  = String to search
  366.             Pattern$ = String expression to search for 
  367.  
  368. Returns:    Position of first character of Pattern$ in Search$
  369.             (0 if Pattern$ is not found)
  370.  
  371. Wildcards:  #   match any numeric character
  372.             !   match any alphabetic character
  373.             ?   match any character
  374.  
  375.             \   indicates that the next character in the string
  376.                 to search for is literal, not a wildcard.
  377.  
  378. This function is similar to INSTR but allows the use of wildcards. It is
  379. based on the MATCH function provided by Digital Research's C-BASIC.
  380.  
  381.  
  382. NEXTWORD
  383.  
  384. Extracts the first word from a string.
  385.  
  386. DECLARE FUNCTION NextWord$ (Last$)
  387.  
  388. This function extracts the first complete word from a string of
  389. text and pads it with a single leading and trailing space. The
  390. returned word is actually removed from string which was passed
  391. to NEXTWORD so the function can be called repeatedly to extract
  392. each word until LAST$ is empty.
  393.  
  394.  
  395. PANEL
  396.  
  397. This procedure is used to produce rectangular boxes, upon the video
  398. display, of various shapes and colours. The calling program should supply
  399. the row/column co-ordinate of the top, left-hand corner of the required
  400. panel, its height in rows and width in columns. You should also specify
  401. the display attribute that the panel will be displayed in and the border
  402. style to frame it with.
  403.  
  404. DECLARE SUB Panel (Row%, Col%, Rows%, Cols%, Border%, Attr%)
  405.  
  406. Panels can be drawn with the following border styles:
  407.  
  408. ┌───┐         ╔═══╗         ╓───╖        ╒═══╕
  409. │ 1 │         ║ 2 ║         ║ 3 ║        │ 4 │
  410. └───┘         ╚═══╝         ╙───╜        ╘═══╛
  411.  
  412. Any other value draws the panel without a border.
  413.  
  414. Although the boxes drawn by PANEL resemble popup windows, you cannot
  415. restore the screen contents overwritten by a box once it has been drawn.
  416. See the POPUP and SHUTUP routines, however, for a full windowing
  417. system which does preserve the display.
  418.  
  419.  
  420. REVINPUT
  421.  
  422. Accepts user input in a Reverse Video entry panel, all the usual editing
  423. keys are supported and entry may be terminated by either a carriage-return
  424. or one of several special function keys (see below).
  425.  
  426. DECLARE FUNCTION RevInput$ (Max%, Default$, Legal$, Ctx%, Topic$,_
  427.                             Mask%, HotKey%)
  428.  
  429. Max%         =  maximum number of characters which can be accepted.
  430. Default$     =  default string which can be accepted by just pressing
  431.                 the <Enter> key.
  432. Ctx%         =  set TRUE if context-sensitive help is available, in
  433.                 which case ... 
  434. Legal$       =  a string of legal characters which are acceptable for
  435.                 input. If a null string is passed then all printable
  436.                 characters will be accepted. 
  437. Topic$       =  name of the HELP Topic file to display whenever the
  438.                 <F1> key is pressed. 
  439. Mask%        =  if TRUE (non-zero) prevents the characters entered from
  440.                 being echoed to the display. Instead an asterisk (*) is
  441.                 displayed for each character position although the entry
  442.                 string itself is unaffected. Use this for passwords.
  443. HotKey%      =  If entry is terminated by anything other than the
  444.                 <Enter> key, this variable will contain an explanatory
  445.                 return code ..
  446.  
  447. Return Codes:   1  =  <Escape> abort entry returning a null string
  448.                 2  =  <F2>     repeat previous entry for this field
  449.                 3  =  <Up Arr> pressed, move to previous field 
  450.                 4  =  <Dn Arr> pressed, move to next field
  451.                 5  =  <Pg Up>  pressed, move to top of screen
  452.                 6  =  <Pg Dn>  pressed, move to end of screen
  453.                 7  =  A hotkey was supplied and used. The calling
  454.                                program takes appropriate action.
  455.  
  456.                 You can specify any key as the hotkey by setting your
  457.                 own value in HotKey% before calling REVINPUT. This
  458.                 number can either be the ASCII code of any standard
  459.                 key or the SCAN code (as a negative value) of one of
  460.                 the function keys. Set HotKey% to zero to turn off
  461.                 keyboard trapping (except for keys 1-6 above).            
  462.  
  463. Editing Keys:   <L.Arrow>   =  Move cursor one character to the left
  464.                 <R.Arrow>   =  Move cursor one character to the right
  465.                 <Home>      =  Move cursor to first character of field
  466.                 <End>       =  Move cursor to last character of field
  467.                 <Ctrl End>  =  Clear from current cursor position to
  468.                                the end of the entry field.
  469.                 <Insert>    =  Toggle between Insert and Overtype modes
  470.                 <Delete>    =  Delete character under the cursor.
  471.                 <BackSpace> =  Replace character under cursor with a
  472.                                blank space and move cursor one character
  473.                                to the left.
  474.                 <F1>        =  pop up on-line HELP screen.
  475.  
  476. REVINPUT is designed to be used as part of a full-screen data-entry
  477. system. Your program can examine the return code to determine whether the
  478. operator wishes to terminate entry or move forwards or backwards between
  479. entry fields.
  480.  
  481. See also the DATEINPUT function for a keyboard routine specially designed
  482. to ask the operator for a date!!!!
  483.  
  484.  
  485. ROOTNAME
  486.  
  487. Extracts the root filename from a full directory pathname.
  488.  
  489. DECLARE FUNCTION RootName$ (Path$, Extension%)
  490.  
  491. Path$       the full directory pathname of the file in question. This
  492.             string can include the drive letter followed by a colon.
  493.  
  494. Extension%  If TRUE (non-zero) the returned filename will include the
  495.             filename extension (if any). If FALSE (zero) the extension
  496.             part is trimmed off.
  497.  
  498.  
  499. ROUND
  500.  
  501. Rounds a double-precision number to the number of decimal places required
  502. and returns it as a string.
  503.  
  504. DECLARE FUNCTION Round$ (Number#, Places%)
  505.  
  506.  
  507. SALUTE
  508.  
  509. DECLARE FUNCTION Salute$ (Original$)
  510.  
  511. This function strips all but the first and last words from a string
  512. and capitalises the first letter of each remaining word. This produces
  513. a string suitable for use as the salutation of a letter.
  514.  
  515.  
  516. SCREENMODE
  517.  
  518. This function calls ROM-BIOS to check the current video mode and then
  519. converts the returned value to the equivalent QuickBASIC SCREEN number.
  520. It can detect the Hercules 720 x 348 graphics mode (SCREEN 3) and the new
  521. Olivetti 640 x 400 mode (SCREEN 4) as well as the Tandy 1000 and PCjr CGA
  522. modes (SCREENs 5 & 6) which are not supported by QuickBASIC.  Other
  523. unsupported graphics modes return a value of -1.
  524.  
  525. No calling parameters are required.
  526.  
  527. DECLARE FUNCTION ScreenMode% ()
  528.  
  529.  
  530. SETFLAG
  531.  
  532. This routine is used to set  one of the sixteen system flags to a value of
  533. between 0 and 255. These flags are situated in the Intra-Application
  534. Communications area, an area reserved by DOS for user programs to signal
  535. to each other. FLAG% is the flag number (1-16), VALUE% is the value you
  536. want to set.
  537.  
  538. DECLARE SUB SetFlag (Flag%, Setting%)
  539.  
  540. You can read the current setting of a particular IAC flag byte with the
  541. GETFLAG function.
  542.  
  543.  
  544. SORTFILE
  545.  
  546. expects the user to supply the name of the file to be sorted. The file,
  547. itself, must be fixed length and its name can include a drive letter and
  548. directory pathname. The logical record length of the file must also be
  549. supplied, along with the start position and length of the field which the
  550. file is to be sorted on.
  551.  
  552. The procedure returns with Done% set to -1 (logical TRUE), if the sort
  553. completed successfully, or to zero (logical FALSE) if an error occurred.
  554.  
  555. DECLARE SUB SortFile (PathName$, OffSet%, FieldLen%, RecordLen%, Done%)
  556.  
  557. The program first checks the size of the file and the amount of free disk
  558. space to see if the it can be sorted in memory, this requires space for
  559. two copies of the file on disk. If it is too large, the file is sorted in
  560. place so that no extra disk space is required. Using this method, which is
  561. far slower, the file may be of any size up to 4 Gigabytes.
  562.  
  563. Note:       If, when sorting in place on disk, SORTFILE detects that there
  564.             is a Ramdisk installed with enough free space to hold the file
  565.             that is being sorted, the program will copy and sort the file
  566.             there. This is much faster than a conventional disk sort, but
  567.             still not as fast as sorting directly in memory.
  568.  
  569. Programs calling this routine must have at least two unused file buffers
  570. available (i.e. no more than thirteen files must be already open).
  571.  
  572.  
  573. SPLITNAME
  574.  
  575. Parses a string containing the full or postal name of a person and
  576. extracts the TITLE, INITIALS and SURNAME from it.
  577.  
  578. DECLARE SUB SplitName (Source$, Title$, Initial$, SurName$)
  579.  
  580. Most commonly used titles (eg MR, MRS, MISS, MS) are correctly
  581. identified and seperated out.
  582.  
  583.  
  584. STRIPQUOTES
  585.  
  586. Strips quotation marks and commas from a string which is to be
  587. written to a comma-delimited ASCII file.
  588.  
  589. DECLARE FUNCTION StripQuote$ (Source$)
  590.  
  591. All double quote characters (") found in SOURCE$ are replaced
  592. with single quotes (') and all commas replaced by blank spaces.
  593. The length of the string is unchanged.
  594.  
  595.  
  596. UNPAD
  597.  
  598. Removes multiple spaces from a string, making sure that no word
  599. in a string of text has more than one blank space between it.
  600.  
  601. DECLARE FUNCTION UnPad$ (Text$, Length%)
  602.  
  603. Text$       the string of text to be processed.
  604.  
  605. Length%     on return, holds the length of the string after
  606.             processing.
  607.  
  608. Leading and trailing spaces are also trimmed.
  609.  
  610.  
  611. VERMENU
  612.  
  613. Displays and operates a pulldown menu, allowing the user to select from
  614. the list of options displayed in the menu window. 
  615.  
  616. DECLARE SUB VerMenu (Row%, Col%, Attr%, Bdr%, Opts%, Title$, Menu$(),_
  617.                      Choice%, Nxt%, Bar%, Ctx%, Topic$, Mouse%)
  618.  
  619. Expects:  Row%, Col%    screen co-ordinates of top-left corner of the
  620.                         window containing the menu.
  621.           Attr%         display attribute given to menu window.
  622.           Bdr%          Border style (1 - 8, 0 = no border). see the
  623.                         WINDOWS documentation for a list of styles.
  624.           Opts%         Number of options provided by menu.
  625.           Title$        Title for the menu, if null string then no
  626.                         title is displayed.
  627.           Menu$()       Text for options list. MENU$(0) should contain
  628.                         a list of key characters, one for each option.
  629.                         Insert a space at the appropriate position of
  630.                         an option to be disabled.
  631.                         In the remaining option strings an ampersand '&'
  632.                         indicates that the next character is the Hotkey
  633.                         to be highlighted for that option.
  634.           Ctx%          If set, this indicates that context-sensitive
  635.                         help is available, in which case ...
  636.           Tpc$          The root name of the Topic file to be displayed
  637.                         if the user presses <F1> for help. The current
  638.                         selection number is appended to this to produce
  639.                         the actual filename.
  640.           Mouse%        If set, this flag indicates that a mouse is
  641.                         installed and can be used to make selections.
  642.  
  643. Returns:  Choice%       Number of selection made by user. If zero then
  644.                         the user pressed <ESC> to abort without making
  645.                         a selection.
  646.           Nxt%          Set TRUE if the user pressed the left or right
  647.                         arrow key to move sideways to another menu, in
  648.                         which case ....
  649.           Bar%          is incremented or decremented accordingly.
  650.  
  651. The BARMENU procedure provides a similarly featured menu which is
  652. orientated horizontally.
  653.  
  654. See the source code for DEMON.BAS, the Toolbox demonstration program, for
  655. an example of VERMENU (and BARMENU) in use.
  656.  
  657.  
  658. VIDEOMODE
  659.  
  660. Checks the video system capabilities of the host computer.
  661.  
  662. DECLARE SUB VideoMode (Colour%, MaxRes%, VideoRam%)
  663.  
  664. This function calls ROM-BIOS to check the type of display adaptor which is
  665. installed in the host system. Three variables are supplied which, on
  666. return, provide the following information:
  667.  
  668. COLOUR%   -1 = Colour adaptor   Indicates the presence of a colour
  669.            0 = Monochrome       monitor in EGA systems. Returns -1
  670.                                 for CGA, even if a mono monitor is
  671.                                 bring used.
  672. MAXRES%    highest SCREEN       Highest resolution graphics screen
  673.            resolution           which can be set. Is equivalent to
  674.                                 QuickBASIC SCREEN numbers. MDA can
  675.                                 only use SCREEN 0, CGA 0, 1 and 2
  676.                                 N.B. MaxRes% = 10 indicates an EGA
  677.                                 with mono monitor. This means that
  678.                                 SCREEN 9 can NOT be used.
  679. VIDEORAM%  in kilobytes         Amount of dedicated display memory
  680.                                 installed. 
  681.                                 MDA = 4K, CGA = 16K, EGA = 64-256K
  682.  
  683.  
  684. EXTRA ROUTINES FOR QB4
  685.  
  686. The following functions and procedures are only included in the version of
  687. the Toolbox intended for QuickBASIC 4.x and BASIC 6. They are omitted from
  688. the later version because the Extended QuickBASIC language provided with
  689. the BASIC 7 Professional Development System includes new statements and
  690. functions that render them unneccessary.
  691.  
  692.  
  693. CHANGEDIR
  694.  
  695. This procedure changes the current directory to the one specified by the
  696. pathname supplied. If a drive letter is included in the argument, the
  697. routine also changes the current drive.
  698.  
  699. DECLARE SUB ChangeDir (PathName$)
  700.  
  701. Microsoft have now added CHDIR and CHDRIVE statements to QBX, the new
  702. Extended QuickBASIC supplied with BASIC 7. Since these statements make
  703. CHANGEDIR redundant, it is not provided with the BASIC 7 Toolbox.
  704.  
  705.  
  706. WAITASEC
  707.  
  708. System-independent pause for a specified number of seconds. The delay will
  709. still be the same, whether you have an original IBM-PC or an AT with the
  710. latest Intel i486 processor running at 33MHz.
  711.  
  712. DECLARE SUB WaitaSec (Seconds!)
  713.  
  714. This is an alternative to the SLEEP statement, for people who still use
  715. QuickBASIC 4.0
  716.