home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / turbopas / pull15.arc / PULL15.DOC < prev    next >
Text File  |  1987-08-31  |  40KB  |  820 lines

  1.                                                          August 31, 1987
  2.  
  3.                            MULTI-LEVEL PULL-DOWN MENUS
  4.                                    Version 1.5
  5.  
  6.         PURPOSE:
  7.  
  8.         This utility creates incredibly quick multi-level pull-down 
  9. |       menus  as include files in Turbo Pascal programs for ALL IBM
  10. |       compatibles, including PS/2.  It features:
  11.  
  12.               - Work window(s) and complete interface for menus
  13. |             - Pull-down menus with 5 menu modes and 7 line modes
  14. |             - Highlighted command letters
  15.               - Unlimited levels of submenus
  16. |             - Unlimited data entry windows for seven types of data
  17.               - Data entry for the work window(s)
  18.               - Automatic NumLock for numerical data entry
  19.               - Right or left justification for data entry
  20.               - Error messages for invalid data entries
  21.               - Error messages for data entries out of range
  22.               - Allowance for null entries on text data entry
  23.               - Automatic and override configuration for sizes and
  24.                   locations for easier development
  25.               - Operation by cursor keys or command keys
  26.               - Pull/Pop between work window and nested submenu(s)
  27.               - Programmable control of pull and pop sequences
  28.               - Full system of self-titled help windows
  29.               - Message lines for prompts and processing
  30.               - Full working shell for user development
  31.               - Can be fully configured by the user including
  32.                   add-on features though include files.
  33.  
  34. |       They work on MDA, CGA, EGA, MCGA, VGA, 8514/A adapters in any 
  35. |       column mode (40/80/etc.).  These procedures use the quick screen 
  36. |       writing procedures of QWIK30.INC and the multi-level window 
  37. |       procedures of WINDOW34.INC.
  38.  
  39.  
  40.         TEST DRIVE:
  41.  
  42.         Compile and run the program PULLDEMO.PAS to get a feeling for 
  43. |       features and speed.  Be sure to use the Help function key "F1" 
  44. |       everywhere for explanations.  WINDOW34.INC and QWIK30.INC are 
  45. |       required to run it.  The operation should be intuitive.  If not, 
  46.         then I didn't do a very good job.
  47.  
  48.  
  49.         FILES:
  50.  
  51.         In this version, PULL15.ARC contains:
  52.  
  53.            !read   .me!:  File that insists you get a copy of 
  54.                           WINDOW34.ARC for source files and QWIK30.ARC 
  55.                           for further documentation.
  56.            Pull15  .doc:  This document.
  57.            Pull15  .inc:  Include file for your programs to use the
  58.                           pull-down menus.
  59.            PullDE15.inc:  Include file which adds data entry to the
  60.                           menus and work window.
  61.            PullDE__.inc:  An empty include file which deletes data entry
  62.                           features, but still permits compiling.
  63.            Pulluser.inc:  Include file which can add user-defined 
  64.                           features to the menus.
  65.            PullDemo.pas:  Fully functional working demo of PULL15.INC.
  66.            PullShel.pas:  A shell for your application programs.
  67.            License .arc:  ARC file containing license agreements.
  68.  
  69.  
  70.         IMPROVEMENTS:
  71.  
  72.         In this version there are several improvements:
  73. |         . Added combination menu modes ExecSingleChoice and 
  74. |             ExecMultipleChoice.
  75. |         . Added line mode type of ExecOnly to be independent of menu 
  76. |             Choice.
  77. |         . Added TypeOfDataTypes UserNums and UserStrings for user-
  78. |             defined sets.
  79. |         . Added Lattr (command Letter) and Cattr (Comment) attributes 
  80. |             to each menu.
  81. |         . Added StatusAttr for the first row attribute.
  82. |         . InitAttr is now the parameter in InitPull.
  83. |         . Deleted HaveEGA to conform to QWIK30.INC.
  84. |         . Modified cursor handling and eliminated separate cursor 
  85. |             modes.
  86. |         . Separated color initialization procedures.
  87. |         . Changed Home and End cursor keys to perform more like 
  88. |             WordStar.
  89.  
  90. |       SHAREWARE:
  91. |
  92. |       Due to the lack of participation and expense, I have decided to 
  93. |       abandon the Teamware concept and instead make them into ShareWare.  
  94. |       The cost may range from $8 to $45 depending on your application.  
  95. |       I do enjoy assisting others in their programming, but lack of 
  96. |       reimbursement is expensive for me!  Please help out.  See the 
  97. |       STATMENT.LIC in LICENSE.ARC for details.  If the response will let 
  98. |       me break even, I will continue support.
  99.  
  100.  
  101.         DEFINITIONS:
  102.               
  103.         So you can understand the program identifiers and this document, 
  104.         here's the definitions I'll use:
  105.               
  106.            Work window - The working window of the application program.
  107.            Top menu - The menu always shown (usually in row 1 or 2).
  108.            Main menu - The first menu pulled from the top menu.
  109.            Submenu - All subsequent menus pulled after the main menu.
  110.            Line - A row of text.
  111.            Menu - A list of selectable lines.
  112.            Window - Not a menu.
  113.            Data entry window - window for entering data into the
  114.                                application program.
  115.            Selection - A line selected in a menu with a CR.
  116.            "HiLited" - A line pointed at in a menu.
  117.            Message line - The bottom row to display key helps or
  118.                           processing status.
  119.            Error message - a short message for data out of range.
  120.            Link - A menu line showing a symbol (three-bar or dot) that 
  121.                   pulls another menu or window.  The symbol is also on 
  122.                   the same side where it is pulled.
  123.            Pull - pulls menus down to the previous level.
  124.            Pop - removes menus and returns to the work window.
  125.                                       
  126.                                       
  127.         BASIC OPERATION:
  128.  
  129.         I'll just put a few words here just in case you may have missed 
  130.         some of the capabilities in the demo.
  131.  
  132.          . Status Line - Row 1 just holds the title of this program.  It 
  133.            can be used to for optional status info.
  134.  
  135.          . Top Menu Line - To access the top menu line, press F10 at any 
  136.            time.  The exceptions are when the Help window or Error 
  137.            messages are displayed.  The "/" key does the same thing 
  138.            except it is considered data in text data entry windows.
  139.  
  140.          . Main Menu - To access a main menu, press RETURN while the top 
  141.            menu is highlighted.
  142.  
  143.          . Submenu - To access a submenu, press RETURN when the HiLite 
  144.            is at a menu line with the three-bar symbol (which looks like 
  145.            a menu).
  146.  
  147.          . Data Entry Window - To access a data entry (pronounced "dot-
  148.            uh" entry?) window, press RETURN when the HiLite is at a menu 
  149.            line with a small dot symbol.  Pressing RETURN again will 
  150.            exit the window.  You can clear any data entered by pressing 
  151.            ESC which also removes the window.
  152.  
  153.          . Numerical Data Entry - Depending on the type of data, (byte, 
  154.            integer, or real) only the valid characters can be typed in. 
  155.            Backspace can be used as well.  The "NumLock" is automatic 
  156.            and is interactive.  After return is pressed, the data is 
  157.            checked for validity (bytes less than 256, etc.) and then for 
  158.            a range check.  If it passes both checks, the data is then 
  159.            stored and the window is removed.  The "NumLock" status is 
  160.            then restored.  In "Exec-" type menus like "Files", the 
  161.            window may remain until processing is complete.  You can 
  162.            program this either way though.
  163.  
  164.          . Text Data Entry - ASCII 32 through 126 are valid characters 
  165.            for string and character data.  Only backspace can be used 
  166.            for editing.  The entry can be nulled by pressing DEL and 
  167.            then RETURN.
  168.  
  169.          . Work Window - This is the 20x78 window for the major part of 
  170.            your output and optional input.  You can also have multi-
  171.            level work windows.
  172.  
  173.          . Work Window Data Entry - The same procedures used for the 
  174.            data entry windows can be used for entering data in the work 
  175.            windows.
  176.  
  177.          . Help Windows - A help window is assigned to every window and 
  178.            menu.  It automatically shows it's title of that menu.  They 
  179.            can use the same info or different.
  180.  
  181.          . Message Line - The bottom line contains help or error 
  182.            messages.  
  183.  
  184.          . Function Keys - These are the keys assigned in the demo and 
  185.            what they control:
  186.                F1  - Pull/pop the Help windows
  187.                F2  - Pull/pop the pull-down menus
  188.                F10 - Pops to top menu for key commands
  189.                "/" - Same as F10, but not in text data entry windows.
  190.                ESC - Same as F2 in the Work window, but in the menus it 
  191.                      backs out of the current menu/window.
  192.                LTR - While in the menus, the HiLite will move to and 
  193.                      execute the menu line with that upper case letter.
  194.                Cursor Keys - refer to comments in PULL15.INC.      
  195.                      
  196.  
  197.         SCREEN DESIGN:
  198.               
  199.         PULL15.INC is quite flexible and allows you to change the basic 
  200. |       screen design in your application program.  EGA and VGA users 
  201. |       will particularly like it because it will also work in any row 
  202. |       mode and column mode.
  203.                                       
  204.         Status line - The demo shows how to place a title or status line 
  205.         in row 1.  Some applications may require a status line outside 
  206.         of the work window for file names or whatever.  But it is not 
  207.         required.  
  208.               
  209.         Work Window - The demo also shows a 20x78 work window but you 
  210.         can modify it to a full 80 columns by setting the MakeWindow to 
  211.         NoBrdr and create a 20x80 window.  The top and bottom lines 
  212.         could be added with a couple of Qfill statements.  You can also 
  213.         have multi-level work windows if you want.
  214.               
  215.         Main Menu Placement - This design seems to be the defacto 
  216.         standard that was started by the Macintosh and is currently 
  217.         being used by Microsoft.  The top menu row is inverse video 
  218.         while the highlight is normal.  The main menu is directly below 
  219.         and offset a few spaces.
  220.  
  221.         Submenu Placement - Press RETURN at a menu line with a linked 
  222.         submenu and notice that the top of a submenu is on the 
  223.         same row.  This menu line also serves as a title.  Let's say you 
  224.         nest 5 levels of submenus.  Will you still be able to see all of 
  225.         the titles?  Sure!  They won't over lap.  However, it's a good 
  226.         idea for operation if you keep the linking lines to submenus 
  227.         high up on the menu which keeps the subsequent submenus high as 
  228.         well.  The first pull using F2 in the demo shows how three 
  229.         levels of menus are kept high.  Keying F10 and "IU" will show 
  230.         you how a submenu drops lower.  The Submenus that "bottom out" 
  231.         on the display will be automatically pushed up when they are 
  232.         located.  Also look for defaults that reduce keystrokes to get 
  233.         around in the menus.
  234.  
  235.         Symbols - the three-line symbol (looks like a menu) tags the 
  236.         line that links a submenu.  A small dot tags the line that links 
  237.         a data window.  In addition, the symbol location also shows the 
  238.         direction of display - left or right.  Right is preferred unless 
  239.         there is no room when it is then placed to the left.
  240.  
  241.         Help Window - The help window is centered between the left and 
  242.         right margin.  The bottom row of the window has a constant 
  243.         number of rows below it and the bottom of screen.  This can be 
  244.         assigned with RowsBelowHelp.  It was also given a zoom and 
  245.         shadow effect so that it would look and feel separated from the 
  246.         working program.
  247.  
  248.         Message Line - The message line is placed relative to the bottom 
  249.         of the screen.  It can be raised up a number of rows by setting 
  250.         RowsBelowMsg greater than zero.
  251.  
  252.         Limits - There are really very few requirements.  Two of which 
  253.         are:
  254.  
  255.          . All menus and data entry windows cannot use NoBrdr.
  256.          . Data entry windows are fixed with 2 lines.
  257.  
  258.         Keyboard Operation - The operation is designed to be as 
  259.         intuitive as possible.  The message lines should guide you 
  260.         through the options.  The idea was to make application programs 
  261.         as user friendly as possible. 
  262.  
  263.               
  264.         PROGRAMMING:
  265.  
  266.         Configuration - Virtually everything can be reconfigured by the 
  267.         user without having to modify PULL15.INC.  It may require a 
  268.         little study, but the demo has most of the examples.
  269.  
  270.         Demo - PULLDEMO.PAS is an example of a shell you can use for 
  271.         your own programs.  I used all the capabilities in the demo.  
  272.         Even though the source code is lengthy, there are only a few 
  273.         procedures.  Here is a summary of the 9 steps to get you through 
  274.         all of the procedures:
  275.  
  276.             STEP 1: Include files
  277.             STEP 2: GetUserPullStats  (forward from PULL15.INC)
  278.             STEP 3: GetOverrideStats  (forward from PULL15.INC)
  279.             STEP 4: DataTransfer      (forward from PULLDE15.INC)
  280.             STEP 5: Application procedures
  281.             STEP 6: Process           (forward from PULL15.INC)
  282.             STEP 7: WorkWndw          (forward from PULL15.INC)
  283.             STEP 8: DisplayScreen
  284.             STEP 9: Main program
  285.  
  286.  
  287.         STEP 1: Include files 
  288.  
  289.         Constants - The constants for the include files allow the user 
  290.         to trim down data memory to only what is needed.  While 
  291.         developing an application, it's best to balloon these values a 
  292.         bit to keep from having to frequently change them.  For MaxWndw, 
  293.         be sure to use the maximum possibility of the deepest nested 
  294.         pull-down menu, plus all work windows, plus the help window.  
  295.  
  296.         {$C-} - Remove $C- while developing an application so you can 
  297.         halt the program with ^C rather than rebooting if there's a 
  298.         problem.
  299.  
  300.         Data Entry File - If you don't want the PULLDE15.INC data entry 
  301.         file, you can substitute PULLDE__.INC which contains a couple of 
  302.         code lines to still allow compiling.  
  303.  
  304.         Custom Links - PULLUSER.INC allows the user to include a custom 
  305.         file for linking another type of window to a menu line. 
  306.  
  307.  
  308.         STEP 2: GetUserPullStats
  309.  
  310.         Automatic configuration - This is the most significant part.  
  311.         PULL15.INC runs this procedure only once to get the basic data 
  312.         for the pull-down menus.  Much of the drudgery of locating, 
  313.         sizing, directing, coloring, command letters is done 
  314.         automatically.  If submenus are not given enough room to fit, an 
  315.         error message will indicate it.  If a data entry window won't 
  316.         fit, it will reassign it to be centered on the screen which you 
  317.         can override by assigning values to RowAlt and ColAlt in the 
  318.         "GetOverrideStats" procedure. 
  319.  
  320. |       Menu Modes - Every menu can have just one of five modes:
  321.  
  322.              ExecChoice         - immediately executes a procedure
  323. |            ExecSingleChoice   - executes a procedure first and then 
  324. |                                 flags one line exclusively on the menu
  325. |            ExecMultipleChoice - executes a procedure first and then 
  326. |                                 toggles the line's boolean flag
  327.              SingleChoice       - flags one line exclusively on the menu
  328.              MultipleChoice     - toggles the line's boolean flag
  329.  
  330.         MenuMode tells how the selection will interact with the other 
  331.         and ONLY "Choice" selections on the menu (see below).  
  332.  
  333.         Line Modes - In addition, each line in the menu can have one of 
  334. |       seven line modes:
  335.  
  336.              Choice     - will interact with the assigned menu mode
  337. |            ExecOnly   - will only execute a procedure in Process
  338.              Comment    - a line that can't be HiLited
  339.              Partition  - draws a horizontal line across window
  340.              ToDataWndw - links a data entry window when selected
  341.              ToSubMenu  - links a submenu when selected
  342.              ToUserWndw - links a user defined window
  343.  
  344.         In "Choice" mode, the line is a valid selection.
  345.  
  346.           . For ExecSingleChoice..MultipleChoice menus, the boolean data 
  347.             for the choice is stored in the menu record for each line.  
  348.             And for this reason, all menus are unique; they cannot be 
  349. |           linked again to another submenu unless you store a copy of 
  350. |           the values before reusing it.
  351.           . For "Exec-" type menus, a selected line executes it's 
  352.             procedure through an interface procedure called "Process".  
  353.             This will let you do just about anything, including any 
  354.             changes to the menus; e.g., take you step-by-step through 
  355.             data entry windows using PopLevels and Pull.
  356.           . If a data entry window is linked to an "Exec-" type menu, it 
  357.             will execute AFTER the data is entered.  An example of this 
  358.             is the "save As" line in "Files".  Once you select "save 
  359.             As", it prompts you for the file name and then executes.
  360.  
  361. |       In "ExecOnly" mode, the line overrides the menu mode and runs 
  362. |       through the Process procedure just like a Choice in an 
  363. |       "Exec-" type menu, but will not set any flags.
  364.  
  365.         In "Comment" mode, the HiLite will simply skip over the line.  
  366.         This allows the user to place descriptions or whatever in the 
  367.         menu without being a possible selection.  There are two lines in 
  368.         the "Files" menu that are comments.
  369.  
  370.         "Partition" is a horizontal line to separate menu lines into 
  371.         groups.  See ShowMenu in PULL15.INC for the five different 
  372.         types.  You specify the value of LinkNum in [11,12,21,22].  Any 
  373.         other values will simply use the bottom border line for the 
  374.         partition.  "Files" in the demo has a partition in the second 
  375.         line from the bottom.
  376.   
  377.         No matter what the menu mode is, if the line mode is a link 
  378.         (ToSubmenu, etc.), it will just pull the linking menu or window.  
  379.         However, a ToDataWndw line on an "Exec-" type menu will execute 
  380.         a procedure in Process after entry.
  381.  
  382.         Attributes - The definitions of the attribute identifiers are 
  383.         suffixes of:
  384.  
  385.            -Attr  - normal attribute
  386.            -Hattr - attribute for HiLite
  387.            -Wattr - attribute for Window area
  388.            -Battr - attribute for Border of window
  389. |          -Lattr - attribute for the command Letter
  390. |          -Cattr - attribute for a Comment line
  391.  
  392.         The attributes are handled by groups in PULL15.INC.  For 
  393.         example, the value for SubMenuWattr sets all SubMenus with the 
  394.         same value.  For exceptions, use "GetOverrideStats".
  395.  
  396. |       Monochrome - Keep in mind that different displays and monitors 
  397. |       don't always appear comparable.  Monochrome modes and displays 
  398. |       require some special considerations.  See SUGGESTIONS and 
  399. |       QWIK30.ARC as well.
  400.  
  401.         Status Line - Keep in mind that there may develop several look-
  402.         alike programs, so it would be helpful to have a title for your 
  403.         program on row 1 or 2 (unless of course you place it in the work 
  404.         window).  You can easily delete the line by setting 
  405.         "TopMenuRow:=1" and "MainMenuRow:=2".
  406.  
  407.         Command Sequences - PULL15.INC keeps track of the key strokes 
  408.         used to access a pull-down menu in the string "CmdSeq".  F10 is 
  409.         not included since it is understood.  When using "Pull" and 
  410.         "Pop" (see below), the user can programmably change the sequence 
  411.         with string "MoreCmdSeq".  The word "More" means that there are 
  412.         additional keys yet to be executed.  (Be sure to leave "CmdSeq" 
  413.         untouched.)
  414.  
  415.         MainMenu Record - Here's a list of what's contained in each 
  416.         record:
  417.  
  418.           Title       - a string required to appear in the Top Menu.
  419.           CmdLtrs     - a string which is done automatically by 
  420.                         PULL15.INC and contains the first letters of 
  421.                         each menu line.  If you want some other letter, 
  422.                         you can edit it in "GetOverrideStats".
  423.           Line        - string to appear on a menu line.
  424.           LineMode    - one of the 6 line modes for each line.
  425.           Flagged     - boolean for each line used for MultipleChoice 
  426.                         and SingleChoice menus.  
  427.           LinkNum     - the index number of the linking SubMenu or 
  428.                         DataWndw. (Also for partition numbers)
  429.           LinkDir     - linking SubMenu or window to appear Left or
  430.                         Right, handled by PULL15.INC.
  431.           MenuMode    - one of the 3 menu modes.
  432.           MenuLines   - quantity of lines in this menu.
  433.           NameCol     - the column of title in the top menu.
  434.           Row,Col,Rows,Cols - location and size of the menu which is 
  435.                         done by PULL15.INC   
  436.           DefaultLine - the HiLite line at startup.
  437.           HiLiteLine  - line currently HiLited
  438.           SingleFlagLine - the only line flagged.  Needed only in 
  439.                         SingleChoice menus (only for "Choice" lines).  
  440. |         Battr,Wattr,Hattr,Lattr,Cattr - attributes set for this menu.
  441.           Border      - one the 10 borders done by PULL15.INC.
  442.           BackToDefault - if true, HiLite will return to DefaultLine 
  443.                         every time the menu is pulled.     
  444.           Changed     - set to true if SingleFlagLine or Flagged have 
  445.                         been altered.  The user must reset this back to 
  446.                         false to be useful.
  447.           MsgLineNum  - the index number of the MsgLine.
  448.           HelpWndwNum - the index number of the HelpWndw.
  449.  
  450.         SubMenu Record - The SubMenu record is identical to the MainMenu 
  451.         record.  There are some differences in use though:
  452.  
  453.           Title       - same string of the linking menu line supplied by 
  454.                         PULL15.INC.
  455.           NameCol     - not used. 
  456.    
  457.         Practically speaking there is no limit to the number of submenus 
  458.         that can be linked (<256).  
  459.  
  460.         Data Entry Windows -  Data entry windows are different from 
  461.         menus because they are merely a scratch pad.  They don't save 
  462.         any data in the record.  The data it picks up is stored by user 
  463.         variables in another interface procedure called "DataTransfer".  
  464.         Even their locations on the screen are assigned at the time when 
  465.         the user presses RETURN on the menu.  So, the user can use a 
  466.         single window for any number of links.  I call them floating 
  467.         windows.  However, when the window won't fit, the program 
  468.         centers it on the screen.  The user can keep it from floating by 
  469.         assigning non-zero coordinates to RowAlt and ColAlt.  Setting 
  470.         them back to zero will allow them to float again.  Since data 
  471.         windows can float, there's no limit for the number of places 
  472.         they can be used.
  473.  
  474.         DataWndw Record - The DataWndw must be typed to allow PULL15.INC 
  475.         to compile whether PULLDE15.INC is included or not.  Here's the 
  476.         list:
  477.  
  478.           Line[1]     - label for the current value of the data.
  479.           Line[2]     - label for the new data entry.
  480.           TypeOfData  - type of data expected for this window.
  481.           Row,Col,Rows,Cols - location and size of the window which is 
  482.                         done by PULL15.INC   
  483.           RowAlt,ColAlt - alternate location of window.
  484.           FirstCol    - first column of the data field, handled by 
  485.                         PULLDE15.INC.
  486.           Field       - number of columns reserved for data entry.
  487.           Decimals    - number of decimal places for Reals only.  If 
  488.                         positive, uses R:F:D format.  If negative, uses 
  489.                         R:F.
  490.           Wattr,Hattr,Battr - attributes set for this window.
  491.           Border      - one the 10 borders done by PULL15.INC.
  492.           MsgLineNum  - the index number of the MsgLine.
  493.           HelpWndwNum - the index number of the HelpWndw.
  494.           
  495.         HelpWndw Record - The HelpWndw displays a number of HelpLines in 
  496.         sequence.  It starts with FirstLine and displays each successive 
  497. |       HelpLine until the window is full set by LinesToShow.  The 
  498. |       intialization default assumes LinesToShow is simply the 
  499. |       difference between the first and last lines.   Here's the list:
  500.  
  501.           FirstLine   - the index number of HelpLine.
  502.           LastLine    - currently unused.
  503.           LinesToShow - number of lines to show.
  504.           Row,Col,Rows,Cols - location and size of the window which is 
  505.                         done by PULL15.INC   
  506.           Wattr,Battr - attributes set for this window.
  507.           Border      - one the 10 borders.
  508.           Zoom        - if set true, the window will zoom.
  509.           Shadow      - shadow effect on Left, Right, or NoDir.
  510.           MsgLineNum  - the index number of the MsgLine.
  511.  
  512. |       Wattr, Battr, Border, Zoom, Shadow, and MsgLineNum for all 
  513. |       HelpWndw's are handled as a group by PULL15.INC with 
  514. |       HelpWndwWattr, HelpWndwBattr, HelpWndwBrdr, HelpZoom, 
  515. |       HelpShadow, and HelpMsgLineNum respectively.  Help windows are 
  516.         optional.  To delete them, assign #00 to HelpKey so they can't 
  517.         be accessed.
  518.  
  519.         HelpLine - This is the text for the help windows.  It was set up 
  520.         as an array rather than a record to help save memory space.  The 
  521.         length need not be the width of the window.
  522.  
  523.         MessageLine - These lines are intended to show the user the 
  524.         number of commands or keys available at any step.  The length 
  525.         should fill one entire row.
  526.  
  527.         ErrorMsgLine - These lines are shorter than MessageLines and 
  528.         temporarily overlays a MessageLine.  They need not fill one 
  529.         entire row.  They are intended of course to indicate errors.
  530.  
  531.  
  532.         STEP 3: GetOverrideStats
  533.  
  534.         Purpose - If the user wants to change any data that PULL15.INC 
  535.         has handled as a group with GetUserPullStats, this is the 
  536.         procedure to do it.  See PULLDEMO.PAS for some examples.
  537.  
  538.  
  539.         STEP 4: DataTransfer
  540.  
  541.         Purpose - If the data entry file PULLDE15.INC is used, 
  542.         DataTransfer will be needed to transfer data from the floating 
  543.         windows to the appropriate variables.  This is done with the 
  544.         DataPad.
  545.  
  546.         DataPad Record - Before I give an explanation, here's the 
  547.         description of the record:
  548.  
  549.           StoreMode  - if true, data will be stored from the data pad to 
  550.                        the user variable.  Otherwise, it reads the 
  551.                        variable and places it on the pad.
  552.           Valid      - if true, numerical data is within typed limits.
  553.           DataStored - if true, data was stored successfully without a 
  554.                        range error.
  555.           NewData    - if true, data will be overwritten on the pad.
  556.           TypeOfData - type of data on the pad.  TAG FIELD for VARIANT 
  557.                        record.
  558. |         Bdata      - Byte       identifier in field list.
  559. |         Idata      - Integer    identifier in field list.
  560. |         Rdata      - Real       identifier in field list.
  561. |         UNdata     - UserNum    identifier in field list.
  562. |         Cdata      - Character  identifier in field list.
  563. |         Sdata      - String     identifier in field list.
  564. |         USdata     - UserString identifier in field list.
  565.           
  566.         If your not familiar with variant records, better read the 
  567.         manual again.  Simply speaking, all variables in the field list 
  568.         all occupy the same address.  The only way you know what type of 
  569.         data you have is by what is assigned to TypeOfData 
  570. |       (Bytes..UserStrings).  You can check the value on the pad at 
  571. |       anytime; just be sure to use the correct identifier.  (The names 
  572. |       were changed in this version to be unique from global variables.  
  573. |       A quirk in TP3.0 will not correctly address "FOR" statements 
  574. |       under "with DataPad do" if identifiers of the same name are 
  575. |       global and also in the variant field.)
  576.  
  577. |       UserNum/UserStrings - These two types are actually strings and 
  578. |       should appear on the data pad as strings.  The new type helps to 
  579. |       correctly identify and justify the data by default.  It also 
  580. |       allows you to customize the characters allowed at data entry 
  581. |       with the use of UserCharSet.
  582.  
  583.         Menu coordinates - Matching variables with windows is easily 
  584.         done by identifying the menu line that pulled the data window.  
  585.         The variables used are:
  586.  
  587.           MPulled - index number of MainMenu pulled.
  588.           SPulled - index number of SubMenu pulled.  If equal to zero, 
  589.                     then only a MainMenu was pulled.
  590.           HiLited - menu line that links the data window.
  591.  
  592.         With these, the DataTransfer procedure is just one big case 
  593.         statement that narrows down the correct user variable.
  594.  
  595.         Range check - Please note that the data here is not stored 
  596.         unless it passes BOTH the validity check and an optional range 
  597.         check.  The demo shows you how to use a field identifier on the 
  598.         DataPad to check for range on the variable PriceLimit.  Make 
  599.         SURE that the type of data MATCHES!  Turbo will not check it.
  600.  
  601.  
  602.         STEP 5: Application Procedures 
  603.  
  604.         This is a good place to put all your application procedures, 
  605.         both for procedures used by the menus (Process) and the work 
  606.         window(s) (WorkWndw).  The demo uses only one called 
  607.         DummyProcess which is just a one second delay.
  608.  
  609.  
  610.         STEP 6: Process
  611.  
  612.         Purpose - "Process" is the procedure accessed by the menus which 
  613.         have and "Exec-" type mode and any menu line of Choice.  This is 
  614.         where you can make the menus do just about anything.
  615.  
  616.         Menu Coordinates - "Process" uses the same coordinate variables 
  617.         as DataTransfer and uses a case statement the same way to locate 
  618.         the correct procedure with MPulled, SPulled and HiLited.
  619.  
  620.         Pull/Pop - Programmably you can pull or pop menus in your 
  621.         procedures at any time.  Try F10 and "IU" in the demo to see 
  622.         just a few of the possibilities of programmable control.  There 
  623.         are 5 flag variables and one function that hook into PULL15.INC 
  624.         to do this:
  625.  
  626.           PopToWorkWndw - if set true, control is returned to the work 
  627.                           window.
  628.           PopToTop      - if set true, menus are popped only to the top 
  629.                           menu.
  630.           PopLevels     - the number of levels to pop.
  631.           Popped        - a function that will pop all menus before 
  632.                           processing.
  633.           MoreCmdSeq    - a string of pending command letters.
  634.           Pull          - if set true, menus will be pulled after pop as 
  635.                           specified by MoreCmdSeq.
  636.  
  637.         You can combine these in several ways.  You can even make data 
  638.         windows enter data sequentially for records or to make it easier 
  639.         for end users automatically step through data entry.  An example 
  640.         of this is in the demo under "IRSaccounting" and "Date".  You'll 
  641.         notice how easy it is to roll through the data windows with 
  642.         RETURNs.
  643.  
  644.  
  645.         STEP 7: WorkWndw
  646.  
  647.         Work Window - When the menus are not pulled, this is where there 
  648.         is most of the programming activity.  You can even have multi-
  649.         level work windows.  Note also that you can work with two or 
  650.         more windows on the screen at the same time with the use of 
  651. |       LIcurrent in WINDOW34.INC provided they don't overlap.  In the 
  652. |       new version, WINDOW40.INC, all windows can be randomly 
  653. |       accessed (revealing a covered window) or moved by the end user.
  654.  
  655.         WorkWndwStep - Since each keystroke goes through the key 
  656.         dispatcher, the number of WorkWndwStep tells the program where 
  657.         to return upon re-entering WorkWndw.  You can change its value, 
  658.         even while in the menus.
  659.  
  660.         WorkWndwEntry - You can now use the same data entry procedures 
  661.         as the data entry windows for the work window with 
  662.         WorkWndwEntry.  Notice that you must set DataPad.NewData:=true 
  663.         before using it.  There is one difference though; the data is 
  664.         stored right after it passes the validity test.  If it doesn't 
  665.         meet the range test, then the data must be restored with 
  666.         RestoreData.
  667.  
  668.  
  669.         STEP 8: DisplayScreen
  670.  
  671.         This procedure finally sets up your screen design.  
  672.  
  673.  
  674.         STEP 9: Main Program
  675.  
  676.         Initial Values - Here is where you place the initial values for 
  677.         user variables.
  678.  
  679.         Reducing code - All procedures executed by InitPull are only 
  680.         done once and never used again.  There's lots of code there and 
  681.         you could probably reduce your code by making an overlay file or 
  682.         something.  
  683.  
  684.         GotoKeyDispatcher - Since each keystroke needs to be analyzed, 
  685.         the dispatcher decides whether it goes to the Menus or WorkWndw.  
  686.         Here's a flow chart for the dispatcher:
  687.  
  688.                                  +------------+
  689.                                  |   START    |
  690.                                  +------------+
  691.                                        | 
  692.                                        /\
  693.                                      /    \             
  694.           +-------------+     No   /        \   Yes     +-------------+
  695.           |    Work     |<--------<  PULL ?  >--------->|  Pull-down  |
  696.           |   Window    |          \        /           |    Menus    |
  697.           +-------------+            \    /             +-------------+
  698.                  |                     \/                       |
  699.                  |                    /|\                       |
  700.                  |                     |                        |
  701.                  |                     | No                     |
  702.                  |                     /\                       |
  703.                  |                   /    \                     |
  704.                  |                 /        \                   |
  705.                  ----------------><  QUIT ?  ><------------------
  706.                                    \        /
  707.                                      \    / 
  708.                                        \/
  709.                                        | Yes
  710.                                       \|/
  711.                                  +------------+
  712.                                  |    END     |
  713.                                  +------------+
  714.  
  715.  
  716.         SUGGESTIONS:
  717.  
  718. |       Full Demonstration - If you would like to see a fully working 
  719. |       utility created from these procedures, you can get a file called 
  720. |       WSX21.ARC.  It is a WordStar Translator program for WordStar 
  721. |       3.31/4.0, but you don't have to have WordStar to examine it.  It 
  722. |       has pull-down directories, WYSIWYG color modifications, and other 
  723. |       ideas.  The ARC file does not contain the source code, but it is 
  724. |       available upon request.  WSX21.ARC can be found on the 
  725. |       CompuServe MicroPro (GO MICROPRO) in the WordStar 4.0 Data 
  726. |       Library (DL3).
  727.  
  728. |       On-line source - All updated files can be found on the CompuServe 
  729. |       Borland Forum (GO BORPRO) in the MSDOS Turbo Pascal Data Library.
  730.  
  731.         Compiling Speed - Since there is a significant amount of code in 
  732.         the include files, you will find that you can decrease compiling 
  733.         time by accessing the files from RAM disk.
  734.  
  735.         Fast Keyboard Repeat - The best utility I've found to double the 
  736.         typematic rate is a utility called HOTKEY.ARC.  It's better than 
  737.         PC Magazine's QUICKEYS, because it doesn't "run away" in the 
  738.         buffer.  Available on CompuServe's IBM Hardware Forum.
  739.  
  740.  
  741.         LIABILITY:
  742.  
  743.         No liabilities are assumed in the use or misuse of these 
  744.         procedures.
  745.  
  746.  
  747.         AUTHOR:
  748.  
  749.         These procedures are now Shareware.  If there are any problems, 
  750.         please let me know.
  751.  
  752.           Copyright (c) 1987 by James H. LeMay
  753.             All rights reserved
  754.             Jim LeMay, 6341 Klamath Rd., Ft. Worth, TX  76116
  755.             CIS 76011,217, 1-(817) 732-7150 (after 1730 PST)
  756.  
  757.  
  758.         CREDITS:
  759.  
  760.         Art Hill started some initial ideas on this with PullDown.arc
  761.  
  762.             Art Hill, 936 S. Kensington Ave., La Grange, IL 60525
  763.             CIS 72307,3570
  764.  
  765.  
  766.         REVISIONS:
  767.  
  768.         Version 1.1 (02-27-87):
  769.           . Initial release
  770.  
  771.         Version 1.2 (04-08-87):  [limited release]
  772.           . Separated data entry procedures into separate include file.
  773.           . Created a key dispatcher and added WorkWndw procedure.
  774.           . Improved Pull/Pop hooks.
  775.           . Made menus 2 columns wider for readability.
  776.           . Made title arrows a different symbol than the Choice flags.
  777.           . Added data entry capability to the work window.
  778.           . Changed "Ch" to "Key".
  779.           . Changed key codes to constant identifiers.
  780.           . Changed command key from "/" to F10.
  781.           . Changed attribute identifiers for consistency.
  782.  
  783.         Version 1.3  (04-20-87):
  784.           . Added Partition to the LineMode.
  785.           . Made both "/" and F10 to be command keys.
  786.           . Changed the following identifiers:
  787.                SelectMode -> LineMode
  788.                NoChoice   -> Comment
  789.                SingleSel  -> SingleFlagLine
  790.                Selected   -> Flagged
  791.             (These were changed for the sake of better understanding. 
  792.              I don't plan on changing any more to keep compatibility.)
  793.           . Changed the Teamware restrictions.
  794.  
  795.         Version 1.4 (06-30-87):  [limited release]
  796.  
  797. |       Version 1.5 (08-31-87):
  798. |         . Incorporated QWIK30.INC and WINDOW34.INC for full IBM 
  799. |           compatibility.
  800. |         . Used names (typed scalars) rather than numbers to identify 
  801. |           menus, windows, and help lines.
  802. |         . Added combination menu modes ExecSingleChoice and 
  803. |           ExecMultipleChoice.
  804. |         . Added line mode type of ExecOnly to be independent of menu 
  805. |           Choice.
  806. |         . Added TypeOfDataTypes UserNums and UserStrings for user-
  807. |           defined sets.
  808. |         . Added Lattr (command Letter) and Cattr (Comment) attributes 
  809. |           to each menu.
  810. |         . Added StatusAttr for the first row attribute.
  811. |         . InitAttr is now the parameter in InitPull.
  812. |         . Deleted HaveEGA to conform to QWIK30.INC.
  813. |         . Changed names of variant identifiers in DataPadRec.
  814. |         . Modified cursor handling and eliminated separate cursor 
  815. |           modes.
  816. |         . Separated color initialization procedures.
  817. |         . Changed Home and End cursor keys to perform more like 
  818. |           WordStar.
  819. |         . Released as Shareware.
  820.