home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / qb / qb4bas46.lzh / QB4BAS.DOC < prev    next >
Text File  |  1989-11-29  |  193KB  |  7,921 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.      QB4BAS.LIB -- Version 4.6
  23.  
  24.      November 29, 1989
  25.  
  26.      Harold Thomson
  27.  
  28.      7437 Burnway Drive
  29.      Orlando, Fl.  32819
  30.      407-351-3737
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.      PREFACE
  71.  
  72.  
  73.  
  74.  
  75.  
  76.      There has been a major enhancement to this release of QB4BAS.LIB. Many
  77.      of the  routines that required  pre-allocated  strings to be passed in
  78.      the call no  longer require this and will now return their output as a
  79.      string.  Many of the  subroutines have been converted to  functions to
  80.      accomodate this new functionality. This is another step towards making
  81.      these routines appear as if they are a part of QuickBASIC.
  82.  
  83.  
  84.      QB4BAS.LIB is  a  collection  of subroutines and  functions which  are
  85.      designed for use with Microsoft  QuickBASIC 4.0 thru 4.5.  In addition
  86.      they will also work with  the new Microsoft  BASCOM 6.0 compiler. They
  87.      are not compatable with previous  versions of QuickBASIC or BASCOM and
  88.      no attempts should be made to use them with other versions.
  89.  
  90.      As noted above, this library contains  both subroutines and functions.
  91.      The difference is that subroutines  will perform the assigned task and
  92.      exit where as a function  will  perform an assigned task and  return a
  93.      value which can be used to assign a value to a  variable (ie  variable
  94.      = function) or be  part of an expression ( IF function = 0 THEN).   As
  95.      you can see, this makes  QB4BAS.LIB much more powerful  and  easier to
  96.      use than  its predecessor, QuickBas.LIB.   I would like to take credit
  97.      for this improvement but  the thanks belongs to Microsoft for creating
  98.      a powerful and impressive compiler.
  99.  
  100.      These routines are for whomever wants to use  them.  I am not charging
  101.      anything  as  long  as  they  are used for  personal  use or  freeware
  102.      programs.   If any of these  routines are  to be used in any  packages
  103.      that are to be sold  to  the public,  I feel it is only fair that I be
  104.      informed of  this use.  I also feel that  it  would  be appropriate in
  105.      this case to send me a small donation.  I am not in this to make money
  106.      but if someone else is going to make money from  my work, I should get
  107.      at least a little something from it.
  108.  
  109.      As you may have noticed, I did  not include  the source code for these
  110.      routines.  The reason for this is  to protect these routines  from any
  111.      changes which may cause  them  to no  longer function the way they are
  112.      documented.   I am  willing to accept any comments  or suggestions for
  113.      changes but I will  have  the final say on  what  happens.   I do  not
  114.      intend to make changes which would cause these routine not to function
  115.      as originally  documented unless  it is felt that these  changes  will
  116.      only improve the routines. Of course if this happens, I will make note
  117.      of it so please read  the #@!%$&  documentation.   (I  know, I hate to
  118.      read documentation almost as much as I hate writing it.)
  119.  
  120.      I  do  have  one thing that I  would  like to ask  of anyone who might
  121.      decide to use any or all of these routines, let me know what you think
  122.      of them.   I like  praise but I can also take criticism.  You can send
  123.      me a note at the address on the front cover.
  124.  
  125.  
  126.  
  127.      QB4BAS.LIB -- Version 4.6                                           ii
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.      ACKNOWLEDGEMENTS
  137.  
  138.  
  139.      While developing the original  QuickBas.LIB routines, Charlie  Wooster
  140.      and  Terry Shockley where very helpful in testing the routines as well
  141.      as  suggesting several of the routines  that were  in the  library.  I
  142.      would also like to  extend thanks to  Charlie who spent a lot  of time
  143.      correcting problems encountered  in QMENU  as well  as  extending  its
  144.      capabilities by writing QMENUS.  Thanks to both of you.
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.      QB4BAS.LIB -- Version 4.6                                          iii
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.      Many  of  the new routines in  version  2.0  were  written  for  Clint
  203.      Labarth, Sysop  of the Black Hole BBS in Orlando, for inclusion in his
  204.      new  release  of DoorPch routines which  are  used  with  PCBoard  for
  205.      writing doors.  Thanks for the suggestions, Clint.
  206.  
  207.      I have  also received several suggestions and comments  from different
  208.      people who have  taken the  time to try these routines.  It is good to
  209.      see that  these routines  are finally  starting to be noticed.  To all
  210.      who have written or called, thanks.
  211.  
  212.      Many of the  routines  contained in the QB4BAS.LIB were  derived  from
  213.      routines in  Leo J. Scanlons "Assembly Language Subroutines for MS-DOS
  214.      Computers".   This  is a very handy book  and if you don't have a copy
  215.      and like to write assembly programs,  I would recommend it. Another of
  216.      his books  that  I  use  quite  often is  "8086/88  Assembly  Language
  217.      Programming".  Page 100 is used quite often.
  218.  
  219.      The  QINPUT  routine included in the  library  was  developed from the
  220.      article "The  Finishing Strokes" by Hardin  Brothers in  the September
  221.      1987  (#6) issue of PCResource magazine.  Hardin has been writing good
  222.      articles for  some time now, I remember some from 80 MICRO, and he has
  223.      several  good ones in  PCResource.   I find this a  very good magazine
  224.      with a good amount of information on Quick Basic programming.
  225.  
  226.      The QCLOCK  routine supplied is based upon  the  CLOCK.ASM program  by
  227.      Robert J. Karp in the October 13, 1987 issue  (Vol 7, Number 17) of PC
  228.      Magazine.
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.      QB4BAS.LIB -- Version 4.6                                           iv
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.      TABLE OF CONTENTS
  269.  
  270.  
  271.  
  272.  
  273.  
  274.      Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   ii
  275.      Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  iii
  276.  
  277.      Summary of Amendments   . . . . . . . . . . . . . . . . . . . . . .  1
  278.      Version 4.6 - Released 11/29/89   . . . . . . . . . . . . . . . . .  1
  279.      Version 4.5 - Released 10/10/89   . . . . . . . . . . . . . . . . .  2
  280.      Version 4.2 - Released 07/17/89   . . . . . . . . . . . . . . . . .  3
  281.      Version 4.1 - Released 05/08/89   . . . . . . . . . . . . . . . . .  3
  282.      Version 4.0 - Released 04/15/89   . . . . . . . . . . . . . . . . .  3
  283.      Version 3.0 - Released 11/20/88   . . . . . . . . . . . . . . . . .  5
  284.      Version 2.0 - Released 03/15/88   . . . . . . . . . . . . . . . . .  5
  285.      Version 1.0 - Released 01/17/88   . . . . . . . . . . . . . . . . .  6
  286.  
  287.      Introduction  . . . . . . . . . . . . . . . . . . . . . . . . . . .  7
  288.      Requirements  . . . . . . . . . . . . . . . . . . . . . . . . . . .  7
  289.  
  290.      Dates   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  9
  291.        QDATE    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . . .  9
  292.        QDATECVT -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   10
  293.        QDATEIN  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   11
  294.        QDATE2INT -- FUNCTION   . . . . . . . . . . . . . . . . . . . .   12
  295.        QINT2DATE -- FUNCTION   . . . . . . . . . . . . . . . . . . . .   12
  296.        QJULCALC -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   13
  297.  
  298.      Disk  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   14
  299.        QCNTFILE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   14
  300.        QDISKSTAT -- SUB  . . . . . . . . . . . . . . . . . . . . . . .   14
  301.        QDISKTYP  -- SUB  . . . . . . . . . . . . . . . . . . . . . . .   15
  302.        QDRVSPACE -- FUNCTION   . . . . . . . . . . . . . . . . . . . .   15
  303.        QGETDRV  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   16
  304.        QGETVOL  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   16
  305.        QSETDRV  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   16
  306.        QSETVOL  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   17
  307.  
  308.      File  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   18
  309.        QCOPYFIL -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   18
  310.        QDELETE  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   18
  311.        QEXIST   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   19
  312.        QFATTR   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   19
  313.        QFCLOSE  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   20
  314.        QFCREATE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   21
  315.        QFDATE   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   22
  316.        QFINDFIRST -- FUNCTION  . . . . . . . . . . . . . . . . . . . .   23
  317.        QFINDNEXT -- FUNCTION   . . . . . . . . . . . . . . . . . . . .   24
  318.        QFINDF   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   25
  319.        QFINDN   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   25
  320.        QFLOF    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   26
  321.        QFNAME   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   26
  322.        QFOPEN   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   27
  323.  
  324.  
  325.      QB4BAS.LIB -- Version 4.6                                            v
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.        QFREAD   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   28
  335.        QFSETEND -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   29
  336.        QFSETREC QFSETRECL-- FUNCTION   . . . . . . . . . . . . . . . .   29
  337.        QFSIZE   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   30
  338.        QFSTAMP  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   30
  339.        QFTIME   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   31
  340.        QFWRITE  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   32
  341.        QMOVEFIL -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   33
  342.        QPARSEF  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   34
  343.        QRENAME  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   35
  344.        QTREAD   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   36
  345.        QTWRITE  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   37
  346.  
  347.      Keyboard  . . . . . . . . . . . . . . . . . . . . . . . . . . . .   39
  348.        QALTKEY  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   39
  349.        QCAPSKEY -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   39
  350.        QCTRLKEY -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   40
  351.        QGETKEY  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   40
  352.        QINKEY   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   41
  353.        QINPUT   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   42
  354.        QINPUTM  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   44
  355.        QKEYFLAG -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   45
  356.        QKEYSTAT -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   45
  357.        QPOPMENU -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   46
  358.        QMENU    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   49
  359.        QMENUS   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   52
  360.        QNUMKEY  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   55
  361.        QSCRLKEY -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   55
  362.        QYESNO   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   56
  363.  
  364.      Miscellaneous   . . . . . . . . . . . . . . . . . . . . . . . . .   57
  365.        QALARM   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   57
  366.        QARGC QARGV -- FUNCTION   . . . . . . . . . . . . . . . . . . .   57
  367.        QBSRCHT  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   58
  368.        QCAPSOFF QCAPSON -- SUB   . . . . . . . . . . . . . . . . . . .   59
  369.        QCLOCK   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   59
  370.        QCMDLEN  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   60
  371.        QCMDLINE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   60
  372.        QCRCCHK QCRCSET -- FUNCTION   . . . . . . . . . . . . . . . . .   61
  373.        QDOSVER  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   61
  374.        QEMSSIZE -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   62
  375.        QEMSEXIST -- FUNCTION   . . . . . . . . . . . . . . . . . . . .   62
  376.        QEQUIPMENT -- SUB   . . . . . . . . . . . . . . . . . . . . . .   63
  377.        QEXIT    -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   63
  378.        QEXEC    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   64
  379.        QINPORT  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   66
  380.        QMININT QMAXINT -- FUNCTION   . . . . . . . . . . . . . . . . .   66
  381.        QMINLONG QMAXLONG -- FUNCTION   . . . . . . . . . . . . . . . .   67
  382.        QNUMLOCKOFF QNUMLOCKON -- SUB   . . . . . . . . . . . . . . . .   67
  383.        QPRINTER -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   68
  384.        QPRTSCRN -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   68
  385.        QPRTSCRNOFF QPRTSCRNON -- SUB   . . . . . . . . . . . . . . . .   69
  386.        QPAUSE   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   69
  387.        QPAUSE18 -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   70
  388.        QREBOOT  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   70
  389.  
  390.  
  391.      QB4BAS.LIB -- Version 4.6                                           vi
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.        QSHIFTIL QSHIFTIR -- FUNCTION   . . . . . . . . . . . . . . . .   71
  401.        QSHIFTLL QSHIFTLR -- FUNCTION   . . . . . . . . . . . . . . . .   71
  402.        QSCROLLOFF QSCROLLON -- SUB   . . . . . . . . . . . . . . . . .   72
  403.        QSHARE   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   72
  404.        QTIME    -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   73
  405.        QTEMPC   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   73
  406.        QTEMPF   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   74
  407.        QVERIFY  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   74
  408.        QVERIFYOFF QVERIFYON -- SUB   . . . . . . . . . . . . . . . . .   75
  409.        Q8087    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   75
  410.  
  411.      Mouse   . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   76
  412.        QMHIDE   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   76
  413.        QMLOC    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   76
  414.        QMPRESS  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   77
  415.        QMSET    -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   77
  416.        QMSHOW   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   78
  417.        QMSTATUS -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   78
  418.  
  419.      String  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   79
  420.        QCAPIT   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   79
  421.        QCENTER  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   79
  422.        QCHARTYP -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   80
  423.        QDELIM   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   80
  424.        QEXTRACT -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   81
  425.        QFORMAT  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   81
  426.        QHIGHBIT -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   82
  427.        QINSTR   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   82
  428.        QLEN     -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   83
  429.        QMID     -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   83
  430.        QMOVREC  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   84
  431.        QMOVSTR  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   84
  432.        QREPLACE -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   85
  433.        QREVERSE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   85
  434.        QRINSTR  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   86
  435.        QSTRIP   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   86
  436.        QSTRPCHR -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   87
  437.        QSUBSTR  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   87
  438.        QWORD    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   88
  439.        QWORDS   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   88
  440.  
  441.      Sub-Directory   . . . . . . . . . . . . . . . . . . . . . . . . .   89
  442.        QCHDIR   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   89
  443.        QCHKDIR  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   89
  444.        QGETDIR  -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   90
  445.        QMKDIR   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   90
  446.        QRMDIR   -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   90
  447.  
  448.      Video   . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   91
  449.        QANSIPRT -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   91
  450.        QATTR    -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   91
  451.        QBPRT    -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   92
  452.        QBMPRT   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   93
  453.        QCRTMODE -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   94
  454.        QCLREOL  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   94
  455.  
  456.  
  457.      QB4BAS.LIB -- Version 4.6                                          vii
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.        QGETATTR -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   96
  467.        QGETCURS -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   96
  468.        QGETMODE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .   97
  469.        QMPRT    -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   98
  470.        QPAINT   -- SUB   . . . . . . . . . . . . . . . . . . . . . . .   99
  471.        QPRT     -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  100
  472.        QPRTANSI -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  101
  473.        QRESTSCR -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  102
  474.        QSAVESCR -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  103
  475.        QSCROLL  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  104
  476.        QSCROLLB -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  104
  477.        QSCRREST -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  105
  478.        QSCRSAVE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  106
  479.        QSETMODE -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  107
  480.        QWINDOW  -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  108
  481.        QWINDOWH -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  109
  482.        QWINDOWV -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  110
  483.        QWINDOWX -- SUB   . . . . . . . . . . . . . . . . . . . . . . .  111
  484.        QVIDREST -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  112
  485.        QVIDSAVE -- FUNCTION  . . . . . . . . . . . . . . . . . . . . .  112
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.      QB4BAS.LIB -- Version 4.6                                         viii
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.      SUMMARY OF AMENDMENTS
  533.  
  534.  
  535.  
  536.      VERSION 4.6 - RELEASED 11/29/89
  537.  
  538.  
  539.      NEW ROUTINES
  540.  
  541.      Miscellaneous    QEXEC QSHARE
  542.  
  543.      Mouse            QMHIDE QMLOC QMPRESS QMSET QMSHOW QMSTATUS
  544.  
  545.      ROUTINES CORRECTED
  546.  
  547.      QCOPYFIL         Corrected documentation
  548.      QINSTR QRINSTR   Returning incorrect results
  549.      QMOVEFIL         Occasional incorrect results
  550.      QREVERSE         Corrected documentation
  551.      QSTRIP           Errors processing null strings
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.      Summary of Amendments                                                1
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.      VERSION 4.5 - RELEASED 10/10/89
  599.  
  600.  
  601.      NEW ROUTINES
  602.  
  603.      File             QFSETRECL
  604.  
  605.      Miscellaneous    QARGC QARGV
  606.  
  607.      String           QREVERSE
  608.  
  609.      ROUTINES CORRECTED
  610.  
  611.      QWINDOWX         Correct documentation for DECLARE
  612.      QINPUT QINPUTM   Would not accept 2 as valid number of keys
  613.      QCHARTYP         Returning wrong results
  614.  
  615.      ROUTINES REVISED
  616.  
  617.      QCMDLINE         Now returns a string variable
  618.      QDATE            Now returns a string variable
  619.      QDATECVT         Now returns a string variable
  620.      QDATEIN          Now returns a string variable
  621.      QDELIM           Now returns a string variable
  622.      QEXIST           Can now also check for existance of directorys
  623.      QEXTRACT         Now returns a string variable
  624.      QGETDIR          Now returns a string variable
  625.      QGETDRV          Now returns a string variable
  626.      QGETVOL          Now returns a string variable
  627.      QINT2DTE         Now returns a string variable
  628.      QMOVREC          Now returns a string variable
  629.      QREVERSE         Now returns a string variable
  630.      QSTRIP           Now returns a string variable
  631.      QSTRPCHR         Now returns a string variable
  632.      QSUBSTR          Now returns a string variable
  633.      QWORD            Now returns a string variable
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.      Summary of Amendments                                                2
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.      VERSION 4.2 - RELEASED 07/17/89
  665.  
  666.  
  667.      NEW ROUTINES
  668.  
  669.      File             QFLOF QPARSEF
  670.  
  671.      Keyboard         QINPUTM
  672.  
  673.      Miscellaneous    QCMDLEN QREBOOT (Really)
  674.  
  675.      String           QMID QSTRIP QSTRPCHR QSUBSTR
  676.  
  677.      ROUTINES CORRECTED
  678.  
  679.      QFSETREC         Now can select first record.
  680.      QCRTMODE         Support added to test for VGA monitor.
  681.  
  682.  
  683.  
  684.      VERSION 4.1 - RELEASED 05/08/89
  685.  
  686.  
  687.      NEW ROUTINES
  688.  
  689.      Disk             QSETVOL
  690.  
  691.      Keyboard         QALTKEY QCAPSKEY  QCAPSON  QCAPSOFF QCNTLKEY  QNUMKEY
  692.                       QSCRLKEY QSCROLLON QSCROLLOFF QYESNO
  693.  
  694.      Miscellaneous    QTEMPC QTEMPF Q8087
  695.  
  696.      String           QHIGHBIT QLEN
  697.  
  698.  
  699.  
  700.      VERSION 4.0 - RELEASED 04/15/89
  701.  
  702.  
  703.      NEW ROUTINES
  704.  
  705.      Disk             QDISKTYP
  706.  
  707.      File             QFSTAMP QTREAD QTWRITE
  708.  
  709.      Miscellaneous    QMAXINT QMININT  QMAXLONG QMINLONG QSHIFTIL  QSHIFTIR
  710.                       QSHIFTLL  QSHIFTLR   QVERIFY   QVERIFYON   QVERIFYOFF
  711.                       QEMSEXIST
  712.  
  713.      String           QCAPIT QCENTER QCHARTYP
  714.  
  715.      Video            QCLREOL QGETMODE QPAINT QRESTSCR QSAVESCR QSETMODE
  716.  
  717.      ROUTINES CORRECTED
  718.  
  719.  
  720.  
  721.      Summary of Amendments                                                3
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.      QCOPYFIL         Increased copy buffer from 1K to 2K.
  731.      QMOVEFIL         Increased move buffer from 1K to 2K.
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.      Summary of Amendments                                                4
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.      VERSION 3.0 - RELEASED 11/20/88
  797.  
  798.  
  799.      NEW ROUTINES
  800.  
  801.      Disk             QCNTFILE QGETVOL
  802.  
  803.      File             QFINDFIRST QFINDNEXT
  804.  
  805.      Keyboard         QPOPMENU
  806.  
  807.      Miscellaneous    QBYTES
  808.  
  809.      String           QMOVREC QMOVSTR
  810.  
  811.      Video            QWINDOWX
  812.  
  813.      ROUTINES CORRECTED
  814.  
  815.      QINPUT           No longer hangs certain systens on exit.
  816.      QSCROLL          No longer hangs certain systems on exit.
  817.      QSCROLLB         No longer hangs certain systems on exit.
  818.      QSCRREST         Now works with monochrome monitors.
  819.      QSCRSAVE         Now works with monochrome monitors.
  820.  
  821.  
  822.  
  823.      VERSION 2.0 - RELEASED 03/15/88
  824.  
  825.  
  826.      NEW ROUTINES
  827.  
  828.      Date             QDATE2INT QINT2DATE
  829.  
  830.      Disk             QDSKSTAT QDRVSPC
  831.  
  832.      Keyboard         QGETKEY QINKEY QKEYSTAT
  833.  
  834.      Miscellaneous    QINPORT QTIMER
  835.  
  836.      Video            QCRTMODE QGETATTR QGETCURS QPRTANSI
  837.  
  838.      ROUTINES CORRECTED
  839.  
  840.      QEXIT            Now resets either Mono or CGA cursor.
  841.      QWORDS           Now returns 0 for null strings.
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.      Summary of Amendments                                                5
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.      VERSION 1.0 - RELEASED 01/17/88
  863.  
  864.  
  865.      CONVERTED ROUTINES from QuickBas.LIB Version 3.0
  866.  
  867.      Date             QDATE QDATECVT QDATEIN QJULCALC
  868.  
  869.      Disk             QGETDRV QSETDRV
  870.  
  871.      File             QCOPYFIL  QDELETE  QEXIST  QFATTR  QFCLOSE   QFCREATE
  872.                       QFOPEN QFREAD QFSETEND QFSETREC QFWRITE QFDATE QFINDF
  873.                       QFINDN QFNAME QFSIZE QFTIME QMOVEFIL QRENAME
  874.  
  875.      KeyBoard         QINPUT QMENU QMENUS
  876.  
  877.      Miscellaneous    QALARM  QCLOCK   QCMDLINE   QCRCCHK  QCRCSET  QDOSVER
  878.                       QEMSSIZE   QEQUIPMENT  QEXIT  QNUMLOCKOFF  QNUMLOCKON
  879.                       QPRINTER   QPRTSCRN  QPRTSCRNOFF   QPRTSCRNON  QPAUSE
  880.                       QPAUSE18
  881.  
  882.      String           QDELIM QEXTRACT QREPLACE QWORD QWORDS
  883.  
  884.      Sub-Directory    QCHDIR QCHKDIR QGETDIR QMKDIR QRMDIR
  885.  
  886.      Video            QANSIPRT   QATTR  QBPRT  QPRT  QBMPRT  QMPRT  QSCROLL
  887.                       QSCROLLB  QSCRREST QSCRSAVE QWINDOW QWINDOWH QWINDOWV
  888.                       VIDREST VIDSAVE
  889.  
  890.      DELETED ROUTINES from QuickBas.LIB Version 3.0
  891.  
  892.      String           QLOWER QUPPER
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.      Summary of Amendments                                                6
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.      INTRODUCTION
  929.  
  930.  
  931.  
  932.      QB4BAS  is  a  collection  of  subroutine  and  functions  written  in
  933.      Assembler for  the  Microsoft QuickBASIC 4.0 thru 4.5 compilers.   The
  934.      routines will also work with the Microsoft BASIC 6.0 compiler. Many of
  935.      the routines  are functionally  the  same  as routines found in  other
  936.      Basic  Library  packages. In addition,  I have added  several routines
  937.      that were  not  available and which I  find to be very helpful. I have
  938.      tested all  of  the routines  and they have worked for  me  on my AT&T
  939.      PC6300.  I am sure that they will work on any AT&T compatible machine.
  940.  
  941.      The files included in QB4BAS45.ZIP are as follows:
  942.  
  943.      QB4BAS.DOC     The QB4BAS library DOC.
  944.      QB4BAS.LIB     The QB4BAS library.
  945.      QB4BAS.QLB     The QB4BAS quick library.
  946.      QB4BAS.BI      Include file containing the necessary DECLAREs.
  947.      QB4OBJ.ZIP     The individual OBJ files to create a LIB.
  948.      QB4BAS.RSP     The response file used to create the .LIB file.
  949.      QB4QLB.RSP     The response file used to create the .QLB file.
  950.  
  951.  
  952.  
  953.      REQUIREMENTS
  954.  
  955.  
  956.      In  order  to use  the  functions or  routines in QB4BAS.LIB, you must
  957.      either add the DECLARE statements in the examples or include QB4BAS.BI
  958.      using the $INCLUDE metacommand.
  959.  
  960.      Most of the routines  in this library  require  that  either a  string
  961.      variable or a numeric variable be  passed with  the  call.  Whenever a
  962.      routine  requires a numeric variable, the variable must be defined  as
  963.      an integer  by either using the  DEFINT  statement  or  by  using  the
  964.      percent sign at the end of the variable name.
  965.  
  966.      Some routines require  that when a  string variable is used, it be set
  967.      to a minimum  size.  This is due to the limitations  placed upon me by
  968.      BASIC when using assembly language routines.  Always check the routine
  969.      format before using it.
  970.  
  971.      Whenever an array  is used in a call, double  check the  example to be
  972.      sure that the  proper calling format is  used.   Failure  to do so may
  973.      cause some of these routines fail or hang up your machine.
  974.  
  975.      I have received  some correspondence regarding linking  programs  with
  976.      the routines in  the .LIB  to create  an  .EXE file.  According to the
  977.      information from MicroSoft, only stand alone .EXE files can be creates
  978.      using  these routines, do not try to create an .EXE from within the QB
  979.      environment,  you must  compile the program using the BC compiler.  In
  980.      addition,  when using the BC compiler, you  must use the /O option  to
  981.      indicate that BCOM45.LIB will be used to link the program.
  982.  
  983.  
  984.  
  985.      Introduction                                                         7
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.      The proper format is:
  995.  
  996.        BC mypgm /O;
  997.  
  998.      The format of the link command is as follows:
  999.  
  1000.        LINK /E mypgm+NOCOM, , ,BCOM45+QB4BAS;
  1001.  
  1002.      I hope that this clears  up  any problems that anyone has been  having
  1003.      with the routines.
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.      Introduction                                                         8
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.      DATES
  1061.  
  1062.  
  1063.  
  1064.      QDATE    -- FUNCTION
  1065.  
  1066.  
  1067.      Returns a variety of date information based upon the current date. The
  1068.      routine returns a string which contains  the requested information. It
  1069.      is  no longer necessary to pre-allocate the return string.  By using a
  1070.      variety of function codes, this function will return the alpha weekday
  1071.      (Sunday), the number  of days so far this  year (ddd), the Julian date
  1072.      (yyddd),  the  alpha month (June),  the default  date  format (dd  MMM
  1073.      yyyy),  the  USA  date  (mm/dd/yy), The European  date (dd/mm/yy), the
  1074.      ordered  date (yy/mm/dd) and the sorted  date (yyyymmdd).  If an error
  1075.      is encountered, a null string will be returned.
  1076.  
  1077.      The format of the call is as follows:
  1078.  
  1079.        Buffer$ = QDATE(FuncCode$)
  1080.  
  1081.      The following are the valid Function Codes:
  1082.  
  1083.        D  - Day of the year  : ddd
  1084.        E  - European date    : dd/mm/yy
  1085.        J  - Julian date      : yyddd
  1086.        M  - Month            : name of month, RC = length
  1087.        N  - Normal           : dd MMM yyyy  (30 Sep 1987)
  1088.        O  - Ordered date     : yy/mm/dd
  1089.        S  - Sorted date      : yyyymmdd
  1090.        U  - USA date         : mm/dd/yy
  1091.        W  - Weekday          : day of the week, RC = length
  1092.  
  1093.      Example:  
  1094.  
  1095.        DEFINT A-Z
  1096.        DECLARE FUNCTION QDATE$ (FunCode AS STRING)
  1097.         .
  1098.        REM Print the day of the week
  1099.        FuncCode$ = "W"
  1100.        Buffer$ = QDATE(FuncCode$)
  1101.        IF Buffer$ <> "" THEN
  1102.           PRINT "Today is " Buffer$
  1103.        END IF
  1104.         .
  1105.        REM Print the normal date
  1106.        FuncCode$ = "N"
  1107.        Buffer$ = QDATE(FuncCode$)
  1108.        IF Buffer$ <> "" THEN
  1109.           PRINT "Today is " Buffer$
  1110.        END IF
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.      Dates                                                                9
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.      QDATECVT -- FUNCTION
  1127.  
  1128.  
  1129.      Converts either a gregorian date to julian (IN = mm/dd/yy OUT = yyddd)
  1130.      or a julian  date  to  gregorian date (IN = yyddd OUT = mm/dd/yy). The
  1131.      conversion is based upon  a  function  code  which is  passed with the
  1132.      call.  If an error is encountered, a null string will returned.
  1133.  
  1134.      The format of the call is as follows:
  1135.  
  1136.        OutDate$ = QDATECVT(Indate$, FuncCode$)
  1137.  
  1138.      The following are the valid Function Codes:
  1139.  
  1140.        J  - Converts gregorian to julian
  1141.        G  - Converts julian to gregorian
  1142.  
  1143.      Example:  
  1144.  
  1145.        DEFINT A-Z
  1146.        DECLARE FUNCTION QDATECVT$ (InDate AS STRING, _
  1147.                                    FunCode AS STRING)
  1148.         .
  1149.        REM Convert to julian
  1150.        InDate$   = "05/29/87"
  1151.        FuncCode$ = "J"
  1152.        OutDate$ = QDATECVT(InDate$, FuncCode$)
  1153.        IF OutDate$ <> "" THEN
  1154.           PRINT "The julian date is " OutDate$
  1155.        END IF
  1156.         .
  1157.        REM Convert to gregorian
  1158.        InDate$   = "87149"
  1159.        FuncCode$ = "G"
  1160.        OutDate$ = QDATECVT(InDate$, FuncCode$)
  1161.        IF OutDate$ <> "" THEN
  1162.           PRINT "The gregorian date is " OutDate$
  1163.        END IF
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.      Dates                                                               10
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.      QDATEIN  -- FUNCTION
  1193.  
  1194.  
  1195.      Returns a  variety of  date  information  based upon  a date  which is
  1196.      included in  the  call.  The date in is in the format of  MM/DD/YY  or
  1197.      MM/DD/YYYY.  If the  year is YY then  1900  is assumed. By supplying a
  1198.      function code, this routine returns a string which contains either the
  1199.      alpha weekday (Sunday), the number of days so far this year (ddd), the
  1200.      Julian date (yyddd),  the  alpha month (June), the default date format
  1201.      (dd MMM  yyyy), the USA date (mm/dd/yy), The European date (dd/mm/yy),
  1202.      the  ordered date  (yy/mm/dd)  and  the sorted date  (yyyymmdd). If an
  1203.      error is, a null string is returned.
  1204.  
  1205.      The format of the call is as follows:
  1206.  
  1207.        Buffer$ = QDATEIN(InDate$, FuncCode$)
  1208.  
  1209.      The following are the valid Function Codes:
  1210.  
  1211.        D  - Day of the year  : ddd
  1212.        E  - European date    : dd/mm/yy
  1213.        J  - Julian date      : yyddd
  1214.        M  - Month            : name of month, RC = length
  1215.        N  - Normal           : dd MMM yyyy  (30 Sep 1987)
  1216.        O  - Ordered date     : yy/mm/dd
  1217.        S  - Sorted date      : yyyymmdd
  1218.        U  - USA date         : mm/dd/yy
  1219.        W  - Weekday          : day of the week, RC = length
  1220.  
  1221.      Example:  
  1222.  
  1223.        DEFINT A-Z
  1224.        DECLARE FUNCTION QDATEIN$ (InDate AS STRING, _
  1225.                                   FunCode AS STRING)
  1226.         .
  1227.        REM Print the day of the week
  1228.        InDate$   = "10-18-1987"
  1229.        FuncCode$ = "W"
  1230.        Buffer$ = QDATEIN(InDate$, FuncCode$)
  1231.        IF Buffer$ <> "" THEN
  1232.           PRINT "Today is " Buffer$
  1233.        END IF
  1234.         .
  1235.        REM Print the normal date
  1236.        FuncCode$ = "N"
  1237.        Buffer$ = QDATEIN(InDate$, FuncCode$)
  1238.        IF Buffer$ <> "" THEN
  1239.           PRINT "Today is " Buffer$
  1240.        END IF
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.      Dates                                                               11
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.      QDATE2INT -- FUNCTION
  1259.  
  1260.  
  1261.      Compress an 8 byte string date (XX/XX/XX)  into a 2 byte integer. This
  1262.      function can be  used to  compress a date  to be  written to a file to
  1263.      save 6 bytes per date written.
  1264.  
  1265.      The format of the call is as follows:
  1266.  
  1267.        HoldDate = QDATE2INT(InDate$)
  1268.  
  1269.      Example:  
  1270.  
  1271.        DEFINT A-Z
  1272.        DECLARE FUNCTION QDATE2INT% (InDate AS STRING)
  1273.         .
  1274.        InDate$ = "05/29/48"
  1275.        HoldDate = QDATE2INT(InDate$)
  1276.  
  1277.  
  1278.  
  1279.      QINT2DATE -- FUNCTION
  1280.  
  1281.  
  1282.      Uncompress  a  2 byte integer date  which  has been  compressed  using
  1283.      QDATE2INT back into an 8 byte string date (XX/XX/XX).
  1284.  
  1285.      The format of the call is as follows:
  1286.  
  1287.        OutDate$ = QINT2DATE(InDate)
  1288.  
  1289.      Example:  
  1290.  
  1291.        DEFINT A-Z
  1292.        DECLARE FUNCTION QDATE2INT% (InDate AS STRING)
  1293.        DECLARE FUNCTION QINT2DATE$ (BYVAL InDate AS INTEGER)
  1294.         .
  1295.        InDate$ = "05/29/48"
  1296.        HoldDate = QDATE2INT(InDate$)
  1297.        OutDate$ = QINT2DATE(HoldDate)
  1298.        PRINT "The date is " OutDate$
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.      Dates                                                               12
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.      QJULCALC -- FUNCTION
  1325.  
  1326.  
  1327.      Either adds or subtracts from a julian date.   The julian date must be
  1328.      passed as a string and the  amount  to  add  or subtract  must  be  an
  1329.      integer.  This function allows for  leap years.  If  there is an error
  1330.      encountered, the RC will be set to -1.
  1331.  
  1332.      The format of the call is as follows:
  1333.  
  1334.        RC = QJULCALC(Calcdate$, Amount)
  1335.  
  1336.      Example:  
  1337.  
  1338.        DEFINT A-Z
  1339.        DECLARE FUNCTION QJULCALC% (CalcDate AS STRING, _
  1340.                                    BYVAL Amount AS INTEGER)
  1341.         .
  1342.        REM Add 25 days to "87214"
  1343.        CalcDate$ = "87214"
  1344.        Amount    = 25
  1345.        IF QJULCALC(CalcDate$, Amount) = 0 THEN
  1346.           PRINT "The new julian date is " CalcDate$
  1347.        END IF
  1348.         .
  1349.        REM Subtract 25 days from "87214"
  1350.        CalcDate$ = "87214"
  1351.        Amount    = -25
  1352.        IF QJULCALC(CalcDate$, Amount) = 0 THEN
  1353.           PRINT "The new julian date is " CalcDate$
  1354.        END IF
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.      Dates                                                               13
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.      DISK
  1391.  
  1392.  
  1393.  
  1394.      QCNTFILE -- FUNCTION
  1395.  
  1396.  
  1397.      Retrieves the number  of files in  the  requested path  that match the
  1398.      search string.
  1399.  
  1400.      The format of the call is as follows:
  1401.  
  1402.        FileCnt = QCNTFILE(InFileName AS STRING)
  1403.  
  1404.      Example:  
  1405.  
  1406.        DEFINT A-Z
  1407.        DECLARE FUNCTION QCNTFILE% (InFileName AS STRING) _
  1408.                                    BYVAL Attr AS INTEGER)
  1409.        InFileName$ = "C:\TESTPATH" + CHR$(0)
  1410.        Attr = 32
  1411.        Cnt = QCNTFILE(InFileName$, Attr)
  1412.        PRINT "Number of files is " + STR$(Cnt)
  1413.  
  1414.  
  1415.  
  1416.      QDISKSTAT -- SUB
  1417.  
  1418.  
  1419.      Retrieves  information  on  the requested disk drive.  The information
  1420.      returned is  the free clusters, total  clusters, bytes  per sector and
  1421.      the number of sectors per cluster
  1422.  
  1423.      The format of the call is as follows:
  1424.  
  1425.        QDISKSTAT Drv$, FClusters, TotClusters, BytesSector, SectorsCluster
  1426.  
  1427.      Example:  
  1428.  
  1429.        DEFINT A-Z
  1430.        DECLARE SUB QDISKSTAT (DrvName AS STRING, _
  1431.                               FreeClusters AS INTEGER, _
  1432.                               TotClusters AS INTEGER, _
  1433.                               BytesSector AS INTEGER, _
  1434.                               SectorsCluster AS INTEGER)
  1435.        Drv$="C:\"
  1436.        QDISKSTAT Drv$, FClusters, TotClusters, BytesSector, SectorsCluster
  1437.        PRINT "Drive "+Drv$+" has "+STR$(SectorsCluster)+" Clusters/Sector."
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.      Disk                                                                14
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.      QDISKTYP  -- SUB
  1457.  
  1458.  
  1459.      Returns a return code which indicates the type of disk for the current
  1460.      logged drive.  A return code of 0 indicates the it is a  hard drive, a
  1461.      1 indicates  a  floppy disk and  a -1 indicates that the type of  disk
  1462.      could not be determined.
  1463.  
  1464.      The format of the call is as follows:
  1465.  
  1466.        RC = QDISKTYP()
  1467.  
  1468.      Example:  
  1469.  
  1470.        DEFINT A-Z
  1471.        DECLARE FUNCTION QDISKTYP% ()
  1472.        RC = QDISKTYP()
  1473.        IF RC = 0 THEN
  1474.           PRINT "The current logged disk is a hard disk"
  1475.        ELSEIF RC = 1 THEN
  1476.           PRINT "The current logged disk is a floppy disk"
  1477.        ELSE
  1478.           PRINT "The current logged disk type cannot be determined"
  1479.        END IF
  1480.  
  1481.  
  1482.  
  1483.      QDRVSPACE -- FUNCTION
  1484.  
  1485.  
  1486.      Retrieves the  total amount of free disk  space on  the requested disk
  1487.      drive.
  1488.  
  1489.      The format of the call is as follows:
  1490.  
  1491.        FreeSpace = QDRVSPACE(DrvStr$)
  1492.  
  1493.      Example:  
  1494.  
  1495.        DEFINT A-Z
  1496.        DECLARE FUNCTION QDRVSPACE& (DrvName AS STRING)
  1497.        DrvStr$="C:\"
  1498.        FreeSpace = QDRVSPACE(DrvStr$)
  1499.        PRINT "Drive "+DrvStr$+" has "+STR$(FreeSpace)+" bytes."
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.      Disk                                                                15
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.      QGETDRV  -- FUNCTION
  1523.  
  1524.  
  1525.      Get the  current logged disk  drive.  It  is  no  longer necessary  to
  1526.      pre-allocate the return string.
  1527.  
  1528.      The format of the call is as follows:
  1529.  
  1530.        DrvStr$ = QGETDRV
  1531.  
  1532.      Example:  
  1533.  
  1534.        DEFINT A-Z
  1535.        DECLARE FUNCTION QGETDRV$ ()
  1536.        DrvStr$ = QGETDRV
  1537.        PRINT "The current disk is " DrvStr$
  1538.  
  1539.  
  1540.  
  1541.      QGETVOL  -- FUNCTION
  1542.  
  1543.  
  1544.      Get the volume label of the requested disk drive.  It is not necessary
  1545.      to pre-allocate the return string.
  1546.  
  1547.      The format of the call is as follows:
  1548.  
  1549.        VolId$ = QGETVOL
  1550.  
  1551.      Example:  
  1552.  
  1553.        DEFINT A-Z
  1554.        DECLARE FUNCTION QGETVOL$ ()
  1555.        VolId$ = QGETVOL
  1556.        PRINT "The current disk label is " VolId$
  1557.  
  1558.  
  1559.  
  1560.      QSETDRV  -- SUB
  1561.  
  1562.  
  1563.      Change the current logged disk drive.
  1564.  
  1565.      The format of the call is as follows:
  1566.  
  1567.        QSETDRV NewDrv$
  1568.  
  1569.      Example:  
  1570.  
  1571.        DEFINT A-Z
  1572.        DECLARE SUB QSETDRV (DrvName AS STRING)
  1573.        NewDrv$="C:"
  1574.        QSETDRV NewDrv$
  1575.  
  1576.  
  1577.  
  1578.  
  1579.      Disk                                                                16
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.      QSETVOL  -- FUNCTION
  1589.  
  1590.  
  1591.      This function will  set,  change  or  delete the  volume  label of the
  1592.      requested disk drive.  In  order to set  or change the vol  label, the
  1593.      string that is passed must be 11  characters long.  A  null string can
  1594.      be used to delete the current vol label.
  1595.  
  1596.      The format of the call is as follows:
  1597.  
  1598.        RC = QSETVOL(VolId$)
  1599.  
  1600.      Example:  
  1601.  
  1602.        DEFINT A-Z
  1603.        DECLARE FUNCTION QSETVOL% (VolId AS STRING)
  1604.        VolId$ = "HAROLDSDISK"
  1605.        IF QSETVOL(VolId$) = 0 THEN
  1606.           PRINT "The Vol label has been set to " VolId$
  1607.        END IF
  1608.         .
  1609.        REM  The following will delete the current Vol label
  1610.        VolId$ = ""
  1611.        IF QSETVOL(VolId$) = 0 THEN
  1612.           PRINT "The Vol label has been deleted"
  1613.        END IF
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.      Disk                                                                17
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.      FILE
  1655.  
  1656.  
  1657.  
  1658.      QCOPYFIL -- FUNCTION
  1659.  
  1660.  
  1661.      Copies a file.  This is a better way of copying a file because it does
  1662.      not require the  SHELL command.  This routine will replace the file on
  1663.      the destination  device, use  QEXIST  to  check  if the  file  already
  1664.      exists.  Requires an ASCIIZ filename.  The return code will be  set if
  1665.      any errors are encountered.
  1666.  
  1667.      The format of the call is as follows:
  1668.  
  1669.        RC = QCOPYFIL(OldFile$, NewFile$)
  1670.  
  1671.      Example:  
  1672.  
  1673.        DEFINT A-Z
  1674.        DECLARE FUNCTION QCOPYFIL% (InFileName AS STRING, _
  1675.                                    OutFileName AS STRING)
  1676.        OldFile$ = "TESTFILE.OLD"+CHR$(0)
  1677.        NewFile$ = "TESTFILE.NEW"+CHR$(0)
  1678.        IF QCOPYFIL(OldFile$, NewFile$) = 0 THEN
  1679.           PRINT "File copied"
  1680.        ELSE
  1681.           PRINT "File not copied"
  1682.        END IF
  1683.  
  1684.  
  1685.  
  1686.      QDELETE  -- FUNCTION
  1687.  
  1688.  
  1689.      Deletes a file.   Requires  an ASCIIZ filename without wildcards. Upon
  1690.      exit, a return code is set to indicate if the file was deleted or not.
  1691.  
  1692.      The format of the call is as follows:
  1693.  
  1694.        RC = QDELETE(DelFile$)
  1695.  
  1696.      Example:  
  1697.  
  1698.        DEFINT A-Z
  1699.        DECLARE FUNCTION QDELETE% (FileName AS STRING)
  1700.         .
  1701.        DelFile$="QUICKBAS.LIB"+CHR$(0)
  1702.        IF QDELETE(DelFile$) = 0 THEN
  1703.           PRINT "File deleted"
  1704.        ELSE
  1705.           PRINT "File not deleted"
  1706.        END IF
  1707.  
  1708.  
  1709.  
  1710.  
  1711.      File                                                                18
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.      QEXIST   -- FUNCTION
  1721.  
  1722.  
  1723.      Tells you if  the  requested  file or  sub-directory  already  exists.
  1724.      Returns zero if it  does, or a  -1  if it doesn't.  Requires an ASCIIZ
  1725.      name without wildcards.
  1726.  
  1727.      The format of the call is as follows:
  1728.  
  1729.        RC = QEXIST(ChkFile$)
  1730.  
  1731.      Example:  
  1732.  
  1733.        DEFINT A-Z
  1734.        DECLARE FUNCTION QEXIST% (FileName AS STRING)
  1735.        REM  For a sub-directory use ==> ChkFile$ = "\QB4\WORK" + CHR$(0)
  1736.        ChkFile$ = "FINDFILE.TXT" + CHR$(0)
  1737.        IF QEXIST(ChkFile$) = 0 THEN
  1738.           PRINT "File exists"
  1739.        ELSE
  1740.           PRINT "File not found"
  1741.        END IF
  1742.  
  1743.  
  1744.  
  1745.      QFATTR   -- SUB
  1746.  
  1747.  
  1748.      Returns the  file attribute  of a file that has been located by either
  1749.      QFINDF or subsequent calls  to QFINDN.   See the  information on these
  1750.      two calls before using this routine.
  1751.  
  1752.      The format of the call is as follows:
  1753.  
  1754.        QFATTR Attr
  1755.  
  1756.      The file attributes are as follows:
  1757.  
  1758.      Normal    - 00h   A normal file.
  1759.      Read-Only - 01h   File cannot be erased or rewritten.
  1760.      Hidden    - 02h   File info not displayed by DIR command.
  1761.      System    - 04h   Like hidden but for system (DOS,BIOS) files.
  1762.      Vol Label - 08h   A disk's vol label.
  1763.      Directory - 10h   A subdirectory.
  1764.      Archive   - 20h   Set after most backup programs run.
  1765.  
  1766.      Combinations of file attributes can be used.  An example is IBMDOS.COM
  1767.      which is usually a hidden, system, read-only, archive file.
  1768.  
  1769.      Example:  
  1770.  
  1771.        DEFINT A-Z
  1772.        DECLARE SUB QFATTR (Attr AS INTEGER)
  1773.        QFATTR Attr
  1774.        PRINT "The file attribute is " Attr
  1775.  
  1776.  
  1777.      File                                                                19
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.      QFCLOSE  -- FUNCTION
  1787.  
  1788.  
  1789.      This function is  used  to  close  a file  which  was created  by  the
  1790.      QFCREATE routine or  opened by the QFOPEN routine.  This function must
  1791.      be called  after the QFCREATE or QFOPEN routines  to close the created
  1792.      or opened file.
  1793.  
  1794.      The function is called by passing the file "handle" which was returned
  1795.      by the QFCREATE or QFOPEN routine.  Upon return, the RC will either be
  1796.      zero indicating the file was closed or will be 6 indicating an invalid
  1797.      handle was specified.
  1798.  
  1799.      The format of the call is as follows:
  1800.  
  1801.        RC = QFCLOSE(FHandle)
  1802.  
  1803.      Example:  
  1804.  
  1805.        DEFINT A-Z
  1806.        DECLARE FUNCTION QFCLOSE% (Handle AS INTEGER)
  1807.         .
  1808.        REM You must issue either a call to QFCREATE or QFOPEN first
  1809.         .
  1810.        IF QFCLOSE(FHandle) = 0 THEN
  1811.           Print "File Closed"
  1812.        ELSE
  1813.           Print "Invalid Handle, File Not Closed"
  1814.        END IF
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.      File                                                                20
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.      QFCREATE -- FUNCTION
  1853.  
  1854.  
  1855.      This function is  used  to  either  create  a  0 length  file  in  the
  1856.      specified  or defaulted  path  or  to initialize a file which  will be
  1857.      written to using QFWRITE.  The  QFCLOSE function must be used to close
  1858.      the file.
  1859.  
  1860.      The function is  called  by passing a file name which may include  the
  1861.      drive  and path).   The file name  must  end with a binary "0"  as the
  1862.      routine requires ASCIIZ names.   In addition, the  file attribute must
  1863.      be passed in the call, see QFATTR for information on  file attributes.
  1864.      Upon return, the  RC will  either  be  zero  indicating the  file  was
  1865.      created  or non-zero indicating  an error.  If  the RC  is  0 the file
  1866.      "handle"  will  be  in  the integer  variable  specified  as  the  3rd
  1867.      parameter.  If the RC is  3 the specified path was not found.   If the
  1868.      RC is 4 a file "handle" was not available.   If the RC is 5 access was
  1869.      denied.
  1870.  
  1871.      The format of the call is as follows:
  1872.  
  1873.        RC = QFCREATE(FileName$, Fattr, FHandle)
  1874.  
  1875.      Example:  
  1876.  
  1877.        DEFINT A-Z
  1878.        DECLARE FUNCTION QFCREATE% (FileName AS STRING, _
  1879.                                    FAttr AS INTEGER, _
  1880.                                    Handle AS INTEGER)
  1881.         .
  1882.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  1883.        Fattr = 0
  1884.        RC = QFCREATE(FileName$, Fattr, FHandle)
  1885.        IF RC = 0 THEN
  1886.           Print "File Created"
  1887.        ELSE
  1888.           Print "File Not Created";RC
  1889.        END IF
  1890.         .
  1891.        RC = QFCLOSE(FHandle)
  1892.  
  1893.  
  1894.  
  1895.  
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.  
  1909.      File                                                                21
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.      QFDATE   -- SUB
  1919.  
  1920.  
  1921.      Returns the date that the file  was  created or updated. The file must
  1922.      first located by a  call to  either  QFINDF  or  subsequent  calls  to
  1923.      QFINDN.   See  the information on these two  calls  before using  this
  1924.      routine.
  1925.  
  1926.      The format of the call is as follows:
  1927.  
  1928.        QFDATE Month, Day, Year
  1929.  
  1930.      Example:  
  1931.  
  1932.        DEFINT A-Z
  1933.        DECLARE SUB QFDATE (Month AS INTEGER, _
  1934.                            Day AS INTEGER, _
  1935.                            Year AS INTEGER)
  1936.         .
  1937.        QFDATE Month, Day, Year
  1938.         .
  1939.        PRINT "The file date is " Month Day Year
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.      File                                                                22
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.      QFINDFIRST -- FUNCTION
  1985.  
  1986.  
  1987.      This  new function works  much  like the QFINDF  function  but, unlike
  1988.      QFINDF, it does  not  require  additional  calls to other routines  to
  1989.      retrieve  the information that you really wanted in the beginning. The
  1990.      file information  is  returned in a record which must  be defined with
  1991.      the TYPE command.  The necessary record TYPE is supplied in QB4BAS.BI.
  1992.      See below for an  example on  how to use it. This function will locate
  1993.      the  first file in  the  specified  or default path which  matches the
  1994.      specified file  name.  The file name may contain  wildcards (* and ?).
  1995.      Additional matching files may be found using the QFINDNEXT function.
  1996.  
  1997.      The function  is called by passing a  pointer to the  record where the
  1998.      file  information  is to  be placed.  A file name  (which  can contain
  1999.      wildcards "*" or "?" as  well  as the  drive and path) which  must end
  2000.      with a binary "0" as the  routine requires ASCIIZ names.  In addition,
  2001.      the  file  attribute  must  be passed in  the  call,  see  QFATTR  for
  2002.      information on file attributes.  Upon  return, the  RC  will either be
  2003.      zero, indicating that a  file  was found,  or  non-zero  indicating an
  2004.      error.  If the RC is -1 there was an error in the call.  If the  RC is
  2005.      a  2 the  specified path  is invalid.  If the  RC  is  18 there  is no
  2006.      matching file.
  2007.  
  2008.      The format of the call is as follows:
  2009.  
  2010.        RC = QFINDFIRST(RecAddr, ChkFile$, Fattr)
  2011.  
  2012.      Example:  
  2013.  
  2014.        DEFINT A-Z
  2015.        DECLARE FUNCTION QFINDFIRST% (BYVAL RecPtr AS INTEGER, _
  2016.                                      FileName AS STRING, _
  2017.                                      BYVAL Attr AS INTEGER)
  2018.        TYPE FileType
  2019.             Fname AS STRING * 12
  2020.             Fdate AS STRING * 8
  2021.             Ftime AS STRING * 5
  2022.             Fsize AS LONG
  2023.             Fattr AS INTEGER
  2024.             Month AS INTEGER
  2025.             Day   AS INTEGER
  2026.             Year  AS INTEGER
  2027.             Hour  AS INTEGER
  2028.             Minute AS INTEGER
  2029.        END TYPE
  2030.         .
  2031.        DIM Qfile AS FileType
  2032.        Fptr = VARPTR(Qfile)
  2033.        ChkFile$="C:\DEMO\*.EXE"+CHR$(0)
  2034.        IF QFINDFIRST(Fptr, ChkFile$, 0) = 0 THEN
  2035.           Print Qfile.Fname, Qfile.Fdate, Qfile.Ftime, Qfile.Fsize
  2036.        END IF
  2037.  
  2038.  
  2039.  
  2040.  
  2041.      File                                                                23
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.      QFINDNEXT -- FUNCTION
  2051.  
  2052.  
  2053.      This  new function works  much  like the  QFINDN  function but, unlike
  2054.      QFINDN, it does  not  require  additional calls  to other routines  to
  2055.      retrieve the information that you  really wanted in the beginning. The
  2056.      file  information is  returned in a record  which must be defined with
  2057.      the TYPE command.  The necessary record TYPE is supplied in QB4BAS.BI.
  2058.      See below for an example  on  how to use it. This function will locate
  2059.      additional files after a successful call to QFINDFIRST.
  2060.  
  2061.      The function  is called by passing a pointer to the  record  where the
  2062.      file information is to be placed.   Upon return, the RC will either be
  2063.      zero indicating that a file was  found or  18 indicating there are  no
  2064.      more matching files.
  2065.  
  2066.      The format of the call is as follows:
  2067.  
  2068.        RC = QFINDNEXT(RecAddr)
  2069.  
  2070.      Example:  
  2071.  
  2072.        DEFINT A-Z
  2073.        DECLARE FUNCTION QFINDNEXT% (BYVAL RecPtr AS INTEGER)
  2074.         .
  2075.        TYPE FileType
  2076.             Fname AS STRING * 12
  2077.             Fdate AS STRING * 8
  2078.             Ftime AS STRING * 5
  2079.             Fsize AS LONG
  2080.             Fattr AS INTEGER
  2081.             Month AS INTEGER
  2082.             Day   AS INTEGER
  2083.             Year  AS INTEGER
  2084.             Hour  AS INTEGER
  2085.             Minute AS INTEGER
  2086.        END TYPE
  2087.         .
  2088.        DIM Qfile AS FileType
  2089.        Fptr = VARPTR(Qfile)
  2090.        ChkFile$="C:\DEMO\*.EXE"+CHR$(0)
  2091.        IF QFINDFIRST(Fptr, ChkFile$, 0) = 0 THEN
  2092.           Print Qfile.Fname, Qfile.Fdate, Qfile.Ftime, Qfile.Fsize
  2093.           WHILE QFINDNEXT(Fptr) = 0
  2094.              Print Qfile.Fname, Qfile.Fdate, Qfile.Ftime, Qfile.Fsize
  2095.           WEND
  2096.        END IF
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.      File                                                                24
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.      QFINDF   -- FUNCTION
  2117.  
  2118.  
  2119.      This function  is used  to locate  the first file  in the specified or
  2120.      default path which matches the specified file name.  The file name may
  2121.      contain wildcards  (* and ?).  Additional matching files may be  found
  2122.      using the QFINDN  function.  This function must be called before calls
  2123.      to QFATTR, QFDATE, QFINDN, QFNAME, QFSIZE and QFTIME.
  2124.  
  2125.      The function  is called by  passing  a file  name (which  can  contain
  2126.      wildcards  "*" or "?" as well as the drive  and path).  The file  name
  2127.      must end with a binary  "0" as the  routine requires ASCIIZ names.  In
  2128.      addition, the  file  attribute must be passed in the call, see  QFATTR
  2129.      for information on file  attributes.  Upon  return, the RC will either
  2130.      be zero, indicating that a file  was found, or  non-zero indicating an
  2131.      error.  If the  RC is -1 there was an error in the call, a 2 indicates
  2132.      the specified path is invalid, an  18 indicates  there is no  matching
  2133.      file.
  2134.  
  2135.      The format of the call is as follows:
  2136.  
  2137.        RC = QFINDF(ChkFile$, Fattr)
  2138.  
  2139.      Example:  
  2140.  
  2141.        DEFINT A-Z
  2142.        DECLARE FUNCTION QFINDF% (FileName AS STRING, BYVAL Attr AS INTEGER)
  2143.        RC = QFINDF("C:\DEMO\*.EXE"+CHR$(0), 0)
  2144.        IF RC < 0 THEN
  2145.           Print "Error in call."
  2146.        ELSEIF RC > 0 THEN
  2147.           Print "File not found."
  2148.        END IF
  2149.  
  2150.  
  2151.  
  2152.      QFINDN   -- FUNCTION
  2153.  
  2154.  
  2155.      This function is used to locate additional files beyond the file found
  2156.      by  the QFINDF  function. The  QFINDN  function reuses the  parameters
  2157.      passed to the QFINDF function to locate any additional files.   The RC
  2158.      will  zero  if a file  was found  or 18  if there are no more matching
  2159.      files.
  2160.  
  2161.      The format of the call is as follows:
  2162.  
  2163.        RC = QFINDN
  2164.  
  2165.      Example:  
  2166.  
  2167.        DEFINT A-Z
  2168.        DECLARE FUNCTION QFINDN% ()
  2169.        IF QFINDN > 0 THEN  PRINT "No more files."
  2170.  
  2171.  
  2172.  
  2173.      File                                                                25
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.  
  2182.      QFLOF    -- FUNCTION
  2183.  
  2184.  
  2185.      This function is used to return the file size of an open file that was
  2186.      opened  with either QFOPEN or QFCREATE.  It  will return the file size
  2187.      whether  it has  been just opened  or if  it has  been  added to  with
  2188.      QFWRITE.  Be  careful  to  make  sure that  a long integer is  used to
  2189.      return the file size to.
  2190.  
  2191.      The format of the call is as follows:
  2192.  
  2193.        Fsize& = QFLOF(FHandle)
  2194.  
  2195.      Example:  
  2196.  
  2197.        DEFINT A-Z
  2198.        DECLARE FUNCTION QFLOF& (Handle AS INTEGER)
  2199.        REM Open file for reading
  2200.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2201.        Faccess = 1
  2202.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2203.        Fsize& = QFLOF(FHandle)
  2204.        RC = QFCLOSE(FHandle)
  2205.  
  2206.  
  2207.  
  2208.      QFNAME   -- SUB
  2209.  
  2210.  
  2211.      Returns the name of the file that  was located  by  either  QFINDF  or
  2212.      subsequent calls  to QFINDN.  It  also returns the length  of the file
  2213.      name less trailing  spaces.  See the information on  these  two  calls
  2214.      before using this routine.
  2215.  
  2216.      The format of the call is as follows:
  2217.  
  2218.        QFNAME File$
  2219.  
  2220.      Example:  
  2221.  
  2222.        DEFINT A-Z
  2223.        DECLARE SUB QFNAME (FileName AS STRING)
  2224.         .
  2225.        REM You must issue a call to either QFINDF or QFINDN first
  2226.         .
  2227.        File$ = Space$(12)
  2228.        QFNAME File$
  2229.        PRINT "The file name is " RTRIM$(File$)
  2230.         .
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.      File                                                                26
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.      QFOPEN   -- FUNCTION
  2249.  
  2250.  
  2251.      This function is  used to open an existing file.  The file can then be
  2252.      read by using QFREAD or  written  to by QFWRITE.  The QFCLOSE function
  2253.      must be used to close the file.
  2254.  
  2255.      The function  is called by passing a  file name which may include  the
  2256.      drive and path).   The file  name  must end with  a binary "0"  as the
  2257.      routine requires ASCIIZ  names.  In addition,  the file access must be
  2258.      passed  in the call, 0 to open for reading, 1 to open for writing or 2
  2259.      to open for both reading and writing.  Upon return, the RC will either
  2260.      be zero indicating  the  file  was  opened  or non-zero indicating  an
  2261.      error.   If  the RC  is  0 the file "handle"  will  be  in the integer
  2262.      variable specified as the 3rd parameter.  If the RC is 2 the specified
  2263.      path was not found.  If the RC is 4, then too many files open.  If the
  2264.      RC is 5,  then access was  denied.  If the  RC is  12, then an invalid
  2265.      access number was passed.
  2266.  
  2267.      The format of the call is as follows:
  2268.  
  2269.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2270.  
  2271.      Example:  
  2272.  
  2273.        DEFINT A-Z
  2274.        DECLARE FUNCTION QFOPEN% (FileName AS STRING, _
  2275.                                  Access AS INTEGER, _
  2276.                                  Handle AS INTEGER)
  2277.         .
  2278.        REM Open file for reading
  2279.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2280.        Faccess = 0
  2281.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2282.        IF RC = 0 THEN
  2283.           Print "File Opened"
  2284.        ELSE
  2285.           Print "File Not Opened";RC
  2286.        END IF
  2287.         .
  2288.        REM Open file for writing
  2289.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2290.        Faccess = 1
  2291.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2292.        IF RC = 0 THEN
  2293.           Print "File Opened"
  2294.        ELSE
  2295.           Print "File Not Opened";RC
  2296.        END IF
  2297.         .
  2298.        RC = QFCLOSE(FHandle)
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.      File                                                                27
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.  
  2314.      QFREAD   -- FUNCTION
  2315.  
  2316.  
  2317.      This  function is used to read a file which has been opened by QFOPEN.
  2318.      The calling sequence  requires  that a string  buffer  be passed which
  2319.      will  contain  the  requested  record upon  return.  In addition,  the
  2320.      length of the  record to read must be passed so that the  routine will
  2321.      know how many bytes to read.  Upon return, the string will contain the
  2322.      requested record and the actual number of bytes read will be returned.
  2323.      In addition,  the RC will either be zero indicating  that the read was
  2324.      successful  or non-zero indicating an error.  If  the RC is  -1, there
  2325.      was  an error  in one of the parameters.  If  the  RC is greater  than
  2326.      zero, DOS encountered an error reading the file.
  2327.  
  2328.      A  useful feature of this function is that block reads can be  done. A
  2329.      block  read is  reading  multiple  records at  a time.   If the record
  2330.      length is 50, by setting a buffer length to 500 will cause the routine
  2331.      to attempt to read 10 records.  The  bytes read count can then be used
  2332.      to determine exactly  how many  records were read.   The buffer can be
  2333.      split using the MID$ function to extract each record.
  2334.  
  2335.      The format of the call is as follows:
  2336.  
  2337.        RC = QFREAD(FHandle, FBuffer$, ReadLen, BytesRead)
  2338.  
  2339.      Example:  
  2340.  
  2341.        DEFINT A-Z
  2342.        DECLARE FUNCTION QFREAD% (Handle AS INTEGER, _
  2343.                                  Buffer AS STRING, _
  2344.                                  ReadLen AS INTEGER, _
  2345.                                  BytesRead AS INTEGER)
  2346.         .
  2347.        REM Open file for reading
  2348.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2349.        Faccess = 0
  2350.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2351.         .
  2352.        FBuffer$ = Space$(50)
  2353.        ReadLen  = 50
  2354.        RC = QFREAD(FHandle, FBuffer$, ReadLen, BytesRead)
  2355.        IF RC <> 0 THEN
  2356.           PRINT "Error reading file"
  2357.           END
  2358.        ELSEIF BytesRead = 0 THEN
  2359.           PRINT "End of File"
  2360.        ELSE
  2361.           PRINT FBuffer$
  2362.        END IF
  2363.         .
  2364.        RC = QFCLOSE(FHandle)
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.      File                                                                28
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.      QFSETEND -- FUNCTION
  2381.  
  2382.  
  2383.      This function is used to set the file pointer to  the end of the file.
  2384.      The file must have been opened  using QFOPEN.  This function is useful
  2385.      to add new records to the end of  an  existing file.  Upon return, the
  2386.      RC will either  be zero indicating  success  or non-zero indicating an
  2387.      error.
  2388.  
  2389.      The format of the call is as follows:
  2390.  
  2391.        RC = QFSETEND(FHandle)
  2392.  
  2393.      Example:  
  2394.  
  2395.        DEFINT A-Z
  2396.        DECLARE FUNCTION QFSETEND% (Handle AS INTEGER)
  2397.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2398.        Faccess = 1
  2399.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2400.        RC = QFSETEND(FHandle)
  2401.        REM New records can now be added.
  2402.        RC = QFCLOSE(FHandle)
  2403.  
  2404.  
  2405.  
  2406.      QFSETREC QFSETRECL-- FUNCTION
  2407.  
  2408.  
  2409.      These functions are used to set the file pointer for random reading or
  2410.      writing to  a  file that  has been opened  using QFOPEN.   The calling
  2411.      sequence  requires that the record length and the record number to set
  2412.      be passed in  the call.   Upon  return,  the  RC will either  be  zero
  2413.      indicating success or non-zero indicating an error.
  2414.  
  2415.      The format of the call is as follows:
  2416.  
  2417.        RC = QFSETREC(FHandle, RecLen, RecNum)
  2418.        RC = QFSETRECL(FHandle, RecLen, RecNum)
  2419.  
  2420.      Example:  
  2421.  
  2422.        DEFINT A-Z
  2423.        DECLARE FUNCTION QFSETREC% (BYVAL Handle AS INTEGER, _
  2424.                                    BYVAL RecLen AS INTEGER, _
  2425.                                    BYVAL RecNum AS INTEGER)
  2426.        DECLARE FUNCTION QFSETRECL% (BYVAL Handle AS INTEGER, _
  2427.                                     BYVAL RecLen AS INTEGER, _
  2428.                                     BYVAL RecNum AS LONG)
  2429.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0): Faccess = 0
  2430.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2431.        RecLen = 50: RecNum& = 70000
  2432.        RC = QFSETRECL(FHandle, RecLen, RecNum&)
  2433.        REM Record 70000 can now be read.
  2434.        RC = QFCLOSE(FHandle)
  2435.  
  2436.  
  2437.      File                                                                29
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.      QFSIZE   -- SUB
  2447.  
  2448.  
  2449.      Returns the size  of the  file  that was  located by either QFINDF  or
  2450.      subsequent calls  to QFINDN.  See the  information on these  two calls
  2451.      before using this routine.   This routine returns the size of the file
  2452.      as a long integer, make sure you ues the correct type declaration.
  2453.  
  2454.      The format of the call is as follows:
  2455.  
  2456.        QFSIZE SizeFile&
  2457.  
  2458.      Example:  
  2459.  
  2460.        DEFINT A-Z
  2461.        DECLARE SUB QFSIZE (Size AS LONG)
  2462.         .
  2463.        REM You must issue a call to either QFINDF or QFINDN first
  2464.        QFSIZE SizeFile&
  2465.        Print "File size is " SizeFile&
  2466.  
  2467.  
  2468.  
  2469.      QFSTAMP  -- FUNCTION
  2470.  
  2471.  
  2472.      This function is used to change the date and time that a file was last
  2473.      updated.  It  returns a zero if the request completed successfully. If
  2474.      there was and error in the information passed to the function,  then a
  2475.      -1  is  return.   If  there were any  DOS  error encountered,  then  a
  2476.      positive number will be returned.
  2477.  
  2478.      The format of the call is as follows:
  2479.  
  2480.        RC = QFSTAMP(Qname$, Qtime$, Qdate$)
  2481.  
  2482.      Example:  
  2483.  
  2484.        DEFINT A-Z
  2485.        DECLARE FUNCTION QFSTAMP (Qname AS STRING, _
  2486.                                  Qtime AS STRING, _
  2487.                                  Qdate AS STRING)
  2488.         .
  2489.        Qname$ = "TEST.TST" + CHR$(0)
  2490.        Qtime$ = "13:10:00"
  2491.        Qdate$ = "12/12/88"
  2492.         .
  2493.        XX = QFSTAMP(Qname$, Qtime$, Qdate$)
  2494.         .
  2495.        END
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.      File                                                                30
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.      QFTIME   -- SUB
  2513.  
  2514.  
  2515.      Returns the time  that the file was created or updated.  The file must
  2516.      first  located  by a call  to  either QFINDF  or  subsequent  calls to
  2517.      QFINDN.  See the information on these  two  calls  before  using  this
  2518.      routine.
  2519.  
  2520.      The format of the call is as follows:
  2521.  
  2522.        QFTIME Hrs, Min
  2523.  
  2524.      Example:  
  2525.  
  2526.        DEFINT A-Z
  2527.        DECLARE SUB QFTIME (Hrs AS INTEGER, _
  2528.                            Min AS INTEGER)
  2529.         .
  2530.        REM You must issue a call to either QFINDF or QFINDN first
  2531.        QFTIME Hrs, Min
  2532.        PRINT "The file time is " Hrs Min
  2533.  
  2534.  
  2535.  
  2536.  
  2537.  
  2538.  
  2539.  
  2540.  
  2541.  
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.      File                                                                31
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.      QFWRITE  -- FUNCTION
  2579.  
  2580.  
  2581.      This function is used to Write a file which has been opened by QFOPEN.
  2582.      The calling sequence  requires that  a string  buffer be  passed which
  2583.      will contain the data to be written.  In addition, the  length  of the
  2584.      record  to write must be passed so that the routine will know how many
  2585.      bytes to write.  Upon return, then actual number of bytes written will
  2586.      be returned.  In addition, the  RC will either be zero indicating that
  2587.      the write was successful or non-zero indicating  an error.  If  the RC
  2588.      is  -1,  there was an error  in one of the parameters.   If the RC  is
  2589.      greater than zero, DOS encountered an error writing to the file.
  2590.  
  2591.      The format of the call is as follows:
  2592.  
  2593.        RC = QFWRITE(FHandle, FBuffer$, WriteLen, BytesWritten)
  2594.  
  2595.      Example:  
  2596.  
  2597.        DEFINT A-Z
  2598.        DECLARE FUNCTION QFWRITE% (Handle AS INTEGER, _
  2599.                                   Buffer AS STRING, _
  2600.                                   WriteLen AS INTEGER, _
  2601.                                   BytesWritten AS INTEGER)
  2602.         .
  2603.        REM Open file for writing
  2604.        FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2605.        Faccess = 1
  2606.        RC = QFOPEN(FileName$, Faccess, FHandle)
  2607.         .
  2608.        FBuffer$ = "This is a record that will be written to the file."
  2609.        ReadLen  = LEN(FBuffer$)
  2610.        RC = QFWRITE(FHandle, FBuffer$, WriteLen, BytesWritten)
  2611.        IF RC <> 0 THEN
  2612.           PRINT "Error writing file"
  2613.           END
  2614.        ELSEIF BytesWritten <> WriteLen THEN
  2615.           PRINT "Error writing file"
  2616.        ELSE
  2617.           PRINT "Write successful"
  2618.        END IF
  2619.         .
  2620.        RC = QFCLOSE(FHandle)
  2621.  
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.      File                                                                32
  2636.  
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642.  
  2643.  
  2644.      QMOVEFIL -- FUNCTION
  2645.  
  2646.  
  2647.      Moves a file.  It functions the same way as QCOPYFIL but the  original
  2648.      file will be deleted after the copy  is completed.  If the file is  to
  2649.      be moved to  a different  directory  on the same  device, it will move
  2650.      just the directory entry which will make the move  much faster.  If an
  2651.      error  is encountered, the  RC will  be set to  -1.  See  QCOPYFIL for
  2652.      additional information.
  2653.  
  2654.      The format of the call is as follows:
  2655.  
  2656.        RC = QMOVEFIL(OldFile$, NewFile$)
  2657.  
  2658.      Example:  
  2659.  
  2660.        DEFINT A-Z
  2661.        DECLARE FUNCTION QMOVEFIL% (InFileName AS STRING, _
  2662.                                    OutFileName AS STRING)
  2663.         .
  2664.        REM Move a file from the A drive to the C drive
  2665.        OldFile$="A:TESTFILE.TXT"+CHR$(0)
  2666.        NewFile$="C:\TESTSUB\TESTFILE.TXT"+CHR$(0)
  2667.        IF QMOVEFIL(OldFile$, NewFile$) = 0 THEN
  2668.           PRINT "File moved"
  2669.        ELSE
  2670.           PRINT "File not moved"
  2671.        END IF
  2672.         .
  2673.         .
  2674.        REM Move a file to a different directory on the C drive
  2675.        OldFile$="TESTFILE.TXT"+CHR$(0)
  2676.        NewFile$="\TESTSUB\TESTFILE.TXT"+CHR$(0)
  2677.        IF QMOVEFIL(OldFile$, NewFile$) = 0 THEN
  2678.           PRINT "File moved"
  2679.        ELSE
  2680.           PRINT "File not moved"
  2681.        END IF
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.  
  2697.  
  2698.  
  2699.  
  2700.  
  2701.      File                                                                33
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.  
  2708.  
  2709.  
  2710.      QPARSEF  -- FUNCTION
  2711.  
  2712.  
  2713.      This function will parse a string which can contain a drive specifier,
  2714.      a path, a file name and  a file extention into individule pieces which
  2715.      will be returned in a  defined type record.  This function will return
  2716.      a -1 if the file name is longer than 8 characters.
  2717.  
  2718.      The TYPE description below is  contained in QB4BAS.BI  and  if  it  is
  2719.      included into the  program using the $INCLUDE meta command it will  be
  2720.      available to the program.  You will still have to DIM the record using
  2721.      whichever name that you wish to use.
  2722.  
  2723.      The format of the call is as follows:
  2724.  
  2725.        RC = PARSEF(Pstring$, Pseg, Pptr)
  2726.  
  2727.      Example:  
  2728.  
  2729.        DEFINT A-Z
  2730.        DECLARE FUNCTION QPARSEF% (Pstring AS STRING, _
  2731.                                   BYVAL Pseg AS INTEGER, _
  2732.                                   BYVAL Pptr AS INTEGER)
  2733.        TYPE ParseType
  2734.             Pdrive AS STRING * 2
  2735.             Ppath AS STRING * 64
  2736.             Pname AS STRING * 8
  2737.             Pext AS STRING * 3
  2738.        END TYPE
  2739.  
  2740.        DIM FileRec AS ParseType
  2741.  
  2742.        Pseg = VARSEG(FileRec)
  2743.        Pptr = VARPTR(FileRec)
  2744.        Pstring$ = "D:\PATH1\PATH2\THISTEST.DAT"
  2745.  
  2746.        IF QPARSEF(Pstring$, Pseg, Pptr) = 0 THEN
  2747.           PRINT "1 " + FileRec.Pdrive
  2748.           PRINT "2 " + FileRec.Ppath
  2749.           PRINT "3 " + FileRec.Pname
  2750.           PRINT "4 " + FileRec.Pext
  2751.        END IF
  2752.  
  2753.        END
  2754.  
  2755.  
  2756.  
  2757.  
  2758.  
  2759.  
  2760.  
  2761.  
  2762.  
  2763.  
  2764.  
  2765.  
  2766.  
  2767.      File                                                                34
  2768.  
  2769.  
  2770.  
  2771.  
  2772.  
  2773.  
  2774.  
  2775.  
  2776.      QRENAME  -- FUNCTION
  2777.  
  2778.  
  2779.        Rename an existing file.  Can also be used to move a file from one
  2780.        sub-directory to another.  Requires an ASCIIZ filename without
  2781.        wildcards for both files.  If an error is encountered, the RC will be
  2782.        set to -1.
  2783.  
  2784.        The format of the call is as follows:
  2785.  
  2786.          RC = QRENAME(OldFile$, NewFile$)
  2787.  
  2788.        Example:  
  2789.  
  2790.          DEFINT A-Z
  2791.          DECLARE FUNCTION QRENAME% (InFileName AS STRING, _
  2792.                                     OutFileName AS STRING)
  2793.           .
  2794.          REM Rename a file
  2795.          OldFile$="\FIRSTDIR\MYFILE.TXT"+CHR$(0)
  2796.          NewFile$="MYFILE.DOC"+CHR$(0)
  2797.          IF QRENAME(OldFile$, NewFile$) = 0 THEN
  2798.             PRINT "File renamed"
  2799.          ELSE
  2800.             PRINT "File not renamed"
  2801.          END IF
  2802.           .
  2803.           .
  2804.          REM Move a file
  2805.          OldFile$="\FIRSTDIR\MYFILE.TXT"+CHR$(0)
  2806.          NewFile$="\SECONDDIR\MYFILE.TXT"+CHR$(0)
  2807.          IF QRENAME(OldFile$, NewFile$) = 0 THEN
  2808.             PRINT "File renamed"
  2809.          ELSE
  2810.             PRINT "File not renamed"
  2811.          END IF
  2812.  
  2813.  
  2814.  
  2815.  
  2816.  
  2817.  
  2818.  
  2819.  
  2820.  
  2821.  
  2822.  
  2823.  
  2824.  
  2825.  
  2826.  
  2827.  
  2828.  
  2829.  
  2830.  
  2831.  
  2832.  
  2833.      File                                                                35
  2834.  
  2835.  
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.  
  2842.      QTREAD   -- FUNCTION
  2843.  
  2844.  
  2845.        This  function  is similar to QFREAD except instead of placing the
  2846.        record into a string buffer it will place  the record  into a user
  2847.        defined  record type.  This  allows records to be placed  directly
  2848.        into the type of record needed  and, in addition, multiple records
  2849.        can be read directly into an array of defined records.
  2850.  
  2851.        This function  requires that  the  file  be opened with QFOPEN and
  2852.        closed with QFCLOSE.   The  file handle returned by QFOPEN is used
  2853.        to  read the records.   Also required  by the call  is the segment
  2854.        address of the file buffer, the offset of the file  buffer and the
  2855.        number of  bytes to read which is usually the length of the record
  2856.        type. Upon  return,  the record will contain the  requested record
  2857.        and the actual  number of  bytes read. The RC will either  be zero
  2858.        indicating that the read was successful  or non-zero indicating an
  2859.        error.   If  the RC  is -1,  there was  an  error  in  one of  the
  2860.        parameters.  If the  RC is greater than  zero, DOS encountered  an
  2861.        error reading the file.
  2862.  
  2863.        A useful feature of this function is that block reads can be done.
  2864.        A block read is reading multiple records at a time.  If the record
  2865.        length is 50,  by setting a buffer length  to  500  will cause the
  2866.        routine to attempt to  read 10 records.  The bytes  read count can
  2867.        then be used to determine exactly how many records were read.
  2868.  
  2869.        The format of the call is as follows:
  2870.  
  2871.          RC = QTREAD(FHandle, BufSeg, BufPtr, ReadLen, BytesRead)
  2872.  
  2873.        Example:  
  2874.  
  2875.          DEFINT A-Z
  2876.          DECLARE FUNCTION QTREAD% (BYVAL Handle AS INTEGER, _
  2877.                                    BYVAL BufSeg AS INTEGER, _
  2878.                                    BYVAL BufPtr AS INTEGER, _
  2879.                                    BYVAL ReadLen AS INTEGER, _
  2880.                                    BytesRead AS INTEGER)
  2881.           .
  2882.          TYPE TestType
  2883.               TstCode AS STRING * 2
  2884.               TstName  AS STRING * 34
  2885.               Balance AS LONG
  2886.          END TYPE
  2887.           .
  2888.          DIM TestRec(1 TO 100) AS TestType
  2889.           .
  2890.          REM Open file for reading
  2891.          FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2892.          Faccess = 0
  2893.          RC = QFOPEN(FileName$, Faccess, FHandle)
  2894.          VSeg = VARSEG(TestRec(1))
  2895.          VPtr = VARPTR(TestRec(1))
  2896.          Rlen = LEN(TestRec(1))
  2897.  
  2898.  
  2899.      File                                                                36
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.          Olen = 0
  2909.          FOR x = 1 TO 100
  2910.              RC = QTREAD(Fhandle, VSeg, VPtr, Rlen, Olen)
  2911.              IF RC <> 0 THEN
  2912.                 PRINT "Error reading record number ", x
  2913.                 PRINT "Error code returned is ", RC
  2914.                 END
  2915.              ELSEIF Olen = 0 THEN
  2916.                 EXIT FOR
  2917.              END IF
  2918.              VPtr = VPtr + Rlen
  2919.          NEXT x
  2920.           .
  2921.          RC = QFCLOSE(FHandle)
  2922.  
  2923.  
  2924.  
  2925.      QTWRITE  -- FUNCTION
  2926.  
  2927.  
  2928.        This function is similar to QFWRITE except instead of wrinting the
  2929.        record into  a string buffer it will write the record  from a user
  2930.        defined record type.  This allows  records to be  written directly
  2931.        from the type of record needed and, in addition, multiple  records
  2932.        can be written directly from an array of defined records.
  2933.  
  2934.        This function  requires that  the file  be  opened with QFOPEN and
  2935.        closed with  QFCLOSE.  The file handle  returned by QFOPEN is used
  2936.        to write the records.  Also  required by the call  is  the segment
  2937.        address of the file  buffer, the offset of the file buffer and the
  2938.        number of bytes to write which is usually the length of the record
  2939.        type. Upon  return, the  actual  number of  bytes  written will be
  2940.        returned. The RC will either be zero indicating that the write was
  2941.        successful  or non-zero  indicating  an error.  If the  RC  is -1,
  2942.        there was an error in one of the parameters.  If the RC is greater
  2943.        than zero, DOS encountered an error writing the file.
  2944.  
  2945.        A useful feature of  this  function  is  that block writes can  be
  2946.        done. A block write is writing multiple records at a time.  If the
  2947.        record length is 50, by setting  a buffer length to 500 will cause
  2948.        the routine to attempt  to  write 10 records.  The  bytes  written
  2949.        count  can then be used to determine exactly how many records were
  2950.        written.
  2951.  
  2952.        The format of the call is as follows:
  2953.  
  2954.          RC = QTWRITE(FHandle, BufSeg, BufPtr, WriteLen, BytesWritten)
  2955.  
  2956.        Example:  
  2957.  
  2958.          DEFINT A-Z
  2959.          DECLARE FUNCTION QTWRITE% (BYVAL Handle AS INTEGER, _
  2960.                                     BYVAL BufSeg AS INTEGER, _
  2961.                                     BYVAL BufPtr AS INTEGER,
  2962.                                     BYVAL WriteLen AS INTEGER, _
  2963.  
  2964.  
  2965.      File                                                                37
  2966.  
  2967.  
  2968.  
  2969.  
  2970.  
  2971.  
  2972.  
  2973.  
  2974.                                     BytesWritten AS INTEGER)
  2975.           .
  2976.          TYPE TestType
  2977.               TstCode AS STRING * 2
  2978.               TstName  AS STRING * 34
  2979.               Balance AS LONG
  2980.          END TYPE
  2981.           .
  2982.          DIM TestRec(1 TO 100) AS TestType
  2983.           .
  2984.          REM Open file for reading
  2985.          FileName$ = "C:\DEMO\TEST.DAT"+CHR$(0)
  2986.          Faccess = 0
  2987.          RC = QFOPEN(FileName$, Faccess, FHandle)
  2988.          VSeg = VARSEG(TestRec(1))
  2989.          Wlen = LEN(TestRec(1))
  2990.          Olen = 0
  2991.          FOR x = 1 TO RecCounter
  2992.              VPtr = VARPTR(TestRec(x))
  2993.              RC = QTWRITE(Fhandle, VSeg, VPtr, Wlen, Olen)
  2994.              IF RC <> 0 THEN
  2995.                 PRINT "Error writing record number ", x
  2996.                 PRINT "Error code returned is ", RC
  2997.                 END
  2998.              END IF
  2999.          NEXT x
  3000.           .
  3001.          RC = QFCLOSE(FHandle)
  3002.  
  3003.  
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.  
  3012.  
  3013.  
  3014.  
  3015.  
  3016.  
  3017.  
  3018.  
  3019.  
  3020.  
  3021.  
  3022.  
  3023.  
  3024.  
  3025.  
  3026.  
  3027.  
  3028.  
  3029.  
  3030.  
  3031.      File                                                                38
  3032.  
  3033.  
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.  
  3040.      KEYBOARD
  3041.  
  3042.  
  3043.  
  3044.      QALTKEY  -- FUNCTION
  3045.  
  3046.  
  3047.      Returns a zero to indicate that the ALT key is pressed, otherwise it
  3048.      returns a -1 to indicate that the ALT key is not pressed.
  3049.  
  3050.      The format of the call is as follows:
  3051.  
  3052.        RC = QALTKEY()
  3053.  
  3054.      Example:  
  3055.  
  3056.        DEFINT A-Z
  3057.        DECLARE FUNCTION QALTKEY% ()
  3058.        WHILE INKEY$ = ""
  3059.          SELECT CASE QALTKEY
  3060.                 CASE -1
  3061.                      LOCATE 5, 2: PRINT "ALT not pressed"
  3062.                 CASE 0
  3063.                      LOCATE 5, 2: PRINT "ALT is pressed "
  3064.          END SELECT
  3065.        WEND
  3066.        END
  3067.  
  3068.  
  3069.  
  3070.      QCAPSKEY -- FUNCTION
  3071.  
  3072.  
  3073.      Returns  a  zero  to  indicate  that the CAPS LOCK  key  is pressed,
  3074.      otherwise it returns  a -1 to indicate that the CAPS LOCK key is not
  3075.      pressed.
  3076.  
  3077.      The format of the call is as follows:
  3078.  
  3079.        RC = QCAPSKEY()
  3080.  
  3081.      Example:  
  3082.  
  3083.        DEFINT A-Z
  3084.        DECLARE FUNCTION QCAPSKEY% ()
  3085.        WHILE INKEY$ = ""
  3086.          SELECT CASE QCAPSKEY
  3087.                 CASE -1
  3088.                      LOCATE 5, 2: PRINT "CAPS not pressed"
  3089.                 CASE 0
  3090.                      LOCATE 5, 2: PRINT "CAPS is pressed "
  3091.          END SELECT
  3092.        WEND
  3093.        END
  3094.  
  3095.  
  3096.  
  3097.      Keyboard                                                            39
  3098.  
  3099.  
  3100.  
  3101.  
  3102.  
  3103.  
  3104.  
  3105.  
  3106.      QCTRLKEY -- FUNCTION
  3107.  
  3108.  
  3109.      Returns a zero to  indicate that  the CTRL key is pressed, otherwise
  3110.      it returns a -1 to indicate that the CTRL key is not pressed.
  3111.  
  3112.      The format of the call is as follows:
  3113.  
  3114.        RC = QCTRLKEY()
  3115.  
  3116.      Example:  
  3117.  
  3118.        DEFINT A-Z
  3119.        DECLARE FUNCTION QCTRLKEY% ()
  3120.        WHILE INKEY$ = ""
  3121.          SELECT CASE QCTRLKEY
  3122.                 CASE -1
  3123.                      LOCATE 7, 2: PRINT "CTRL not pressed"
  3124.                 CASE 0
  3125.                      LOCATE 7, 2: PRINT "CTRL is pressed "
  3126.          END SELECT
  3127.        WEND
  3128.        END
  3129.  
  3130.  
  3131.  
  3132.      QGETKEY  -- FUNCTION
  3133.  
  3134.  
  3135.      Returns a key which is waiting in the keyboard buffer.  If the RC is
  3136.      zero then the key returned is a normal ASCII key.  If the RC  is  -1
  3137.      the  the key returned  is an extended  code.  The meanings of  these
  3138.      codes can be found in the BASIC reference manual.
  3139.  
  3140.      The format of the call is as follows:
  3141.  
  3142.        RC = QGETKEY(Char$)
  3143.  
  3144.      Example:  
  3145.  
  3146.        DEFINT A-Z
  3147.        DECLARE FUNCTION QGETKEY% (Char AS STRING)
  3148.        Char$ = SPACE$(1)
  3149.        IF QGETKEY(Char$) = 0 THEN
  3150.           PRINT "Normal key "; Char$
  3151.        ELSE
  3152.           PRINT "Extended code "; Char$
  3153.        END IF
  3154.  
  3155.  
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  
  3163.      Keyboard                                                            40
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.      QINKEY   -- FUNCTION
  3173.  
  3174.  
  3175.      This  function is  a  combination of  both QGETKEY and QKEYSTAT.  It
  3176.      will set  a RC to indicate if a key is waiting  and what type of key
  3177.      was pressed.  This function works very well with SELECT CASE logic.
  3178.  
  3179.      The format of the call is as follows:
  3180.  
  3181.        RC = QINKEY(Char$)
  3182.  
  3183.      Example:  
  3184.  
  3185.        DEFINT A-Z
  3186.        DECLARE FUNCTION QINKEY% (Char AS STRING)
  3187.        Char$ = SPACE$(1)
  3188.        SELECT CASE QINKEY(CHAR$)
  3189.               CASE 0
  3190.                    PRINT "No key waiting."
  3191.               CASE 1
  3192.                    PRINT "Normal key "; Char$
  3193.               CASE -1
  3194.                    PRINT "Extended code "; VAL(Char$)
  3195.               CASE ELSE
  3196.                    PRINT "Error detected."
  3197.        END SELECT
  3198.  
  3199.  
  3200.  
  3201.  
  3202.  
  3203.  
  3204.  
  3205.  
  3206.  
  3207.  
  3208.  
  3209.  
  3210.  
  3211.  
  3212.  
  3213.  
  3214.  
  3215.  
  3216.  
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.      Keyboard                                                            41
  3230.  
  3231.  
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.  
  3238.      QINPUT   -- FUNCTION
  3239.  
  3240.  
  3241.      A  keyboard  input function  that has full editing capabilities.  By
  3242.      passing a verification string, each key stroke is validated as it is
  3243.      entered.  It also  returns  a RETURN CODE which indicates  which key
  3244.      was pressed to exit the input  routine.  The input string can either
  3245.      be all spaces or it can contain existing  data  to  be updated.   It
  3246.      should be  noted here,  because of  the restrictions BASIC forces on
  3247.      called ASSEMBLER programs, the size of the string must be set before
  3248.      calling  the function.  The Keys variable must be initialized with a
  3249.      number from  0 to  50 which is used to set which return keys will be
  3250.      used.  The keys  with an RC equal to or  less than the passed number
  3251.      will be  the active  return keys.  See  the next page for  the valid
  3252.      return  keys.  The color attribute  used by the program is the Aattr
  3253.      variable. The program  will reverse the color attribute that is set,
  3254.      which usually means that the input field will highlighted.
  3255.  
  3256.      The format of the call is as follows:
  3257.  
  3258.        RC = QINPUT(Ver$,InBuff$,Row,Col,Aattr,Page,Keys)
  3259.  
  3260.      Where:
  3261.  
  3262.      RC        the return code or key that was pressed to exit.
  3263.      Ver$      the string containing that valid characters.
  3264.      InBuff$   the input buffer which can be pre-populated.
  3265.      Row       the screen row to display the buffer.
  3266.      Column    the screen column to display the buffer.
  3267.      Aattr     the action video color attribute.
  3268.      Page      the video display page (Valid pages are 0-3).
  3269.      Keys      a number from 0 to 50 to indicate the valid return keys.
  3270.  
  3271.      Example:  
  3272.  
  3273.        DEFINT A-Z
  3274.        DECLARE FUNCTION QINPUT% (VerStr AS STRING, _
  3275.                                  Buffer AS STRING, _
  3276.                                  BYVAL Row AS INTEGER, _
  3277.                                  BYVAL Col AS INTEGER, _
  3278.                                  BYVAL Attr AS INTEGER, _
  3279.                                  BYVAL Page AS INTEGER, _
  3280.                                  BYVAL Keys AS INTEGER)
  3281.        Fgrd    = 7
  3282.        Bkgrd   = 1
  3283.        Aattr = QATTR(Fgrd,Bkgrd)
  3284.        REM  Only accept alpha-numeric input
  3285.        Ver$    = "0123456789abcdefghijklmnopqrstuvwxyz"
  3286.        Ver$    = Ver$+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3287.        InBuff$ = SPACE$(20)
  3288.        Row = 10  :  Col = 20  :  Page = 0  :  Keys = 8
  3289.        IF QINPUT(Ver$,InBuff$,Row,Col,Aattr,Page,Keys) > 0 THEN
  3290.           InBuff$ = RTRIM$(InBuff$)
  3291.        END IF
  3292.  
  3293.  
  3294.  
  3295.      Keyboard                                                            42
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.  
  3303.  
  3304.      The following are the valid editing keys:
  3305.  
  3306.      INSERT         Toggles the insert mode and over-type mode.
  3307.      DELETE         Delete character at cursor.
  3308.      BACKSPACE      Destructive backspace.
  3309.      LEFT ARROW     Move the cursor to the left.
  3310.      RIGHT ARROW    Move the cursor to the right.
  3311.      HOME           Move the cursor to the beginning of the field.
  3312.      END            Move the cursor to the end of the field.
  3313.      CTL-HOME       Move cursor to the start and erase the field.
  3314.      CTL-END        Erase from the cursor to the end of the field.
  3315.      CTL-BkSpace    Erase from the cursor to the start of the field.
  3316.  
  3317.      The following are the return codes returned upon exit:
  3318.  
  3319.        RC  - Key pressed                 RC  - Key pressed
  3320.  
  3321.        00  - ESC                         09  - ALT HOME
  3322.        01  - RETURN                      10  - ALT-END
  3323.        02  - CTL-RETURN               11-20  - F1 thru F10
  3324.        03  - TAB                      21-30  - SHIFT-F1 thru SHIFT-F10
  3325.        04  - SHIFT-TAB                31-40  - CTL-F1 thru CTL-F10
  3326.        05  - UP ARROW                 41-50  - ALT-F1 thru ALT-F10
  3327.        06  - DOWN ARROW
  3328.        07  - PAGE UP
  3329.        08  - PAGE DOWN
  3330.  
  3331.  
  3332.  
  3333.  
  3334.  
  3335.  
  3336.  
  3337.  
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.  
  3346.  
  3347.  
  3348.  
  3349.  
  3350.  
  3351.  
  3352.  
  3353.  
  3354.  
  3355.  
  3356.  
  3357.  
  3358.  
  3359.  
  3360.  
  3361.      Keyboard                                                            43
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.  
  3368.  
  3369.  
  3370.      QINPUTM  -- FUNCTION
  3371.  
  3372.  
  3373.      This  function works just like QINPUT but  has  the added feature of
  3374.      allowing you to supply an edit mask which makes entering information
  3375.      such  as  dates   or   social   security   numbers  look  much  more
  3376.      professional.  The  cursor  will  automatically skip  over  any mask
  3377.      characters, the user will  not  have to press the tab or arrow keys.
  3378.      The mask characters will not be returned in the buffer.   See QINPUT
  3379.      for further information  on  using  the editing functions, it  works
  3380.      just the same.
  3381.  
  3382.      The format of the call is as follows:
  3383.  
  3384.        RC = QINPUTM(Ver$,InBuff$,Mask$,Row,Col,Aattr,Page,Keys)
  3385.  
  3386.      Where:
  3387.  
  3388.      RC        the return code or key that was pressed to exit.
  3389.      Ver$      the string containing that valid characters.
  3390.      InBuff$   the input buffer which can be pre-populated.
  3391.      Mask$     the edit mask to be displayed.
  3392.      Row       the screen row to display the buffer.
  3393.      Column    the screen column to display the buffer.
  3394.      Aattr     the action video color attribute.
  3395.      Page      the video display page (Valid pages are 0-3).
  3396.      Keys      a number from 0 to 50 to indicate the valid return keys.
  3397.  
  3398.      Example:  
  3399.  
  3400.        DEFINT A-Z
  3401.        DECLARE FUNCTION QINPUTM% (VerStr AS STRING, _
  3402.                                   Buffer AS STRING, _
  3403.                                   Mask AS STRING, _
  3404.                                   BYVAL Row AS INTEGER, _
  3405.                                   BYVAL Col AS INTEGER, _
  3406.                                   BYVAL Attr AS INTEGER, _
  3407.                                   BYVAL Page AS INTEGER, _
  3408.                                   BYVAL Keys AS INTEGER)
  3409.        Fgrd    = 7
  3410.        Bkgrd   = 1
  3411.        Aattr = QATTR(Fgrd,Bkgrd)
  3412.        REM  Only accept numeric input
  3413.        VerStr$ = "0123456789"
  3414.        Buffer$ = "4075551212"
  3415.        BuffMask$ = "(   )   -    "
  3416.        Row = 10  :  Col = 20  :  Page = 0  :  Keys = 8
  3417.        RC = QINPUTM(VerStr$, Buffer$, BuffMask$, Row, Col, Aattr, Page, Keys)
  3418.  
  3419.        END
  3420.  
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.      Keyboard                                                            44
  3428.  
  3429.  
  3430.  
  3431.  
  3432.  
  3433.  
  3434.  
  3435.  
  3436.      QKEYFLAG -- FUNCTION
  3437.  
  3438.  
  3439.      This  function  returns an RC  to indicate if  either the ALT, CTRL,
  3440.      LEFT SHIFT or the RIGHT SHIFT is pressed.  By adding the various key
  3441.      values together, you can check various combinations.  The key values
  3442.      are NO KEY-0, RIGHT SHIFT-1, LEFT SHIFT-2, CTRL-4 and ALT-8.
  3443.  
  3444.      The format of the call is as follows:
  3445.  
  3446.        RC = QKEYFLAG
  3447.  
  3448.      Example:  
  3449.  
  3450.        DEFINT A-Z
  3451.        DECLARE FUNCTION QKEYFLAG% ()
  3452.        CLS
  3453.        WHILE INKEY$ = ""
  3454.          SELECT CASE QKEYFLAG
  3455.                 CASE 1
  3456.                      LOCATE 5, 2: PRINT "RIGHT SHIFT    "
  3457.                 CASE 15
  3458.                      LOCATE 5, 2: PRINT "R L CTRL ALT   "
  3459.          END SELECT
  3460.        WEND
  3461.        END
  3462.  
  3463.  
  3464.  
  3465.      QKEYSTAT -- FUNCTION
  3466.  
  3467.  
  3468.      This function returns an  RC to indicate if a key is waiting  in the
  3469.      keyboard buffer.   A zero indicates  no key, anything else indicates
  3470.      that a key is waiting.
  3471.  
  3472.      The format of the call is as follows:
  3473.  
  3474.        RC = QKEYSTAT
  3475.  
  3476.      Example:  
  3477.  
  3478.        DEFINT A-Z
  3479.        DECLARE FUNCTION QKEYSTAT% ()
  3480.         .
  3481.        Char$ = SPACE$(1)
  3482.        IF QKEYSTAT = 0 THEN
  3483.           PRINT "No key waiting."
  3484.        ELSE
  3485.           IF QGETKEY(Char$) = 0 THEN
  3486.              PRINT "Normal key "; Char$
  3487.           ELSE
  3488.              PRINT "Extended code "; Char$
  3489.           END IF
  3490.        END IF
  3491.  
  3492.  
  3493.      Keyboard                                                            45
  3494.  
  3495.  
  3496.  
  3497.  
  3498.  
  3499.  
  3500.  
  3501.  
  3502.      QPOPMENU -- FUNCTION
  3503.  
  3504.  
  3505.      The  QPOPMENU function displays a menu  within a window or frame and
  3506.      obtains a selection from  the user and passes  back  an indicator of
  3507.      the  users  selection.  The function  accepts as  input  the  screen
  3508.      location where the  window should be displayed  allowing the menu to
  3509.      be  placed in a window which is a subset of the screen. The menu may
  3510.      be created  allowing selection by moving a selection bar, optionally
  3511.      each menu entry may have an action indicator which provides a faster
  3512.      selection mechanism.
  3513.  
  3514.      The QPOPMENU function is specified as follows:
  3515.  
  3516.        Slct=QPOPMENU(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  3517.                      Row,Col,NAttr,AAttr,HAttr,Page)
  3518.  
  3519.      The Slct variable will contain the results  of the QPOPMENU function
  3520.      when control is returned to your program. This will be the number of
  3521.      the menu array entry selected or, depending on the key pressed, zero
  3522.      if the Esc key was depressed, -1 if the left arrow was pressed or -2
  3523.      if the right arrow was pressed.
  3524.  
  3525.      The contents of the variables passed are as follows:
  3526.  
  3527.      Cnt     The number of entries  contained in the menu array which are
  3528.              to be included in the menu.
  3529.      VARSEG(Menu$(1)) A string array (Menu$) passed to QPOPMENU using the
  3530.              VARSEG/VARPTR  functions. The number (1) indicates the array
  3531.              element where the menu entries begin.
  3532.      VARPTR(Menu$(1)) A string array (Menu$) passed to QPOPMENU using the
  3533.              VARSEG/VARPTR functions. The number (1)  indicates the array
  3534.              element where the menu entries begin.
  3535.      Row     The screen row where the menu window is to start.
  3536.      Col     The screen Column where the menu window is to start.
  3537.      NAttr   The color attribute  to  be used to display normal text.  It
  3538.              is also used for the color attribute of the window frame.
  3539.      AAttr   The  color  attribute  to  be used  to  display  the  action
  3540.              character. Use 0,0 (black on black) if action characters are
  3541.              not desired.
  3542.      HAttr   The color attribute to be  used  to display the  highlighted
  3543.              menu  entry.  When  a  black  background  is  specified  the
  3544.              attribute will be reversed by the routine.
  3545.      Page    The video display page (valid pages are 0-3) to be used.
  3546.  
  3547.      Rules:  
  3548.  
  3549.      1.  No  error checking is performed on the input parameters.  Errors
  3550.          in the input parameters will have unpredictable results.
  3551.  
  3552.      2.  The QPOPMENU  routine requires the Color Graphics Adapter with a
  3553.          color or monochrome (shades of gray) monitor.
  3554.  
  3555.      3.  Text placed on the screen before  this function is  called which
  3556.          is outside of the bounds of the menu itself is left undisturbed.
  3557.  
  3558.  
  3559.      Keyboard                                                            46
  3560.  
  3561.  
  3562.  
  3563.  
  3564.  
  3565.  
  3566.  
  3567.  
  3568.      4.  The menu is displayed  starting  at the row and column specified
  3569.          and extends down the screen using as many screen  rows as  there
  3570.          are menu entries.
  3571.  
  3572.      5.  When the action attribute specified  is not 0,0 (black on black)
  3573.          the  first character of each entry will be highlighted  with the
  3574.          action  attribute  if  there  are  36  or  fewer menu  selection
  3575.          entries.
  3576.  
  3577.      6.  The highlight  attribute is checked for a background other  than
  3578.          black. When the background  is  black the highlight attribute is
  3579.          reversed  to  create a  reverse  video  highlight  bar.  If  the
  3580.          background is not black the highlight attribute is not changed.
  3581.  
  3582.      7.  The  following keys  will be active  for the  indicated  purpose
  3583.          while the menu is displayed.
  3584.  
  3585.          Esc         Exit  the menu without a selection, 0 is returned as
  3586.                      the function result.
  3587.          Left Arrow  Exit the menu without a selection, -1 is returned as
  3588.                      the function result.
  3589.          Right Arrow Exit the menu without a selection, -2 is returned as
  3590.                      the function result.
  3591.          Enter       Selects highlighted item.
  3592.          Up          Move the highlight bar up 1  menu  entry.  Rolls  to
  3593.                      the last entry if the  highlight bar  is  already on
  3594.                      the first entry.
  3595.          Down        Move the  highlight bar down 1 menu entry.  Rolls to
  3596.                      the first entry if  the highlight bar is already  on
  3597.                      the last entry.
  3598.          Home        Move the highlight bar to the first menu entry.
  3599.          End         Move the highlight bar to the last menu entry.
  3600.          x           When  the action attribute  is  specified other than
  3601.                      0,0  (black on black) the  keys corresponding to the
  3602.                      characters highlighted by  the action attribute  may
  3603.                      be used to select the menu entry.
  3604.  
  3605.      8.  By  checking the  value  returned by QPOPMENU  for a  -1 or  -2,
  3606.          programs can use this function to create pull down menus similar
  3607.          to the menus  that  are found in the  QuickBASIC  4 environment.
  3608.          See the example below for a suggested way of accomplishing this.
  3609.  
  3610.  
  3611.  
  3612.  
  3613.  
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.  
  3624.  
  3625.      Keyboard                                                            47
  3626.  
  3627.  
  3628.  
  3629.  
  3630.  
  3631.  
  3632.  
  3633.  
  3634.      Example:  
  3635.  
  3636.        DEFINT A-Z
  3637.        DECLARE FUNCTION QPOPMENU% (BYVAL Count AS INTEGER, _
  3638.                                    BYVAL MenuSeg AS INTEGER, _
  3639.                                    BYVAL MenuOff AS INTEGER, _
  3640.                                    BYVAL Row AS INTEGER, _
  3641.                                    BYVAL Col AS INTEGER, _
  3642.                                    BYVAL Norm AS INTEGER, _
  3643.                                    BYVAL Actn AS INTEGER, _
  3644.                                    BYVAL High AS INTEGER, _
  3645.                                    BYVAL Page AS INTEGER)
  3646.        OPTION BASE 1
  3647.        DIM Menu$(5)
  3648.         ...
  3649.        NAttr=QATTR(3,0)
  3650.        AAttr=QATTR(4,0)
  3651.        HAttr=QATTR(7,0)
  3652.         ...
  3653.        Menu$(1)= "A - Goto Routine One"
  3654.        Menu$(2)= "B - Goto Routine Two"
  3655.        Menu$(3)= "C - Goto Routine Three"
  3656.        Menu$(4)= "D - Goto Routine Four"
  3657.        Menu$(5)= "E - Goto Routine Five"
  3658.        Cnt = 5: Row = 3: Col = 3: Page = 0
  3659.        RC = QPOPMENU(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  3660.                      Row,Col,NAttr,AAttr,HAttr,Page)
  3661.        SELECT CASE RC
  3662.               CASE -2
  3663.                    GOTO NextMenu
  3664.               CASE -1
  3665.                    GOTO PrevMenu
  3666.               CASE 0
  3667.                    GOTO GetOut
  3668.               CASE 1
  3669.                    GOTO Rtn1
  3670.               CASE 2
  3671.                    GOTO Rtn2
  3672.               CASE 3
  3673.                    GOTO Rtn3
  3674.               CASE 4
  3675.                    GOTO Rtn4
  3676.               CASE 5
  3677.                    GOTO Rtn5
  3678.               CASE ELSE
  3679.                    GOTO ErrorRtn
  3680.        END SELECT
  3681.         ...
  3682.        END
  3683.  
  3684.  
  3685.  
  3686.  
  3687.  
  3688.  
  3689.  
  3690.  
  3691.      Keyboard                                                            48
  3692.  
  3693.  
  3694.  
  3695.  
  3696.  
  3697.  
  3698.  
  3699.  
  3700.      QMENU    -- FUNCTION
  3701.  
  3702.  
  3703.      The QMENU function displays a  menu and obtains a selection from the
  3704.      user  and  passes back  an  indicator  of the  users  selection. The
  3705.      function accepts as input the screen location where  the menu should
  3706.      be  displayed allowing the menu to be placed  in a window which is a
  3707.      subset of the screen. The menu may be created allowing selection  by
  3708.      moving  a selection  bar, optionally  each menu  entry may  have  an
  3709.      action indicator which provides a faster selection mechanism.
  3710.  
  3711.      The QMENU function is specified as follows:
  3712.  
  3713.        Slct=QMENU(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  3714.                   Row,Col,NAttr,AAttr,HAttr,Page)
  3715.  
  3716.      The Slct variable  will contain the  results  of  the QMENU function
  3717.      when  control is returned  to  your program, the number  of the menu
  3718.      array entry selected or zero if the Esc key was depressed.
  3719.  
  3720.      The contents of the variables passed are as follows:
  3721.  
  3722.      Cnt     The number of entries contained in  the menu array which are
  3723.              to be included in the menu.
  3724.      VARSEG(Menu$(1)) A  string array  (Menu$) passed to QMENU using  the
  3725.              VARSEG/VARPTR functions. The  number (1) indicates the array
  3726.              element where the menu entries begin.
  3727.      VARPTR(Menu$(1)) A  string array  (Menu$) passed to QMENU using  the
  3728.              VARSEG/VARPTR functions.  The number (1) indicates the array
  3729.              element where the menu entries begin.
  3730.      Row     The screen row where the menu display is to start.
  3731.      Col     The screen Column where the menu display is to start.
  3732.      NAttr   The color attribute to be used to display normal text.
  3733.      AAttr   The  color  attribute  to  be used  to  display  the  action
  3734.              character. Use 0,0 (black on black) if action characters are
  3735.              not desired.
  3736.      HAttr   The  color attribute to  be used to display the  highlighted
  3737.              menu  entry.  When  a  black  background  is  specified  the
  3738.              attribute will be reversed by the routine.
  3739.      Page    The video display page (valid pages are 0-3) to be used.
  3740.  
  3741.      Rules:  
  3742.  
  3743.      1.  No  error checking is performed  on the input parameters. Errors
  3744.          in the input parameters will have unpredictable results.
  3745.  
  3746.      2.  The QMENU routine  requires the  Color  Graphics Adapter  with a
  3747.          color or monochrome (shades of gray) monitor.
  3748.  
  3749.      3.  Text placed on the screen before this  function is called  which
  3750.          is outside of the bounds of the menu itself is left undisturbed.
  3751.          As an  example the  QWINDOW  subroutine can  be used to create a
  3752.          window before calling this function.
  3753.  
  3754.  
  3755.  
  3756.  
  3757.      Keyboard                                                            49
  3758.  
  3759.  
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.  
  3766.      4.  The menu is displayed starting at the  row and column  specified
  3767.          and  extends down the screen using as many screen  rows as there
  3768.          are menu entries.
  3769.  
  3770.      5.  When the action attribute specified is not 0,0 (black  on black)
  3771.          the first character of each  entry will be highlighted with  the
  3772.          action  attribute  if  there  are  36  or  fewer menu  selection
  3773.          entries.
  3774.  
  3775.      6.  The highlight  attribute is checked for  a background other than
  3776.          black. When the  background is black the highlight attribute  is
  3777.          reversed  to  create  a  reverse  video  highlight  bar.  If the
  3778.          background is not black the highlight attribute is not changed.
  3779.  
  3780.      7.  The following  keys will be active  for  the  indicated  purpose
  3781.          while the menu is displayed.
  3782.  
  3783.          Esc     Exit the menu without a selection, 0 is returned as  the
  3784.                  function result.
  3785.          Enter   Selects highlighted item.
  3786.          Up      Move the highlight bar up 1 menu entry.
  3787.          Down    Move the highlight bar down 1 menu entry.
  3788.          Home    Move the highlight bar to the first menu entry.
  3789.          End     Move the highlight bar to the last menu entry.
  3790.          x       When the action  attribute  is specified other than  0,0
  3791.                  (black  on   black)   the  keys  corresponding  to   the
  3792.                  characters highlighted  by the  action  attribute may be
  3793.                  used to select the menu entry.
  3794.  
  3795.      Example:  
  3796.  
  3797.        DEFINT A-Z
  3798.        DECLARE FUNCTION QMENU% (BYVAL Count AS INTEGER, _
  3799.                                 BYVAL MenuSeg AS INTEGER, _
  3800.                                 BYVAL MenuOff AS INTEGER, _
  3801.                                 BYVAL Row AS INTEGER, _
  3802.                                 BYVAL Col AS INTEGER, _
  3803.                                 BYVAL Norm AS INTEGER, _
  3804.                                 BYVAL Actn AS INTEGER, _
  3805.                                 BYVAL High AS INTEGER, _
  3806.                                 BYVAL Page AS INTEGER)
  3807.        OPTION BASE 1
  3808.        DIM Menu$(3)
  3809.         ...
  3810.        NAttr=QATTR(3,0)
  3811.        AAttr=QATTR(4,0)
  3812.        HAttr=QATTR(7,0)
  3813.        Menu$(1)= "A - Goto Routine One"
  3814.        Menu$(2)= "B - Goto Routine Two"
  3815.        Menu$(3)= "C - Goto Routine Three"
  3816.        Cnt = 4: Row = 3: Col = 58: Page = 0
  3817.        RC = QMENU(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  3818.                   Row,Col,NAttr,AAttr,HAttr,Page)
  3819.        ON RC GOTO Rtn1,Rtn2,Rtn3
  3820.         ...
  3821.  
  3822.  
  3823.      Keyboard                                                            50
  3824.  
  3825.  
  3826.  
  3827.  
  3828.  
  3829.  
  3830.  
  3831.  
  3832.        END
  3833.  
  3834.  
  3835.  
  3836.  
  3837.  
  3838.  
  3839.  
  3840.  
  3841.  
  3842.  
  3843.  
  3844.  
  3845.  
  3846.  
  3847.  
  3848.  
  3849.  
  3850.  
  3851.  
  3852.  
  3853.  
  3854.  
  3855.  
  3856.  
  3857.  
  3858.  
  3859.  
  3860.  
  3861.  
  3862.  
  3863.  
  3864.  
  3865.  
  3866.  
  3867.  
  3868.  
  3869.  
  3870.  
  3871.  
  3872.  
  3873.  
  3874.  
  3875.  
  3876.  
  3877.  
  3878.  
  3879.  
  3880.  
  3881.  
  3882.  
  3883.  
  3884.  
  3885.  
  3886.  
  3887.  
  3888.  
  3889.      Keyboard                                                            51
  3890.  
  3891.  
  3892.  
  3893.  
  3894.  
  3895.  
  3896.  
  3897.  
  3898.      QMENUS   -- FUNCTION
  3899.  
  3900.  
  3901.      The QMENUS function displays a menu and obtains a selection from the
  3902.      user and passes back an indicator of the users selection. Unlike the
  3903.      QMENU function this function assumes the entire screen  is used  for
  3904.      the menu display. The function accepts as input the screen row where
  3905.      the menu is to start, the screen  column is computed  based  on  the
  3906.      longest  menu selection entry assuming  an  80 character screen. The
  3907.      displayed menu extends from the specified screen row through row 22,
  3908.      rows  23  and 24 are  not used and the 25th row is used as  a status
  3909.      line where the valid  cursor movement keys  are displayed.  The menu
  3910.      allows  selection by moving  a selection bar,  optionally each  menu
  3911.      entry may have an action indicator which provides a faster selection
  3912.      mechanism.
  3913.  
  3914.      A unique feature  of the QMENUS function allows a maximum  of 32,767
  3915.      menu  selection  entries to be  displayed. Yes, that's right  32,767
  3916.      menu selection entries. What is displayed  on the screen is a subset
  3917.      of the menu. The  cursor movement keys allow the menu to be scrolled
  3918.      in both directions, move to the next or previous screen  and move to
  3919.      the first or last screen.
  3920.  
  3921.      The QMENUS function is specified as follows:
  3922.  
  3923.        Slct=QMENUS(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  3924.                   Row,Col,NAttr,AAttr,HAttr,Page)
  3925.  
  3926.      The  Slct variable will contain the results  of  the QMENUS function
  3927.      when control is  returned to your program,  the  number of  the menu
  3928.      array entry selected or zero if the Esc key was depressed.
  3929.  
  3930.      The contents of the variables passed are as follows:
  3931.  
  3932.      Cnt     The number of entries contained in the menu  array which are
  3933.              to be  included in the menu. This number may range from 1 to
  3934.              32,767.
  3935.      VARSEG(Menu$(1)) A  string array  (Menu$) passed to QMENUS using the
  3936.              VARSEG/VARPTR functions. The  number (1) indicates the array
  3937.              element where the menu entries begin.
  3938.      VARPTR(Menu$(1)) A string  array (Menu$) passed to QMENUS  using the
  3939.              VARSEG/VARPTR functions. The number (1) indicates  the array
  3940.              element where the menu entries begin.
  3941.      Row     The screen row where the menu display is to start.
  3942.      NAttr   The color attribute to be used to display normal text.
  3943.      AAttr   The  color  attribute  to  be used  to  display  the  action
  3944.              character. Use 0,0 (black on black) if action characters are
  3945.              not desired.
  3946.      HAttr   The color attribute  to  be used  to display the highlighted
  3947.              menu  entry.  When  a  black  background  is  specified  the
  3948.              attribute will be reversed by the routine.
  3949.      Page    The video display page (valid pages are 0-3) to be used.
  3950.  
  3951.  
  3952.  
  3953.  
  3954.  
  3955.      Keyboard                                                            52
  3956.  
  3957.  
  3958.  
  3959.  
  3960.  
  3961.  
  3962.  
  3963.  
  3964.      Rules:  
  3965.  
  3966.      1.  No error checking is performed  on the  input parameters. Errors
  3967.          in the input parameters will have unpredictable results.
  3968.  
  3969.      2.  The QMENUS function  requires  the Color Graphics Adapter with a
  3970.          color or monochrome (shades  of  gray) monitor. An 80x25  screen
  3971.          size is assumed.
  3972.  
  3973.      3.  Text placed on  the screen before this  function is called which
  3974.          is outside of the  bounds of the menu itself and the status line
  3975.          is left undisturbed. As an example the QWINDOW subroutine can be
  3976.          used to frame the  screen before calling this function, however,
  3977.          this frame may not use the 25th row.
  3978.  
  3979.      4.  The menu is displayed starting at the row specified  and extends
  3980.          down  the  screen to row  22. Row 25 is used as a status line to
  3981.          indicate the valid cursor movement keys.
  3982.  
  3983.      5.  When the action attribute specified is not 0,0  (black on black)
  3984.          the first character of  each entry  will be highlighted with the
  3985.          action  attribute  if  there are  36  or  fewer  menu  selection
  3986.          entries.
  3987.  
  3988.      6.  The highlight  attribute is checked for a background  other than
  3989.          black.  When the background is black  the highlight attribute is
  3990.          reversed  to  create  a  reverse  video  highlight bar.  If  the
  3991.          background is not black the highlight attribute is not changed.
  3992.  
  3993.      7.  The following  keys will be  active  for the  indicated  purpose
  3994.          while the menu is displayed.
  3995.  
  3996.          Esc     Exit the menu without a selection, 0 is returned as  the
  3997.                  function result.
  3998.          Enter   Selects highlighted item.
  3999.          Up      Move the highlight bar up 1 menu entry.
  4000.          Down    Move the highlight bar down 1 menu entry.
  4001.          PgUp    Move up 1 screen.
  4002.          PgDn    Move down 1 screen.
  4003.          Home    Move the highlight bar to the first menu entry.
  4004.          End     Move the highlight bar to the last menu entry.
  4005.          x       When the  action  attribute is specified  other than 0,0
  4006.                  (black   on  black)  the  keys  corresponding   to   the
  4007.                  characters highlighted  by the  action  attribute may be
  4008.                  used to select the menu entry.
  4009.  
  4010.  
  4011.  
  4012.  
  4013.  
  4014.  
  4015.  
  4016.  
  4017.  
  4018.  
  4019.  
  4020.  
  4021.      Keyboard                                                            53
  4022.  
  4023.  
  4024.  
  4025.  
  4026.  
  4027.  
  4028.  
  4029.  
  4030.      Example:  
  4031.  
  4032.        DEFINT A-Z
  4033.        DECLARE FUNCTION QMENUS% (BYVAL Count AS INTEGER, _
  4034.                                  BYVAL MenuSeg AS INTEGER, _
  4035.                                  BYVAL MenuOff AS INTEGER, _
  4036.                                  BYVAL Row AS INTEGER, _
  4037.                                  BYVAL Norm AS INTEGER, _
  4038.                                  BYVAL Actn AS INTEGER, _
  4039.                                  BYVAL High AS INTEGER, _
  4040.                                  BYVAL Page AS INTEGER)
  4041.        OPTION BASE 1
  4042.        DIM Menu$(5)
  4043.         ...
  4044.        NAttr=QATTR(3,0)
  4045.        AAttr=QATTR(4,0)
  4046.        HAttr=QATTR(7,0)
  4047.        Menu$(1)= "Apples to Oranges"
  4048.        Menu$(2)= "Books to Comics"
  4049.         ...
  4050.        Menu$(25)= "Yet Another Entry"
  4051.        Menu$(26)= "Zebras to Horses"
  4052.        Cnt = 26
  4053.        Row = 3
  4054.        Page = 0
  4055.        RC = QMENUS(Cnt,VARSEG(Menu$(1)),VARPTR(Menu$(1)), _
  4056.                    Row,NAttr,AAttr,HAttr,Page)
  4057.        SELECT CASE RC
  4058.           CASE 1
  4059.            ...
  4060.           CASE 2
  4061.            ...
  4062.           CASE 26
  4063.            ...
  4064.        END SELECT
  4065.        END
  4066.  
  4067.  
  4068.  
  4069.  
  4070.  
  4071.  
  4072.  
  4073.  
  4074.  
  4075.  
  4076.  
  4077.  
  4078.  
  4079.  
  4080.  
  4081.  
  4082.  
  4083.  
  4084.  
  4085.  
  4086.  
  4087.      Keyboard                                                            54
  4088.  
  4089.  
  4090.  
  4091.  
  4092.  
  4093.  
  4094.  
  4095.  
  4096.      QNUMKEY  -- FUNCTION
  4097.  
  4098.  
  4099.      Returns a zero to indicate that the NUM LOCK key is on, otherwise it
  4100.      returns a -1 to indicate that the NUM LOCK key is not on.
  4101.  
  4102.      The format of the call is as follows:
  4103.  
  4104.        RC = QNUMKEY()
  4105.  
  4106.      Example:  
  4107.  
  4108.        DEFINT A-Z
  4109.        DECLARE FUNCTION QNUMKEY% ()
  4110.        CLS
  4111.        WHILE INKEY$ = ""
  4112.          SELECT CASE QNUMKEY
  4113.                 CASE -1
  4114.                      LOCATE 5, 2: PRINT "NUM LOCK not on"
  4115.                 CASE 0
  4116.                      LOCATE 5, 2: PRINT "NUM LOCK is on "
  4117.          END SELECT
  4118.        WEND
  4119.        END
  4120.  
  4121.  
  4122.  
  4123.      QSCRLKEY -- FUNCTION
  4124.  
  4125.  
  4126.      Returns a zero to indicate that the SCROLL LOCK key is on, otherwise
  4127.      it returns a -1 to indicate that the SCROLL LOCK key is not on.
  4128.  
  4129.      The format of the call is as follows:
  4130.  
  4131.        RC = QSCRLKEY()
  4132.  
  4133.      Example:  
  4134.  
  4135.        DEFINT A-Z
  4136.        DECLARE FUNCTION QSCRLKEY% ()
  4137.        CLS
  4138.        WHILE INKEY$ = ""
  4139.          SELECT CASE QSCRLKEY
  4140.                 CASE -1
  4141.                      LOCATE 5, 2: PRINT "SCROLL LOCK not on"
  4142.                 CASE 0
  4143.                      LOCATE 5, 2: PRINT "SCROLL LOCK is on "
  4144.          END SELECT
  4145.        WEND
  4146.        END
  4147.  
  4148.  
  4149.  
  4150.  
  4151.  
  4152.  
  4153.      Keyboard                                                            55
  4154.  
  4155.  
  4156.  
  4157.  
  4158.  
  4159.  
  4160.  
  4161.  
  4162.      QYESNO   -- FUNCTION
  4163.  
  4164.  
  4165.      Returns a value to indicate if the  "Y" or "N" or the  "ESC" key has
  4166.      has been pressed.  It will not return to  the main program until one
  4167.      of  the above keys has been pressed.  It will  accept both upper and
  4168.      lower case characters.  The  values returned are -1 for ESC, 0 for Y
  4169.      and 1 for N.
  4170.  
  4171.      The format of the call is as follows:
  4172.  
  4173.        RC = QYESNO()
  4174.  
  4175.      Example:  
  4176.  
  4177.        DEFINT A-Z
  4178.        DECLARE FUNCTION QYESNO% ()
  4179.        CLS
  4180.        PRINT "Press (Y)es or (N)o --> ";
  4181.        SELECT CASE QYESNO
  4182.               CASE -1
  4183.                    PRINT "ESC was pressed"
  4184.               CASE 0
  4185.                    PRINT "Y was pressed"
  4186.               CASE 1
  4187.                    PRINT "N was pressed"
  4188.        END SELECT
  4189.        END
  4190.  
  4191.  
  4192.  
  4193.  
  4194.  
  4195.  
  4196.  
  4197.  
  4198.  
  4199.  
  4200.  
  4201.  
  4202.  
  4203.  
  4204.  
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.  
  4217.  
  4218.  
  4219.      Keyboard                                                            56
  4220.  
  4221.  
  4222.  
  4223.  
  4224.  
  4225.  
  4226.  
  4227.  
  4228.      MISCELLANEOUS
  4229.  
  4230.  
  4231.  
  4232.      QALARM   -- SUB
  4233.  
  4234.  
  4235.      Produces a pulsating alarm tone.
  4236.  
  4237.      The format of the call is as follows:
  4238.  
  4239.        QALARM
  4240.  
  4241.      Example:  
  4242.  
  4243.        DEFINT A-Z
  4244.        DECLARE SUB QALARM ()
  4245.        QALARM
  4246.  
  4247.  
  4248.  
  4249.      QARGC QARGV -- FUNCTION
  4250.  
  4251.  
  4252.      QARGC returns  the number of command line parameters  used to envoke
  4253.      the  program.   This  value  can  be  tested  to  determine  if  any
  4254.      parameters  were passed  to  the  program.  This  routines  has been
  4255.      optimized for multiple executions.
  4256.  
  4257.      QARGV  returns  the space delimited  parameters used  to  invoke the
  4258.      program.  The  parameters are placed into individual  elements  much
  4259.      like a  BASIC array.   The zero element, QARGV(0), returns the fully
  4260.      qualified program name, including the drive letter, of the executing
  4261.      program in version 3.x of DOS.  Prior versions return a null string.
  4262.      Use QARGC to determine the number of command line parameters.
  4263.  
  4264.      The format of the calls are as follows:
  4265.  
  4266.        Parms = QARGC
  4267.        Parm$ = QARGV(Parms)
  4268.  
  4269.      Example:  
  4270.  
  4271.        DEFINT A-Z
  4272.        DECLARE FUNCTION QARGC% ()
  4273.        DECLARE FUNCTION QARGV$ (ParmNumber AS INTEGER)
  4274.        IF QARGC > 0 THEN
  4275.           FOR X = 1 TO QARGC
  4276.               PRINT QARGV(X)
  4277.           NEXT X
  4278.        END IF
  4279.  
  4280.  
  4281.  
  4282.  
  4283.  
  4284.  
  4285.      Miscellaneous                                                       57
  4286.  
  4287.  
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.  
  4294.      QBSRCHT  -- FUNCTION
  4295.  
  4296.  
  4297.      This function is a BINARY search routine that will search through an
  4298.      array of  records defined using  the TYPE  statement.  This function
  4299.      requires that the KEY being searched for is the first element of the
  4300.      record  and it must be in  string format.  It is also necessary that
  4301.      the records  be  in sorted, ascending order.   If  these  rules  are
  4302.      followed, this  routine  should find the KEY you are looking for  in
  4303.      seven  or less tests  of the  array.   This  is  done  by constantly
  4304.      spliting the  search group in half.   When  the  KEY is  found,  the
  4305.      function will  return the element  number of the record.  If the KEY
  4306.      is not found, then  a -1 is returned.  All of this searching is done
  4307.      in memory so the KEY will be found very quickly.
  4308.  
  4309.      The format of the calls are as follows:
  4310.  
  4311.        Index = QBSRCHT(Aseg, Aptr, Lrecl, RecCnt, SearchKey$)
  4312.  
  4313.      Example:  
  4314.  
  4315.        DEFINT A-Z
  4316.        TYPE DataType
  4317.             DataKey AS STRING * 6
  4318.             DataField1 AS STRING * 10
  4319.             DataField2 AS INTEGER
  4320.             DataField3 AS STRING * 5
  4321.             DataField4 AS INTEGER
  4322.             DataField5 AS INTEGER
  4323.        END TYPE
  4324.        DIM DataRec(1 TO 2000) AS DataType
  4325.         .
  4326.        REM Do whatever is necessary to load the DataRec array
  4327.         .
  4328.        DataSeg = VARSEG(DataRec(1))
  4329.        DataPtr = VARPTR(DataRec(1))
  4330.        DataLen = LEN(DataRec(1))
  4331.        DataCnt = 2000
  4332.        DataKey$ = "ABC123"
  4333.        DataSub = QBSRCHT(DataSeg, DataPtr, DataLen, DataCnt, DataKey$)
  4334.        IF DataSub = -1 THEN
  4335.           PRINT "Key not found ==> " + DataKey$
  4336.        ELSE
  4337.           PRINT DataRec(DataSub).DataKey
  4338.           PRINT DataRec(DataSub).DataField1
  4339.           PRINT DataRec(DataSub).DataField2
  4340.           PRINT DataRec(DataSub).DataField3
  4341.           PRINT DataRec(DataSub).DataField4
  4342.           PRINT DataRec(DataSub).DataField5
  4343.        END IF
  4344.        END
  4345.  
  4346.  
  4347.  
  4348.  
  4349.  
  4350.  
  4351.      Miscellaneous                                                       58
  4352.  
  4353.  
  4354.  
  4355.  
  4356.  
  4357.  
  4358.  
  4359.  
  4360.      QCAPSOFF QCAPSON -- SUB
  4361.  
  4362.  
  4363.      This routine  will  enable  or  disable  the  CAPS LOCK key  on  the
  4364.      keyboard.  This  will  force all input to be  in upper  case without
  4365.      having to  press the shift key.   The normal  functions can still be
  4366.      used by pressing the shift key and then the appropriate key.
  4367.  
  4368.      The format of the call is as follows:
  4369.  
  4370.        QCAPSOFF
  4371.        QCAPSON
  4372.  
  4373.      Example:  
  4374.  
  4375.        DEFINT A-Z
  4376.        DECLARE SUB QCAPSOFF ()
  4377.        DECLARE SUB QCAPSON ()
  4378.        QCAPSON
  4379.         .
  4380.        QCAPSOFF
  4381.  
  4382.  
  4383.  
  4384.      QCLOCK   -- SUB
  4385.  
  4386.  
  4387.      Display a running clock on the screen.  This is a very nice touch on
  4388.      menu and update  screens. The  clock  can  be turned on and  off  by
  4389.      flipping  the "switch" (1 = on, 0 =  off).  The  routine can also be
  4390.      called again  to move the  location  of the  clock without having to
  4391.      first turn it off.
  4392.  
  4393.      The format of the call is as follows:
  4394.  
  4395.        QCLOCK Row, Col, NAttr, Page, Switch
  4396.  
  4397.      Example:  
  4398.  
  4399.        DEFINT A-Z
  4400.        DECLARE SUB QCLOCK (BYVAL Row AS INTEGER, BYVAL Col AS INTEGER, _
  4401.                            BYVAL NAttr AS INTEGER, BYVAL Page AS INTEGER, _
  4402.                            BYVAL Switch AS INTEGER)
  4403.        REM Turn the clock on
  4404.        Fgrd=5 : Bkgrd=7
  4405.        NAttr = QATTR(Fgrd,Bkgrd)
  4406.        Row = 2: Col = 70
  4407.        Switch = 1: Page = 0
  4408.        QCLOCK Row, Col, NAttr, Page, Switch
  4409.         .
  4410.        REM Turn the clock off
  4411.        Switch = 0
  4412.        QCLOCK Row, Col, NAttr, Page, Switch
  4413.  
  4414.  
  4415.  
  4416.  
  4417.      Miscellaneous                                                       59
  4418.  
  4419.  
  4420.  
  4421.  
  4422.  
  4423.  
  4424.  
  4425.  
  4426.      QCMDLEN  -- FUNCTION
  4427.  
  4428.  
  4429.      Returns the  length of  the command line used to envoke the program.
  4430.      This  function is  helpful  in  setting  the  length  of  the string
  4431.      variable  needed when  using QCMDLINE.  If  there is no command line
  4432.      information, then zero is returned.
  4433.  
  4434.      The format of the call is as follows:
  4435.  
  4436.        RC = QCMDLEN
  4437.  
  4438.      Example:  
  4439.  
  4440.        DEFINT A-Z
  4441.        DECLARE FUNCTION QCMDLEN% ()
  4442.        DECLARE FUNCTION QCMDLINE% (CmdLine AS STRING)
  4443.        IF QCMDLEN = 0 THEN
  4444.           PRINT "No command line parameters."
  4445.        ELSE
  4446.           CmdLine$ = Space$(QCMDLEN)
  4447.           RC = QCMDLINE(CmdLine$)
  4448.           PRINT "Command line is " CmdLine$
  4449.        END IF
  4450.  
  4451.  
  4452.  
  4453.      QCMDLINE -- FUNCTION
  4454.  
  4455.  
  4456.      Returns the command line used  to invoke the program.  This function
  4457.      works  like  the  COMMAND$ function except it  does not  convert all
  4458.      letters to uppercase.  You do not have to pre-set the return string,
  4459.      one of the correct  size  will be returned.   A null  string will be
  4460.      returned it there aren't any characters passed.  This function  does
  4461.      not  work in  the  editor  environment  because  it  will return the
  4462.      command line used to invoke QuickBasic.
  4463.  
  4464.      The format of the call is as follows:
  4465.  
  4466.        CmdLine$ = QCMDLINE
  4467.  
  4468.      Example:  
  4469.  
  4470.        DEFINT A-Z
  4471.        DECLARE FUNCTION QCMDLEN% ()
  4472.        DECLARE FUNCTION QCMDLINE$ ()
  4473.        IF QCMDLEN = 0 THEN
  4474.           PRINT "No command line parameters."
  4475.        ELSE
  4476.           CmdLine$ = QCMDLINE
  4477.           PRINT "Command line is " CmdLine$
  4478.        END IF
  4479.  
  4480.  
  4481.  
  4482.  
  4483.      Miscellaneous                                                       60
  4484.  
  4485.  
  4486.  
  4487.  
  4488.  
  4489.  
  4490.  
  4491.  
  4492.      QCRCCHK QCRCSET -- FUNCTION
  4493.  
  4494.  
  4495.      These  functions  will  either  calculate  and  set   the   cyclical
  4496.      redundancy check (CRC) value for a record or check the validity if a
  4497.      record with the  CRC  already set.  These functions will return a RC
  4498.      which will be zero if OK or -1 on an error.
  4499.  
  4500.      The format of the call is as follows:
  4501.  
  4502.        RC = QCRCCHK(Rec$)
  4503.        RC = QCRCSET(Rec$)
  4504.  
  4505.      Example:  
  4506.  
  4507.        DEFINT A-Z
  4508.        DECLARE FUNCTION QCRCCHK% (Record AS STRING)
  4509.        DECLARE FUNCTION QCRCSET% (Record AS STRING)
  4510.        REM Sending a record
  4511.        Rec$ = Rec$+STRING$(2,0)
  4512.        IF QCRCSET(Rec$) = 0 THEN
  4513.           Send the record
  4514.        ELSE
  4515.           Error computing the CRC
  4516.        END IF
  4517.         .
  4518.        REM Receiving a record
  4519.        IF QCRCCHK(Rec$) = 0 THEN
  4520.           Rec$ = LEFT$(Rec$,LEN(Rec$)-2)
  4521.        ELSE
  4522.           Error in CRC, request a resend
  4523.        END IF
  4524.  
  4525.  
  4526.  
  4527.      QDOSVER  -- SUB
  4528.  
  4529.  
  4530.      Retrieve  the MS-DOS version.  The major version  is returned in the
  4531.      first parm and the minor version in the second parm.
  4532.  
  4533.      The format of the call is as follows:
  4534.  
  4535.        QDOSVER Lparm, Rparm
  4536.  
  4537.      Example:  
  4538.  
  4539.        DEFINT A-Z
  4540.        DECLARE SUB QDOSVER (Major AS INTEGER, _
  4541.                             Minor AS INTEGER)
  4542.        QDOSVER Lparm, Rparm
  4543.        PRINT Lparm, Rparm
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.      Miscellaneous                                                       61
  4550.  
  4551.  
  4552.  
  4553.  
  4554.  
  4555.  
  4556.  
  4557.  
  4558.      QEMSSIZE -- SUB
  4559.  
  4560.  
  4561.      Returns both the total  and free amounts of memory in kilobytes that
  4562.      is available on  an EMS board.  If no board is installed or the  EMS
  4563.      driver is not loaded, it will return -1 for both.
  4564.  
  4565.      The format of the call is as follows:
  4566.  
  4567.        QEMSSIZE Total, Free
  4568.  
  4569.      Example:  
  4570.  
  4571.        DEFINT A-Z
  4572.        DECLARE SUB QEMSSIZE (Total AS INTEGER, _
  4573.                              Free AS INTEGER)
  4574.        QEMSSIZE Total, Free
  4575.        IF Total > 0 THEN
  4576.           PRINT "Total is" Total " Free is" Free
  4577.        ELSE
  4578.           PRINT "EMS is not available."
  4579.        END IF
  4580.  
  4581.  
  4582.  
  4583.      QEMSEXIST -- FUNCTION
  4584.  
  4585.  
  4586.      Returns a return  code indicating if  an  EMS  board  and driver  is
  4587.      installed.  If either is unavailable it  will return -1 otherwise it
  4588.      returns a zero.
  4589.  
  4590.      The format of the call is as follows:
  4591.  
  4592.        RC = QEMSEXIST()
  4593.  
  4594.      Example:  
  4595.  
  4596.        DEFINT A-Z
  4597.        DECLARE FUNCTION QEMSSIZE% ()
  4598.        IF QEMSEXIST() = 0 THEN
  4599.           PRINT "EMS is available"
  4600.        ELSE
  4601.           PRINT "EMS is not available."
  4602.        END IF
  4603.  
  4604.  
  4605.  
  4606.  
  4607.  
  4608.  
  4609.  
  4610.  
  4611.  
  4612.  
  4613.  
  4614.  
  4615.      Miscellaneous                                                       62
  4616.  
  4617.  
  4618.  
  4619.  
  4620.  
  4621.  
  4622.  
  4623.  
  4624.      QEQUIPMENT -- SUB
  4625.  
  4626.  
  4627.      Returns information on the hardware  configuration of the  computer.
  4628.      The information returned is the  memory  installed in kilobytes, the
  4629.      number of parallel ports (0-3), the number of serial ports (0-7) and
  4630.      the number of game ports (0-1).
  4631.  
  4632.      The format of the call is as follows:
  4633.  
  4634.        QEQUIPMENT Memory, Parallel, Serial, Game
  4635.  
  4636.      Example:  
  4637.  
  4638.        DEFINT A-Z
  4639.        DECLARE SUB QEQUIPMENT (Memory AS INTEGER, _
  4640.                                Parallel AS INTEGER, _
  4641.                                Serial AS INTEGER, _
  4642.                                Game AS INTEGER)
  4643.        QEQUIPMENT Memory, Parallel, Serial, Game
  4644.        PRINT Memory, Parallel, Serial, Game
  4645.  
  4646.  
  4647.  
  4648.      QEXIT    -- SUB
  4649.  
  4650.  
  4651.      This routine provides a method of letting you set the DOS errorlevel
  4652.      and  exiting your program.  There  may be  cases where  it may cause
  4653.      some problems so use it  with care.  This routine is used instead of
  4654.      the BASIC commands  "END" or "SYSTEM".  The errorlevel can be set to
  4655.      any value  between 0 and  255.  You must also  be sure that any open
  4656.      files  are closed  before calling this routine  because it  does not
  4657.      return, it jumps straight to DOS.   This routine can  now  be called
  4658.      from  the programming environment, it basically will perform a  nop,
  4659.      you should include a BASIC "END" or "SYSTEM" on the next line.
  4660.  
  4661.      The format of the call is as follows:
  4662.  
  4663.        QEXIT ErrorLevel
  4664.  
  4665.      Example:  
  4666.  
  4667.        DEFINT A-Z
  4668.        DECLARE SUB QEXIT (ErrorLevel AS INTEGER)
  4669.         .
  4670.        ErrorExit:
  4671.        CLOSE
  4672.        ErrorLevel = 16
  4673.        QEXIT ErrorLevel
  4674.        END
  4675.  
  4676.  
  4677.  
  4678.  
  4679.  
  4680.  
  4681.      Miscellaneous                                                       63
  4682.  
  4683.  
  4684.  
  4685.  
  4686.  
  4687.  
  4688.  
  4689.  
  4690.      QEXEC    -- FUNCTION
  4691.  
  4692.  
  4693.      This function is used to execute another program without leaving the
  4694.      the current program.  This function will in effect, put the  current
  4695.      program on hold, shrink  the memory that is being used to a minimum,
  4696.      run the requested program, return a return code or errorlevel if the
  4697.      executed program  returns  one and then return the memory usage back
  4698.      to the way it was in the beginning of the routine.
  4699.  
  4700.      When this  function is executed  it  must be passed  a string  which
  4701.      contains  the  full file name,  with extention (.EXE  or  .COM).  In
  4702.      addition,  command  line parameters can be included in  the  string,
  4703.      just leave one space after the file  name.  There are special  rules
  4704.      if you want to run a .BAT file, see the example below.
  4705.  
  4706.      There are a few error codes that can be returned by the routine that
  4707.      may  need  special attention.   The first error is issued  if  QEXEC
  4708.      finds an error,  the  remaining  error  codes  are returned  if  DOS
  4709.      encounters  an  error.  Any  error  code  greater  than  zero can be
  4710.      assumed to be returned by the program that was executed.
  4711.  
  4712.      -1      An error was encountered in the passed string.
  4713.      -255    Invalid function
  4714.      -254    File not found
  4715.      -248    Not enough memory
  4716.      -246    Bad environment
  4717.      -245    Bad format
  4718.  
  4719.      A little explanation should be given to  the following routine as it
  4720.      contains  some  routines from  this  library.   The  first  routine,
  4721.      QREPLACE  changes  all  occurances  of  one   character  to  another
  4722.      character.  This is used to change all occurances of ";"  to a space
  4723.      that I can then parse to the PATH string using QWORD and QWORDS in a
  4724.      FOR loop, concatinating it to the file name and then using QEXIST to
  4725.      see if the file exists.  If it does, I break out of the FOR loop and
  4726.      then invoke QEXEC.  The resulting return code will be printed to the
  4727.      screen.  If the file is not found, then the routine just exits.
  4728.  
  4729.  
  4730.  
  4731.  
  4732.  
  4733.  
  4734.  
  4735.  
  4736.  
  4737.  
  4738.  
  4739.  
  4740.  
  4741.  
  4742.  
  4743.  
  4744.  
  4745.  
  4746.  
  4747.      Miscellaneous                                                       64
  4748.  
  4749.  
  4750.  
  4751.  
  4752.  
  4753.  
  4754.  
  4755.  
  4756.      The format of the call is as follows:
  4757.  
  4758.        RC = QEXEC (PgmStr$)
  4759.  
  4760.      Example:  
  4761.  
  4762.        DEFINT A-Z
  4763.        ' $INCLUDE: 'QB4BAS.BI'
  4764.        DECLARE FUNCTION QEXEC% (PgmStr AS STRING)
  4765.  
  4766.        Tmp$ = "SDIR.COM"
  4767.        Work$ = ENVIRON$("PATH")
  4768.        QREPLACE Work$, ";", " "
  4769.        FOR X = 1 TO QWORDS(Work$)
  4770.            Work2$ = QWORD(Work$, X) + "\" + Tmp$
  4771.            IF QEXIST(Work2$ + CHR$(0)) = 0 THEN
  4772.               EXIT FOR
  4773.            ELSE
  4774.               Work2$ = ""
  4775.            END IF
  4776.        NEXT X
  4777.  
  4778.        IF Work2$ <> "" THEN
  4779.           PRINT QEXEC(Work2$)
  4780.        END IF
  4781.        END
  4782.  
  4783.      This second  example  shows the necessary format  to execute a  .BAT
  4784.      program.  This  requires that another copy  of  COMMAND.COM be first
  4785.      loaded using the /C option and  then the .BAT file name is passed in
  4786.      the command tail.
  4787.  
  4788.        DEFINT A-Z
  4789.        DECLARE FUNCTION QEXEC% (PgmStr AS STRING)
  4790.        Work1$ = ENVIRON$("COMSPEC")
  4791.        Work2$ = " /C THISTEST.BAT"
  4792.        Work$ = Work1$ + Work2$
  4793.        RC = QEXEC(Work$)
  4794.        END
  4795.  
  4796.  
  4797.  
  4798.  
  4799.  
  4800.  
  4801.  
  4802.  
  4803.  
  4804.  
  4805.  
  4806.  
  4807.  
  4808.  
  4809.  
  4810.  
  4811.  
  4812.  
  4813.      Miscellaneous                                                       65
  4814.  
  4815.  
  4816.  
  4817.  
  4818.  
  4819.  
  4820.  
  4821.  
  4822.      QINPORT  -- FUNCTION
  4823.  
  4824.  
  4825.      This  function works just like  the BASIC INP function  except it is
  4826.      slightly faster.  The port must be a number between 0 and 65,535 and
  4827.      can  be either and integer or  in BASIC HEX notation.  The  function
  4828.      will return the value that was read from the port requested.
  4829.  
  4830.      The format of the call is as follows:
  4831.  
  4832.        PortVal = QINPORT(&H6A)
  4833.  
  4834.      Example:  
  4835.  
  4836.        DEFINT A-Z
  4837.        DECLARE FUNCTION QINPORT% (BYVAL Port AS INTEGER)
  4838.         .
  4839.         .
  4840.        PortVal = QINPORT(&H6A)
  4841.        PRINT PortVal
  4842.  
  4843.  
  4844.  
  4845.      QMININT QMAXINT -- FUNCTION
  4846.  
  4847.  
  4848.      These functions will  return either the smaller of two  integers for
  4849.      QMININT or the  larger of two integers for QMAXINT.  This will allow
  4850.      numbers to be selected with a minimum of code.
  4851.  
  4852.      The format of the call is as follows:
  4853.  
  4854.        NewMin = QMININT(Number1, Number2)
  4855.        NewMax = QMAXINT(Number1, Number2)
  4856.  
  4857.      Example:  
  4858.  
  4859.        DEFINT A-Z
  4860.        DECLARE FUNCTION QMININT% (BYVAL NUM1 AS INTEGER, BYVAL NUM1 AS INTEGER)
  4861.        DECLARE FUNCTION QMAXINT% (BYVAL NUM1 AS INTEGER, BYVAL NUM1 AS INTEGER)
  4862.         .
  4863.        NewMin = QMININT(600, 682)
  4864.        NewMax = QMAXINT(600, 682)
  4865.        PRINT "The smaller number is " NewMin
  4866.        PRINT "The larger number is " NewMax
  4867.        END
  4868.  
  4869.  
  4870.  
  4871.  
  4872.  
  4873.  
  4874.  
  4875.  
  4876.  
  4877.  
  4878.  
  4879.      Miscellaneous                                                       66
  4880.  
  4881.  
  4882.  
  4883.  
  4884.  
  4885.  
  4886.  
  4887.  
  4888.      QMINLONG QMAXLONG -- FUNCTION
  4889.  
  4890.  
  4891.      These functions will return either the smaller of two  long integers
  4892.      for QMININT or the larger  of  two long integers  for QMAXINT.  This
  4893.      will allow numbers to be selected with a minimum of code.
  4894.  
  4895.      The format of the call is as follows:
  4896.  
  4897.        NewMin = QMINLONG(Number1, Number2)
  4898.        NewMax = QMAXLONG(Number1, Number2)
  4899.  
  4900.      Example:  
  4901.  
  4902.        DEFLONG A-Z
  4903.        DECLARE FUNCTION QMINLONG& (BYVAL NUM1 AS LONG, BYVAL NUM1 AS LONG)
  4904.        DECLARE FUNCTION QMAXLONG& (BYVAL NUM1 AS LONG, BYVAL NUM1 AS LONG)
  4905.         .
  4906.        NewMin = QMININT(600000, 682000)
  4907.        NewMax = QMAXINT(600000, 682000)
  4908.        PRINT "The smaller number is " NewMin
  4909.        PRINT "The larger number is " NewMax
  4910.        END
  4911.  
  4912.  
  4913.  
  4914.      QNUMLOCKOFF QNUMLOCKON -- SUB
  4915.  
  4916.  
  4917.      This routine will enable or disable the NUMLOCK key on the keyboard.
  4918.      This will  allow  the  numeric  keypad to be used without having  to
  4919.      press the  shift  key.  The normal functions  can still  be  used by
  4920.      pressing the shift key and then the appropriate key.
  4921.  
  4922.      The format of the call is as follows:
  4923.  
  4924.        QNUMLOCKOFF
  4925.        QNUMLOCKON
  4926.  
  4927.      Example:  
  4928.  
  4929.        DEFINT A-Z
  4930.        DECLARE SUB QNUMLOCKOFF ()
  4931.        DECLARE SUB QNUMLOCKON ()
  4932.        QNUMLOCKON
  4933.         .
  4934.        QNUMLOCKOFF
  4935.  
  4936.  
  4937.  
  4938.  
  4939.  
  4940.  
  4941.  
  4942.  
  4943.  
  4944.  
  4945.      Miscellaneous                                                       67
  4946.  
  4947.  
  4948.  
  4949.  
  4950.  
  4951.  
  4952.  
  4953.  
  4954.      QPRINTER -- FUNCTION
  4955.  
  4956.  
  4957.      Check to see if the  first printer device  is active  or on.  The RC
  4958.      will be 0 if it is  online or -1  if it is not.   Care must be taken
  4959.      when using this function  because some print  spoolers may return  0
  4960.      when the printer is actually offline.
  4961.  
  4962.      The format of the call is as follows:
  4963.  
  4964.        RC = QPRINTER
  4965.  
  4966.      Example:  
  4967.  
  4968.        DEFINT A-Z
  4969.        DECLARE FUNCTION QPRINTER% ()
  4970.         .
  4971.        IF QPRINTER = 0 THEN
  4972.           PRINT "Printer is online"
  4973.        ELSE
  4974.           PRINT "Printer is offline"
  4975.        END IF
  4976.  
  4977.  
  4978.  
  4979.      QPRTSCRN -- SUB
  4980.  
  4981.  
  4982.      Prints the  current  screen display  to the current printer  device.
  4983.      This routine functions exactly the same  as pressing the Shift-PrtSc
  4984.      keys from the keyboard.
  4985.  
  4986.      The format of the call is as follows:
  4987.  
  4988.        QPRTSCRN
  4989.  
  4990.      Example:  
  4991.  
  4992.        DEFINT A-Z
  4993.        DECLARE SUB QPRTSCRN ()
  4994.        QPRTSCRN
  4995.  
  4996.  
  4997.  
  4998.  
  4999.  
  5000.  
  5001.  
  5002.  
  5003.  
  5004.  
  5005.  
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.      Miscellaneous                                                       68
  5012.  
  5013.  
  5014.  
  5015.  
  5016.  
  5017.  
  5018.  
  5019.  
  5020.      QPRTSCRNOFF QPRTSCRNON -- SUB
  5021.  
  5022.  
  5023.      These  routines  will  enable  or disable  the  PRTSCRN  key on  the
  5024.      keyboard.  This  will prevent  anyone from  accidently pressing  the
  5025.      wrong key while the program is executing.
  5026.  
  5027.      The format of the call is as follows:
  5028.  
  5029.        QPRTSCRNOFF
  5030.        QPRTSCRNON
  5031.  
  5032.      Example:  
  5033.  
  5034.        DECLARE SUB QPRTSCRNOFF ()
  5035.        DECLARE SUB QPRTSCRNON ()
  5036.        QPRTSCRNOFF
  5037.         .
  5038.        QPRTSCRNON
  5039.  
  5040.  
  5041.  
  5042.      QPAUSE   -- SUB
  5043.  
  5044.  
  5045.      Pause for  a given number of seconds.  It uses  the system clock and
  5046.      will pause for the same amount of time regardless of the CPU used.
  5047.  
  5048.      The format of the call is as follows:
  5049.  
  5050.        QPAUSE Seconds
  5051.  
  5052.      Example:  
  5053.  
  5054.        DEFINT A-Z
  5055.        DECLARE SUB QPAUSE (BYVAL Seconds AS INTEGER)
  5056.        Seconds = 15
  5057.        QPAUSE Seconds
  5058.  
  5059.  
  5060.  
  5061.  
  5062.  
  5063.  
  5064.  
  5065.  
  5066.  
  5067.  
  5068.  
  5069.  
  5070.  
  5071.  
  5072.  
  5073.  
  5074.  
  5075.  
  5076.  
  5077.      Miscellaneous                                                       69
  5078.  
  5079.  
  5080.  
  5081.  
  5082.  
  5083.  
  5084.  
  5085.  
  5086.      QPAUSE18 -- SUB
  5087.  
  5088.  
  5089.      Pause  for a given  number of eighteenths  of a second.   The actual
  5090.      amount may vary depending on the PC that you are using.
  5091.  
  5092.      The format of the call is as follows:
  5093.  
  5094.        QPAUSE18 Count
  5095.  
  5096.      Example:  
  5097.  
  5098.        DEFINT A-Z
  5099.        DECLARE SUB QPAUSE18 (BYVAL Count AS INTEGER)
  5100.        REM Pause for 1/2 second.
  5101.        Count = 9
  5102.        QPAUSE18 Count
  5103.  
  5104.  
  5105.  
  5106.      QREBOOT  -- SUB
  5107.  
  5108.  
  5109.      Forces the  system to do an immediate reboot.  This program  can  be
  5110.      useful  in programs that change the CONFIG.SYS  file  which requires
  5111.      that the system be rebooted to take effect.
  5112.  
  5113.      The format of the call is as follows:
  5114.  
  5115.        QREBOOT
  5116.  
  5117.      Example:  
  5118.  
  5119.        DEFINT A-Z
  5120.        DECLARE SUB QREBOOT ()
  5121.        REM Replace the config.sys file
  5122.        RC = QCOPYFIL("CONFIG.NEW" + CHR$(0), "CONFIG.SYS + CHR$(0))
  5123.        QREBOOT
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.  
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.      Miscellaneous                                                       70
  5144.  
  5145.  
  5146.  
  5147.  
  5148.  
  5149.  
  5150.  
  5151.  
  5152.      QSHIFTIL QSHIFTIR -- FUNCTION
  5153.  
  5154.  
  5155.      These  functions will  take  an  integer  and  shift  the  bits  the
  5156.      requested  number of bits either  left or  right and return  the new
  5157.      number.  This will  increase or decrease the number  by the power of
  5158.      two.
  5159.  
  5160.      The format of the call is as follows:
  5161.  
  5162.        Num1 = QSHIFTIL(Number, 1)
  5163.        Num2 = QSHIFTIR(Number, 1)
  5164.  
  5165.      Example:  
  5166.  
  5167.        DEFINT A-Z
  5168.        DECLARE FUNCTION QSHIFTIL% (BYVAL Number AS INTEGER, _
  5169.                                    BYVAL Shift AS INTEGER)
  5170.        DECLARE FUNCTION QSHIFTIR% (BYVAL Number AS INTEGER, _
  5171.                                    BYVAL Shift AS INTEGER)
  5172.         .
  5173.        Num1 = QSHIFTIL(5,1)
  5174.        Num2 = QSHIFTIL(10,1)
  5175.        PRINT Num1, Num2
  5176.  
  5177.  
  5178.  
  5179.      QSHIFTLL QSHIFTLR -- FUNCTION
  5180.  
  5181.  
  5182.      These functions  will  take a  long integer and shift  the  bits the
  5183.      requested  number of  bits either left or right  and  return the new
  5184.      number.  This will increase or decrease the number by  the  power of
  5185.      two.
  5186.  
  5187.      The format of the call is as follows:
  5188.  
  5189.        Num1 = QSHIFTLL(Number, 1)
  5190.        Num2 = QSHIFTLR(Number, 1)
  5191.  
  5192.      Example:  
  5193.  
  5194.        DEFLONG A-Z
  5195.        DECLARE FUNCTION QSHIFTIL& (BYVAL Number AS LONG, _
  5196.                                    BYVAL Shift AS INTEGER)
  5197.        DECLARE FUNCTION QSHIFTIR& (BYVAL Number AS LONG, _
  5198.                                    BYVAL Shift AS INTEGER)
  5199.         .
  5200.        Num1 = QSHIFTLL(65536,1)
  5201.        Num2 = QSHIFTLL(262144,1)
  5202.        PRINT Num1, Num2
  5203.  
  5204.  
  5205.  
  5206.  
  5207.  
  5208.  
  5209.      Miscellaneous                                                       71
  5210.  
  5211.  
  5212.  
  5213.  
  5214.  
  5215.  
  5216.  
  5217.  
  5218.      QSCROLLOFF QSCROLLON -- SUB
  5219.  
  5220.  
  5221.      This  routine  will  enable or  disable the  SCROLL  LOCK key on the
  5222.      keyboard.
  5223.  
  5224.      The format of the call is as follows:
  5225.  
  5226.        QSCROLLOFF
  5227.        QSCROLLON
  5228.  
  5229.      Example:  
  5230.  
  5231.        DEFINT A-Z
  5232.        DECLARE SUB QSCROLLOFF ()
  5233.        DECLARE SUB QSCROLLON ()
  5234.        QSCROLLON
  5235.         .
  5236.        QSCROLLOFF
  5237.  
  5238.  
  5239.  
  5240.      QSHARE   -- FUNCTION
  5241.  
  5242.  
  5243.      This function returns a return code  which indicates if  the program
  5244.      SHARE  has been loaded or not.  The following are  the  return codes
  5245.      that will  be  returned,  -1  indicates a  version of  DOS less than
  5246.      3.10.   If a zero is returned, then SHARE has been loaded, otherwise
  5247.      a one is returned to indicate that SHARE is not present.
  5248.  
  5249.      The format of the call is as follows:
  5250.  
  5251.        RC = QSHARE
  5252.  
  5253.      Example:  
  5254.  
  5255.        DEFINT A-Z
  5256.        DECLARE FUNCTION QSHARE ()
  5257.         .
  5258.        PRINT QSHARE
  5259.  
  5260.  
  5261.  
  5262.  
  5263.  
  5264.  
  5265.  
  5266.  
  5267.  
  5268.  
  5269.  
  5270.  
  5271.  
  5272.  
  5273.  
  5274.  
  5275.      Miscellaneous                                                       72
  5276.  
  5277.  
  5278.  
  5279.  
  5280.  
  5281.  
  5282.  
  5283.  
  5284.      QTIME    -- SUB
  5285.  
  5286.  
  5287.      Returns 4  integers which contain  the  current  hours,  minutes and
  5288.      seconds  of the  day as well as  the total  number of seconds  since
  5289.      midnight.
  5290.  
  5291.      The format of the call is as follows:
  5292.  
  5293.        QTIME Hours, Minutes, Seconds, TotSeconds
  5294.  
  5295.      Example:  
  5296.  
  5297.        DEFINT A-Z
  5298.        DECLARE SUB QTIME (Hours AS INTEGER, _
  5299.                           Minutes AS INTEGER, _
  5300.                           Seconds AS INTEGER, _
  5301.                           TotSeconds AS LONG)
  5302.         .
  5303.        QTIME Hours, Minutes, Seconds, TotSeconds
  5304.  
  5305.  
  5306.  
  5307.      QTEMPC   -- FUNCTION
  5308.  
  5309.  
  5310.      This function  will  convert  the inputed fahrenheit temperature and
  5311.      convert it into centigrade.
  5312.  
  5313.      The format of the call is as follows:
  5314.  
  5315.        TempC = QTEMPC(TempF);
  5316.  
  5317.      Example:  
  5318.  
  5319.        DEFINT A-Z
  5320.        DECLARE FUNCTION QTEMPC% (BYVAL Fahrenheit AS INTEGER)
  5321.        FOR N1 = 32 TO 212
  5322.            PRINT QTEMPC(N1);
  5323.        NEXT N1
  5324.        END
  5325.  
  5326.  
  5327.  
  5328.  
  5329.  
  5330.  
  5331.  
  5332.  
  5333.  
  5334.  
  5335.  
  5336.  
  5337.  
  5338.  
  5339.  
  5340.  
  5341.      Miscellaneous                                                       73
  5342.  
  5343.  
  5344.  
  5345.  
  5346.  
  5347.  
  5348.  
  5349.  
  5350.      QTEMPF   -- FUNCTION
  5351.  
  5352.  
  5353.      This function will convert  the  inputed  centigrade temperature and
  5354.      convert it into fahrenheit.
  5355.  
  5356.      The format of the call is as follows:
  5357.  
  5358.        TempF = QTEMPF(TempC);
  5359.  
  5360.      Example:  
  5361.  
  5362.        DEFINT A-Z
  5363.        DECLARE FUNCTION QTEMPF% (BYVAL Fahrenheit AS INTEGER)
  5364.        FOR N1 = 0 TO 100
  5365.            PRINT QTEMPF(N1);
  5366.        NEXT N1
  5367.        END
  5368.  
  5369.  
  5370.  
  5371.      QVERIFY  -- FUNCTION
  5372.  
  5373.  
  5374.      Returns an integer  which indicates if the DOS  write verify flag is
  5375.      on or off.  If the value is zero then the verify flag is turned off.
  5376.      If the value is one then the flag is turned on.
  5377.  
  5378.      The format of the call is as follows:
  5379.  
  5380.        Flag = QVERIFY
  5381.  
  5382.      Example:  
  5383.  
  5384.        DEFINT A-Z
  5385.        DECLARE FUNCTION QVERIFY% ()
  5386.         .
  5387.        PRINT "The write verify flag is ";
  5388.        IF QVERIFY = 0 THEN
  5389.           PRINT "OFF"
  5390.        ELSE
  5391.           PRINT "ON"
  5392.        END IF
  5393.  
  5394.  
  5395.  
  5396.  
  5397.  
  5398.  
  5399.  
  5400.  
  5401.  
  5402.  
  5403.  
  5404.  
  5405.  
  5406.  
  5407.      Miscellaneous                                                       74
  5408.  
  5409.  
  5410.  
  5411.  
  5412.  
  5413.  
  5414.  
  5415.  
  5416.      QVERIFYOFF QVERIFYON -- SUB
  5417.  
  5418.  
  5419.      These subroutines will either turn the verify flag on or off. If the
  5420.      verify flag is turned on, writing to files will take longer.
  5421.  
  5422.      The format of the call is as follows:
  5423.  
  5424.        QVERIFYOFF
  5425.        QVERIFYON
  5426.  
  5427.      Example:  
  5428.  
  5429.        DEFINT A-Z
  5430.        DECLARE SUB QVERIFYOFF()
  5431.        DECLARE SUB QVERIFYON()
  5432.        DECLARE FUNCTION QVERIFY% ()
  5433.         .
  5434.        CLS
  5435.        PRINT QVERIFY
  5436.        QVERIFYON
  5437.        PRINT QVERIFY
  5438.        QVERIFYOFF
  5439.        PRINT QVERIFY
  5440.        END
  5441.  
  5442.  
  5443.  
  5444.      Q8087    -- FUNCTION
  5445.  
  5446.  
  5447.      Returns an integer  which indicates if an 80x87 math  coprocessor is
  5448.      present.  If  the  value is zero  then  a  coprocessor is present. A
  5449.      value of -1 is returned if a coprocessor is not present.
  5450.  
  5451.      The format of the call is as follows:
  5452.  
  5453.        Flag = Q8087
  5454.  
  5455.      Example:  
  5456.  
  5457.        DEFINT A-Z
  5458.        DECLARE FUNCTION Q8087% ()
  5459.        IF Q8087 = 0 THEN
  5460.            PRINT "Co-processor is present"
  5461.        ELSE
  5462.            PRINT "Co-processor is not present"
  5463.        END IF
  5464.        END
  5465.  
  5466.  
  5467.  
  5468.  
  5469.  
  5470.  
  5471.  
  5472.  
  5473.      Miscellaneous                                                       75
  5474.  
  5475.  
  5476.  
  5477.  
  5478.  
  5479.  
  5480.  
  5481.  
  5482.      MOUSE
  5483.  
  5484.  
  5485.  
  5486.      QMHIDE   -- SUB
  5487.  
  5488.  
  5489.      Removes the mouse pointer from the screen.  The mouse driver continues
  5490.      to track the mouse position.
  5491.  
  5492.      The format of the call is as follows:
  5493.  
  5494.        QMHIDE
  5495.  
  5496.      Example:  
  5497.  
  5498.        DEFINT A-Z
  5499.        DECLARE SUB QMHIDE ()
  5500.        Buttons = QMSTATUS
  5501.        QMSHOW
  5502.         ..
  5503.        REM  Do what you want with the MOUSE
  5504.         ..
  5505.         ..
  5506.        QMHIDE
  5507.        END
  5508.  
  5509.  
  5510.  
  5511.      QMLOC    -- FUNCTION
  5512.  
  5513.  
  5514.      Returns  the  current mouse  button  status  and the  X/Y  pointer
  5515.      positon.  This function will always  return the  current location,
  5516.      If you need to know what  the location was when a key was pressed,
  5517.      use QMPRESS.
  5518.  
  5519.      The format of the call is as follows:
  5520.  
  5521.        Buttons = QMLOC(Xloc, Yloc)
  5522.  
  5523.      Example:  
  5524.  
  5525.        DEFINT A-Z
  5526.        DECLARE FUNCTION QMLOC% (Xloc AS INTEGER, Yloc AS INTEGER)
  5527.        Buttons = QMSTATUS
  5528.        QMSHOW
  5529.         ..
  5530.        Buttons = QMLOC(Xloc, Yloc)
  5531.        PRINT Buttons, Xloc, Yloc
  5532.         ..
  5533.        QMHIDE
  5534.  
  5535.  
  5536.  
  5537.  
  5538.  
  5539.      Mouse                                                               76
  5540.  
  5541.  
  5542.  
  5543.  
  5544.  
  5545.  
  5546.  
  5547.  
  5548.      QMPRESS  -- FUNCTION
  5549.  
  5550.  
  5551.      Returns the current status of all mouse buttons, and the number of
  5552.      presses and  position  of  the  last  press for a specified  mouse
  5553.      button. The press counter for the button is reset to zero.
  5554.  
  5555.      The format of the call is as follows:
  5556.  
  5557.        Button = QMPRESS(MouseKey, PushCounter, Xloc, Yloc)
  5558.  
  5559.      Example:  
  5560.  
  5561.        DEFINT A-Z
  5562.        DECLARE FUNCTION QMPRESS% (BYVAL Mkey AS INTEGER, Ctr AS INTEGER,  
  5563.                                   Xloc AS INTEGER, Yloc AS INTEGER)
  5564.        Buttons = QMSTATUS
  5565.        QMSHOW
  5566.         ..
  5567.        MouseKey = 1
  5568.        Button1 = QMPRESS(MouseKey, PushCounter1, Xloc1, Yloc1)
  5569.        MouseKey = 2
  5570.        Button2 = QMPRESS(MouseKey, PushCounter2, Xloc2, Yloc2)
  5571.        PRINT Button1, PushCounter1, Xloc1, Yloc1
  5572.        PRINT Button2, PushCounter2, Xloc2, Yloc2
  5573.         ..
  5574.        QMHIDE
  5575.  
  5576.  
  5577.  
  5578.      QMSET    -- SUB
  5579.  
  5580.  
  5581.      Sets the position of  the mouse pointer.  The pointer is displayed
  5582.      at the new position unless it has been hidden with QMHIDE.
  5583.  
  5584.      The format of the call is as follows:
  5585.  
  5586.        QMSET Xloc, Yloc
  5587.  
  5588.      Example:  
  5589.  
  5590.        DEFINT A-Z
  5591.        DECLARE SUB QMSET (Xloc, Yloc)
  5592.        Buttons = QMSTATUS
  5593.        QMSHOW
  5594.         ..
  5595.        Xloc = 50
  5596.        Yloc = 70
  5597.        QMSET Xloc, Yloc
  5598.         ..
  5599.        QMHIDE
  5600.  
  5601.  
  5602.  
  5603.  
  5604.  
  5605.      Mouse                                                               77
  5606.  
  5607.  
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.  
  5614.      QMSHOW   -- SUB
  5615.  
  5616.  
  5617.      Displays the mouse pointer on the screen provided the mouse driver
  5618.      is running.
  5619.  
  5620.      The format of the call is as follows:
  5621.  
  5622.        QMSHOW
  5623.  
  5624.      Example:  
  5625.  
  5626.        DEFINT A-Z
  5627.        DECLARE SUB QMSHOW ()
  5628.        Buttons = QMSTATUS
  5629.        QMSHOW
  5630.         ..
  5631.        REM  Do what you want with the MOUSE
  5632.         ..
  5633.         ..
  5634.        QMHIDE
  5635.        END
  5636.  
  5637.  
  5638.  
  5639.      QMSTATUS -- FUNCTION
  5640.  
  5641.  
  5642.      Initializes the mouse driver  and returns the  driver  status.  If
  5643.      the  status code  returned  is -1  then the mouse  driver  is  not
  5644.      available, otherwise the number of mouse buttons are returned.
  5645.  
  5646.      The format of the call is as follows:
  5647.  
  5648.        Buttons = QMSTATUS
  5649.  
  5650.      Example:  
  5651.  
  5652.        DEFINT A-Z
  5653.        DECLARE FUNCTION QMSTATUS% ()
  5654.        Buttons = QMSTATUS
  5655.        QMSHOW
  5656.         ..
  5657.        REM  Do what you want with the MOUSE
  5658.         ..
  5659.         ..
  5660.        QMHIDE
  5661.        END
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.      Mouse                                                               78
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.  
  5680.      STRING
  5681.  
  5682.  
  5683.  
  5684.      QCAPIT   -- SUB
  5685.  
  5686.  
  5687.      This  routine  will take an  input  string  and change  the  first
  5688.      character  to upper case and the remainder of  the string will  be
  5689.      changed to lower case.  If the second  character  of the string is
  5690.      an apostrophe ('), then the third character will also be converted
  5691.      to an upper case character.
  5692.  
  5693.      The format of the call is as follows:
  5694.  
  5695.        QCAPIT TstStr$
  5696.  
  5697.      Example:  
  5698.  
  5699.        DEFINT A-Z
  5700.        DECLARE SUB QCAPIT (StringName AS STRING)
  5701.        TstStr$="harold"
  5702.        QCAPIT TstStr$
  5703.        PRINT TstStr$
  5704.         .
  5705.        TstStr$="o'brian"
  5706.        QCAPIT TstStr$
  5707.        PRINT TstStr$
  5708.        END
  5709.  
  5710.  
  5711.  
  5712.      QCENTER  -- SUB
  5713.  
  5714.  
  5715.      This  routine will take an input string that has  been padded with
  5716.      spaces and center the test.  It does not matter  if the padding is
  5717.      on  the left  or  the right of  the text  and  the  text  can have
  5718.      multiple words. The  way that this routine works is  to first left
  5719.      justify all text and then to center the text.
  5720.  
  5721.      The format of the call is as follows:
  5722.  
  5723.        QCENTER TstStr$
  5724.  
  5725.      Example:  
  5726.  
  5727.        DEFINT A-Z
  5728.        DECLARE SUB QCENTER (StringName AS STRING)
  5729.        TstStr$ = "Harold Thomson" + SPACE$(30)
  5730.        QCENTER TstStr$
  5731.        PRINT TstStr$
  5732.        END
  5733.  
  5734.  
  5735.  
  5736.  
  5737.      String                                                              79
  5738.  
  5739.  
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.  
  5746.      QCHARTYP -- FUNCTION
  5747.  
  5748.  
  5749.      This function  is used to determine if an  input  string  contains
  5750.      valid characters which are inputed to the function via a string of
  5751.      valid characters.  If the inputed characters are valid, a zero (0)
  5752.      is returned otherwise the position of the first invalid characters
  5753.      is returned. If either string is null ("") then a -1 is returned.
  5754.  
  5755.      The format of the call is as follows:
  5756.  
  5757.        RC = QCHARTYP(TstStr$, ValStr$)
  5758.  
  5759.      Example:  
  5760.  
  5761.        DEFINT A-Z
  5762.        DECLARE FUNCTION QCHARTYP% (TstStr AS STRING, ValStr AS STRING)
  5763.        TstStr$="abbc2254621"
  5764.        ValStr$="abcdefgABCDEFG12345"
  5765.        IF QCHARTYP(TstStr$, ValStr$) = 0 THEN
  5766.           PRINT "The string is valid"
  5767.        ELSE
  5768.           PRINT "The string is invalid"
  5769.        END
  5770.  
  5771.  
  5772.  
  5773.      QDELIM   -- FUNCTION
  5774.  
  5775.  
  5776.      Returns  the  n'th  word  in  a  comma  delimited  string.  If the
  5777.      requested word is null (,,) then a null string is returned.
  5778.  
  5779.      The format of the call is as follows:
  5780.  
  5781.        NewStr$ = QDELIM(TstStr$, Index)
  5782.  
  5783.      Example:  
  5784.  
  5785.        DEFINT A-Z
  5786.        DECLARE FUNCTION QDELIM$ (StringName AS STRING,
  5787.                                  BYVAL Indx AS INTEGER)
  5788.        TstStr$="This,,string,contains,five,words"
  5789.        Index = 5
  5790.        NewStr$ = QDELIM(TstStr$, Indx)
  5791.        IF NewStr$ <> "" THEN
  5792.           PRINT "The fifth word of the string is " NewStr$
  5793.        ELSE
  5794.           PRINT "Error in QDELIM"
  5795.        END
  5796.  
  5797.  
  5798.  
  5799.  
  5800.  
  5801.  
  5802.  
  5803.      String                                                              80
  5804.  
  5805.  
  5806.  
  5807.  
  5808.  
  5809.  
  5810.  
  5811.  
  5812.      QEXTRACT -- FUNCTION
  5813.  
  5814.  
  5815.      Returns  the n'th word from a string based upon a  delimiter which
  5816.      is passed in  the call. A null string  is  returned if an error is
  5817.      encountered.
  5818.  
  5819.      The format of the call is as follows:
  5820.  
  5821.        NewString$ = QEXTRACT(TstStr$, Delim$, Index)
  5822.  
  5823.      Example:  
  5824.  
  5825.        DEFINT A-Z
  5826.        DECLARE FUNCTION QEXTRACT$ (StringName AS STRING, Delim AS STRING, _
  5827.                                    BYVAL Index AS INTEGER)
  5828.        TstStr$="This@string@contains@five@words"
  5829.        Index = 4: Delim$ = "@"
  5830.        NewStr$ = QEXTRACT(TstStr$, Delim$, Index)
  5831.        IF NewStr$ <> "" THEN
  5832.           PRINT "The fourth word of the string is " NewStr$
  5833.        ELSE
  5834.           PRINT "Error in QEXTRACT"
  5835.        END
  5836.  
  5837.  
  5838.  
  5839.      QFORMAT  -- FUNCTION
  5840.  
  5841.  
  5842.      This  function  will  return a  formatted string  using  two input
  5843.      strings. The first string is the unformatted  input string and the
  5844.      second string is the format mask string.  This routine can be used
  5845.      to print such things as a SSN  (social security number), telephone
  5846.      numbers  and  money  amounts that  are  in  a string format.   The
  5847.      important thing to remember is that the spaces in the mask  string
  5848.      are where the data from the input string will be  printed.  If you
  5849.      want a  space in the formatted string, what I have done is include
  5850.      an ASCII 255 in the  mask  string, QFORMAT will not print  in this
  5851.      location.
  5852.  
  5853.      The format of the call is as follows:
  5854.  
  5855.        NewString$ = QFORMAT(TstStr$, Mask$)
  5856.  
  5857.      Example:  
  5858.  
  5859.        DEFINT A-Z
  5860.        DECLARE FUNCTION QFORMAT$ (StringName AS STRING, Mask AS STRING)
  5861.        TstStr$="4073513737"
  5862.        Mask$ = "(   )   -    "
  5863.        NewStr$ = QFORMAT(TstStr$, Mask$)
  5864.        PRINT NewStr$          '  Should print (407)351-3737
  5865.        END
  5866.  
  5867.  
  5868.  
  5869.      String                                                              81
  5870.  
  5871.  
  5872.  
  5873.  
  5874.  
  5875.  
  5876.  
  5877.  
  5878.      QHIGHBIT -- SUB
  5879.  
  5880.  
  5881.      This  subroutine will turn off  the high order or leftmost bit  of
  5882.      every character in a string.  This may be useful when reading some
  5883.      files which have  been created  by some word  processing  programs
  5884.      such as Wordstar.
  5885.  
  5886.      The format of the call is as follows:
  5887.  
  5888.        QHIGHBIT TstStr$
  5889.  
  5890.      Example:  
  5891.  
  5892.        DEFINT A-Z
  5893.        DECLARE SUB QHIGHBIT (TstStr AS STRING)
  5894.        TstStr$="ÇàÄÜ"
  5895.        QHIGHBIT TstStr$
  5896.        PRINT "This string now reads " TstStr$
  5897.        END
  5898.  
  5899.  
  5900.  
  5901.      QINSTR   -- FUNCTION
  5902.  
  5903.  
  5904.      Returns the position  of  a character  in a  string  based upon  a
  5905.      supplied character  which is passed in the call.  In addition, the
  5906.      desired number of the character occurence  is passed. Returns a -1
  5907.      if an error is encountered or the character is not found.
  5908.  
  5909.      The format of the call is as follows:
  5910.  
  5911.        RC = QINSTR(TstStr$, Delim$, Index)
  5912.  
  5913.      Example:  
  5914.  
  5915.        DEFINT A-Z
  5916.        DECLARE FUNCTION QINSTR% (TstStr AS STRING, _
  5917.                                  Delim AS STRING, _
  5918.                                  BYVAL Index AS INTEGER)
  5919.        TstStr$="aaa( ( (  ) ) )aaa"
  5920.        Index = 2
  5921.        Delim$ = "("
  5922.        IF QINSTR(TstStr$, Delim$, Index) > 0 THEN
  5923.           PRINT "The character position is " Index
  5924.        ELSE
  5925.           PRINT "Error in QINSTR Call"
  5926.        END IF
  5927.        END
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.  
  5934.  
  5935.      String                                                              82
  5936.  
  5937.  
  5938.  
  5939.  
  5940.  
  5941.  
  5942.  
  5943.  
  5944.      QLEN     -- FUNCTION
  5945.  
  5946.  
  5947.      Returns the length of a string.  This routine works just like  the
  5948.      BASIC LEN() function but is somewhat faster.  This functions works
  5949.      with variable length strings  as well as fixed length strings.  It
  5950.      also works with strings defined with the BASIC TYPE statement.
  5951.  
  5952.      The format of the call is as follows:
  5953.  
  5954.        StrLen = QLEN(TstStr$)
  5955.  
  5956.      Example:  
  5957.  
  5958.        DEFINT A-Z
  5959.        DECLARE FUNCTION QLEN% (TstStr AS STRING)
  5960.        TstStr$="1234567890"
  5961.        PRINT "The length of the string is " QLEN(TstStr$)
  5962.  
  5963.  
  5964.  
  5965.      QMID     -- FUNCTION
  5966.  
  5967.  
  5968.      Overlays the contents of  string 2  with the contents of string  1
  5969.      starting at  the  character  pointed to  by start.  This  function
  5970.      returns a zero if it is successful, if start if  beyond the string
  5971.      2 length or the length of string 1 extends beyond string 2 a -1 is
  5972.      returned.
  5973.  
  5974.      The format of the call is as follows:
  5975.  
  5976.        RC = QMID(Str1$, Str2$, Start)
  5977.  
  5978.      Example:  
  5979.  
  5980.        DEFINT A-Z
  5981.        DECLARE FUNCTION QMID% (Str1 AS STRING, _
  5982.                                Str2 AS STRING, _
  5983.                                BYVAL Start AS INTEGER)
  5984.        Str1$ = "zzzzzzzzzz": Str2$ = "aaaXxxxxxxxxxxXaaa"
  5985.        Start = 5
  5986.        XX = QMID(Str1$, Str2$, Start)
  5987.        PRINT Str2$
  5988.        END
  5989.  
  5990.  
  5991.  
  5992.  
  5993.  
  5994.  
  5995.  
  5996.  
  5997.  
  5998.  
  5999.  
  6000.  
  6001.      String                                                              83
  6002.  
  6003.  
  6004.  
  6005.  
  6006.  
  6007.  
  6008.  
  6009.  
  6010.      QMOVREC  -- FUNCTION
  6011.  
  6012.  
  6013.      Move a  record defined  with the TYPE function to  a  BASIC string
  6014.      variable.  Currently, only  individule fields  can  be  moved to a
  6015.      string.
  6016.  
  6017.      The format of the call is as follows:
  6018.  
  6019.        OutString$ = QMOVREC(PtrR, LenR)
  6020.  
  6021.      Example:  
  6022.  
  6023.        DEFINT A-Z
  6024.        DECLARE FUNCTION QMOVREC$ (BYVAL PtrR AS INTEGER, _
  6025.                                   BYVAL LenR AS INTEGER)
  6026.        TYPE TestType
  6027.             Fld1 AS STRING * 5
  6028.             Fld2 AS STRING * 10
  6029.        END TYPE
  6030.        DIM TestRec AS TestType
  6031.        TestRec.Fld1 = "AAAAA": TestRec.Fld2 = "0123456789"
  6032.        PtrR = VARPTR(TestRec): LenR = LEN(TestRec)
  6033.        Buffer$ = QMOVREC(PrtR, LenR)
  6034.        PRINT Buffer$
  6035.  
  6036.  
  6037.  
  6038.      QMOVSTR  -- SUB
  6039.  
  6040.  
  6041.      Moves  a BASIC string variable to  a record  defined with the TYPE
  6042.      function.  Currently,  strings can only  be  moved  to  individule
  6043.      fields.
  6044.  
  6045.      The format of the call is as follows:
  6046.  
  6047.        QMOVSTR PtrR, LenR, OutString$
  6048.  
  6049.      Example:  
  6050.  
  6051.        DEFINT A-Z
  6052.        DECLARE SUB QMOVSTR (BYVAL PtrR AS INTEGER, BYVAL LenR AS INTEGER, _
  6053.                             Buffer AS STRING)
  6054.        TYPE TestType
  6055.             Fld1 AS STRING * 5
  6056.             Fld2 AS STRING * 10
  6057.        END TYPE
  6058.        DIM TestRec AS TestType
  6059.        PtrR = VARPTR(TestRec): LenR = LEN(TestRec)
  6060.        Buffer$ = "AAAAA0123456789"
  6061.        QMOVSTR PrtR, LenR, Buffer$
  6062.        PRINT TestRec.Fld1, TestRec.Fld2
  6063.  
  6064.  
  6065.  
  6066.  
  6067.      String                                                              84
  6068.  
  6069.  
  6070.  
  6071.  
  6072.  
  6073.  
  6074.  
  6075.  
  6076.      QREPLACE -- SUB
  6077.  
  6078.  
  6079.      Replace  the  character  specified  by  OLD$  with  the  character
  6080.      specified  by  NEW$.   These  two  characters  must  be  only  one
  6081.      character long or the routine returns without changing the string.
  6082.  
  6083.      The format of the call is as follows:
  6084.  
  6085.        QREPLACE TstStr$, Old$, New$
  6086.  
  6087.      Example:  
  6088.  
  6089.        DEFINT A-Z
  6090.        DECLARE SUB QREPLACE (StringName AS STRING, _
  6091.                              OldStr AS STRING, _
  6092.                              NewStr AS STRING)
  6093.        TstStr$="05-29-87"
  6094.        Old$ = "-"
  6095.        New$ = "/"
  6096.        QREPLACE TstStr$, Old$, New$
  6097.        PRINT TstStr$
  6098.  
  6099.  
  6100.  
  6101.      QREVERSE -- FUNCTION
  6102.  
  6103.  
  6104.      This function  returns a  new  string with  all characters  of the
  6105.      input string reversed.  In other words, "ABCD" becomes "DCBA".  It
  6106.      is not necessary to supply an output string.
  6107.  
  6108.      The format of the call is as follows:
  6109.  
  6110.        NewStr$ = QREVERSE(OldStr$)
  6111.  
  6112.      Example:  
  6113.  
  6114.        DEFINT A-Z
  6115.        DECLARE FUNCTION QREVERSE$ (StringName AS STRING)
  6116.        TstStr$ = "This is a test string"
  6117.        NewStr$ = QREVERSE(TstStr$)
  6118.        PRINT NewStr$
  6119.        REM  The results are ==> "gnirts tset a si sihT"
  6120.  
  6121.  
  6122.  
  6123.  
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.  
  6130.  
  6131.  
  6132.  
  6133.      String                                                              85
  6134.  
  6135.  
  6136.  
  6137.  
  6138.  
  6139.  
  6140.  
  6141.  
  6142.      QRINSTR  -- FUNCTION
  6143.  
  6144.  
  6145.      This routine is simular to QINSTR except it starts the search from
  6146.      the end of the string and searches towards the beginning.  It will
  6147.      return  the  position  of  a character  in  a string  based upon a
  6148.      supplied character which is passed in the call.  In  addition, the
  6149.      desired number of  the character occurence is passed. Returns a -1
  6150.      if an error is encountered or the character is not found.
  6151.  
  6152.      The format of the call is as follows:
  6153.  
  6154.        RC = QRINSTR(TstStr$, Delim$, Index)
  6155.  
  6156.      Example:  
  6157.  
  6158.        DEFINT A-Z
  6159.        DECLARE FUNCTION QRINSTR% (TstStr AS STRING, _
  6160.                                   Delim AS STRING, _
  6161.                                   BYVAL Index AS INTEGER)
  6162.        TstStr$="aaa( ( (  ) ) )aaa"
  6163.        Index = 2
  6164.        Delim$ = ")"
  6165.        IF QRINSTR(TstStr$, Delim$, Index) > 0 THEN
  6166.           PRINT "The character position is " Index
  6167.        ELSE
  6168.           PRINT "Error in QRINSTR Call"
  6169.        END
  6170.  
  6171.  
  6172.  
  6173.      QSTRIP   -- FUNCTION
  6174.  
  6175.  
  6176.      This  routine removes  all  occurances of blanks or spaces  from a
  6177.      string and returns a new string.
  6178.  
  6179.      The format of the call is as follows:
  6180.  
  6181.        NewString$ = QSTRIP(StringName$)
  6182.  
  6183.      Example:  
  6184.  
  6185.        DEFINT A-Z
  6186.        DECLARE FUNCTION QSTRIP$ (StringName AS STRING)
  6187.        StringName$ = "This is a test string for QSTRIP"
  6188.        NewString$ = QSTRIP(StringName$)
  6189.        PRINT NewString$
  6190.  
  6191.  
  6192.  
  6193.  
  6194.  
  6195.  
  6196.  
  6197.  
  6198.  
  6199.      String                                                              86
  6200.  
  6201.  
  6202.  
  6203.  
  6204.  
  6205.  
  6206.  
  6207.  
  6208.      QSTRPCHR -- FUNCTION
  6209.  
  6210.  
  6211.      This  routine removes  all of  the  occurances  of  the  requested
  6212.      character from a string and return it in a new string.
  6213.  
  6214.      The format of the call is as follows:
  6215.  
  6216.        NewString$ = QSTRPCHR(StringName$, StripChr$)
  6217.  
  6218.      Example:  
  6219.  
  6220.        DEFINT A-Z
  6221.        DECLARE FUNCTION QSTRPCHR$ (StringName AS STRING, _
  6222.                                    StripChr AS STRING)
  6223.        StringName$ = "This#is#a#test#string#for#QSTRPCHR"
  6224.        StripChr$ = "#"
  6225.        NewString$ = QSTRPCHR(StringName$, StripChr$)
  6226.        PRINT NewString$
  6227.  
  6228.  
  6229.  
  6230.      QSUBSTR  -- FUNCTION
  6231.  
  6232.  
  6233.      This function copies a portion  of FromStr starting  at  the Start
  6234.      position for Length number  of characters and places it in ToStr$.
  6235.      A null string is returned if it was unsuccessful.
  6236.  
  6237.      The format of the call is as follows:
  6238.  
  6239.        ToStr$ = QSUBSTR(FromStr$, Start, Length)
  6240.  
  6241.      Example:  
  6242.  
  6243.        DEFINT A-Z
  6244.        DECLARE FUNCTION QSUBSTR$ (FromStr AS STRING, _
  6245.                                   BYVAL Start AS INTEGER, _
  6246.                                   BYVAL Length AS INTEGER)
  6247.         .
  6248.        FromStr$ = "aaaXxxxxxxxxxxXaaa"
  6249.        Start = 4
  6250.        Length = 10
  6251.        ToStr$ = QSUBSTR(FromStr$, Start, Length)
  6252.        PRINT ToStr$
  6253.        END
  6254.  
  6255.  
  6256.  
  6257.  
  6258.  
  6259.  
  6260.  
  6261.  
  6262.  
  6263.  
  6264.  
  6265.      String                                                              87
  6266.  
  6267.  
  6268.  
  6269.  
  6270.  
  6271.  
  6272.  
  6273.  
  6274.      QWORD    -- FUNCTION
  6275.  
  6276.  
  6277.      Returns a string which contains the n'th space delimited word from
  6278.      a string.  Returns a null string if an error is encountered.
  6279.  
  6280.      The format of the call is as follows:
  6281.  
  6282.        Found$ = QWORD(TstStr$, Index)
  6283.  
  6284.      Example:  
  6285.  
  6286.        DEFINT A-Z
  6287.        DECLARE FUNCTION QWORD$ (StringName AS STRING, _
  6288.                                 BYVAL Index AS INTEGER)
  6289.        TstStr$="This string contains five words"
  6290.        Index = 4
  6291.        Found$ = QWORD(TstStr$, Index)
  6292.        IF Found$ <> "" THEN
  6293.           PRINT "The fourth word of the string is " Found$
  6294.        ELSE
  6295.           PRINT "Error in QWORD"
  6296.        END
  6297.  
  6298.  
  6299.  
  6300.      QWORDS   -- FUNCTION
  6301.  
  6302.  
  6303.      Returns the  number of space delimited words in a string.  If  the
  6304.      string is null or all spaces, it will return zero.
  6305.  
  6306.      The format of the call is as follows:
  6307.  
  6308.        Number.Of.Words = QWORDS(TstStr$)
  6309.  
  6310.      Example:  
  6311.  
  6312.        DEFINT A-Z
  6313.        DECLARE FUNCTION QWORDS% (StringName AS STRING)
  6314.        TstStr$="This string contains five words"
  6315.        IF QWORDS(TstStr$) > 0 THEN
  6316.           PRINT "The number of words in this string is " QWORDS(TstStr$)
  6317.        ELSE
  6318.           PRINT "Error in QWORDS"
  6319.        END
  6320.  
  6321.  
  6322.  
  6323.  
  6324.  
  6325.  
  6326.  
  6327.  
  6328.  
  6329.  
  6330.  
  6331.      String                                                              88
  6332.  
  6333.  
  6334.  
  6335.  
  6336.  
  6337.  
  6338.  
  6339.  
  6340.      SUB-DIRECTORY
  6341.  
  6342.  
  6343.  
  6344.      QCHDIR   -- FUNCTION
  6345.  
  6346.  
  6347.      Change the current sub-directory. Works the  same as the DOS CHDIR
  6348.      command except a return code is set to zero (0) if successful.
  6349.  
  6350.      The format of the call is as follows:
  6351.  
  6352.        RC = QCHDIR(ChFile$)
  6353.  
  6354.      Example:  
  6355.  
  6356.        DEFINT A-Z
  6357.        DECLARE FUNCTION QCHDIR% (DirName AS STRING)
  6358.        ChFile$="C:\NEWSUB\DIR"+CHR$(0)
  6359.        IF QCHDIR(ChFile$) = 0 THEN
  6360.           PRINT "New directory set"
  6361.        ELSE
  6362.           PRINT "New directory not selected"
  6363.        END IF
  6364.  
  6365.  
  6366.  
  6367.      QCHKDIR  -- FUNCTION
  6368.  
  6369.  
  6370.      Checks to see  if the requested sub-directory exists.   The return
  6371.      code is set to -1 if the directory doesn't exist.
  6372.  
  6373.      The format of the call is as follows:
  6374.  
  6375.        RC = QCHKDIR(ChkFile$)
  6376.  
  6377.      Example:  
  6378.  
  6379.        DEFINT A-Z
  6380.        DECLARE FUNCTION QCHKDIR% (DirName AS STRING)
  6381.        ChkFile$="C:\CHKSUB\DIR"+CHR$(0)
  6382.        IF QCHKDIR(ChkFile$) = 0 THEN
  6383.           PRINT "Sub-directory exists"
  6384.        ELSE
  6385.           PRINT "The requested sub-directory doesn't exist"
  6386.        END IF
  6387.  
  6388.  
  6389.  
  6390.  
  6391.  
  6392.  
  6393.  
  6394.  
  6395.  
  6396.  
  6397.      Sub-Directory                                                       89
  6398.  
  6399.  
  6400.  
  6401.  
  6402.  
  6403.  
  6404.  
  6405.  
  6406.      QGETDIR  -- FUNCTION
  6407.  
  6408.  
  6409.      Returns the current sub-directory.  It is  no longer  necessary to
  6410.      pre-allocate the return string.
  6411.  
  6412.      The format of the call is as follows:
  6413.  
  6414.        DirStr$ = QGETDIR
  6415.  
  6416.      Example:  
  6417.  
  6418.        DEFINT A-Z
  6419.        DECLARE FUNCTION QGETDIR$ ()
  6420.        DirStr$ = QGETDIR
  6421.        PRINT "The current directory is " DirStr$
  6422.  
  6423.  
  6424.  
  6425.      QMKDIR   -- FUNCTION
  6426.  
  6427.  
  6428.      Create  a  new  sub-directory. Works  the same as  the  DOS  MKDIR
  6429.      command except a return code is set to -1 if the  directory wasn't
  6430.      created.
  6431.  
  6432.      The format of the call is as follows:
  6433.  
  6434.        RC = QMKDIR(MkFile$)
  6435.  
  6436.      Example:  
  6437.  
  6438.        DEFINT A-Z
  6439.        DECLARE FUNCTION QMKDIR% (DirName AS STRING)
  6440.        MkFile$ = "NEWSUBDIR"+CHR$(0)
  6441.        IF QMKDIR(MkFile$) = 0 THEN PRINT "Sub-directory created."
  6442.  
  6443.  
  6444.  
  6445.      QRMDIR   -- FUNCTION
  6446.  
  6447.  
  6448.      Deletes an existing sub-directory.  Same as the  DOS RMDIR command
  6449.      except the RC will be set to -1 if the directory not found.
  6450.  
  6451.      The format of the call is as follows:
  6452.  
  6453.        RC = QRMDIR(RmFile$)
  6454.  
  6455.      Example:  
  6456.  
  6457.        DEFINT A-Z
  6458.        DECLARE FUNCTION QRMDIR% (DirName AS STRING)
  6459.        RmFile$ = "OLDSUBDIR"+CHR$(0)
  6460.        IF QRMDIR(RmFile$) = 0 THEN PRINT "Sub-directory deleted."
  6461.  
  6462.  
  6463.      Sub-Directory                                                       90
  6464.  
  6465.  
  6466.  
  6467.  
  6468.  
  6469.  
  6470.  
  6471.  
  6472.      VIDEO
  6473.  
  6474.  
  6475.  
  6476.      QANSIPRT -- SUB
  6477.  
  6478.  
  6479.      Print a string to the screen  including any ANSI escape characters
  6480.      sequences.   The BASIC LOCATE command must be used before the call
  6481.      to  set the line and column before printing. This routine uses DOS
  6482.      calls so it will print slower than QPRT or QBPRT.
  6483.  
  6484.      The format of the call is as follows:
  6485.  
  6486.        QANSIPRT CharString$
  6487.  
  6488.      Example:  
  6489.  
  6490.        DEFINT A-Z
  6491.        DECLARE SUB QANSIPRT (PrtString AS STRING)
  6492.        LOCATE 3,2
  6493.        QANSIPRT CharString$
  6494.  
  6495.  
  6496.  
  6497.      QATTR    -- FUNCTION
  6498.  
  6499.  
  6500.      Calculates the color attribute for routines such as QPRT, QWINDOW,
  6501.      etc. It also allows use of the "blink" attribute.
  6502.  
  6503.      The format of the call is as follows:
  6504.  
  6505.        NAttr = QATTR(Fgrd, Bkgrd)
  6506.  
  6507.      Example:  
  6508.  
  6509.        DEFINT A-Z
  6510.        DECLARE FUNCTION QATTR% (BYVAL Fore AS INTEGER, _
  6511.                                 BYVAL Back AS INTEGER)
  6512.        Fgrd = 7 : Bkgrd = 0
  6513.        NAttr = QATTR(Fgrd, Bkgrd)
  6514.  
  6515.  
  6516.  
  6517.  
  6518.  
  6519.  
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.      Video                                                               91
  6530.  
  6531.  
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.  
  6538.      QBPRT    -- SUB
  6539.  
  6540.  
  6541.      Print a string at the specified location on the screen.  The Color
  6542.      attribute must be computed prior to the call and included with the
  6543.      call.  It  also allows  the  string to be printed on  any of the 4
  6544.      video pages.  This routine uses BIOS calls to print the string  so
  6545.      it will be compatible with most versions of DOS.
  6546.  
  6547.      The format of the call is as follows:
  6548.  
  6549.        QBPRT Prt$, Row, Col, NAttr, Page
  6550.  
  6551.      The parameters that are used by QBPRT are as follow:
  6552.  
  6553.      Prt$    The string to be printed.
  6554.      Row     The row to print.
  6555.      Col     The column to print.
  6556.      Attr    The video color attribute to use.
  6557.      Page    The video page to print on.
  6558.  
  6559.      Example:  
  6560.  
  6561.        DEFINT A-Z
  6562.        DECLARE SUB QBPRT (PrtLine AS STRING, _
  6563.                           BYVAL Row AS INTEGER, _
  6564.                           BYVAL Col AS INTEGER, _
  6565.                           BYVAL Attr AS INTEGER, _
  6566.                           BYVAL Page AS INTEGER)
  6567.         .
  6568.         .
  6569.        Prt$="This is the string to be printed."
  6570.        Fgrd = 7 : Bkgrd = 0
  6571.        NAttr = QATTR(Fgrd, Bkgrd)
  6572.        Row=5 : Col=10 : Page=0
  6573.        QBPRT Prt$, Row, Col, NAttr, Page
  6574.  
  6575.  
  6576.  
  6577.  
  6578.  
  6579.  
  6580.  
  6581.  
  6582.  
  6583.  
  6584.  
  6585.  
  6586.  
  6587.  
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.      Video                                                               92
  6596.  
  6597.  
  6598.  
  6599.  
  6600.  
  6601.  
  6602.  
  6603.  
  6604.      QBMPRT   -- SUB
  6605.  
  6606.  
  6607.      Print a string array at the specified location on the screen.  The
  6608.      color attribute must be calculated before the call and passed with
  6609.      the call.  It also allows the string to be printed on any of the 4
  6610.      video pages.  This routine uses BIOS calls to print the strings so
  6611.      it will be compatible with most versions of DOS.
  6612.  
  6613.      The format of the call is as follows:
  6614.  
  6615.        QBMPRT Elements, VARSEG(Prt$(0)), VARPTR(Prt$(0)), Row, Col, AAttr, Page
  6616.  
  6617.      The parameters that are used by QMPRT are as follows:
  6618.  
  6619.      Elements          The number of occurrences of the array.
  6620.      VARSEG(Prt$(0))   The  VARSEG  segment  address of the first array
  6621.                        element.
  6622.      VARPTR(Prt$(0))   The VARPTR address of the first array element.
  6623.      Row               The row to start printing.
  6624.      Col               The column to start in.
  6625.      Attr              The video color attribute to use.
  6626.      Page              The video page to print on.
  6627.  
  6628.      Example:  
  6629.  
  6630.        OPTION BASE 0
  6631.        DEFINT A-Z
  6632.        DECLARE SUB QBMPRT (BYVAL Elements AS INTEGER, _
  6633.                            BYVAL VSeg AS INTEGER, _
  6634.                            BYVAL VOff AS INTEGER, _
  6635.                            BYVAL Row AS INTEGER, _
  6636.                            BYVAL Col AS INTEGER, _
  6637.                            BYVAL Attr AS INTEGER, _
  6638.                            BYVAL Page AS INTEGER)
  6639.        DIM Prt$(4)
  6640.         .
  6641.        Prt$(0)="This is the first string to be printed."
  6642.        Prt$(1)="This is the second string to be printed."
  6643.        Prt$(2)="This is the third string to be printed."
  6644.        Prt$(3)="This is the fourth string to be printed."
  6645.        Fgrd = 1 : Bkgrd = 7
  6646.        AAttr = QATTR(Fgrd, Bkgrd)
  6647.        Row=5 : Col=10 : Page=0
  6648.        Elements=4
  6649.        QBMPRT Elements, VARSEG(Prt$(0)), VARPTR(Prt$(0)), Row, Col, AAttr, Page
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.      Video                                                               93
  6662.  
  6663.  
  6664.  
  6665.  
  6666.  
  6667.  
  6668.  
  6669.  
  6670.      QCRTMODE -- SUB
  6671.  
  6672.  
  6673.      This routine will return a value between 0  and 3  to indicate the
  6674.      type of monitor that is installed.  In addition it will return the
  6675.      current number of  columns that the screen is set too.   Care must
  6676.      be  taken on some  systems such as the AT&T PC6300 because it will
  6677.      return a  1 indicationg CGA  even though  a mono  screen is  being
  6678.      used.  This is due to the fact that a CGA video controller card is
  6679.      being used.
  6680.  
  6681.      The format of the call is as follows:
  6682.  
  6683.        QCRTMODE CType, CCols
  6684.  
  6685.      Example:  
  6686.  
  6687.        DEFINT A-Z
  6688.        DECLARE SUB QCRTMODE (CrtType AS INTEGER, _
  6689.                              CrtCols AS INTEGER)
  6690.        REM CrtType ==> 0 = MDA, 1 = CGA, 2 = EGA, 3 = VGA
  6691.        QCRTMODE CType, CCols
  6692.        SELECT CASE CType
  6693.               CASE 0
  6694.                    PRINT "Monitor type is MDA with"+STR$(CCols)+" Columns."
  6695.               CASE 1
  6696.                    PRINT "Monitor type is CGA with"+STR$(CCols)+" Columns."
  6697.               CASE 2
  6698.                    PRINT "Monitor type is EGA with"+STR$(CCols)+" Columns."
  6699.               CASE 3
  6700.                    PRINT "Monitor type is VGA with"+STR$(CCols)+" Columns."
  6701.               CASE ELSE
  6702.                    PRINT "Unknown monitor type."
  6703.        END SELECT
  6704.        END
  6705.  
  6706.  
  6707.  
  6708.      QCLREOL  -- SUB
  6709.  
  6710.  
  6711.      This routine will print spaces from the current cursor location to
  6712.      the  end of the  line.   The cursor can be places  anywhere on the
  6713.      screen using the LOCATE statement.
  6714.  
  6715.      The format of the call is as follows:
  6716.  
  6717.        QCLREOL
  6718.  
  6719.      Example:  
  6720.  
  6721.        DEFINT A-Z
  6722.        DECLARE SUB QCLREOL ()
  6723.         .
  6724.        LOCATE 5, 15
  6725.  
  6726.  
  6727.      Video                                                               94
  6728.  
  6729.  
  6730.  
  6731.  
  6732.  
  6733.  
  6734.  
  6735.  
  6736.        QCLREOL
  6737.         .
  6738.        END
  6739.  
  6740.  
  6741.  
  6742.  
  6743.  
  6744.  
  6745.  
  6746.  
  6747.  
  6748.  
  6749.  
  6750.  
  6751.  
  6752.  
  6753.  
  6754.  
  6755.  
  6756.  
  6757.  
  6758.  
  6759.  
  6760.  
  6761.  
  6762.  
  6763.  
  6764.  
  6765.  
  6766.  
  6767.  
  6768.  
  6769.  
  6770.  
  6771.  
  6772.  
  6773.  
  6774.  
  6775.  
  6776.  
  6777.  
  6778.  
  6779.  
  6780.  
  6781.  
  6782.  
  6783.  
  6784.  
  6785.  
  6786.  
  6787.  
  6788.  
  6789.  
  6790.  
  6791.  
  6792.  
  6793.      Video                                                               95
  6794.  
  6795.  
  6796.  
  6797.  
  6798.  
  6799.  
  6800.  
  6801.  
  6802.      QGETATTR -- FUNCTION
  6803.  
  6804.  
  6805.      This function will return an integer  containing the current video
  6806.      attribute at the requested row and column.  This can  be useful in
  6807.      determinine  the color attribute being used before print with QPRT
  6808.      or the other print routines in this library.
  6809.  
  6810.      The format of the call is as follows:
  6811.  
  6812.        Attr = QGETATTR (Row, Col)
  6813.  
  6814.      Example:  
  6815.  
  6816.        DEFINT A-Z
  6817.        DECLARE FUNCTION QGETATTR% (BYVAL Row AS INTEGER, _
  6818.                                    BYVAL Col AS INTEGER)
  6819.        PRINT "The color attribute at row 24, column 1 is "; QGETATTR(24,1)
  6820.        END
  6821.  
  6822.  
  6823.  
  6824.      QGETCURS -- SUB
  6825.  
  6826.  
  6827.      This  routine will  return  integer values containing the  current
  6828.      cursor row and column for the requested video page.  This requires
  6829.      only one call instead of  2 using  the  BASIC funtions CSRLIN  and
  6830.      POS(0).
  6831.  
  6832.      The format of the call is as follows:
  6833.  
  6834.        QGETCURS Row, Col, Page
  6835.  
  6836.      Example:  
  6837.  
  6838.        DEFINT A-Z
  6839.        DECLARE SUB QGETCURS (Row AS INTEGER, _
  6840.                              Col AS INTEGER, _
  6841.                              Page AS INTEGER)
  6842.        QGETCURS Row, Col, Page
  6843.        PRINT "The cursor is at Row/Column": Row, Col
  6844.        END
  6845.  
  6846.  
  6847.  
  6848.  
  6849.  
  6850.  
  6851.  
  6852.  
  6853.  
  6854.  
  6855.  
  6856.  
  6857.  
  6858.  
  6859.      Video                                                               96
  6860.  
  6861.  
  6862.  
  6863.  
  6864.  
  6865.  
  6866.  
  6867.  
  6868.      QGETMODE -- FUNCTION
  6869.  
  6870.  
  6871.      This function  will  return an integer  value  which contains  the
  6872.      current video mode  returned by the BIOS.  This value can then  be
  6873.      used  to  reset  the  video mode  after it  has been changed  with
  6874.      QSETMODE.
  6875.  
  6876.      The format of the call is as follows:
  6877.  
  6878.        HoldMode = QGETMODE
  6879.  
  6880.      Example:  
  6881.  
  6882.        DEFINT A-Z
  6883.        DECLARE FUNCTION QGETMODE% ()
  6884.        HoldMode = QGETMODE
  6885.        QSETMODE HoldMode - 2
  6886.         .
  6887.         .
  6888.        QSETMODE HoldMode
  6889.         .
  6890.        END
  6891.  
  6892.  
  6893.  
  6894.  
  6895.  
  6896.  
  6897.  
  6898.  
  6899.  
  6900.  
  6901.  
  6902.  
  6903.  
  6904.  
  6905.  
  6906.  
  6907.  
  6908.  
  6909.  
  6910.  
  6911.  
  6912.  
  6913.  
  6914.  
  6915.  
  6916.  
  6917.  
  6918.  
  6919.  
  6920.  
  6921.  
  6922.  
  6923.  
  6924.  
  6925.      Video                                                               97
  6926.  
  6927.  
  6928.  
  6929.  
  6930.  
  6931.  
  6932.  
  6933.  
  6934.      QMPRT    -- SUB
  6935.  
  6936.  
  6937.      Print a string array at the specified location on the screen.  The
  6938.      color attribute must be calculated before the call and passed with
  6939.      the call.  It also allows the string to be printed on any of the 4
  6940.      video pages.   This  routine  writes to video ram directly and may
  6941.      not be compatible with some versions of DOS.
  6942.  
  6943.      The format of the call is as follows:
  6944.  
  6945.        QMPRT Elements, VARSEG(Prt$(0)), VARPTR(Prt$(0)), Row, Col, AAttr, Page
  6946.  
  6947.      The parameters that are used by QMPRT are as follows:
  6948.  
  6949.      Elements          The number of occurrences of the array.
  6950.      VARSEG(Prt$(0))   The VARSEG segment address  of  the first  array
  6951.                        element.
  6952.      VARPTR(Prt$(0))   The VARPTR address of the first array element.
  6953.      Row               The row to start printing.
  6954.      Col               The column to start in.
  6955.      Attr              The video color attribute to use.
  6956.      Page              The video page to print on.
  6957.  
  6958.      Example:  
  6959.  
  6960.        OPTION BASE 0
  6961.        DEFINT A-Z
  6962.        DECLARE SUB QMPRT (BYVAL Elements AS INTEGER, _
  6963.                           BYVAL VSeg AS INTEGER, _
  6964.                           BYVAL VOff AS INTEGER, _
  6965.                           BYVAL Row AS INTEGER, _
  6966.                           BYVAL Col AS INTEGER, _
  6967.                           BYVAL Attr AS INTEGER, _
  6968.                           BYVAL Page AS INTEGER)
  6969.        DIM Prt$(4)
  6970.         .
  6971.        Prt$(0)="This is the first string to be printed."
  6972.        Prt$(1)="This is the second string to be printed."
  6973.        Prt$(2)="This is the third string to be printed."
  6974.        Prt$(3)="This is the fourth string to be printed."
  6975.        Fgrd = 1 : Bkgrd = 7
  6976.        AAttr = QATTR(Fgrd, Bkgrd)
  6977.        Row=5 : Col=10 : Page=0
  6978.        Elements=4
  6979.        QMPRT Elements, VARSEG(Prt$(0)), VARPTR(Prt$(0)), Row, Col, AAttr, Page
  6980.  
  6981.  
  6982.  
  6983.  
  6984.  
  6985.  
  6986.  
  6987.  
  6988.  
  6989.  
  6990.  
  6991.      Video                                                               98
  6992.  
  6993.  
  6994.  
  6995.  
  6996.  
  6997.  
  6998.  
  6999.  
  7000.      QPAINT   -- SUB
  7001.  
  7002.  
  7003.      This subroutine will  change the current foreground and background
  7004.      colors of an area of the screen as defined by  the supplied screen
  7005.      locations.  Any text  that exists in  this area will remain.  Only
  7006.      the colors will change.
  7007.  
  7008.      The format of the call is as follows:
  7009.  
  7010.        QPAINT TRow, LCol, BRow, RCol, Attr, Page
  7011.  
  7012.      The parameters that are used by QPAINT are as follows:
  7013.  
  7014.      TR      The top row location.
  7015.      LC      The left column location.
  7016.      BR      The bottom row location.
  7017.      RC      The right column location.
  7018.      Attr    The video color attribute to use.
  7019.      Page    The video page to print on.
  7020.  
  7021.      Example:  
  7022.  
  7023.        DEFINT A-Z
  7024.        DECLARE SUB QPAINT (BYVAL TR AS INTEGER, _
  7025.                            BYVAL LC AS INTEGER, _
  7026.                            BYVAL BR AS INTEGER, _
  7027.                            BYVAL RC AS INTEGER, _
  7028.                            BYVAL ATTR AS INTEGER, _
  7029.                            BYVAL PAGE AS INTEGER)
  7030.         .
  7031.         .
  7032.        TRow = 5: LCol = 10: BRow = 15: RCol = 70: Page = 0
  7033.        Attr = QATTR(3, 0)
  7034.        QPAINT TRow, LCol, BRow, RCol, Attr, Page
  7035.         .
  7036.        END
  7037.  
  7038.  
  7039.  
  7040.  
  7041.  
  7042.  
  7043.  
  7044.  
  7045.  
  7046.  
  7047.  
  7048.  
  7049.  
  7050.  
  7051.  
  7052.  
  7053.  
  7054.  
  7055.  
  7056.  
  7057.      Video                                                               99
  7058.  
  7059.  
  7060.  
  7061.  
  7062.  
  7063.  
  7064.  
  7065.  
  7066.      QPRT     -- SUB
  7067.  
  7068.  
  7069.      Print a string at the specified location on the screen.  The color
  7070.      attribute must be calculated prior to the call and passed with the
  7071.      call.  It  also allows the string to  be printed on any of  the  4
  7072.      video  pages.   This routine writes to video  ram directly and may
  7073.      not be compatible with some versions of DOS.
  7074.  
  7075.      The format of the call is as follows:
  7076.  
  7077.        QPRT Prt$, Row, Col, NAttr, Page
  7078.  
  7079.      The parameters that are used by QPRT are as follows:
  7080.  
  7081.      Prt$    The string to be printed.
  7082.      Row     The row to print.
  7083.      Col     The column to print.
  7084.      Attr    The video color attribute to use.
  7085.      Page    The video page to print on.
  7086.  
  7087.      Example:  
  7088.  
  7089.        DEFINT A-Z
  7090.        DECLARE SUB QPRT (PrtLine AS STRING, _
  7091.                          BYVAL Row AS INTEGER, _
  7092.                          BYVAL Col AS INTEGER, _
  7093.                          BYVAL Attr AS INTEGER, _
  7094.                          BYVAL Page AS INTEGER)
  7095.         .
  7096.         .
  7097.        Prt$="This is the string to be printed."
  7098.        Fgrd = 7 : Bkgrd = 0
  7099.        NAttr = QATTR(Fgrd, Bkgrd)
  7100.        Row=5 : Col=10 : Page=0
  7101.        QPRT Prt$, Row, Col, NAttr, Page
  7102.  
  7103.  
  7104.  
  7105.  
  7106.  
  7107.  
  7108.  
  7109.  
  7110.  
  7111.  
  7112.  
  7113.  
  7114.  
  7115.  
  7116.  
  7117.  
  7118.  
  7119.  
  7120.  
  7121.  
  7122.  
  7123.      Video                                                              100
  7124.  
  7125.  
  7126.  
  7127.  
  7128.  
  7129.  
  7130.  
  7131.  
  7132.      QPRTANSI -- SUB
  7133.  
  7134.  
  7135.      Print  a string to the screen including any ANSI escape characters
  7136.      sequences.  The unlike  the QANSIPRT sub, this routine has a built
  7137.      in locate function.  In addition,  this subroutine can be passed a
  7138.      number which  is the last line of a window  that  the routine will
  7139.      print to.  If this number will  be exceeded,  the subroutine  will
  7140.      scroll the  screen up one before printing the next  line.  In this
  7141.      case, the  row  and  column parameters will be  ignored.   If this
  7142.      value is zero, then  the  window parameter is ignored and  the row
  7143.      and column specified will be used.  This routine uses DOS calls so
  7144.      it will print slower than QPRT or QBPRT.
  7145.  
  7146.      The format of the call is as follows:
  7147.  
  7148.        QPRTANSI CharString$, Row, Col, Awindow
  7149.  
  7150.      Example:  
  7151.  
  7152.        DEFINT A-Z
  7153.        DECLARE SUB QPRTANSI (PrtString AS STRING, _
  7154.                              BYVAL Row AS INTEGER, _
  7155.                              BYVAL Col AS INTEGER, _
  7156.                              BYVAL Awindow AS INTEGER)
  7157.         .
  7158.        REM Print string at row and column specified
  7159.        CharString$ = "This is a string to be printed"
  7160.        Row=5 : Col=10 : Awindow = 0
  7161.        QPRTANSI CharString$, Row, Col, Awindow
  7162.         .
  7163.         .
  7164.        REM Print string at next row if the row is less than the window
  7165.        CharString$ = "This is a string to be printed" + CHR$(13) + CHR$(10)
  7166.        Row=0 : Col=0 : Awindow = 22
  7167.        QPRTANSI CharString$, Row, Col, Awindow
  7168.  
  7169.  
  7170.  
  7171.  
  7172.  
  7173.  
  7174.  
  7175.  
  7176.  
  7177.  
  7178.  
  7179.  
  7180.  
  7181.  
  7182.  
  7183.  
  7184.  
  7185.  
  7186.  
  7187.  
  7188.  
  7189.      Video                                                              101
  7190.  
  7191.  
  7192.  
  7193.  
  7194.  
  7195.  
  7196.  
  7197.  
  7198.      QRESTSCR -- FUNCTION
  7199.  
  7200.  
  7201.      Restore the portion  of the screen from  an  array  that  had been
  7202.      saved with QSAVESCR.  It will restore the screen to any of  the  4
  7203.      video pages. The screen does not  have to  be restored to the same
  7204.      location that  it was saved from.   The array that is used must be
  7205.      large enough to  hold the saved screen area.  The way to calculate
  7206.      the size array needed is with the following ((BottomRow  - TopRow)
  7207.      + 1) * (RightCol - LeftCol) + 1).
  7208.  
  7209.      The format of the call is as follows:
  7210.  
  7211.        QRESTSCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7212.  
  7213.      The parameters that are used by QRESTSCR are as follows:
  7214.  
  7215.      TR             The top row location.
  7216.      LC             The left column location.
  7217.      BR             The bottom row location.
  7218.      RC             The right column location.
  7219.      Page           The video page to save from.
  7220.      VARSEG(A(0))   The array segment address.
  7221.      VARPTR(A(0))   The array pointer address.
  7222.  
  7223.      Example:  
  7224.  
  7225.        DEFINT A-Z
  7226.        DECLARE SUB QRESTSCR (BYVAL TR AS INTEGER, _
  7227.                              BYVAL LC AS INTEGER, _
  7228.                              BYVAL BR AS INTEGER, _
  7229.                              BYVAL RC AS INTEGER, _
  7230.                              BYVAL PAGE AS INTEGER, _
  7231.                              BYVAL VSEG AS INTEGER, _
  7232.                              BYVAL VPTR AS INTEGER)
  7233.        DIM Array(671)
  7234.         .
  7235.        SHELL "DIR"
  7236.        TRow = 5: LCol = 10: BRow = 15: RCol = 70: Page = 0
  7237.        QSAVESCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7238.        CLS
  7239.        WHILE INKEY$ = "": WEND
  7240.        QRESTSCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7241.        END
  7242.  
  7243.  
  7244.  
  7245.  
  7246.  
  7247.  
  7248.  
  7249.  
  7250.  
  7251.  
  7252.  
  7253.  
  7254.  
  7255.      Video                                                              102
  7256.  
  7257.  
  7258.  
  7259.  
  7260.  
  7261.  
  7262.  
  7263.  
  7264.      QSAVESCR -- FUNCTION
  7265.  
  7266.  
  7267.      Saves a  portion of the screen  to  an array.  You do not  have to
  7268.      save  the whole  screen,  only the  portions  that is needed.  The
  7269.      screen can  be restored at a later time using QRESTSCR.  The array
  7270.      that is used must  be large enough to hold  the saved screen area.
  7271.      The  way to calculate the size  array needed is with the following
  7272.      ((BottomRow - TopRow) + 1) * (RightCol - LeftCol) + 1).
  7273.  
  7274.      The format of the call is as follows:
  7275.  
  7276.        QSAVESCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7277.  
  7278.      The parameters that are used by QSAVESCR are as follows:
  7279.  
  7280.      TR             The top row location.
  7281.      LC             The left column location.
  7282.      BR             The bottom row location.
  7283.      RC             The right column location.
  7284.      Page           The video page to save from.
  7285.      VARSEG(A(0))   The array segment address.
  7286.      VARPTR(A(0))   The array pointer address.
  7287.  
  7288.      Example:  
  7289.  
  7290.        DEFINT A-Z
  7291.        DECLARE SUB QSAVESCR (BYVAL TR AS INTEGER, _
  7292.                              BYVAL LC AS INTEGER, _
  7293.                              BYVAL BR AS INTEGER, _
  7294.                              BYVAL RC AS INTEGER, _
  7295.                              BYVAL PAGE AS INTEGER, _
  7296.                              BYVAL VSEG AS INTEGER, _
  7297.                              BYVAL VPTR AS INTEGER)
  7298.        DIM Array(671)
  7299.         .
  7300.        SHELL "DIR"
  7301.        TRow = 5: LCol = 10: BRow = 15: RCol = 70: Page = 0
  7302.        QSAVESCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7303.        CLS
  7304.        WHILE INKEY$ = "": WEND
  7305.        QRESTSCR TRow, LCol, BRow, RCol, Page, VARSEG(Array(0)), VARPTR(Array(0))
  7306.        END
  7307.  
  7308.  
  7309.  
  7310.  
  7311.  
  7312.  
  7313.  
  7314.  
  7315.  
  7316.  
  7317.  
  7318.  
  7319.  
  7320.  
  7321.      Video                                                              103
  7322.  
  7323.  
  7324.  
  7325.  
  7326.  
  7327.  
  7328.  
  7329.  
  7330.      QSCROLL  -- SUB
  7331.  
  7332.  
  7333.      Scrolls the screen up using  the locations that are  passed in the
  7334.      call.   One or more lines  can be scrolled and  if  the number  is
  7335.      zero, the whole area will be  cleared.  Be  sure that the rows and
  7336.      columns are within the screen.
  7337.  
  7338.      The format of the call is as follows:
  7339.  
  7340.        QSCROLL Trow, Lcol, Brow, Rcol, Lines
  7341.  
  7342.      Example:  
  7343.  
  7344.        DEFINT A-Z
  7345.        DECLARE SUB QSCROLL (BYVAL TRow AS INTEGER, _
  7346.                             BYVAL LCol AS INTEGER, _
  7347.                             BYVAL BRow AS INTEGER, _
  7348.                             BYVAL RCol AS INTEGER, _
  7349.                             BYVAL Lines AS INTEGER)
  7350.        Trow = 5 : Lcol = 15 : Brow = 15 : Rcol = 65 : Lines = 2
  7351.        QSCROLL Trow, Lcol, Brow, Rcol, Lines
  7352.         .
  7353.        REM The following will clear an area of the screen
  7354.        Trow = 5 : Lcol = 15 : Brow = 15 : Rcol = 65 : Lines = 0
  7355.        QSCROLL Trow, Lcol, Brow, Rcol, Lines
  7356.  
  7357.  
  7358.  
  7359.      QSCROLLB -- SUB
  7360.  
  7361.  
  7362.      Scrolls the screen down using the locations that are passed in the
  7363.      call.  One  or  more lines can be scrolled  and if the  number  is
  7364.      zero, the whole area will be  cleared.  Be sure that the rows  and
  7365.      columns are within the screen.
  7366.  
  7367.      The format of the call is as follows:
  7368.  
  7369.        QSCROLLB Trow, Lcol, Brow, Rcol, Lines
  7370.  
  7371.      Example:  
  7372.  
  7373.        DEFINT A-Z
  7374.        DECLARE SUB QSCROLLB (BYVAL TRow AS INTEGER, _
  7375.                              BYVAL LCol AS INTEGER, _
  7376.                              BYVAL BRow AS INTEGER, _
  7377.                              BYVAL RCol AS INTEGER, _
  7378.                              BYVAL Lines AS INTEGER)
  7379.        Trow = 5 : Lcol = 15 : Brow = 15 : Rcol = 65 : Lines = 2
  7380.        QSCROLLB Trow, Lcol, Brow, Rcol, Lines
  7381.  
  7382.  
  7383.  
  7384.  
  7385.  
  7386.  
  7387.      Video                                                              104
  7388.  
  7389.  
  7390.  
  7391.  
  7392.  
  7393.  
  7394.  
  7395.  
  7396.      QSCRREST -- FUNCTION
  7397.  
  7398.  
  7399.      Restore  the  screen  from an  array  that  had  been  saved  with
  7400.      QSCRSAVE. It will restore the screen to any  of the 4 video pages.
  7401.      If an error was encountered, the RC will be -1.
  7402.  
  7403.      The format of the call is as follows:
  7404.  
  7405.        RC = QSCRREST(VARSEG(ScrnHold(1)), VARPTR(ScrnHold(1)), Page)
  7406.  
  7407.      The parameters that are used by QSCRREST are as follows:
  7408.  
  7409.      VARSEG(Prt$(0))   The  VARSEG segment  address of  the first array
  7410.                        element.
  7411.      VARPTR(Prt$(0))   The VARPTR address of the first array element.
  7412.      Page              The video page to print on.
  7413.  
  7414.      Example:  
  7415.  
  7416.        OPTION BASE 1
  7417.        DEFINT A-Z
  7418.        DECLARE FUNCTION QSCRREST% (BYVAL ASeg AS INTEGER, _
  7419.                                    BYVAL AOffset AS INTEGER, _
  7420.                                    BYVAL Page AS INTEGER)
  7421.        DIM ScrnHold(2000)
  7422.        Page = 0
  7423.        IF QSCRREST(VARSEG(ScrnHold(1)), VARPTR(ScrnHold(1)), Page) = 0 THEN
  7424.           LOCATE RowHold,ColHold
  7425.        ELSE
  7426.           PRINT "Error on screen restore"
  7427.        END IF
  7428.  
  7429.  
  7430.  
  7431.  
  7432.  
  7433.  
  7434.  
  7435.  
  7436.  
  7437.  
  7438.  
  7439.  
  7440.  
  7441.  
  7442.  
  7443.  
  7444.  
  7445.  
  7446.  
  7447.  
  7448.  
  7449.  
  7450.  
  7451.  
  7452.  
  7453.      Video                                                              105
  7454.  
  7455.  
  7456.  
  7457.  
  7458.  
  7459.  
  7460.  
  7461.  
  7462.      QSCRSAVE -- FUNCTION
  7463.  
  7464.  
  7465.      Save the  requested  video  page (0  - 3) into array.  Use this in
  7466.      text mode only.  The array must be an integer array dimensioned to
  7467.      at least 2000 occurrences.  The starting address of the array must
  7468.      be  passed,  use the VARPTR function to  get  this  address.   The
  7469.      cursor  location  is not  saved  so,  if  it is needed,  save  the
  7470.      location.  More than  one screen can be saved  into  the  array as
  7471.      long  as  2000 occurrences are dimensioned for each screen and the
  7472.      appropriate  VARPTR address is passed the the routine. If an error
  7473.      is encountered, the RC will be -1.
  7474.  
  7475.      The format of the call is as follows:
  7476.  
  7477.        RC = QSCRSAVE(VARSEG(ScrnHold(1)), VARPTR(ScrnHold(1)), Page)
  7478.  
  7479.      The parameters that are used by QSCRSAVE are as follows:
  7480.  
  7481.      VARSEG(Prt$(0))   The VARSEG  segment  address of  the first array
  7482.                        element.
  7483.      VARPTR(Prt$(0))   The VARPTR address of the first array element.
  7484.      Page              The video page to print on.
  7485.  
  7486.      Example:  
  7487.  
  7488.        OPTION BASE 1
  7489.        DEFINT A-Z
  7490.        DECLARE FUNCTION QSCRSAVE% (BYVAL ASeg AS INTEGER, _
  7491.                                    BYVAL AOffset AS INTEGER, _
  7492.                                    BYVAL Page AS INTEGER)
  7493.        DIM ScrnHold(2000)
  7494.        Page = 0
  7495.        IF QSCRSAVE(VARSEG(ScrnHold(1)), VARPTR(ScrnHold(1)), Page) = 0 THEN
  7496.           RowHold = CSRLIN
  7497.           ColHold = POS(0)
  7498.        ELSE
  7499.           PRINT "Error on screen save"
  7500.        END IF
  7501.  
  7502.  
  7503.  
  7504.  
  7505.  
  7506.  
  7507.  
  7508.  
  7509.  
  7510.  
  7511.  
  7512.  
  7513.  
  7514.  
  7515.  
  7516.  
  7517.  
  7518.  
  7519.      Video                                                              106
  7520.  
  7521.  
  7522.  
  7523.  
  7524.  
  7525.  
  7526.  
  7527.  
  7528.      QSETMODE -- SUB
  7529.  
  7530.  
  7531.      This  subroutine will set  the video  mode to the  value  that  is
  7532.      supplied. This value can be any of the valid BIOS video modes.
  7533.  
  7534.      The format of the call is as follows:
  7535.  
  7536.        QSETMODE HoldMode
  7537.  
  7538.      Example:  
  7539.  
  7540.        DEFINT A-Z
  7541.        DECLARE SUB QSETMODE (BYVAL VMode AS INTEGER)
  7542.        HoldMode = QGETMODE
  7543.        QSETMODE HoldMode - 2
  7544.         .
  7545.         .
  7546.        QSETMODE HoldMode
  7547.         .
  7548.        END
  7549.  
  7550.  
  7551.  
  7552.  
  7553.  
  7554.  
  7555.  
  7556.  
  7557.  
  7558.  
  7559.  
  7560.  
  7561.  
  7562.  
  7563.  
  7564.  
  7565.  
  7566.  
  7567.  
  7568.  
  7569.  
  7570.  
  7571.  
  7572.  
  7573.  
  7574.  
  7575.  
  7576.  
  7577.  
  7578.  
  7579.  
  7580.  
  7581.  
  7582.  
  7583.  
  7584.  
  7585.      Video                                                              107
  7586.  
  7587.  
  7588.  
  7589.  
  7590.  
  7591.  
  7592.  
  7593.  
  7594.      QWINDOW  -- SUB
  7595.  
  7596.  
  7597.      Displays  a  pop-up  window on  the screen.   It  requires several
  7598.      parameters  which are used to determine where to print the  window
  7599.      as well as the type of frame to be used for the window.  The  rows
  7600.      and columns that are used  and the  ones that will be used for the
  7601.      frame. The color attribute that must be computed prior to the call
  7602.      and passed to QWINDOW.  If the value passed for frame  is not 1-4,
  7603.      the screen will be cleared based upon the row and column values.
  7604.  
  7605.      The format of the call is as follows:
  7606.  
  7607.        QWINDOW TRow, LCol, BRow, RCol, Frame, NAttr, Page
  7608.  
  7609.      The parameters that are used by QWINDOW are as follows:
  7610.  
  7611.      TRow    The top row of the window.
  7612.      LCol    The left column of the window.
  7613.      BRow    The bottom row of the window.
  7614.      RCol    The right column of the window.
  7615.      Frame   The type of frame to be used for the window.
  7616.      Attr    The video color attribute to use.
  7617.      Page    The video page to print the window on.
  7618.  
  7619.      The types of frames available with QWINDOW are as follow:
  7620.  
  7621.      1   Single line frame.
  7622.      2   Double line frame.
  7623.      3   Double vertical and single horizontal frame.
  7624.      4   Single vertical and double horizontal frame.
  7625.  
  7626.      Example:  
  7627.  
  7628.        DEFINT A-Z
  7629.        DECLARE SUB QWINDOW (BYVAL TRow AS INTEGER, _
  7630.                             BYVAL LCol AS INTEGER, _
  7631.                             BYVAL BRow AS INTEGER, _
  7632.                             BYVAL RCol AS INTEGER, _
  7633.                             BYVAL Frame AS INTEGER, _
  7634.                             BYVAL Attr AS INTEGER, _
  7635.                             BYVAL Page AS INTEGER)
  7636.         .
  7637.        Fgrd=7 : Bkgrd=0
  7638.        NAttr = QATTR(Fgrd, Bkgrd)
  7639.        TRow=1 : LCol=1 : BRow=25 : RCol=80 : Frame=2 : Page=0
  7640.        QWINDOW TRow, LCol, BRow, RCol, Frame, NAttr, Page
  7641.  
  7642.  
  7643.  
  7644.  
  7645.  
  7646.  
  7647.  
  7648.  
  7649.  
  7650.  
  7651.      Video                                                              108
  7652.  
  7653.  
  7654.  
  7655.  
  7656.  
  7657.  
  7658.  
  7659.  
  7660.      QWINDOWH -- SUB
  7661.  
  7662.  
  7663.      Works just like QWINDOW, but in  addition, it will draw horizontal
  7664.      lines across the window based upon the values passed in NLines and
  7665.      RNum.  This routine  can be very  useful in  menu windows.  If the
  7666.      value passed  in  NLines  is  zero,  it will function  the same as
  7667.      QWINDOW.  The VARPTR function must be used to  get the  address of
  7668.      the first array element.
  7669.  
  7670.      To use this routine, you must define a numeric array. Each element
  7671.      of  this array  will contain  the row in which you  wish to have a
  7672.      line drawn across the window.  The address of the first occurrence
  7673.      of the array is what is passed to the routine.
  7674.  
  7675.      The format of the call is as follows:
  7676.  
  7677.        QWINDOWH TRow, LCol, BRow, RCol, NLine, RSeg, RNum, Frame, NAttr, Page
  7678.  
  7679.      The parameters that are used by QWINDOWH are as follows:
  7680.  
  7681.      TRow    The top row of the window.
  7682.      LCol    The left column of the window.
  7683.      BRow    The bottom row of the window.
  7684.      RCol    The right column of the window.
  7685.      NLine   The number of horizontal lines to draw.
  7686.      RSeg    The VARSEG segment address of the first array element.
  7687.      RNum    The VARPTR address of the first array element.
  7688.      Frame   The type of frame to be used for the window.
  7689.      Attr    The video color attribute to use.
  7690.      Page    The video page to print the window on.
  7691.  
  7692.      The types of frames available with QWINDOWH are as follows:
  7693.  
  7694.      1   Single line frame.
  7695.      2   Double line frame.
  7696.      3   Double vertical and single horizontal frame.
  7697.      4   Single vertical and double horizontal frame.
  7698.  
  7699.      Example:  
  7700.  
  7701.        OPTION BASE 0
  7702.        DEFINT A-Z
  7703.        DECLARE SUB QWINDOWH (BYVAL TRow AS INTEGER, BYVAL LCol AS INTEGER, _
  7704.                              BYVAL BRow AS INTEGER, BYVAL RCol AS INTEGER, _
  7705.                              BYVAL NLine AS INTEGER, BYVAL ASeg AS INTEGER, _
  7706.                              BYVAL AOff AS INTEGER, BYVAL Frame AS INTEGER, _
  7707.                              BYVAL Attr AS INTEGER, BYVAL Page AS INTEGER)
  7708.        DIM ARow(2)
  7709.         .
  7710.        Fgrd=7 : Bkgrd=0 : NAttr = QATTR(Fgrd, Bkgrd)
  7711.        TRow=1 : LCol=1 : BRow=25 : RCol=80 : Frame=2 : Page=0
  7712.        NLine=2 : ARow(0)=3 : ARow(1)=23
  7713.        RSeg=VARSEG(ARow(0)) : RNum=VARPTR(ARow(0))
  7714.        QWINDOWH TRow, LCol, BRow, RCol, NLine, RSeg, RNum, Frame, NAttr, Page
  7715.  
  7716.  
  7717.      Video                                                              109
  7718.  
  7719.  
  7720.  
  7721.  
  7722.  
  7723.  
  7724.  
  7725.  
  7726.      QWINDOWV -- SUB
  7727.  
  7728.  
  7729.      Works  just like QWINDOW, but in addition,  it  will draw vertical
  7730.      lines down the  window based upon the values passed in NLines  and
  7731.      CNum. If the value passed in NLines is zero, it will  function the
  7732.      same as QWINDOW.   The  VARPTR  function  must be used  to get the
  7733.      address of the first array element.
  7734.  
  7735.      To use this routine, you must define a numeric array. Each element
  7736.      of this array  will contain the  row in  which you wish  to have a
  7737.      line  drawn down the  window.  The address of the first occurrence
  7738.      of the array is what is passed to the routine.
  7739.  
  7740.      The format of the call is as follows:
  7741.  
  7742.        QWINDOWH TRow, LCol, BRow, RCol, NLine, CSeg, CNum, Frame, NAttr, Page
  7743.  
  7744.      The parameters that are used by QWINDOWV are as follows:
  7745.  
  7746.      TRow    The top row of the window.
  7747.      LCol    The left column of the window.
  7748.      BRow    The bottom row of the window.
  7749.      RCol    The right column of the window.
  7750.      NLine   The number of vertical lines to draw.
  7751.      CSeg    The VARSEG segment address of the first array element.
  7752.      CNum    The VARPTR address of the first array element.
  7753.      Frame   The type of frame to be used for the window.
  7754.      Attr    The video color attribute to use.
  7755.      Page    The video page to print the window on.
  7756.  
  7757.      The types of frames available with QWINDOWV are as follows:
  7758.  
  7759.      1   Single line frame.
  7760.      2   Double line frame.
  7761.      3   Double vertical and single horizontal frame.
  7762.      4   Single vertical and double horizontal frame.
  7763.  
  7764.      Example:  
  7765.  
  7766.        OPTION BASE 0
  7767.        DEFINT A-Z
  7768.        DECLARE SUB QWINDOWV (BYVAL TRow AS INTEGER, BYVAL LCol AS INTEGER, _
  7769.                              BYVAL BRow AS INTEGER, BYVAL RCol AS INTEGER, _
  7770.                              BYVAL NLine AS INTEGER, BYVAL ASeg AS INTEGER, _
  7771.                              BYVAL AOff AS INTEGER, BYVAL Frame AS INTEGER, _
  7772.                              BYVAL Attr AS INTEGER, BYVAL Page AS INTEGER)
  7773.        DIM ACol(2)
  7774.         .
  7775.        Fgrd=7 : Bkgrd=0 : NAttr = QATTR(Fgrd, Bkgrd)
  7776.        TRow=1 : LCol=1 : BRow=25 : RCol=80 : Frame=2 : Page=0
  7777.        NLine=2 : ACol(0)=5 : ACol(1)=75
  7778.        CSeg=VARSEG(ACol(0)) : CNum=VARPTR(ACol(0))
  7779.        QWINDOWH TRow, LCol, BRow, RCol, NLine, CSeg, CNum, Frame, NAttr, Page
  7780.  
  7781.  
  7782.  
  7783.      Video                                                              110
  7784.  
  7785.  
  7786.  
  7787.  
  7788.  
  7789.  
  7790.  
  7791.  
  7792.      QWINDOWX -- SUB
  7793.  
  7794.  
  7795.      Displays  a  pop-up window on the  screen  with a user  selectable
  7796.      shadow either below left or  below rightp window on the screen. It
  7797.      requires  several parameters which are used to determine  where to
  7798.      print  the window as well as the type of frame to be used  for the
  7799.      window.  The rows and columns that are used and the ones that will
  7800.      be used for the frame.  The  color attribute that must be computed
  7801.      prior to the call and passed to QWINDOWX.  If the value passed for
  7802.      frame is not  1-4, the screen will be cleared based  upon the  row
  7803.      and column values.
  7804.  
  7805.      The format of the call is as follows:
  7806.  
  7807.        QWINDOWX TRow, LCol, BRow, RCol, Frame, NAttr, HAttr, Page
  7808.  
  7809.      The parameters that are used by QWINDOWX are as follows:
  7810.  
  7811.      TRow    The top row of the window.
  7812.      LCol    The left column of the window.
  7813.      BRow    The bottom row of the window.
  7814.      RCol    The right column of the window.
  7815.      Frame   The type of frame to be used for the window.
  7816.      Attr    The video color attribute to use.
  7817.      Page    The video page to print the window on.
  7818.  
  7819.      The types of frames available with QWINDOWX are as follow:
  7820.  
  7821.      1   Single line frame, shadow bottom left.
  7822.      2   Double line frame, shadow bottom left.
  7823.      3   Double vertical  and  single  horizontal frame,  shadow bottom
  7824.          left.
  7825.      4   Single  vertical  and  double horizontal frame, shadow  bottom
  7826.          left.
  7827.      5   Single line frame, shadow bottom right.
  7828.      6   Double line frame, shadow bottom right.
  7829.      7   Double vertical  and single  horizontal  frame,  shadow bottom
  7830.          right.
  7831.      8   Single vertical  and  double horizontal frame,  shadow  bottom
  7832.          right.
  7833.  
  7834.      Example:  
  7835.  
  7836.        DEFINT A-Z
  7837.        DECLARE SUB QWINDOWX (BYVAL TRow AS INTEGER, BYVAL LCol AS INTEGER, _
  7838.                              BYVAL BRow AS INTEGER, BYVAL RCol AS INTEGER, _
  7839.                              BYVAL Frame AS INTEGER, BYVAL Attr AS INTEGER, _
  7840.                              BYVAL Attrs AS INTEGER, BYVAL Page AS INTEGER)
  7841.         .
  7842.         REM Will print window with a shadow on bottom left.
  7843.        Fgrd=7 : Bkgrd=0 : NAttr = QATTR(Fgrd, Bkgrd)
  7844.        Fgrd=3 : Bkgrd=2 : HAttr = QATTR(Fgrd, Bkgrd)
  7845.        TRow=5 : LCol=10 : BRow=15 : RCol=30 : Frame=2 : Page=0
  7846.        QWINDOWX TRow, LCol, BRow, RCol, Frame, NAttr, HAttr, Page
  7847.  
  7848.  
  7849.      Video                                                              111
  7850.  
  7851.  
  7852.  
  7853.  
  7854.  
  7855.  
  7856.  
  7857.  
  7858.      QVIDREST -- FUNCTION
  7859.  
  7860.  
  7861.      Restore  a  screen  that  was  saved  with  QVIDSAVE.   Color  and
  7862.      monochrome screens have 4  pages of video  memory and this routine
  7863.      will move  a screen  from  pages 1-3 to page  0.  If  an  error is
  7864.      encountered, the RC will be set to -1.
  7865.  
  7866.      The format of the call is as follows:
  7867.  
  7868.        RC = QVIDREST(Page)
  7869.  
  7870.      Example:  
  7871.  
  7872.        DEFINT A-Z
  7873.        DECLARE FUNCTION QVIDREST% (BYVAL Page AS INTEGER)
  7874.        Page = 2
  7875.        RC = QVIDREST(Page)
  7876.  
  7877.  
  7878.  
  7879.      QVIDSAVE -- FUNCTION
  7880.  
  7881.  
  7882.      Save a screen to video page 1, 2 or 3 from page 0.  If an error is
  7883.      encountered, the RC will be set to -1.
  7884.  
  7885.      The format of the call is as follows:
  7886.  
  7887.        RC = QVIDSAVE(Page)
  7888.  
  7889.      Example:  
  7890.  
  7891.        DEFINT A-Z
  7892.        DECLARE FUNCTION QVIDSAVE% (BYVAL Page AS INTEGER)
  7893.        Page = 2
  7894.        RC = QVIDSAVE(Page)
  7895.  
  7896.  
  7897.  
  7898.  
  7899.  
  7900.  
  7901.  
  7902.  
  7903.  
  7904.  
  7905.  
  7906.  
  7907.  
  7908.  
  7909.  
  7910.  
  7911.  
  7912.  
  7913.  
  7914.  
  7915.      Video                                                              112
  7916.  
  7917.  
  7918.  
  7919.  
  7920.  
  7921.