
                                    ANGELIB for BC7/PDS                        i
                                    ___________________





                _|||||_  ||_  ||  _|||||_  |||||||  ||       ||  |||||||
                ||   ||  |||_ ||  ||   ||  ||       ||       ||  ||    ||
                ||   ||  ||||_||  ||       ||       ||       ||  ||    ||
                |||||||  || ||||  || ||||  |||||    ||       ||  |||||||
                ||   ||  || ||||  ||   ||  ||       ||       ||  ||    ||
                ||   ||  ||  |||  ||   ||  ||       ||       ||  ||    ||
                ||   ||  ||   ||   |||||   |||||||  |||||||  ||  |||||||



                                         CONTENTS



          I.    DISCLAIMER OF WARRANTY  . . . . . . . . . . . . . . . . . .    1

          II.   COPYRIGHT . . . . . . . . . . . . . . . . . . . . . . . . .    1

          III.  LICENSE . . . . . . . . . . . . . . . . . . . . . . . . . .    1

          IV.   TECHNICAL SUPPORT (HOW TO REACH ME) . . . . . . . . . . . .    2
                Official Distribution Bulletin Boards . . . . . . . . . . .    2

          V.    INTRODUCTION  . . . . . . . . . . . . . . . . . . . . . . .    2

          VI.   SUMMARY OF RECENT UPDATES (WHAT'S NEW)  . . . . . . . . . .    3

          VII.  REGISTRATION  . . . . . . . . . . . . . . . . . . . . . . .    4
                A. Methods of Payment . . . . . . . . . . . . . . . . . . .    5
                B. Pricing  . . . . . . . . . . . . . . . . . . . . . . . .    5
                INVOICE & REGISTRATION  . . . . . . . . . . . . . . . . . .    9

          VIII. SYSTEM REQUIREMENTS . . . . . . . . . . . . . . . . . . . .   10

          IX.   FILES WHICH MAKE UP ANGELIB . . . . . . . . . . . . . . . .   10

          X.    USING ANGELIB . . . . . . . . . . . . . . . . . . . . . . .   11
                Creating a QLB (Quick Library)  . . . . . . . . . . . . . .   11

          XI.   REFERENCE . . . . . . . . . . . . . . . . . . . . . . . . .   12

          XII.  USING PRINTER FUNCTIONS . . . . . . . . . . . . . . . . . .   48




















                                    ANGELIB for BC7/PDS                        1
                                    ___________________




          I.    DISCLAIMER OF WARRANTY

                I use the routines in ANGELIB almost every day as I write
                                      _______
          software and I am regularly adding, enhancing, or fixing.  My software
          will never be "done," and I hope that it gets better and better.  In
          any case, I can't guarantee that it's perfect; in fact, I'll guarantee
          that it's not.  By using this software and documentation ("ANGELIB")
          you must accept this disclaimer of warranty:

                ANGELIB is provided "as is" without any warranties or
                _______
          conditions, expressed or implied, including, but not limited to, those
          concerning merchantability and fitness for a particular purpose.  By
          using ANGELIB, you are expressly releasing the author, Angel Babudro,
                _______
          from any liability resulting from the use of this software and
          documentation.  You must assume the entire risk of using ANGELIB.
                                                                   _______


          II.   COPYRIGHT

                The author retains the copyright for all ANGELIB source code,
                                                         _______
          documentation, assorted files, and all libraries.  However, once
          provided with registration from the author you may distribute any
          program you write with the benefit of ANGELIB, in compiled form only,
                                                _______
          without royalties to the author.  You must have written consent from
          the author prior to distributing ANGELIB source code in part or in
                                           _______
          whole, whether modified or in original form.


          III.  LICENSE

                1.  ANGELIB is being distributed as Shareware.  This library is
                    _______
          not free, although license is hereby granted for evaluation of the
          Unregistered Edition for an unlimited time.

                2. You may keep as many backup copies of ANGELIB as you wish. 
                                                         _______
          The Registered Edition is limited to simultaneous use on the number of
          computers indicated by your registration level.  The Unregistered
          Edition may be used on any number of computers.  You may share ANGELIB
                                                                         _______
          with others in complete and unmodified form.  REGISTERED USERS may NOT
          distribute the files ending in OBJ.

                3. You MUST NOT charge any fee or receive any consideration for
          distributing the ANGELIB files and you MUST NOT include ANGELIB with
          another business transaction (e.g., a hardware sale) unless you have
          express written consent from the copyright holder, Angel Babudro.  You
          MAY charge a fee of not more than US$6 (six dollars) for the disk
          and/or service of distribution.
















                                    ANGELIB for BC7/PDS                        2
                                    ___________________




          IV.   TECHNICAL SUPPORT (HOW TO REACH ME)

                If my wording is unclear or can't find some topic in here, give
          me a holler and help me fix it or add it to the manual.  A letter or
          BBS message is preferred (and less expensive for you).  Phone calls
          are fine between 9am and 5pm Eastern Time as long as you are a
          registered user or intend to become one.  I thank you for your help in
          making this library better.

                Sysops please read SYSOP.DOC for special deals.  Shareware
          vendors please see VENDOR.DOC for distribution information.

                I can be reached via the mail or BBS.  The bulletin boards below
          should always have current versions of all my software and I will get
          any messages left there for me.

                Mail        Angel Babudro, "Organic Computer Wizardry",
                            28 Mulberry Street, Clinton, NY  13323-1506,
                            (315) 853-1070 Mon-Fri 9am-5pm Eastern Time

                Official Distribution Bulletin Boards

                On bulletin boards I use the first name "Angelo" since it avoids
          gender confusion.  I go by either name, anyhow.

          East Coast        Excalibur, Central NY (315) 736-3792 USR 14.4
                            This is my local distribution board where you can
                            always find the latest updates to all of my
                            software.  I will get messages left here within a
                            few days.  My software can be FREQed from this board
                            via RBBS Net address A:954/401, FIDO Net address
                            1:26501, or ICN Net 91:315/101.

          West Coast        Researcher's BBS, So Cal (805) 949-8151 USR DS
                            This is my west coast distribution board which is
                            updated every 2-3 weeks with the latest versions of
                            all my software.  Leave messages for me in
                            conference #136 (Organic Software).

                My software can also be found on many of the nations larger
          bulletin boards, such as Exec-PC and Channel 1.


          V.    INTRODUCTION

                ANGEL.QLB is a "high level" BC7 library for developing business
          applications, especially data base uses.  These are the routines I use
          in developing my apps (with some help from three other shareware
          libraries, most notably John Strong's EZ-Windows which is terrific).














                                    ANGELIB for BC7/PDS                        3
                                    ___________________




                I put in the things that are simple but a pain to code every
          time, like a "percent completed" bar graph in a window, and things
          that are more complicated, such as a scrollable information window
          with mouse support.  ANGELIB is written in BASIC.  Even though it's
                               _______
          not the "tightest" code of its kind I think you will find it very easy
          to use.

                Some of my routines trade flexibility for ease of use, like the
          percentage graph which is always the same colour and at the same spot
          on the screen.  This keeps things simple and provides built-in
          consistency.  Just in case my ideas for standards aren't the same as
          yours :) I have decided to offer the licensing of my source code.

                Well, what more can I say?  I hope my library helps you to write
          a bit better and faster.  If so maybe I'll see your registration in my
          mail someday.


          VI.   SUMMARY OF RECENT UPDATES (WHAT'S NEW)

                Every release fixes bugs found in previous releases and/or adds
          a few new features.  Here is a summary of recent updates:

          1.9b  Routines updated: ChooseFile$, ChooseFiles$, GetFileName$,
                GetFileNames$, GetValidPath, IsPath%, ParseFSpec, StripSymbols$

                Routines dropped: DBFPickFld, DBFShowFlds

                Parameters modified: PctDone, ZipFmt$

                FileRestore2%() has been renamed FileRestores%() to be
                consistent with other routines.

          1.9a  Parameters modified:  GetValidPath$, IsPath%

          1.9   Full LIB file is now included.  I was severly chastised by the
                dBASIC Toolkit BBS' sysop for distributing "crippled" software. 
                I never saw it that way before and am in agreement.  Now you can
                compile to EXE form, but if you want to distribute and/or sell
                your software please register the library.

          1.8m  All printer & font routines have been updated to allow use on
                networks using DOS SHARE.

          1.8j  StrFmt's parameters were in reverse order compared with other
                similar functions.  Mask & source strings have been swapped.

                Parameters modified: HelpIndex















                                    ANGELIB for BC7/PDS                        4
                                    ___________________




                Routines dropped: BackupMethod%, ChooseCountry%

                Documentation corrected: I forgot to update the documentation
                    for some routines.  Now you can actually use InputDate,
                    FileBackup%, FileRestore%, FileRestores%, FmtFDD%

          1.8h  New routines:
                ChooseFiles$ allows multiple file names to be chosen (whereas
                    ChooseFile$ allows only one).
                FileRestores% allows single or multiple files to be selected
                    from a back-up copy.
                GetFileNames$ allows more than one input file to be selected.
                OutDevs$ is identical to OutDev$ but is for use with these other
                    new routines (which all use a common routine from John
                    Strong's EZ-Windows library).
                GetFileDesc$ retrieves a file's long name from the DESCRIPT.*
                    file

                Renamed ToFDD% to FileBackup% and FromFDD% to FileRestore% - I
                think these names are easier to remember.


          VII.  REGISTRATION

                Although I hope that you are so happy with ANGELIB that
                                                           _______
          registering will be reward enough in itself, but I think it's more fun
          & exciting to get something new.  ANGELIB is the library I use for
                                            _______
          developing all of my applications, so it is constantly updated.  Your
          registered version will be an up-to-the-minute copy.  Other benefits
          of registration that come to my mind include:

                1.  You'll get OBJ files so you can create your own custom
                    libraries.  I use the EZ-Windows and PBClone libraries for
                    some routines (why re-invent the wheel?), so you will need
                    to get them if you want to create custom libraries.  Buying
                    all three libraries will cost around $70 which is far less
                    than most commercial packages.
                2.  Within days you will get a library that would probably take
                    so long to develop yourself that by the time you've done it
                    you won't need it anymore
                3.  You can order a printed & bound manual for $8
                4.  Technical support is possible! You can contact a real
                    programmer who is 98% knowledgeable about the library
                    (nobody's prefect) via mail, phone, or BBS
                5.  You'll have helped one of the little guys - someone who
                    isn't a huge corporation.  (Thank you...)

















                                    ANGELIB for BC7/PDS                        5
                                    ___________________




                A.  Methods of Payment

                U.S. customers please send cash, check, or money order. 
          Canadian customers please send cash or Canadian International Money
          Order (CIMO).  Customers in other countries please send U.S. funds
          drawn on a U.S. bank.  If you send cash use a "security" no-see-
          through envelope and you may want to send it via Registered mail, too.

                If you prefer to use a credit card, you can order ANGELIB from
                                                                  _______
          Public (software) Library with your MC, Visa, AmEx, or Discover card
          by calling 800-242-4PsL (from overseas: 713-524-6394) or by FAX to
          713-524-6398 or by CompuServe to 71355,470.  THESE NUMBERS ARE FOR
          ORDERING ONLY.  I CANNOT be reached at those numbers.  To contact me
          for information about dealer pricing, volume discounts, site
          licensing, the status of shipment of the product, the latest version
          number, or for technical information, call 315-852-6942 or write me at
          28 Mulberry Street, Clinton, NY USA 13323-1506.  Shareware is "try
          before you buy" so please understand that product returns are not
          allowed.

                When ordering from PsL ask for product #10799 and please note
          that PsL will add $3 for shipping & handling to U.S. as well as
          Canadian orders.

                B. Pricing

          Registration with Disk -- A single copy costs $29.  You will receive
                the latest version of ANGELIB in LIB (so it can be merged with
                                      _______
                other libraries) and OBJ (to make custom libraries) formats. 
                You will also receive notification of major updates.  At this
                time, updates for registered users are $5 or send me a disk and
                return postage (I'll re-use your envelope).  See below for
                printed manuals.

          Multiple Copies -- Each copy may be used on a single computer at a
                time.  To ease the financial burden and thank you for being
                honest, you may apply the following discounts when ordering more
                than one copy:
                2 to 5 copies                                       40% discount
                Over 5 copies                                       50% discount

          Site License -- Register a single copy of ANGELIB and purchase a site
                                                    _______
                license which allows you to make copies of the registered
                version for use on more than one computer owned by the same
                business.  I would prefer that you order a registered copy and
                Site License for each physical location of the same business,
                but this is not required unless you would like to receive update
                notices at each location.
                   Up to 4 computers                             $30.00 per site














                                    ANGELIB for BC7/PDS                        6
                                    ___________________




                   Up to 10 computers                            $70.00 per site
                   Up to 20 computers                           $125.00 per site
                   Any number of computers                      $400.00 per site

          Manuals -- I will print the latest version of the manual you are
                reading right now (using Ventura Publisher and a laser printer)
                and bind it.  I am offering this as a service to those who want
                a printed, bound manual with their software.  Most of the cost
                involved here is for materials and extra shipping costs. 
                Remember that ASCII and WP documentation files are always on
                disk and if you provide your printer model on the registration
                form I will send you a file ready to print on your printer.
                -  One copy                                                $8.00
                -  Two or more copies                             $6.00 per copy

          Source Code License - You may license the use of the source code for
                ANGELIB for just $30.  Thereafter, updates will be available for
                _______
                $5 plus shipping.  Please note that I call routines from EZ-
                Windows (by John Strong) and PBClone (by Tom Hanlin) in my
                library (why re-invent their wheels?), so you will need to
                register one or both of these to use some OBJs in creating
                custom libraries.  I recommend both of them highly and will
                gladly share unregistered versions of these with you - just ask.

          Complimentary Registered Editions - I would like to give you a
                complimentary registration if you will give me a bit of
                marketing assistance:

                1. Write a review of my software and post it on a bulletin
                   board, send me a copy of it showing the BBS's header and the
                   name and phone number of the BBS.  Just give me your honest
                   praise and criticism in a decent review.  Your review will be
                   most helpful to me if it mentions your best & worst-liked
                   features and any ideas you have for improvement.  This will
                   help me decide the future of ANGELIB and for that help I will
                                                _______
                   send you a complimentary registered disk.

                2. It helps me to know which BBSs carry my software and the more
                   the better, of course!  If you will upload a package to at
                   least five public ("open") BBSs, send me their names and
                   phone numbers and I'll send you a complimentary registered
                   disk.  I would appreciate you uploading to time-share
                   systems, private ("closed") BBSs, or part-time BBS, but
                   please do not use these to apply for a complimentary
                   registered edition.  BTW: I use an HST 14.4 modem so it would
                   be best if you provided me with BBSs which also use HSTs so I
                   can hook-up at high speed.
















                                    ANGELIB for BC7/PDS                        7
                                    ___________________




                3. If you are a consultant or other type of computer
                   professional and your recommendation leads to one or more of
                   your clients purchasing one of my packages, just send me a
                   note with your client's registration or have them mention
                   your name when they register.  I will send a complimentary
                   registered edition or an update for every registration you
                   get for me.  This is in lieu of a multiple copy discount; I
                   intend it for consultants who choose not to deal with sales
                   tax.

                One complimentary registration per person or company.  A
          complimentary registration is just like a paid one - you can upgrade
          it with a site license, purchase manuals, etc.  It helps when you send
          back disks to be re-used - even the envelopes can be re-used.  When
          you order a complimentary registration please fill in the appropriate
          blanks below PLUS the Invoice so I know what size disk you need, and
          please send me a couple of dollar bills for shipping expenses. 
          Thanks.

                I will promise these complimentary offers until at least
          12/31/93 - after that date please check with me first.



                          COMPLIMENTARY REGISTRATION APPLICATION
                                  Use until Dec. 31, 1993


                                                             Date_______________

                Please also fill in the Invoice on the following page (put $0
          for the disk).  Include $2.00 for shipping within the U.S. or the
          amount indicated for addresses outside the U.S.  Remember to order
          printed manual(s) if you so desire.


          (__) Review posted on (BBS name & number)________________________
                Include a copy of the review, please. Thank you very much!

























                                    ANGELIB for BC7/PDS                        8
                                    ___________________




          (__) I uploaded (archive name, like ANGEL18E.ARJ)__________________
                to these five 24-hour public ("open") BBSs:

             BBS Name              Phone Number/Modem Type  Sysop Name
             ________              _______________________  __________

          1_______________________ ________________________ _______________
          2_______________________ ________________________ _______________
          3_______________________ ________________________ _______________
          4_______________________ ________________________ _______________
          5_______________________ ________________________ _______________

             These offers subject to withdrawal or change at any time without
          notice.  All prices are subject to change without notice.  Bulletin
          Board Sysops please see the file SYSOP.DOC for special pricing and
          information; vendors & sysops please see VENDOR.DOC.

                        Angel Babudro - "Organic Computer Wizardry"
                        28 Mulberry Street   Clinton, NY 13323-1506
                        (315) 853-6942 Mon-Fri 9am-5pm Eastern Time
               (home phone; remember we're 3 hours later than Pacific coast)

                          Please register the Shareware you keep.









































                                    ANGELIB for BC7/PDS                        9
                                    ___________________




                                                          INVOICE & REGISTRATION
                               Credit card orders see "Methods of Payment" above

          Your Name_____________________________________________________________

          Company Name__________________________________________________________

          Address_______________________________________________________________

          ______________________________________________________________________

          City___________________________ State/Prov________ Zip________________

          Registration     Registration & disk: $29 x qty _____        $_______ 

          Source Code      Source disk & license: $30 x qty _____       _______ 

          Multiple/        2-4 disks -- deduct 40%
          Wholesale        5 or more -- deduct 50%                     (_______)

          Site License     Up to 4 CPUs add $30; Up to 10 add $70
          (add to above)   Up to 20 add $125; Unlimited add $400        _______ 

          Printed          One copy is $8, 2 or more are $6 each
          Manuals          Qty _____ x $_____ each                      _______ 

          Shipping &       Canada, AK, HI, VI, PR add $3 extra          _______ 
           Expenses        Other countries add $9 per copy              _______ 

                           ** T O T A L **                              _______ 


          Disk size & quantity   [__] 3"                   [__] 5"
          Drive density          [__] Low (DD) required     [__] High (HD) okay
          Extended densities     [__] FDFORMAT extended densities okay

          Which version are you using now?_____________________________________

          Where did you get it?________________________________________________


          ANGELIB has been delivered to and accepted by customer.  Upon receipt
          _______
          of this paid invoice the latest Registered Edition disk and any
          options chosen above will be sent.  Send U.S. funds or CIMO.  NYS
          orders add local sales tax.  Mail this page with your cash (use
          Registered mail), cheque or money order to Angel Babudro, 28 Mulberry
          Street, Clinton, NY USA 13323-1506. Please allow 1-3 weeks. Thank you!
















                                    ANGELIB for BC7/PDS                       10
                                    ___________________




          VIII. SYSTEM REQUIREMENTS

                All you need is PC/MS-DOS 3.3 or later, PDS/BC 7.1, and a
          computer.  You will need 200k to 500k of disk space for the files,
          depending on which ones you decide to keep around.


          IX.   FILES WHICH MAKE UP ANGELIB

                The unregistered edition is made up of the following files:

                ANGEL.LIB     The linker library to make EXE files (check
                              MAKEQLB.BAT for help making a Quick Library)
                ANGEL.BI      The include file, function & subroutine
                              definitions
                COLOURS.BI    Colour codes definitions, use is optional
                FKEYS.BI      Function key definitions, use is optional
                ANGEL.TXT     The ASCII text file of this document
                ANGEL.WP      The WordPerfect file of this document (so you can
                              format it for your printer)
                QSORT.BAS     Source code to this public domain routine
                FKEY.LST      Sample file for use with FKEYS routine
                READ.ME       A file containing late-breaking news...  May or
                              may not be part of the package you get
                ORDER.FRM     Order form for all of my software
                SYSOP.DOC     Sysop information
                VENDOR.DOC    Disk vendors & Sysops: pricing, detailed
                              description, and distribution information
                COMPARE.EXE   A byte-by-byte file compare utility.  Displays in
                              hex, decimal, and ASCII. Type COMPARE for help.
                DUMP.EXE      Hex/octal/decimal file viewer. Type DUMP for help.

                The registered edition also includes:

                FAROBJ.EXE    Object modules for creating custom libraries
                              (self-extracting archive)
                MLIB.BAT      Sample batch file for creating custom libraries
                              from OBJ modules.  I use it all the time to re-
                              compile libraries during software development. 
                              Allows OBJs to be anywhere you like rather than
                              all in one directory
                MLIB.LSP      Sample specification file for MLIB.BAT
                ANGEL.INF     Object module information file for use with Tom
                              Hanlin's LIBWIZ utility - this makes it MUCH
                              easier to create your own custom libraries if
                              you've never done it before.

















                                    ANGELIB for BC7/PDS                       11
                                    ___________________




          X.    USING ANGELIB

                Basically, just put the files wherever you want them and use the
          INCLUDE meta-command to place the .BI definition files in your
          programme (e.g., '$INCLUDE: 'Angel.bi' and '$INCLUDE: 'PtrRec.def'). 
          Using the $INCLUDE file lets you call subroutines without the CALL key
          word.

                Creating a QLB (Quick Library)

                If you want to use ANGEL.LIB routines in the QBX interactive
          environment you need to make a file called ANGEL.QLB first.  To do
          this just use the command:

                link /qu angel.lib,angel.qlb,nul,qbxqlb;

                If you get "Bad command or file name" you will need to supply
          the drive and path containing the file LINK.EXE.

                When you start QBX just use "QBX /L d:\path\ANGEL" (replacing
          d:\path with your drive and pathname) - this will load the quick
          library into memory so you can run the routines.  Please note that
          it's a large library; if you have extended memory QBX will load some
          of the library "high."  If you run out of memory with a large
          programme I can only console you with the fact that most of my
          software is too large to run in the QBX environment and the Microsoft
          help-line wasn't even able to help me.

                Rather than write a probably-lame demonstration programme to
          show off ANGELIB's functions, I would like to suggest that you check
                   _______
          out my shareware from whence this library sprang:  What Mailing List?
          (WML), What Vehicle History? (WVH), What Job Summary? (WJS), What
          Floppy Format? (WFF), and What Tape Back-up (WTB).

                Registered Edition users have individual OBJ files which can be
          combined into custom libraries, even adding OBJs from other libraries
          (such as EZ-Windows) or your own routines.  I find it easiest to make
          a file, using an ASCII editor, which contains all of the names of the
          OBJs I want in the library (see MLIB.LSP for a sample).  This file
          contains one routine per line, preceded by a "+" and ending with a "&"
          (which is what LIB requires since this file is passed directly to
          LIB.EXE).  This makes it easy to recompile the library if you changed
          some code or want to add or delete routines.

                Another alternative for making your own libraries is to use Tom
          Hanlin's LIBWIZ utility.  This makes things very easy since LIBWIZ is
          smart enough to figure out if a routine requires others (for example,
          the INFORM%() function requires several other routines) and will
          include those other routines automatically.  The drawback to LIBWIZ is














                                    ANGELIB for BC7/PDS                       12
                                    ___________________




          that it has no "save" feature so you have to select each module every
          time (which can get a bit tedious if you have 50 modules or so).  If
          you've never tried LIBWIZ you ought to at least check it out.  The
          most current version I know of is LIBWIZ13.  To use it just enter
          LIBWIZ ANGEL mylibname (where "mylibname" is your library's name).


          XI.   REFERENCE

                ANGELIB is made up of functions and subroutines.  Functions
                _______
          return a value to a variable - e.g., a% = CalcAttr(White, Blue) puts a
          value in a% - whereas subroutines do not - e.g., BackUpMsg just prints
          a message on the screen.

                The general syntax of a function call is
          var = Function(param1,param2,etc).  For a subroutine, the "formal"
          _________________________________
          syntax is "[CALL] subname(param1, param2, etc.)" although "CALL" is
                     ____________________________________
          not needed when you include ANGEL.BI in your code.

                Subroutines do not yield any "result," but they often modify one
          or more variables which are passed to them.  DBFHeader is a good
          example of this.

                The routines below each show their name at the left margin and a
          sample calling sequence aligned with the right margin, under which is
          the english explanation of the routine's purpose followed by the
          definition of variables.


          BackupMsg                                                    BackupMsg
            Prints  what I think of  as a pseudo-subliminal reminder to back-up
            your data  :)  A little reminder pops  onto the screen for a second
            then the screen is cleared.

            Pass
            ____
                 Nothing

            Returns
            _______
                 Nothing
























                                    ANGELIB for BC7/PDS                       13
                                    ___________________




          BarMenu%    opt% = BarMenu%(r%,c%,norm%,rev%,opts$(),seed%,getit%,ms%)
            Displays  a horizontal bar menu and  waits for user's choice of the
            options.

            Pass
            ____
                 r%/c%       Row and column at which to begin displaying

                 norm%/rev%  Normal   &   reverse   display   attributes   (via
                             CalcAttr%)

                 opts$()     String array containing choices

                 seed%       Option  number  to  highlight initially  (normally
                             "1")

                 getit%      Flag to  get user's input:   If true routine waits
                             for user  to select an option or press an extended
                             key (e.g., an arrow,  PgUp, etc.) or ENTER or Esc.
                             If  False,  the  routine  displays the  menu  then
                             exits (which is  useful for displaying a bunch  of
                             horizontal menus on a setup screen, for example).

                 ms%         Mouse support (0=no, non-zero=yes)

            Returns
            _______
                 Function    If getit%  is true, the  user's final keypress  is
                             returned - ENTER  (13), Esc (27), or extended  key
                             code (2nd byte of code).  If getit% is false  then
                             the returned value is irrelevant.

                 seed%       The number of the highlighted item, numbered  from
                             left to right starting with one.




          CalcAttr%                             attr% = CalcAttr% (Fore%, Back%)
            For use with routines that need a single integer colour code.

            Pass
            ____
                 Fore%       Foreground colour code

                 Back%       Background colour code

            Returns
            _______
                 Fore% + (Back% * 16)

















                                    ANGELIB for BC7/PDS                       14
                                    ___________________




          ChooseFD$                                             fdd$ = ChooseFD$
            This is a menu of available floppy disk drives.  The function:

            1.   Checks the number of floppy disk drives

            2.   If there is only one drive then "A:" is returned, otherwise

            3.   A pop-up  menu of  floppy drives is  presented from  which the
                 user may choose one or press Esc.

            Pass
            ____
                 Nothing

            Returns
            _______
                 Floppy disk  drive  letter followed  by a  colon, or  a  blank
                 string if user presses Esc.















































                                    ANGELIB for BC7/PDS                       15
                                    ___________________




          ChooseFile$         File$ = ChooseFile$(FSpec$,Exclude$,ExtInfo%,ms%))
            Presents  a  scrollable  list  of files  in  a  window which  match
            FileSpec$ (excluding Exclude$) and waits for user to choose one.

            Pass
            ____
                 FSpec$      File specification  to include in  the list.   May
                             include drive  and path name,  if necessary.   For
                             example, "*.DAT" or "C:\DATA\*.DAT" are valid.

                 Exclude$    File   specification  to  exclude  from  the  list
                             (e.g., "*.bak").   Do  not put a drive  or path in
                             this.

                 ExtInfo%    Extended   Information   flag   &   record   size.
                             Controls  display  of  extended information  (file
                             size &  long description).   Set this variable  to
                             zero  for no  extra file  information,  or to  the
                             record size to show the number  of records in  the
                             file  along with description (if a file DESCRIPT.*
                             is  in  the directory  it  will be  used for  file
                             descriptions).    To  show size  in  bytes  use  a
                             record size of one.  If  negative information will
                             be  in  DOS  Name/Size/Description   order.     If
                             positive  Description/Name/Size   order  will   be
                             displayed.

                 ms%         Mouse support flag (true/false).

            Returns
            _______
                 File name  chosen without  drive or path, or  null string ("")
                                   _______
                 if user presses Esc

            Notes
            _____
                 If ExtInfo%  is non-zero,  font files *.SFP and  *.SFL will be
            shown with  their font  names and  other files  will be shown  with
            their size & any description.
                 I  patterned the  format of  the DESCRIPT.*  file after  4DOS:
            file name  followed by  a space  and up  to 40  characters for  the
            description.  4DOS makes a hidden file, however.  ChooseFile$  will
            only  read "normal" (not  hidden) files right now.   I'll soon have
            it so ChooseFile$ will read hidden files, too.
                 ChooseFile$()  uses the  EZ-Windows  routine ScrlMenu  and the
            PBClone routines ScrSave & ScrRest.




















                                    ANGELIB for BC7/PDS                       16
                                    ___________________




          ChooseFileS$             F$ = ChooseFileS$(Inc$,Exc$,Info%,many%,ms%))
            Shows a scrollable  list of files in a  window which match Inc$ and
            excluding Exc$ then waits for user to choose one or more.

            Pass
            ____
                 Inc$        File specification  to include in  the list.   May
                             include drive  and path name,  if necessary.   For
                             example, "*.DAT" or "C:\DATA\*.DAT" are valid.

                 Exc$        File   specification  to  exclude  from  the  list
                             (e.g., "*.bak").   Do  not put a drive  or path in
                             this.

                 Info%       Extended   Information   flag   &   record   size.
                             Controls  display  of  extended information  (file
                             size &  long description).   Set this variable  to
                             zero  for no  extra file  information,  or to  the
                             record size to show the number  of records in  the
                             file  along with description (if a file DESCRIPT.*
                             is  in  the directory  it  will be  used for  file
                             descriptions).    To  show size  in  bytes  use  a
                             record size of one.  If  negative information will
                             be  in  DOS  Name/Size/Description   order.     If
                             positive  Description/Name/Size   order  will   be
                             displayed.

                 many%       True=Allow multiple picks, False=Just one

                 ms%         Mouse support flag (true/false).

            Returns
            _______
                 File names without drive or  path, or null string ("") if user
                            _______
                 presses Esc. Names are padded to length of 12.

            Notes
            _____
                 This  routine ends  up  about  10k larger  than  ChooseFile$()
            since it requires  an EZ-Windows routine (ScrlTag) which the  other
            routine does not.  If your  programme already uses ScrlTag you will
            only see a slight increase in your programme size  (about .5k) over
            using ChooseFile$().  See ChooseFile$() for other notes.























                                    ANGELIB for BC7/PDS                       17
                                    ___________________




          ChoosePort%                      PtrPort% = ChoosePort%(default%, ms%)
            Presents a pop-up menu of printer ports (LPT1, LPT2, and LPT3)  and
            waits for user to pick one or press Esc.

            Pass
            ____
                 default%    Default (current) printer port setting (1-3).

                 ms%         Mouse support available: 0 = No, 1 = Yes

            Returns
            _______
                 Port number (1-3) or zero if user presses Esc




          ChoosePtr%      Ok% = ChoosePtr%(pType$, path$, PtrNo%, PtrPort%, ms%)
            Presents a  pop-up menu  of  printer choices  from the  PRINTER.DAT
            file.   If there are less than 15 choices (that is, all choices fit
            inside the window), then the default (PtrNo%) will be highlighted.

            Pass
            ____
                 pType$      Printer types to include in the menu:
                             D = Dot matrix printers
                             L = Laser printers
                             B = Both

                 path$       File  specification  for  PRINTER.DAT file.  path$
                             may contain a  drive, path, and/or file name.   If
                             no  file name  is given, PRINTER.DAT is  used.  If
                             no  drive &  path are  given, the  current drive &
                             path are used.

                 PtrNo%      Record  number  of  currently  chosen  printer  in
                             PRINTER.DAT

                 ms%         0 = Keyboard only
                             1 = Use mouse, too

            Returns
            _______
                 pType$      Changed  to "D"  if dot  matrix  chosen or  "L" if
                             laser printer chosen

                 PtrNo%      PRINTER.DAT record number for the chosen printer

                 PtrPort%    The port number selected for the  printer (LPT1 is
                             1, LPT2 is 2, etc.) or zero if user presses Esc

















                                    ANGELIB for BC7/PDS                       18
                                    ___________________




          ContCan%                                                 i% = ContCan%
            Displays  "Continue" and "Cancel" keys  at the bottom of the screen
            and waits for response.

            Pass
            ____
                 Nothing

            Returns
            _______
                 TRUE (-1) if user presses Esc
                 FALSE (0) if user presses Return (aka Enter)




          DateFmt$                  FormattedDate$ = DateFmt$(d%, m%, y%, intl%)
            I use this routine to print  the formatted date after getting input
            from  the user.   You  can  "PRINT DateFmt$()" or  assign it  to  a
            variable.  Use the ChooseCountry% menu to let the user set Intl%.

            Pass
            ____
                 d%          Day on the month
                 m%          Month number
                 y%          Year (4-digits)
                 Intl%       International formatting
                             1 = USA (mm/dd/yyyy)
                             2 = Canadian (dd-mm-yyyy)
                             3 = USA & Cdn (dd MoName yyyy)
                             4 = International (dd MoName yyyy)

            Returns
            _______
                 Formatted date




          DateVal%                                      dv% = DateVal%(TheDate$)
            Converts  dates from 1992  to 2078  to an  integer number  for date
            calculations.   For  example,  DateVal%(Date1$)  - DateVal%(Date2$)
            would give  you the number  of days between the  two dates.   Years
            prior to 1992 are converted to 1992.

            Pass
            ____
                 TheDate$    Date formatted the same as BASIC's DATE$ function

            Returns
            _______
                 Integer value based on the date

















                                    ANGELIB for BC7/PDS                       19
                                    ___________________




          DBFHeader             DBFHeader file$, Fld$(), reclen%, recs&, NoFlds%
            Opens  .DBF  file FileName$  and returns  field names  in Field$(),
            record length in  reclen%, number of records in  the file in recs&,
            and number  of fields in NoFields%.   You can  then call DBFPickFld
            to pick fields from the list.  See also DBFPickFld function.

            Pass
            ____
                 file$       The DBF  file name, including  drive and path,  if
                             necessary

                 Fld$()      This array  must be initialized  prior to  calling
                             DBFHeader  to  the  maximum  number of  fields  (I
                             would suggest  setting it to  at least 50,  unless
                             you know better).

            Returns
            _______
                 Fld$()      The names of the fields.  The first field name  is
                             in Field$(1), etc.

                 reclen%     The file's record length

                 recs&       The number of records on file

                 NoFlds%     The number of fields




          Delay                                                       Delay Sec!
            Delays for  Sec! seconds.  I use  this for copyright messages, etc.
            The accuracy is roughly +/- .1 seconds on a 386/40.

            Pass
            ____
                 Sec!        Number of seconds to delay (floating point)

            Returns
            _______
                 Nothing


























                                    ANGELIB for BC7/PDS                       20
                                    ___________________




          DrawFDD                                   DrawFDD Light%, iRow%, iCol%
            Draws a text picture of a floppy on the screen at iRow%,iCol%.   If
            Light% is  TRUE (-1)  then the  light blinks  red (bright  white on
            mono monitors), else it is white.

            Pass
            ____
                 Light%      True if drive "light" is to blink, false if not

                 iRow%       Top row of picture

                 iCol%       Left column of picture

            Returns
            _______
                 Nothing




          DrawHDD                             DrawHDD Light%, iRow%, iCol%, Msg$
            Similar  to DrawFDD but  draws a  text picture  of a hard  disk and
            places the current drive (CURDRIVE) letter in the box.

            Pass
            ____
                 Light%      True if drive "light" is to blink, else false

                 iRow%       Top row of picture

                 iCol%       Left column of picture

                 Msg$        A  message up  to 20  characters  long to  display
                             inside the  picture.  If  longer than  20 chars it
                             will be truncated.

            Returns
            _______
                 Nothing




























                                    ANGELIB for BC7/PDS                       21
                                    ___________________




          DrvSpace                         DrvSpace (Drive$, Total&, Free&, EC%)
            Returns total space and free space (in bytes) of drive Drive$.

            Pass
            ____
                 Drive$      Disk drive letter (e.g., "C")

            Returns
            _______
                 Total&      Total bytes are returned in this variable

                 Free&       Free bytes are returned in this variable

                 EC%         DOS error  code is  returned in  this variable  or
                             zero if no error




          ElapsedTime         ElapsedTime STime$, ETime$, Hour%, Minutes%, Secs%
            Calculates elapsed time.

            Pass
            ____
                 STime$      Starting  time  hh:mm:ss  (same  format  as  TIME$
                             function)

                 ETime$      Ending  time   hh:mm:ss  (same   format  as  TIME$
                             function)

            Returns
            _______
                 ETime$      Formatted elapsed time (hh:mm:ss)
                 Hour%       Elapsed hours
                 Minutes%    Elapsed minutes
                 Secs%       Elapsed seconds

            Example
            _______
                 S$ = TIME$              'Starting time
                 (do whatever needs to be done)
                 E$ = TIME$              'Ending time
                 ElapsedTime S$, E$, H%, M%, S%

























                                    ANGELIB for BC7/PDS                       22
                                    ___________________




          ErrScn                                        ErrScn ErrCode%, Module$
            Presents  an  error  screen showing  error  number,  english  text,
            possible solution, and module name.

            Pass
            ____
                 ErrCode%    Error number

                 Module$     Module name

            Returns
            _______
                 Nothing




          ErrSolve$                                            ErrSolve$ Number%
            Prints  possible  solution  to  error  number  Number%.    Used  by
            subroutine ErrScn.   Not  very extensive (to  save memory),  but it
            sure beats no error handling...




          ErrText$                                              ErrText$ Number%
            Prints text of error Number%.  Used by ErrScn.






































                                    ANGELIB for BC7/PDS                       23
                                    ___________________




          FileBackup%                      ec% = FileBackup%(FileMask$, Method%)
            Asks for  user to  enter path (including  drive) on which  to store
            the   back-up  (e.g.,  "A:\"   or  "\TEMP\BACKUPS")  then  backs-up
            FileMask$ to drive Drive$ using Method%.

            Pass
            ____
                 FileMask$   File  mask  to  include  in  restore  (e.g.,  *.*,
                             *.DAT, OLD??.*, etc.)

                 Method%     The method to use in making the back-up
                             1 = DOS Copy
                             2 = ARJ (req. a lot of free memory)
                             3 = LHARC
                             4 = PKZIP

            Returns
            _______
                 0 = Completed
                 1 = Cancelled
                 2 = Bad file mask
                 3 = No files matching file mask

            Notes
            _____
                 Requires GetValidPath$() function (GETPATH.OBJ)








































                                    ANGELIB for BC7/PDS                       24
                                    ___________________




          FileRestore%                    ec% = FileRestore%(FileMask$, Method%)
            Menu of  floppy drives  then if  Method% is  2, 3, or  4 a  menu of
            files matching  FileMask$ (user  can select  one to  restore).   If
            Method%=1 all files matching FileMask$ are restored.

            Pass
            ____
                 FileMask$   Files to restore (*.*, *.DAT, OLD??.*, etc.)

                 Method%     The method to use in restoring
                             1 = DOS Copy
                             2 = ARJ (req. a lot of free memory)
                             3 = LHARC
                             4 = PKZIP
                             Anything else = DOS Copy

            Returns
            _______
                 0 = Completed
                 1 = Cancelled
                 2 = Bad file mask
                 3 = No files matching file mask

            Notes
            _____
                 Requires ChooseFile$() function (CHOOSEFL.OBJ).




          FileRestores%                  ec% = FileRestores%(FileMask$, Method%)
            Same  as FileRestore%() function  above except that user can select
            one  or  multiple  files  to restore.    See  FileRestore%() for  a
            description of the parameters.

            Notes
            _____
                 Requires ChooseFileS$()  function (CHOOSEFS.OBJ).  Will add k
            to 10k to your code size over using FileRestore%().




























                                    ANGELIB for BC7/PDS                       25
                                    ___________________




          FKeys                                                      FKeys Keys$
            Displays a list of function keys at the bottom of the screen.

            Pass
            ____
                 Keys$       String of  keys  to be  displayed (e.g.,  "EPNQ").
                             Plus sign  (+) is  a reserved character.   If  the
                             first character  is a plus  sign followed by  two-
                             digits, then the keys are placed  starting on that
                             row.  For example, "+24EPNQ" would  place the keys
                             on row 24/25, instead of the default rows 23/24.

            Notes
            _____

            The file  FKEY.LST  is  seached  first  if it  is  in  the  current
            directory, then  an internal list is  searched if the  keys are not
            found.  The format of FKEY.LST ASCII file is:

                 KeyCode$,KeyName$,KeyDesc$,XPos%

            For example, a  line reading "C,Enter,Continue,51" would place  the
            key  "Enter" (in  reverse  video)  and the  description  "Continue"
            under  it at  column  51  whenever an  FKeys  "C"  is issued  in  a
            program.  See the sample FKEY.LST file.

            The routine scans the first screen row  at column 1 for the  colour
            to use.

            The keys "AacCFNoPQSsTtyn" are defined internally as follows:
                 A - Up and Down arrows
                 a - Up/Down/Right/Left arrows
                 C - Esc = Cancel
                 c - Enter = Continue
                 N - PgDn = Next
                 o - Enter = OK
                 P - PgUp = Prev
                 Q - Esc = Quit
                 S - Enter = Select
                 s - Esc = Stop
                 T - TAB = Next
                 t - BackTAB = Prev
                 y - Enter = Yes
                 n - Esc = No





















                                    ANGELIB for BC7/PDS                       26
                                    ___________________




          FmtFDD%                                                  ec% = FmtFDD%
            Format floppy disks.

            Pass
            ____
                 Nothing

            Returns
            _______
                 TRUE if function completed
                 FALSE if cancelled

            Notes
            _____
                 It's easiest to give you an algorithm of the logic flow:

                 Search DOS PATH for WFF.EXE (What Floppy Format?)
                 If found, run it and exit
                 How many drives does this computer have?
                 If more than 1 present list
                 Issue DOS command "FORMAT d:" and exit

                 I always  put a  "Format Floppies" option  under my  File menu
                 which  simply  does  "i% =  FmtFDD".   See  also  FromFDD% and
                 ToFDD% functions.









































                                    ANGELIB for BC7/PDS                       27
                                    ___________________




          FontDL                          FontDL FontFile$, Pts%, Port%, FontNo%
            Downloads  a  soft  font file  to a  laser  printer and  displays a
            status window while doing so.

            Pass
            ____
                 FontFile$   The full  file name, including  drive and path  if
                             necessary,  of   the   soft   font  file   to   be
                             downloaded.

                 Port%       The port number (1-3) of the printer.

                 FontNo%     PCL font number  to assign this font (e.g.,  400).
                             Numbers  >128 are  generally best  to  use as  the
                             lower numbers have  standard fonts which typically
                             apply to them.

            Returns
            _______
                 Pts%        The  point size of  the font  is returned  in this
                             variable.

            Example
            _______
                 ok% = FontDL%(FontFile$, Pts%, Port%, FontNo%)
                 if ok% then
                     PRINT #PrintFile%, chr$(27)+"("+ltrim$(str$(FontNo%))+"X"
                     end if

            Notes
            _____
                 The above  sequence selects FontNo% as  the primary font  (the
                 '('  does  this).   To select  it  as the  secondary font  use
                 chr$(27)+"("+ltrim$(str$(FontNo%))+"X"

































                                    ANGELIB for BC7/PDS                       28
                                    ___________________




          GetDate                          GetDate d%, m%, y%, Intl%, Row%, Col%
            Accepts date from keyboard at {Row%,Col%}  unformatted (no symbols,
            just  numbers run  together).   Extended keys  (arrows, PgUp, etc.)
            will  exit  plus  a mouse  button  push  or  the  Alt  key.   Intl%
            determines the sequence of entry.

            Pass
            ____
                 d%          Default  day (1-31),  zero to  use to-day's  date,
                             negative to skip the day

                 m%          Default  month number, zero to  use current month,
                             negative to skip the month

                 y%          Default  year  number  (4  digits),  zero  to  use
                             current year, negative to skip the year

                 Intl%       Country  setting   (1=US,  2=Cdn,   3=US  &   Cdn,
                             4=Other)

                 Row%        Screen row on which to get input

                 Col%        Screen column in which to get input

            Returns
            _______
                 d%, m%, and y% are set to user's input




          GetFileDesc$                               desc$ = GetFileDesc$(file$)
            Get a  file's description  (long name) from the  DESCRIPT.* file in
            the current directory.

            Pass
            ____
                 file$       DOS file  name.   You can specify a  drive & path,
                             but  the current  directory will  be accessed  for
                             the DESCRIPT.* file.

            Returns
            _______
                 Description (long name) of the file.























                                    ANGELIB for BC7/PDS                       29
                                    ___________________




          GetFileName$     afile$ = GetFileName$(InOut%, ttl$, msg$, dflt$, ms%)
            Get  a file name  from user  in a  window, verify proper  format of
            entry, and check status of file.

            Pass
            ____
                 InOut%      Input or Output file?
                             1 =  Input file  (file must  exist; error  message
                             displayed if not) ('1' is for 'I'nput)
                             0 = Output file  (checks that file does not exist;
                             if file exists, presents a warning  that file will
                             be over-written) ('0' is for 'O'utput)

                 ttl$        Title of window

                 msg$        Help  message displayed  on the  screen below  the
                             file entry window

                 dflt$       Default response

                 ms%         Mouse flag (0=no mouse, non-zero=use mouse)
                             Mouse cursor should be invisible (off)

            Returns
            _______
                 Name of file, including drive and path (if entered)




          GetFileNames$   files$ = GetFileNames$(InOut%, ttl$, msg$, dflt$, ms%)
            Same as  GetFileName$ except  that user can  specify more  than one
            input file.

            Pass
            ____
                 InOut%      Input or Output file?
                             1  = Single input file
                             -1 = Multiple input files
                             0  = Output file

            Everything else is the same as GetFileName$() above.

            Returns
            _______
                 Drive and  path (if entered) followed  by file name(s)  padded
            to 12 spaces.




















                                    ANGELIB for BC7/PDS                       30
                                    ___________________




          GetFontInfo                      GetFontInfo File$, FontName$, PtSize%
            Provides name  &  size in  the header  of a  soft font  file.   Try
            FontDL% on your laser for a demonstration of this.

            Pass
            ____
                 File$       The name  of the  soft font,  including drive  and
                             path, if necessary.

            Returns
            _______
                 FontName$   The  long name  of the  font is  returned in  this
                             variable, if present  (some fonts do not have  any
                             name in the header)

                 PtSize%     In  the font file's header  is a point size -- the
                             integer  value   of  this  is  returned   (decimal
                             chopped off).   Although this  should be the  real
                             point size, it's possible for it to be wrong.














































                                    ANGELIB for BC7/PDS                       31
                                    ___________________




          GetNum$       n$ = GetNum$(iRow%, iCol%, NumMask$, OrigNo$, ExitCode%)
            Get formatted  numerical input  from user.   Screen colours  at the
            specified  location will be inverted during input and restored upon
            exit.

            Pass
            ____
                 iRow%       Row at which to get input

                 iCol%       Left column at which to get input

                 NumMask$    Format  mask.   Valid  mask  characters  are pound
                             (#),  dollar ($),  and  comma  (,); all  else  are
                             literals (same  as PRINT  USING).  E.g.,  "#,###",
                             "$$##.##" or "(###) ###-####".

                 OrigNo$     Default number in string  form to avoid  numerical
                             data type conflicts.   Can be integer or  floating
                             point.

            Returns
            _______
                 User's  entry as  a string  (use VAL  to  extract it  into the
                 proper variable; for example, Cost@=VAL(A$) or Miles%=VAL(A$)

                 ExitCode%   ASCII value  of key user pressed  to exit.   E.g.,
                             Esc =  27.   If an extended  key (e.g.,  F4, PgUp,
                             etc.) is used ExitCode% is negative.

            Example
            _______
                 A$=GetNum$(15,30,"$$###.##",STR$(UnitPrice@),ExitCode%)

                 In  the  above  example  an input  field  will  be created  at
                 location (15,30).   The original  number, UnitPrice@, will  be
                 formatted and  displayed using the  mask "$$###.##", then  the
                 computer will  wait for the  user's input.   The key that  the
                 user  presses  to  exit  the field  will  be  returned in  the
                 variable ExitCode%.

                 See FKEYS.BI for key definitions.

























                                    ANGELIB for BC7/PDS                       32
                                    ___________________




          GetValidPath               GetValidPath Drv$, path$, Msg$, InOut%, ms%
            Displays  Msg$ then asks user for  a valid path name, defaulting to
            Drv$ and  Path$.  If path does not  exist and it  is being used for
            output, user is asked if s/he wants to create it.

            Pass
            ____
                 Drv$        Default drive (e.g., "C:")

                 Path$       Default path (e.g., "\TEST\DIR")

                 Msg$        Helpful message  to display on  the screen  (using
                             Inform%)

                 InOut%      1=Input/0=Output
                             If  InOut%=0 will  prompt  to create  a  directory
                             that does not exist.

                 ms%         0=No mouse, 1=Use mouse

            Returns
            _______
                 Drv$        Selected drive letter followed by a colon

                 Path$       Selected path with trailing  foreslash (\)  (e.g.,
                             "\TEST\DIR\")

            Notes
            _____
                 The mouse must be initialized and visible to use  it.  To keep
                 things simple  & save  stack space, the  windows are  at fixed
                 positions (which also helps keep things consistent, too).


































                                    ANGELIB for BC7/PDS                       33
                                    ___________________




          GoodbyeScreen          GoodbyeScreen Pkg$, Reg%, FirstUse$, TimesUsed%
            Presents a  'goobye screen'  with which  I end  my programmes.   It
            also has  my name on it... :)   When you  register ANGELIB you will
            get a version which lets you put your copyright message on it.

            Pass
            ____
                 Pkg$        Package abbreviation  (e.g., "WVH",  "WML", etc.).
                             Should be a short name to fit properly in window.

                 Reg%        Registration   flag,  true/false,   controls   the
                             information displayed

                 FirstUse$   Date of  first use.   Used to  calculate number of
                             days package has been used.

                 TimesUsed%  Number of times package has been used.

            Returns
            _______
                 Nothing












































                                    ANGELIB for BC7/PDS                       34
                                    ___________________




          HelpIndex                                  HelpIndex Topic$, FileSpec$
            Displays a help index (menu) or a specific help screen.

            Pass
            ____
                 Topic$      A  specific topic to look up (as  might be desired
                             with context-sensitive help).   If blank an  index
                             is presented in a scrollable menu.  Once the  user
                             selects a topic, the help text  is displayed using
                             the Inform% function.

                 FileSpec$   The specification  for the help  file.  If  blank,
                             "*.HLP" is used.   FileSpec$ may contain a  drive,
                             path, and/or file name (wildcards okay).

            Returns
            _______
                 Nothing.

            Notes
            _____

            The help file is an ASCII text file which is arranged like this:

            Topic #1+chr$(4)+Help information
              more information at least one space from left
              more help etc. etc.
            Topic #2+chr$(4)+Help info...

            Help  files may contain up to 100 topics.   The total length of the
            help text for a single entry is limited to 99 lines with  a maximum
            of  50 characters per line (roughly 4k of text).  Topics MUST begin
            in column  one, additional  text MUST begin  AFTER column  1 (i.e.,
            indent the help text at least one space).

            The topic  may begin with a chr$(1) through  chr$(3) to indicate an
            outline  level.      For  example,   you  might   have  FILE   then
            chr$(1)+Open.




























                                    ANGELIB for BC7/PDS                       35
                                    ___________________




          Inform%    ok% = Inform%(iRow%, iCol%, iWid%, iType%, ms%, snd%, Msg$)
            Displays a scrollable information window containing up to  99 lines
            of information.   Msg$ may be any  length.  The routine will  break
            the message  into lines of  iWid% length  or less.   If the box  is
            positioned too low on the screen, it will be adjusted upwards.

            Pass
            ____
                 iRow%       Top row of window
                 iCol%       Left column of window
                 iWid%       Window width (in characters)

                 iType%      Determines buttons (see below)
                             0="Message" (no buttons)
                             1="Note" (Ok button)
                             2="Caution" (Ok/Cancel)
                             3="Warning" (blinking) (Continue/Stop)
                             4="Attention" (blinking) (Yes/No)

                 ms%         Mouse support
                             0 = No mouse
                             1 = Mouse available
                             99 = Reset mouse & use it, if available

                 snd%        Sound: 0=None 1=Squeak 2=Tick 3=Beep
                 Msg$        Message  to  display  in  the  window.    Will  be
                             truncated at 99 lines, if necessary.

            Returns
            _______
                 TRUE if user presses ENTER to exit
                 FALSE if user presses ESC to exit

            Notes
            _____

            All message  types except  zero restore  the screen on  exit.   Use
            iType%=0  when you want to put  information on the screen and leave
            it there, such as instructions on how to enter data.

            The mouse should be turned OFF before calling Inform%

            Custom Titles
            _____________

            A custom title  can replace the default.   Just place a title  plus
            chr$(254) at  the start  of your message  (changed from  chr$(4) to
            allow the code to be imbedded without the use of the CHR$ function



















                                    ANGELIB for BC7/PDS                       36
                                    ___________________




          InformFill        InformFill Row%, Col%, BegLine%, WinSize%, MLines$()
            Used by Inform% -- fills the window with text.




          InputDate       InputDate Mo%, Dy%, Yr%, DtStr$, Row%, Col%, ExitCode%
            Accepts a valid date.  Unlike GetDate, InputDate only supports  the
            DD/MM/YYYY format and does not check for a mouse  button or the Alt
            key  being  pressed.   However,  the  input  is  formatted  whereas
            GetDate has all the numbers run together.

            Pass
            ____
                 Mo%         Month number (1-12)
                             Zero for current month
                             -1 to skip month

                 Dy%         Day number (1-31)
                             Zero for current day
                             -1 to skip day

                 Yr%         Year number (4 digits)
                             Zero for current year
                             -1 to skip year

                 r%/c%       Screen row & column at which to display/get date

            Returns
            _______
                 DtStr$      Date string formatted MM/DD/YYYY.

                 ExitCode%   Set to the key used to exit.

            Example 1
            _________
                 M%=0: D%=0: Y%=0: row%=10: col%=20
                 InputDate M%, D%, Y%, DtStr$, row%, col%, ExitCode%

                 This will  get the  date at location {10,20}  using the system
                 date as default.  Because InputDate is a BASIC subroutine,  it
                 is not necessary to initialize DtStr$ before using it.

            Example 2
            _________
                 M%=5: D%=-1: Y%=0: row%=10: col%=20
                 InputDate M%, D%, Y%, DtStr$, row%, col%, ExitCode%

                 This will get a  month and year at location {10,20}  using May
                 and the system clock's year as default.

















                                    ANGELIB for BC7/PDS                       37
                                    ___________________




          IsColour%                                               x% = IsColour%
            Get adapter card type.

            Pass
            ____
                 Nothing

            Returns
            _______
                 True (-1) if colour adapter card, otherwise False (0).




          IsPath%                             stat% = IsPath%(Pathname$, InOut%)
            Checks validity  & extends  path.  If  directory is  being accessed
            for output and does not exist, user is prompted to create it.

            Pass
            ____
                 TheName$    Path name in the format [d:][\path\]
                             If the drive or full path are  missing the current
                             drive/path are inserted

                 InOut%      1=Input/0=Output
                             If  directory does  not  exist  and InOut%=0  then
                             user will be prompted to create the directory

            Returns
            _______
                 0 = Path not found/not created (suitable for Output)
                                                              _
                 1 = Path exists (suitable for Input)
                                               _
                 -1 = Bad path specification, or -2 = Other error

                 TheName$    Contains the  fully extended  path name  including
                             the drive  letter unless user  hit Esc when  asked
                             permission to create the directory.

            Example
            _______
            Assume the current path is C:\ugh\ and no directories under it.

                 Path$ = "test": InOut% = 0
                 stat% = IsPath%(Path$, InOut%)
                 select case stat%
                      case 0    'Path not found & not created (user hit Esc)
                      case 1    'Path found, everything okay
                      case is < 0  'Bad path specification or DOS error

            Inform user that C:\ugh\test\  does not exist & ask to create.   If
            "No" stat%=0 & Path$="test", else stat%=1 & Path$="C:\ugh\test\"

















                                    ANGELIB for BC7/PDS                       38
                                    ___________________




          Max%                                           Highest% = Max%(A%, B%)
            Returns the larger of the two integers




          MaxL&                                         Highest& = MaxL&(A&, B&)
            Returns the larger of two long integers.




          MaxS!                                         Highest! = MaxS!(A!, B!)
            Returns the larger of two single-precision floating point numbers.




          Min%                                            Lowest% = Min%(A%, B%)
            Returns the smaller of two integers.




          MinL&                                          Lowest& = MinL&(A&, B&)
            Returns the smaller of two long integers.




          MinS!                                          Lowest! = MinS!(A!, B!)
            Returns the smaller of two single precision numbers.































                                    ANGELIB for BC7/PDS                       39
                                    ___________________




          MonthDays%                                NoDays% = MonthDays%(M%, Y%)
            Returns the number of days in month M% of year Y%.

            Pass
            ____
                 M%          Month (1-12)
                 Y%          Year (2 or 4 digits)

            Returns
            _______
                 Number of days in the specified month

            Example
            _______
                 MonthDays%(2,1992) returns 29




          OutDev$                                    PDev$ = OutDev$(Port%, ms%)
            Presents a menu of output devices: Screen, Printer, and Disk  File.
            If Disk  File is  selected the  user is  prompted for  a file  name
            (using  GetFileName$).   If Printer is selected  the routine checks
            if the printer is on-line (that's  partly why Port% is needed)  and
            returns the device  name as  "LPT1:", "LPT2:",  or "LPT3:"  (that's
            also why Port% is needed).

            Pass
            ____
                 Port%       Port number of printer (1, 2, or 3)

                 ms%         Mouse support:  0=no, non-zero=yes

            Returns
            _______
                 Device or file name




          OutDevs$                                  PDev$ = OutDevs$(Port%, ms%)
            Same  as   OutDev$  function,  but   for  use  with   ChooseFiles$,
            FileRestore2%, GetFileNames$, and SelectSoftFonts% routines.

            See OutDev$ function for details.























                                    ANGELIB for BC7/PDS                       40
                                    ___________________




          ParseFSpec             ParseFSpec TheName$, Drv$, Pathname$, TheName2$
            Searches file name for the drive, path, and NAME.EXT components.

            Pass
            ____
                 TheName$    Full file name to parse

            Returns
            _______
                 Drv$        Drive letter followed by a colon (if present)

                 Pathname$   Path  name, if present,  beginning and ending with
                             a  foreslash  (\).  Path  will  be  extended  with
                             current path, if necessary.

                 TheName2$   FILENAME.EXT, if present

            Notes
            _____

            Converts  the regular  slash (/) to  a foreslash (\),  in case user
            enters the wrong one.

            If an invalid  file name is entered  (for example, more  than eight
            characters  in  the  name  or more  than  three  characters in  the
            extension) then TheName2$ is returned as a blank string.

            The original file  name, TheName$, is not changed  so that if there
            is an error it can be given to the user for editing again.





































                                    ANGELIB for BC7/PDS                       41
                                    ___________________




          PctDone                         PctDone PctY%, PctX%, Percent%, title$
            Displays  a graph of percentage completion  in a box on the screen.
            If the  process takes  longer than  10 seconds  a count-down  timer
            will appear below the graph.

            Pass
            ____
                 PctY%       The row (Y position) of the top right corner

                 PctX%       The column (X position) of the top right corner

                 Percent%    Percentage  to draw on  the graph.  The first time
                             PctDone is called  a small window  is drawn.  When
                             Percent% is 100 the window is erased.

                 title$      A  title  (10  chars  max)  to  display  over  the
                             progress bar. The length  of the title  determines
                             the width of the window.

            Returns
            _______
                 Nothing

            Notes
            _____

            You must call PctDone  with 100 to clear  it.   If you do not,  the
            window will not be displayed until the routine is cleared.

            Example
            _______
                 For Sort&=0 to NumRecs&
                     PctDone 9, 30, 100 * Sort& \ Y&, "Sorting"
                     do something...
                     next Sort&




          PrintRptMsg                                           PrintRptMsg Msg$
            Displays a window  saying "Printing "+Rpt$+" Press Esc to  cancel."
            I use this on every report so I made it into a routine.

            Example
            _______
                 Rpt$ = "Stock Status Report"
                 PrintRptMsg Rpt$





















                                    ANGELIB for BC7/PDS                       42
                                    ___________________




          PtrReady%                                       ok% = PtrReady%(Port%)
            Checks if printer on LPT[Port%] is on-line.

            Pass
            ____
                 Port%       Printer port (1, 2, or 3)

            Returns
            _______
                 TRUE if ready, FALSE if not

            Notes
            _____
                 It doesn't matter whether or not you  have opened a channel to
                 the printer before calling this routine.




          QSort    QSort Wrk%(), Arr1$(), Arr2$(), NoDims%, NoItems%, SortField%
            A good public domain sorting  method.  Used by ChooseFile$ to  sort
            the file list.

            See  the source code in QSORT.SUB.  This is  not my code -- I'm not
            selling it, I just use it and pass it on to you...




          Repl$                                cmd$ = Repl$(St$, Target$, Item$)
            Replaces occurence of  Target$ in St$ with  Item$.  Good for  laser
            printer codes.

            Pass
            ____
                 St$         Complete string

                 Target$     The part of St$ to be replaced

                 Item$       The replacement for Target$

            Returns
            _______
                 The modified string with trailing spaces & nulls truncated.

            Example
            _______
                 Repl$("&a#V ","#","500") will return "&a500V"





















                                    ANGELIB for BC7/PDS                       43
                                    ___________________




          SayOk                                            SayOk Row%, Col%, ms%
            Puts an "Ok" button centred at position {Row%, Col%} and an  "Enter
            /  Continue" message at the  bottom of the screen, flushes keyboard
            buffer, then waits for mouse or keyboard to exit.

            Pass
            ____
                 Row%        Row on which to place button
                 Col%        Middle of button
                 ms%         Use mouse support? (True/False)

            Returns
            _______
                 Nothing

            Notes
            _____
                 Scans screen at  {Row%-1, Col%} and inverts the colours  found
            there -- the idea  being to make the button stand out from the lines
            above it.
                 If  ms% is non-zero (True)  then the mouse must be initialized
            but invisible.




          SearchPath$                                a$ = SearchPath$(FileName$)
            Searches the DOS PATH environment variable for a file.

            Pass
            ____
                 FileName$   Name of file for which to search  (file name only;
                             no drive or path)

            Returns
            _______
                 If file is found, DOS path with trailing foreslash (\)
                 If file is not found, returns blank string ("")

            Example
            _______
                 Assuming you have C:\ in your search path...

                 A$ = SearchPath$("Config.sys")

                 will set A$ = "C:\"























                                    ANGELIB for BC7/PDS                       44
                                    ___________________




          SelectFont%    ok% = SelectFont%(m$,path$,PtrNo%,Pts%,Ext$,SFdir$,ms%)
            Displays  a scrollable list of soft fonts in a window and waits for
            user to select  one or press Esc.   List  will show DOS file  name,
            font  name (if present  in header)  and point  size (if  present in
            header).

            Pass
            ____
                 m$          Purpose  of  font,  displayed  at  top  of  window
                             (e.g., "Printing", "Reports", "Titles", etc.)

                 path$       File  specification  for  PRINTER.DAT file.  path$
                             may contain a  drive, path, and/or  file name.  If
                             no file  name is given,  PRINTER.DAT is  used.  If
                             no drive  & path are  given, the  current drive  &
                             path are used.

                 PtrNo%      The printer's record number in PRINTER.DAT

                 Ext$        Soft  font   file  extension   (e.g.,  "SFP"   for
                             portrait fonts, "SFL" for landscape fonts)

                 SFdir$      Default soft font directory (e.g., "C:\Fonts")

                 ms%         Mouse support:  0=no mouse, 1=use mouse

            Returns
            _______
                 Function returns font's  record number in PRINTER.DAT or  zero
                 if user presses Esc

                 m$          Changed  to soft font  file name  (including path)
                             if soft font selected

                 Pts%        Changed to point size if scalable font

                 SFdir$      Soft font directory with any user modifications

            Notes
            _____
                 Mouse must be initialized but turned OFF




          SelectFonts%  ok% = SelectFonts%(m$,path$,PtrNo%,Pts%,Ext$,SFdir$,ms%)
            Same as SelectFont%()  function except that it uses  ChooseFileS$()
            (instead of ChooseFile$()).


















                                    ANGELIB for BC7/PDS                       45
                                    ___________________




          SelectFontSize%             Pts% = SelectFontSize%(Font$, IsPts%, ms%)
            This routine  gets the  user's choice  for font  size in a  window.
            This routine  is called  whenever a  scalable font  is selected  in
            SelectFont% (I don't ever use this routine directly).

            Pass
            ____
                 Font$       The font  name  (for  displaying on  the  screen).
                             For example, CG Times.

                 IsPts%      Logical  flag  to indicate  whether point  size is
                             needed  (versus   character  pitch).     If   true
                             "points"  is   displayed;   otherwise  (if   zero)
                             "character pitch" is displayed on screen.

                 ms%         Mouse flag: 0=no mouse, 1=use mouse

            Returns
            _______
                 Font size (integer) or zero if user presses Esc.

            Notes
            _____
                 This  routine  is  called  by  SelectFont%.    Mouse  must  be
            initialized but turned OFF (invisible cursor).




          SelectSoftFont$              Font$ = SelectSoftFont$(Path$, Ext$, ms%)
            This routine presents a scrollable list of soft fonts  in a window.
            It  is called by  SelectFont% if  the user selects  a soft font (as
            opposed to a font built into the printer).

            Pass
            ____
                 Path$       Path to soft fonts

                 Ext$        Extension to be included in the  list (e.g., "SFP"
                             for portrait fonts)

                 ms%         Mouse support (0=no, 1=yes)

            Returns
            _______
                 Name of chosen font, including drive & path, if necessary.

                 Path$       Path as modified by user

            Notes
            _____
                 Uses ChooseFile$() function

















                                    ANGELIB for BC7/PDS                       46
                                    ___________________




          SelectSoftFonts$            Font$ = SelectSoftFonts$(Path$, Ext$, ms%)
            Same as SelectSoftFont$() except  this routine uses  ChooseFileS$()
            instead of ChooseFile$().




          StrFmt$                            ph$ = StrFmt$(Mask$, St$, reverse%)
            Formats a  string according to a given mask.  I  use this to format
            phone numbers, zip codes, etc.

            Pass
            ____
                 Mask$       Mask: "#"  is a digit  or a space; "9"  is a digit
                             or  a  zero;  "*"  is  a  digit  or  an  asterisk;
                             everything else is treated as a literal
                 St$         String to format
                 reverse%    Flag: if  TRUE formatting  is done  from right  to
                             left; if  FALSE (0) formatting  is done from  left
                             to right. TRUE is the most common setting.

            Returns
            _______
                 Formatted string

            Examples
            ________
                 a$ = StrFmt$("8052662574","(###) ###-####",-1)
                 returns a$ = "(805) 266-2574"

                 a$ = StrFmt$("2726893","(###) ###-####",-1)
                 returns a$ = "(   ) 272-6893"

                 a$ = StrFmt$("$*****","15",-1)
                 returns a$ = "$***15"




          StripSymbols$                               new$ = StripSymbols$(Old$)
            This  strips  any symbols  from  a  string, returning  numbers  and
            letters only.  I  use it to strip the parenthesis, etc.  from phone
            numbers, etc.  Returns the string St$ stripped of its  parenthesis,
            dashes, and commas.

            Example
            _______
                 a$ = StripSymbols$("(805) 272-4923")

                 returns a$ = "8052724923"

















                                    ANGELIB for BC7/PDS                       47
                                    ___________________




          Trim$                                                   b$ = Trim$(a$)
            Trims  leading  & trailing  spaces  and trailing  chr$(0)'s from  a
            string  (using LTRIM$/RTRIM$ will remove  spaces but not nulls).  I
            use this to  test the length  of static  strings, which are  padded
            with CHR$(0)'s.




          ZipFmt$                                          a$ = ZipFmt$(TheZip$)
            Formats a zip code.

            Pass
            ____
                 TheZip$     Unformatted Zip/Postal code

            Returns
            _______
                 Zip/postal code formatted as follows:
                 * If all numbers, #####-#######
                 * If len 4 or 5 -- A#A #A#
                 * Other -- No formatting




          zTrim$                                                 b$ = zTrim$(a$)
            This routine only trims  trailing nulls [chr$(0)]  from the string.
            Good for trimming  fixed-length file fields  which are  padded with
            nulls when you don't want to remove any spaces  [chr$(32)] from the
            string.


































                                    ANGELIB for BC7/PDS                       48
                                    ___________________




          XII. USING PRINTER FUNCTIONS

               In order to use the printer functions, you will need to include
          the data structures definition file PtrRec.DEF in your source code. 
          Place the line '$INCLUDE: 'PtrRec.DEF' near the beginning of your
          code.

               Next, you will need to dimension the variables to hold the
          records.  I use both local and the global (common) variables; either
          will work fine unless your programme is strapped for memory one way or
          the other.  For local variables use DIM; to make the variables global
          use DIM SHARED.  The record types are:

               LaserPtrRec - Control codes which are not font-specific
               LaserFontRec - Font-specific control codes
               DMPtrRec - Dot matrix codes which are not font-specific
               DMFontRec - Font-specific dot matrix control codes

               The records are all the same length so that the single file,
          PRINTER.DAT, can contain all four record types.  Laser printer records
          start with a greater-than (>) sign (for example, ">Panasonic KX-
          P4450").  Dot matrix printer records start with a dot (for example,
          ".NEC P5300").  Both record types (dot matrix and laser) begin with a
          Model field, so you can use a LaserPtrRec variable to read a dot
          matrix record, then, if the Model begins with a period, re-read the
          record as a DMPtrRec variable.

               Here are the steps your programme will need to take to set
          everything up:
               1.  Use the ChoosePtr% function to get and save the user's
                   choice for a printer
               2.  Use SelectFont% to get the user's font choice(s).
               3.  Save printer & font choices in a configuration file.
               4.  Either at programme start-up or before printing read the
                   printer control codes into memory.  For example:

                   DIM SHARED Lz as LaserPtrRec
                   DIM SHARED DM as DMPtrRec
                   PtrFile% = FREEFILE
                   OPEN HomePath$ + "Printer.DAT" FOR RANDOM ACCESS READ SHARED
                       AS PtrFile% LEN = LEN(Lz)
                   GET #PtrFile%, PtrRec%, Lz
                   IF LEFT$(Lz.Model, 1) = "." THEN
                     GET #PtrFile%, PtrRec%, DM
                     END IF

               5.  At programme start-up or before printing read the printer
                   font codes into memory (like the example below)















                                    ANGELIB for BC7/PDS                       49
                                    ___________________




          DIM LF as LaserFontRec
          DIM DF as DMFontRec
          ' Normally you would already have PtrFile% open from the
          ' above routine (to read the printer codes).  If not, you
          ' would need to open the file as in the above routine.
          m$ = "Reports": Ext$ = "SFP"                     'Portrait fonts (SFP)
          FontRec%=SelectFont%(m$, PtrRec%, Pts%, Ext$, SFdir$, ms%)
          SELECT CASE FontRec%                                     'Check result
               CASE 0                                       'User hit Escape key
                 EXIT SUB
               CASE -1                                     'User chose soft font
                 PRINT #PrintFile%, zTrim$(Lz.Init);                'Reset laser
                 Done% = FontDL(SFont$, FPts%, PtrPort%, 400)     'Download font
                 IF NOT Done% THEN
                             'User aborted download; flag routine as 'cancelled'
                   EXIT FUNCTION or SUB
                   END IF
                 IF FPts% > 0 THEN                           'FontDL got a size?
                     Fcpi% = 120 \ FPts%      'Cvt points to rough CPI for calcs
                   ELSE                                     'No size in font hdr
                     Fcpi% = 10                     'Assume 12pt/10cpi for calcs
                   END IF
                 PRINT #PrintFile%, CHR$(27); ")400X";       'Secondary, ID #400
               CASE ELSE
                 IF Ptr$ = "D" THEN                          'DOT MATRIX PRINTER
                     GET #PtrFile%, FontRec%, DF
                     PRINT #PrintFile%, zTrim$(DM.Init);                  'Reset
                     PRINT #PrintFile%, zTrim$(DF.Select);          'Select font
                     T$=Trim$(DM.HTab) + CHR$(2 * Fcpi) + CHR$(0)  'Set tab @ 2"

                   ELSE                                           'LASER PRINTER
                     GET #PtrFile%, FontRec%, LF
                     PRINT #PrintFile%, zTrim$(LF.SymSet2);      'Make secondary
                     PRINT #PrintFile%, zTrim$(LF.Select2);     'Use SymSet1 etc
                     PRINT #PrintFile%, zTrim$(LF.Spacing);     'to make Primary
                     IF VAL(LF.Pitch) = 0 THEN                   'Scalable font?
                       PRINT #PrintFile%,LTRIM$(STR$(Pts%));         'Point size
                       END IF                                '(from SelectFont%)
                     PRINT #PrintFile%, zTrim$(LF.Pitch);      'Pitch select cmd
                     PRINT #PrintFile%, zTrim$(LF.Slant);        'Upright/italic
                     PRINT #PrintFile%, zTrim$(LF.Weight);       'Light/Med/Bold
                     PRINT #PrintFile%, zTrim$(LF.Number);      'PCL font number
                     IF RIGHT$(zTrim$(LF.Pitch), 1) = "h" THEN     'Mono-spaced?
                         Fcpi% = VAL(LF.Pitch)                        'Store cpi
                         FPts% = 120 \ temp1%       'Cvt cpi to rough pts if nec
                       ELSE
                         FPts% = VAL(LF.Pitch)                     'Store points
                         Fcpi% = 120 \ TPts%        'Cvt pts to rough cpi if nec
                       END IF
                   END IF














                                    ANGELIB for BC7/PDS                       50
                                    ___________________




               END SELECT
          CLOSE #PtrFile%

               Now you have the printer ready to go and you have the variables
          Fcpi% and Fpts% to work with in calculating TAB locations, line
          length, etc.

               You will notice that I use zTrim$() rather than just printing a
          variable.  This is because BASIC pads TYPE fields with nulls -
          CHR$(0)'s.  The zTrim$() function removes CHR$(0)'s but leaves
          trailing spaces (which may be part of the command string).

               There are some things that you must know, such as that the pitch
          command for a PCL (laser) printer ends in "h" if it is mono-spaced
          (cpi) and "v" if it is proportionally-spaced (points).  Also, in
          setting a TAB string in the above example I used the Epson-standard
          which terminates the setting of TABs with a CHR$(0).  This is the best
          solution I have come up with, and every printer I've seen in the past
          five years uses Epson codes anyhow, so I figure this technique will
          work 90% of the time or better.

               You can make your own PRINTER.DAT file or modify the one supplied
          just by using the PtrRec.DEF file.  Someday soon I will make a
          programme for modifying the PRINTER.DAT file, but for now it will have
          to be done manually.  I would really appreciate it if you would share
          with me any new printers you install by sending me your modified
          PRINTER.DAT file.



































